Sisällysluettelo:

Käännä Arduinosi magneettiseksi kortinlukijaksi!: 9 vaihetta (kuvilla)
Käännä Arduinosi magneettiseksi kortinlukijaksi!: 9 vaihetta (kuvilla)

Video: Käännä Arduinosi magneettiseksi kortinlukijaksi!: 9 vaihetta (kuvilla)

Video: Käännä Arduinosi magneettiseksi kortinlukijaksi!: 9 vaihetta (kuvilla)
Video: 15 käytännön työpöydälle, joka pitää sinut terveenä ja organisoituneena 2024, Heinäkuu
Anonim
Tee Arduinostasi magneettinen kortinlukija!
Tee Arduinostasi magneettinen kortinlukija!
Tee Arduinostasi magneettinen kortinlukija!
Tee Arduinostasi magneettinen kortinlukija!
Tee Arduinostasi magneettinen kortinlukija!
Tee Arduinostasi magneettinen kortinlukija!

Kaikki ovat mielestäni käyttäneet magneettikortinlukijaa. Tarkoitan, kuka kantaa käteistä nykyään? Niitäkään ei ole vaikea saada käsiinsä, ja matkan aikana suosikki paikalliseen elektroniikkaliikkeeseeni löysin roskakorin täynnä näitä tyyppejä. Joten… tietysti otin yhden ja toin sen kotiin katsomaan, mitä kaikkea voisin tehdä sen ja AVR: n kanssa.

Tässä ohjeessa kerrotaan, kuinka Magtek -magneettikortinlukija kytketään AVR: ään tai Arduino/klooniin ja luetaan tiedot kortin ensimmäisestä raidasta. Kiinnitä istuimet; magneettikortinlukijoilla on korkea bittinopeus!

Vaihe 1: Laitelista

Laitelista
Laitelista
Laitelista
Laitelista

Tässä on muutamia asioita, joita sinun on aloitettava.

  • Magneettinen kortinlukija (Minulla on Magetk 90 mm: n kaksipäinen lukija. 5,00 dollaria)
  • AVR, Arduino tai klooni (ATmega328p ~ $ 4.30 Mouser.comilta
  • juotonta leipälautaa
  • joku lanka
  • ehkä otsikko, jos pidät tällaisesta asiasta.
  • jotain sarjaportin lukemista. Käytän BattleDroids.netin AVR -terminaalia

Se on kaikki mitä sinun tarvitsee aloittaa. Riippuen magcard -lukijasta, jonka saat, saatat joutua muuttamaan näitä ohjeita ja varmimmin koodia, jotta voit työskennellä lukijan kanssa. Kirjoittamani koodin pitäisi kuitenkin viedä sinut melko pitkälle, toivon.

Vaihe 2: Itse kelluvat magneettikortinlukijat

Itse kelluvat magneettikortinlukijat
Itse kelluvat magneettikortinlukijat
Itse kelluvat magneettikortinlukijat
Itse kelluvat magneettikortinlukijat
Itse kelluvat magneettikortinlukijat
Itse kelluvat magneettikortinlukijat
Itse kelluvat magneettikortinlukijat
Itse kelluvat magneettikortinlukijat

Magneettiset kortinlukijat ovat "itsekellottavia", mikä tarkoittaa, että ne tarjoavat kellon, jota kutsutaan stroboskoopiksi, jota vastaan yhdistetty mikro-ohjain voi synkronoida. Tämä on siunaus. Se tarkoittaa, että sinun ei tarvitse huolehtia siitä, että etsit kellosignaalia ja ajoitat signaalin keskelle suoraan kellopulssiin, eikä häiritsevää värähtelyä kellosignaalin makeaan kohtaan. Tämä on järkevää, kun ajattelet kortin pyyhkäisyä: kaikki pyyhkäisevät eri tahdissa, jotkut hitaammin, toiset nopeammin kuin toiset. Itsekellotus antaa jopa makealle mummolleni mahdollisuuden käyttää korttiaan rikkomatta rannetta. Muistuttaa minua siitä, että minun on muutettava hänen asetustaan, joka määrittää, kuinka kauan aikaa on napsautusten välillä kaksoisnapsautuksen rekisteröimiseksi….

Nämä kortinlukijan tiedot ovat voimassa 1.0 me ennen stroboskoopin käyttöönottoa, joten sinun ei tarvitse huolehtia viivytyksestä päästäksesi "bittiaikaan". Kaksoispäälukijalle, kuten käyttämälleni, on kaksi luettavaa dataraitaa. Tässä ketjussa näytän lukemisen ensisijaisesta ensimmäisestä kappaleesta, jotta pääset alkuun. Sinun on tehtävä viisi yhteyttä (neljä, jos et halua luopua hienosäädetystä ohjauksesta, kun käytät vähemmän I/O -portteja). Katso alla oleva kuva. Punainen johto menee +5 V: iin ja musta johto maahan. Vihreä johto on /CARD_PRESENT; keltainen johto on /STROBE ja valkoinen johto on /DATA1. Kauttaviiva (/) tarkoittaa, että data käännetään. Alhainen signaali (eli 0) luetaan yhtenä tai korkeana. Muut liittimet ovat ruskeita /STROBE2 ja oranssit /DATA2. Emme aio käyttää näitä. Jos haluat, voit unohtaa /CARD_PRESENT. Tämä tietorivi laskee noin 17 päänvuo -kierroksen jälkeen, mikä osoittaa, että kortti on läsnä (esimerkiksi satunnaisen melun sijaan, joka saa lukijan lähettämään vääriä tietoja), ja sitä käytetään vahvistamaan, että saamasi tiedot ovat korttitietoja ja ei roskaa. Voit ohittaa tämän yhteyden, jos tarkistat datavirran aloitusvalvonnan. Siitä lisää myöhemmin. Kuten alla näet, käytin suorakulmaista urosliitintä, joka oli kytketty leipätauluun, ja liitin lukijani siihen. Yhdistin /STROBE PIND2: een (digitaalinen nasta 2 Arduinossa), /CARD_PRESENT PIND3: een (havainnollistamiseksi) ja /DATA1 PIND4: ään. Varmista, että otat pullupit käyttöön näissä nastoissa, jotta nastasi eivät kellu. Vaihdoin myös Arduinoni Bare Bones AVR: ään, koska pidän tavasta, jolla se sopii leipälautaan.

Vaihe 3: Magneettikortin perusteet

Magneettikortin perusteet
Magneettikortin perusteet

Ensisijaiset toiminnot, jotka sinun on tehtävä magneettikortin lukemiseksi, ovat: 1. Tunnista, milloin kortti on pyyhkäisty 2. Lue tietovirta 3. Tunnista, milloin kortti on kadonnut 4. Käsittele tiedot 5. Näytä data Ensin esitän sinulle joitain magneettikortin perusasioita, jotka sinun on tiedettävä, kun alat kirjoittaa omaa koodiasi.

Magneettikorttistandardit

Magneettikortit on standardisoitu ISO-standardissa seuraavissa asiakirjoissa: 7810 Luottokorttikokoisen asiakirjan fyysiset ominaisuudet 7811-1 Kohokuviointi 7811-2 Magneettiraita-alhainen korsitiivisuus 7811-3 Kohokuvioitujen merkkien sijainti 7811-4 Raitojen 1 ja 2 sijainti 7811- 5 Radan sijainti 3 7811-6 Magneettiraita - suuri korsitiivisuus 7813 Rahoitusmaksukortit Kuten näette, rahoituskortit on määritelty erillisessä asiakirjassa ja ne ovat usein eri muodoissa kuin esimerkiksi päivittäistavara- tai kansainvälinen käyntikortti. Sinun on ohjelmoitava nämä erot. Minulla oli juuri käteinen luottokortti ja vakuutuskortti, joten ohjelmoin näitä tyyppejä (jotka molemmat sattuvat olemaan muoto B).

Kortin muodot

Magneettikorteille on useita eri muotoja. Muoto A ja B ovat yleisiä, ja B on yleisin näkemäni ja jota tämä koodi tukee. Uskon, että ISO varaa muodot C - M, kun taas N - ?? on varattu laitoskohtaiseen käyttöön. Raita 1 Rahoituskorttien ensimmäinen raita tallennetaan 210 bittiä tuumalla ja se on kortin ensimmäinen 0,110 tuumaa ylhäältä. Tiedot koodataan korttitiedoiksi 7-biteinä merkkiä kohden. Tämä on 6-bittinen merkki ja vähän pariteettia varten. Radalla 1 on ~ 79 aakkosnumeerista merkkiä. Fyysinen järjestys on taaksepäin. Eli tiedot ovat, mutta ne on kirjoitettu taaksepäin kortille (ja siksi laiteohjelmisto lukee ne) nimellä. pariteetti on outoa. Kortin datamuoto näyttää tältä:

[SS] [FC] [Ensisijainen tili #] [FS] [Nimi] [FS] [Lisätietoja] [FS] [ES] [LRC], jossa:

SS Start sentinel FC Formaattikoodi FS Kenttäerotin ES End sentinel LRC Longitudinal Redundancy Check character Seuraa yksi SS = '%', FC = yksi muodoista (tulee olemaan B monta kertaa), FS on usein '', ES on '?' ja LRC -merkki on yleensä '<', vaikka sitä ei ole määritelty standardeissa. Sen lisäksi, että datassa on kirjoitettu taaksepäin, datalla on pariton pariteettibitti ja se on 0x20 ASCII: sta. Hoidamme tämän, kun käsittelemme tietoja. Raita 2 Raita kaksi on 0,110 tuumaa leveä ja alkaa 0,110 kortin yläosasta. Sen tallennustiheys on 75 bittiä tuumaa kohti. Tiedot ovat 5 bittiä merkkiä kohden ja sisältävät vain noin 40 numeerista symbolia. Sinun ei pitäisi kohdata mitään kortin tietojen muodon tulisi noudattaa tätä rakennetta

[SS] [ensisijainen tili #] [FS] [lisätiedot | harkinnanvaraiset tiedot] [ES] [LRC]

Kappaleen kaksi SS on puolipiste: ';' ja FS on '=' Tämän pyhän tiedon avulla vyösi alla, jatka seuraaviin vaiheisiin nähdäksesi yllä kuvatun menettelyn toteuttavan koodin.

Vaihe 4: Tunnista, milloin korttia pyyhkäistään

Tunnista, kun korttia pyyhkäistään
Tunnista, kun korttia pyyhkäistään

1. Tunnista, milloin kortti on pyyhkäisty Muodollisesti, tarkistetaan /CARD_PRESENT -nasta, onko kortti pudonnut. Onneksi tämä ei ole todella tarpeellista. Tarkistamme kelvollisen kortin myöhemmin. Vaihtoehtoisesti voit lukea strobe -nastasi nähdäksesi, milloin viivat on asetettu tappiin, mutta tämä tuo sinulle paljon kellon nollat. Lukija lähettää noin 60–70 nollaa ilmoittaakseen, että tietoja on tarkoitus esittää. Käytämme kuitenkin binääridatan luonnetta määrittääksemme milloin aloittaa bittien tallennus. Raidan ensimmäisen aloitusvalvoja (SS) on prosenttimerkki (%). Sen binaarinen arvo on 0010 0101, mikä tarkoittaa, että se tallennetaan (ja luetaan) muodossa 1010 001 (se on 7-bittinen, joten 8. bittiä ei lähetetä). Nyt taitava lukija huomaa, että vaikka tiedot ovat taaksepäin, ne eivät vastaa binääristä ASCII -arvoa. Tämä johtuu siitä, että se on 0x20 hex. % -Merkki on 0x25 ja 0100 0101 on 0x05. Kortin tiedoista on vähennetty 0x20 arvosta. Se, joka roikkuu siellä korkeassa napassa, on pariton pariteettibitti. Se on asetettu sinne niin, että arvossa on pariton määrä "1". Joten koska tiedämme, että kelvollinen kortti alkaa aina tällä aloitusvalvonnalla ja koska pariteettibitti on 1, niin kun havaitsemme datanapissa ensimmäisen HIGH -LOW -siirtymän, tiedämme, että olemme juuri alkaneet vastaanottaa aloita vartija kortilta. Tämä ei aina pidä paikkaansa, ja on järjetön suunnitelma tarkistaa /CARD_PRESENT -kortista, onko se mennyt LOW lisäksi. Yksinkertaisin tapa havaita SS: n alku on luoda ulkoinen keskeytys /STROBE: n putoavalle reunalle. Tiedot ovat voimassa 1,0 me ennen putoavaa reunaa, joten kun olet ottanut näytteen putoavasta reunasta, tiedät, että voit lukea /DATA1 -nastan ja saada kelvollisen arvon. Tässä on koodi ulkoisen keskeytyksen luomiseksi laskevalle reunalle.

voidInitInterrupt (void) {// Asennuksen keskeytys BSET (EIMSK, INT0); // ulkoinen keskeytysmaski BSET (EICRA, ISC01); // putoava reuna BCLR (EICRA, ISC00); // putoava reuna BSET (SREG, 7); // I-bit SREG: ssä}

BSET: n ja BCLR: n määritelmät löytyvät yhteisestä.h: sta, jonka sisällytän kaikkiin ohjelmiini. Katso kyseistä tiedostoa, jos sinulla on kysymyksiä bittien asettamisesta. Nyt kun keskeytys laukaistaan, haluamme ottaa näytteen /DATA1: stä (koodissani määritetty CARD_DATA) ja asettaa bitin yleiskäyttöiseen IO -rekisteriin. Jos käytämme 7. bittiä, tallenna rekisteri hahmoksi globaalissa puskurissamme. Käytän GPIOR0 -rekisteriä, koska sen käyttö on nopeaa. Pseudo -koodi on jotain tällaista:

Pysäytä 16-bittinen ajastin Tyhjennä ajastin Jos TIEDOT ovat LOW Aseta BIT = 1 REGISTER Decrement BIT Set -merkki, jotta emme ohita enää 0: ta, muut DATA on HIGH Aseta BIT = 0 REGISTERissä Decrement BIT Jos BIT on 0 Lisää tavu puskuriin Lisäysindeksi Nollaa BIT

Jos kysyt itseltäsi, miksi pienentäminen lisäyksen sijaan, muista, että tiedot ovat taaksepäin, joten sen sijaan, että tallennat bitit, kun saamme ne LSB: stä MSB: hen, tallennamme ne MSB: stä LSB: hen, jotta meidän ei tarvitse kääntää bittejä myöhemmin tietoja käsiteltäessä. Jos todella halusit, voit lisätä tähän myös 0x20 heksadesimaalin, mutta koska se on noin 5us näillä vilkuilla, pidän käsittelyn tässä keskeytyspalvelurutiinissa minimissä.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // käänteinen matala = 1 {BSET (GPIOR0, bitti); --bitti; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --bitti; } jos (bitti <0) {buff [idx] = (char) GPIOR0; ++ idx; bitti = 6; } Käynnistysajastin ();} Jos mietit, mistä ajoitusliiketoiminnasta on kyse, se käsitellään vaiheessa, jossa määritetään, milloin kortti on poistunut lukijasta.

Vaihe 5: Lue tietovirta

Lue datavirta

No, olen jo näyttänyt sinulle, miten voit lukea tiedot, koska se on osa keskeytyspalvelurutiinia ulkoisen keskeytyksemme kannalta. Vaihtoehtoinen menetelmä olisi asettaa lippu ISR: ään ja äänestää lippu pääsilmukassa ja lukea tiedot tällä tavalla, mutta mielestäni tapa, jolla olen esittänyt sen, on puhtaampi. Ole oma tuomarisi ja kirjoita omasi, mutta MCU: si sallii sen. Siirrymme kuitenkin selvittämään, miten tunnistaa, milloin kortti vetää Elvisin ja on poistunut rakennuksesta.

Vaihe 6: Tunnista lukija lähtevä kortti

Tunnista lukija poistuva kortti
Tunnista lukija poistuva kortti

Tunnista, milloin kortti on kadonnut

Muodollisesti otettaisiin näyte /CARD_PRESENT -nastasta nähdäkseen, onko se jälleen KORKEA, mutta emme tarvitse, että steenkin ' /CARD_PRESENT ottaa toisen I /O -portin. Täällä nuo ajastimet tulevat sisään. Joka kerta, kun keskeytystä kutsutaan, koska olemme havainneet laskevan reunan /STROBE -toiminnossa, pysäytämme ajastimen, tyhjennämme ajastimen arvon ja aloitamme lukemisen. Kun olemme lukeneet, käynnistämme ajastimen uudelleen. Toista ad nauseum tai kunnes ajastin saavuttaa tietyn arvon. Tämä tarkoittaa, että viimeinen keskeytys on soitettu eikä tietoja ole enää tullut, joten oletamme, että se on se, ja aloitamme keräämiemme tietojen käsittelyn. Ajastimissa käytämme TIMER1, eli 16-bittistä ajastinta. Käytän 16 Mhz: n resonaattoria ulkoisesti AVR -laitteeseeni. Jos käytät arduinoa, luultavasti käytät sitä. Joten, olen valinnut esiskaalausarvon 1024, mikä tarkoittaa jokaista (16 000 000 /1024) kertaa, että ajastin kasvaa. Toisin sanoen se "tikittää" 15, 625 kertaa sekunnissa. /CARD_PRESENT näyttää KORKEA, mikä osoittaa, että kortti on poistunut lukijasta noin 150 ms viimeisen databitin jälkeen. Tietäen tämän, päätin vain tarkistaa noin 1/4 sekunnin välein. Se näyttäisi suunnilleen tältä:

((((F_CPU) / PRESCALER) / 4) joka osoittautuu noin 3900. Joten kun ajastinlaskuri TCNT1 saavuttaa 3900, tiedän, että se on ollut noin 300 ms, ja voin melko turvallisesti päätellä, että kortti on poistunut lukijasta. Helppo

#define PRESCALER 1024#define CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#define StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 esisäädin#define StopTimer () BCLR (TCCR1B, CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) Olet nähnyt ISR: ssä, missä ajastin käynnistetään, pysäytetään ja tyhjennetään jokaisen keskeytyksen yhteydessä. Nyt pääsilmukassa tarkistamme vain, onko ajastinlaskuri saavuttanut tavoitearvon, ja jos on, aloita tietojen käsittely

(;;) {if (TCNT1> = CHECK_TIME) {

Pysäytysajastin (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bitti = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Nyt tietojen käsittely on turvallista

koodi muotoiltu osoitteessa

Vaihe 7: Käsittele tiedot

Käsittele tiedot
Käsittele tiedot

Käsittele tiedot

Käsittelyvaihe koostuu:

  • tarkistaa voimassa olevan SS: n
  • pariteetin tarkistaminen
  • muuntaminen ASCII: ksi
  • tarkistetaan kelvollinen ES
  • LRC: n tarkistaminen

Tässä en vaivaudu pariteetin tarkistamiseen, koska asetin vain bitin nollaan. En myöskään laske LRC: tä tälle pienelle opetusohjelmalle. Tässä olisi jotain, mitä täydellisemmin toteutettu laiteohjelmisto voisi haluta tehdä. Löydä se alla olevasta kuvasta. Se on kommentoitu ja melko itsestään selvä. Erityinen huomautus pariteetista ja ASCII: sta: Poistan yksinkertaisesti pariteettibitin (7. bitti… eli 1, jonka takana on 6 nollaa) ja jos haluat muuntaa "kortin datasta", sinun on lisättävä arvoon 0x20. Siinäpä suurinpiirtein se.

Vaihe 8: Näytä tiedot

Näytä tiedot
Näytä tiedot
Näytä tiedot
Näytä tiedot

Näytä tiedot

Näyttö siirtyy pääteohjelmaan, jonka kirjoitin erityisesti liittämistä varten AVR -laitteeseen RS232: n tai USB: n kautta. Ohjelman nimi on AVR Terminal. ReadData () -menetelmä on melko ruma ja sinua kehotetaan löytämään puhtaampi ratkaisu kuin keksin. AVR -terminaalissa on myös toiminnon ulostulo. Tulos on ensin sairausvakuutuskortti ja toinen VISA -kortti. Napsauta kuvan vasemmassa yläkulmassa ja valitse alkuperäinen tai suuri kuva nähdäksesi sen paremmin.

Vaihe 9: Koodin lataus ja kääriminen

Tässä ohjeessa olen keskustellut magneettikortinlukijoiden perusasioista ja näyttänyt sinulle koodin, jolla pääset oikeaan suuntaan lukemaan tietoja magneettikorteilta. Paljon muuta työtä voitaisiin tehdä, kuten toisen raidan lukeminen ja purkaminen, LRC: n laskeminen ja parittoman pariteetin laskeminen jokaisesta tavusta. Koko lähdekoodi on ladattavissa alla. Se on kirjoitettu AVR Studio 4.17: ssä. Toivon, että pidit tästä opettavaisesta ja odotan, kuten aina, mahdollisia kommentteja tai ehdotuksia.

Suositeltava: