Kazalo:

Pretvorite svoj Arduino v bralnik magnetnih kartic!: 9 korakov (s slikami)
Pretvorite svoj Arduino v bralnik magnetnih kartic!: 9 korakov (s slikami)

Video: Pretvorite svoj Arduino v bralnik magnetnih kartic!: 9 korakov (s slikami)

Video: Pretvorite svoj Arduino v bralnik magnetnih kartic!: 9 korakov (s slikami)
Video: Измерьте постоянный ток до 500A с помощью шунтирующего резистора и Arduino - дисплей на LCD1602 2024, Julij
Anonim
Pretvorite svoj Arduino v bralnik magnetnih kartic!
Pretvorite svoj Arduino v bralnik magnetnih kartic!
Pretvorite svoj Arduino v bralnik magnetnih kartic!
Pretvorite svoj Arduino v bralnik magnetnih kartic!
Pretvorite svoj Arduino v bralnik magnetnih kartic!
Pretvorite svoj Arduino v bralnik magnetnih kartic!

Verjamem, da so vsi uporabljali bralnik magnetnih kartic. Mislim, kdo danes nosi gotovino? Prav tako jih ni težko dobiti v roke in med potovanjem v mojo najljubšo lokalno trgovino z elektroniko sem našel poln zabojnik teh fantov. Torej…. Seveda sem vzel enega in ga prinesel domov, da vidim, kaj vse lahko naredim z njim in AVR.

Ta navodila vam bodo pokazala, kako priključite bralnik magnetnih kartic Magtek na AVR ali Arduino/klon in preberete podatke iz prvega posnetka kartice. Zapenjajte sedeže; Čitalniki magnetnih kartic imajo visoko bitno hitrost!

1. korak: Seznam opreme

Seznam opreme
Seznam opreme
Seznam opreme
Seznam opreme

Tukaj je nekaj stvari, ki jih boste potrebovali za začetek.

  • Čitalnik magnetnih kartic (moj je 90-milimetrski bralnik Magetk, 5,00 USD)
  • AVR, Arduino ali klon (ATmega328p ~ 4,30 USD na Mouser.com
  • lemljena plošča
  • nekaj žice
  • mogoče naslov, če ti je kaj takega všeč.
  • nekaj za branje vaših serijskih vrat. Uporabljam AVR terminal iz BattleDroids.net

To je vse, kar potrebujete za začetek. Odvisno od bralnika magcard, ki ga dobite, boste morda morali spremeniti ta navodila in zagotovo kodo za delo s svojim bralcem. Upam, da bi morala koda, ki sem jo napisal, precej daleč.

2. korak: Samodejni čitalniki magnetnih kartic

Samodejni čitalniki magnetnih kartic
Samodejni čitalniki magnetnih kartic
Samodejni čitalniki magnetnih kartic
Samodejni čitalniki magnetnih kartic
Samodejni čitalniki magnetnih kartic
Samodejni čitalniki magnetnih kartic
Samodejni čitalniki magnetnih kartic
Samodejni čitalniki magnetnih kartic

Čitalniki magnetnih kartic so "samostojni", kar pomeni, da imajo uro, imenovano stroboskop, proti kateri se lahko sinhronizira povezani mikrokrmilnik. To je blagor. To pomeni, da vam ni treba skrbeti, če iščete signal za merjenje časa in nastavite čas signala, da se osredotoči neposredno na urni utrip, in ne smete motiti v sladko točko signala ure. To je smiselno, če pomislite na vlečenje kartic: vsi vlečejo z drugačnim tempom, nekateri počasneje, nekateri hitreje kot drugi. Samodejna ura omogoča tudi moji sladki babici, da lahko uporablja svojo kartico, ne da bi si zlomila zapestje. Opomni me, da moram zanjo spremeniti nastavitev, ki določa, koliko časa velja med kliki, da registriram dvojni klik….

Podatki tega bralnika kartic veljajo 1,0 us, preden se strobofon vklopi na linijo, zato ni skrbi, da boste zamudili, da se spustite v "bitni čas". Za bralnik z dvema glavama, kot je tisti, ki ga uporabljam, sta na voljo dve podatkovni poti za branje. V tem prispevku bom za začetek prikazal branje s prve pesmi. Obstaja pet povezav, ki jih boste morali vzpostaviti (štiri, če vas ne moti, da se odrečete bolj natančno nastavljenemu nadzoru za manj uporabljenih V/I vrat). Oglejte si spodnjo sliko. Rdeča žica gre na +5V, črna žica pa na ozemljitev. Zelena žica je /CARD_PRESENT; rumena žica je /STROBE, bela žica pa /DATA1. Poševnica naprej (/) pomeni, da so podatki obrnjeni. Nizek signal (tj. 0) se bere kot ena ali visok. Drugi priključki so rjavi za /STROBE2 in oranžni za /DATA2. Teh ne bomo uporabljali. Če želite, lahko pozabite na /CARD_PRESENT. Ta podatkovna vrstica se po približno 17 rotacijah pretoka glave zniža, kar kaže na prisotnost kartice (namesto, na primer, naključni šum, zaradi katerega bralnik pošilja lažne podatke) in se uporablja za preverjanje, ali so podatki, ki jih dobite, podatki o kartici in ne smeti. To povezavo lahko preskočite, če v podatkovnem toku preverite začetni nadzornik. Več o tem kasneje. Kot lahko vidite spodaj, sem uporabil pravokotno moško glavo, priključeno na ploščo za kruh, in na to priključil bralnik. Priključil sem /STROBE na PIND2 (digitalni pin 2 na Arduinu), /CARD_PRESENT na PIND3 (za ilustracijo) in /DATA1 na PIND4. Na teh zatičih omogočite vlečenje, da zatiči ne plavajo. Svoj Arduino sem zamenjal tudi za AVR Bare Bones, ker mi je všeč, kako se prilega krovu.

3. korak: Osnove magnetne kartice

Osnove magnetne kartice
Osnove magnetne kartice

Primarne funkcije, ki jih boste morali opraviti za branje magnetne kartice, so: 1. Zaznati, ko je kartica potegnjena 2. Prebrati tok podatkov 3. Zaznati, ko je kartica odšla 4. Obdelati podatke 5. Prikažite podatki Najprej vam bom predstavil nekaj osnov magnetne kartice, ki jih boste morali poznati, ko začnete pisati svojo kodo.

Standardi magnetnih kartic

Magnetne kartice je ISO standardiziral v naslednjih dokumentih: 7810 Fizikalne lastnosti dokumenta velikosti kreditne kartice 7811-1 Vtisnjen 7811-2 Magnetni trak-nizka koercivnost 7811-3 Lokacija vtisnjenih znakov 7811-4 Lokacija tirov 1 & 2 7811- 5 Lokacija proge 3 7811-6 Magnetni trak - visoka prisilnost 7813 Kartice za finančne transakcije Kot lahko vidite, so finančne kartice navedene v ločenem dokumentu in imajo pogosto drugačne oblike kot, na primer, vaša kartica z živili ali mednarodna klicna kartica. Za te razlike boste morali programirati. Ravnokar sem imel pri roki kreditno kartico in zavarovalno kartico, zato sem programiral za te vrste (oba sta formata B).

Formati kartic

Za magnetne kartice obstaja več različnih formatov. Format A in B sta pogosta, pri čemer je B najpogostejši, kar sem jih videl, in je podprt v tej kodi. Oblike C do M so po mojem mnenju rezervirane za ISO, medtem ko N do ?? so rezervirane za institucionalno uporabo po meri. Sled 1 Pri finančnih karticah je prva skladba zabeležena pri 210 bitih na palec in je prvih 0,110 "kartice od vrha. Podatki so kodirani kot" podatki o kartici "kot 7 bitov na znak. To je 6 bitov za znak in delček za pariteto. Na sledi 1 je ~ 79 alfanumeričnih znakov. Fizično razvrščanje je nazaj. To pomeni, da so podatki zapisani nazaj na kartico (zato jih bo vaša strojna programska oprema prebrala) kot. parnost je čudna. Oblika podatkov kartice izgleda tako:

[SS] [FC] [Primarni račun št.] [FS] [Ime] [FS] [Dodatni podatki] [FS] [ES] [LRC] kjer:

SS Začni nadzornik FC Oznaka oblike FS Ločilo polja ES Končni nadzornik LRC Vzdolžna odvečnost Preverjevalni znak Sledite enemu SS = '%', FC = eni od formatov (velikokrat bo B), FS je pogosto '', ES je '?' in znak LRC je običajno '<', čeprav v standardih ni določen. Poleg tega, da so podatki zapisani nazaj na kartico, imajo lih parni bit in so 0x20 iz ASCII. To bomo obravnavali, ko obdelamo podatke. Skladba 2 Druga skladba je široka 0,110 "in se začne 0,110 z vrha kartice. Gostota snemanja je 75 bitov na palec. Podatki so 5 bitov na znak in so sestavljeni le iz približno 40 numeričnih simbolov. Ne bi smeli naleteti na nobenega črke na tej skladbi. Oblika podatkov kartice mora slediti tej strukturi

[SS] [primarni račun št.] [FS] [dodatni podatki | diskrecijski podatki] [ES] [LRC]

SS za drugo skladbo je podpičje: ';' in FS je '=' S tem svetim znanjem pod pasom nadaljujte z naslednjimi koraki, da si ogledate kodo, ki izvaja zgoraj opisani postopek.

4. korak: Zaznajte, ko kartico povlečete

Zaznati, ko kartico povlečete
Zaznati, ko kartico povlečete

1. Zaznaj, ko je kartica potegnjena. Formalno bi preverili pin /CARD_PRESENT, da bi ugotovili, ali je padla nizko. Na srečo to res ni potrebno. Kasneje bomo preverili veljavnost kartice. Druga možnost je, da preberete svoj strobo pin, da vidite, kdaj so bili strobi nameščeni na pin, vendar vam bo to prineslo veliko ničelnih takt. Bralec bo poslal približno 60-70 začetnih nič, da vas obvesti, da bodo podatki kmalu predstavljeni. Vendar bomo uporabili naravo binarnih podatkov, da ugotovimo, kdaj začeti snemati bite. Začetni stražar (SS) za prvo skladbo je znak za odstotek (%). Njegova binarna vrednost je 0010 0101, kar pomeni, da bo shranjena (in prebrana) kot 1010 001 (7-bitna je, zato se osmi bit ne prenaša). Preudarni bralec bo zdaj opazil, da se podatki ne ujemajo z binarno vrednostjo ASCII, čeprav so podatki nazaj. To je zato, ker je 0x20 off hex. Simbol % je 0x25, 0100 0101 pa 0x05. Podatki kartice so od vrednosti odšteti 0x20. Ta, ki visi tam v visokem grizljanju, je čuden paritetni bit. Postavljeno je tako, da je v vrednosti liho število "1". Torej, ker vemo, da se bo s tem zagonskim nadzornikom vedno začela veljavna kartica, in ker je paritetni bit 1, potem, ko zaznamo prvi prehod HIGH to LOW na podatkovnem zatiču, vemo, da smo šele začeli prejemati začni stražar s kartice. To pa ne bo vedno res in nepremagljiv načrt bi bil, da preverite kartico /CARD_PRESENT in preverite, ali je poleg tega nizka. Najpreprostejši način za zaznavanje zagona SS je ustvariti zunanji prekinitev, ki se sproži na padajočem robu /STROBE. Podatki veljajo 1,0 us pred padajočim robom, zato, ko ste vzorčili padajoči rob, veste, da lahko preberete pin /DATA1 in dobite veljavno vrednost. Tukaj je koda za ustvarjanje zunanjega prekinitve, ki se sproži na padajočem robu.

voidInitInterrupt (void) {// Nastavitev prekinitve BSET (EIMSK, INT0); // zunanja prekinitvena maska BSET (EICRA, ISC01); // padajoči rob BCLR (EICRA, ISC00); // padajoči rob BSET (SREG, 7); // I-bit v SREG}

V mojem common.h, ki ga vključujem v vse svoje programe, je mogoče najti definicije BSET in BCLR. Če imate kakršna koli vprašanja o nastavitvi bitov, si oglejte to datoteko. Zdaj, ko se prekinitev sproži, želimo vzorčiti /DATA1 (v moji kodi opredeljeno kot CARD_DATA) in nastaviti malo v register IO splošnega namena. Če smo na 7. bitu, shranite register kot znak v našem globalnem medpomnilniku. Uporabljam register GPIOR0, ker je hiter dostop. Psevdo koda je nekaj takega:

Ustavi 16-bitni časovnik Počisti časovnik Če je DATA NIZKA Nastavite BIT = 1 v REGISTER Decrement BIT Nastavite zastavico, da ne preskočimo več 0-ih sicer DATA je HIGH Set BIT = 0 v REGISTER-u Zmanjšajte BIT Če je BIT 0 Dodajte bajt v medpomnilnik Povečanje indeksa Ponastavi BIT

Če se sprašujete, zakaj zmanjšanje namesto povečanja, ne pozabite, da so podatki nazaj, zato jih namesto beleženja, ko jih prejemamo iz LSB v MSB, shranimo iz MSB v LSB, tako da nam ni treba obrniti bitov kasneje pri obdelavi podatkov. Če bi res želeli, bi lahko tukaj dodali še šestnajstiko velikosti 0x20, a ker je na teh strobovih približno 5us, bom obdelavo v tej rutini prekinitve ohranil na minimumu.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // inverzno nizko = 1 {BSET (GPIOR0, bit); -bit; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); -bit; } if (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Če se sprašujete, za kakšen časovni posel gre, je to opisano v koraku pri določanju, kdaj je kartica zapustila bralnik.

5. korak: preberite tok podatkov

Preberite tok podatkov

No, že sem vam pokazal, kako berete podatke, saj so to del rutine prekinitvenih storitev za našo zunanjo prekinitev. Druga možnost bi bila, da zastavico nastavite v ISR, v glavni zanki pa anketo preberete in tako preberete podatke, vendar menim, da je način, ki sem ga predstavil, čistejši. Bodite sami svoj sodnik in napišite svojega, vendar bo vaš MCU to dovolil. Prehajamo k ugotovitvam, kako ugotoviti, kdaj kartica potegne Elvisa in zapusti stavbo.

6. korak: Zaznajte kartico, ki zapusti bralnik

Zaznajte kartico, ki zapusti bralnik
Zaznajte kartico, ki zapusti bralnik

Odkrijte, kdaj je kartica izginila

Formalno bi vzorčili pin /CARD_PRESENT, da bi videli, ali je spet visoko, vendar ne potrebujemo steenkin ' /CARD_PRESENT, ki bi zavzel druga V /I vrata. Tu pridejo ti časovniki. Vsakič, ko se pokliče prekinitev, ker smo zaznali padajoči rob na /STROBE, ustavimo časovnik, počistimo vrednost časovnika in začnemo z branjem. Ko končamo z branjem, znova zaženemo časovnik. Ponavljajte navznoter ali dokler časovnik ne doseže določene vrednosti. To pomeni, da je bil poklican zadnji prekinitev in ni prišlo več podatkov, zato predvidevamo, da je to to, in začnemo z obdelavo podatkov, ki smo jih zbrali. Za časovnike uporabljamo TIMER1, torej 16-bitni časovnik. Zunaj za AVR uporabljam 16 MHz resonator. Če uporabljate arduino, potem verjetno tudi vi. Zato sem izbral vrednost prednamestitve 1024, kar pomeni, da se bo časovnik povečal (16, 000, 000 /1024). Se pravi, da bo 'tiktakal' 15, 625 -krat na sekundo. /CARD_PRESENT bo visoko, kar pomeni, da je kartica pustila bralnik približno 150 ms po zadnjem podatkovnem bitu. Ker sem to vedel, sem se odločil preveriti vsake 1/4 sekunde. To bi izgledalo nekako takole:

(((F_CPU) / PRESCALER) / 4) kar se izkaže za okoli 3900. Ko torej števec časa TCNT1 doseže 3900, potem vem, da je minilo približno 300 ms in lahko precej varno sklepam, da je kartica zapustila bralnik. Enostavno

#define PRESCALER 1024#define CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#define StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 predkaler#definiraj StopTimer () BCLR (TCCR1B, CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) V ISR -ju ste videli, kdaj se časovnik zažene, ustavi in počisti ob vsakem prekinitvi. Zdaj v glavni zanki samo preverimo, ali je števec časovnika dosegel ciljno vrednost, in če je tako, začnite obdelavo podatkov

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

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Zdaj je varno obdelati podatke

koda, oblikovana s strani

7. korak: Obdelajte podatke

Obdelajte podatke
Obdelajte podatke

Obdelajte podatke

Faza obdelave je sestavljena iz:

  • preverjanje veljavnosti SS
  • preverjanje paritete
  • pretvorbo v ASCII
  • preverjanje veljavnosti ES
  • preverjanje LRC

Tukaj se ne trudim s preverjanjem paritete, saj sem ta bit nastavil na nič. Prav tako ne izračunam LRC za to majhno vadnico. To bi bilo nekaj, kar bi morda želela narediti bolj uresničena strojna programska oprema. Tukaj je koda za obdelavo podatkov z zgornjimi koraki (brez prej omenjenega). Poiščite ga na spodnji sliki. Je komentirano in precej samoumevno. Posebna opomba o pariteti in ASCII: preprosto počistim paritetni bit (7. bit … tj. 1 s 6 ničel za njim) in če želite pretvoriti iz "podatkov o kartici", morate vrednosti dodati 0x20. To je to.

8. korak: Prikažite podatke

Prikaz podatkov
Prikaz podatkov
Prikaz podatkov
Prikaz podatkov

Prikažite podatke

Zaslon gre na terminalski program, ki sem ga napisal posebej za povezavo z AVR prek RS232 ali USB. Program se imenuje AVR Terminal. Metoda ReadData () je precej grda, zato vas prosimo, da poiščete čistejšo rešitev od tiste, ki sem jo zamislil. Obstaja tudi izhod funkcije v terminalu AVR. Izhod je prvi izkaznice zdravstvenega zavarovanja, drugi pa kartice VISA. Kliknite v zgornjem levem kotu slike in izberite izvirno ali veliko sliko, da jo vidite bolje.

9. korak: Prenos kode in zavijanje

V tem navodilu sem razpravljal o nekaterih osnovah bralnikov magnetnih kartic in vam pokazal nekaj kode, s katero boste začeli v pravo smer pri branju podatkov z magnetnih kartic. Na voljo je še veliko dela, na primer branje in dekodiranje 2. skladbe, izračun LRC in izračun lihe paritete za vsak bajt. Celotna izvorna koda je na voljo za prenos spodaj. Napisano je bilo v AVR Studio 4.17. Upam, da ste uživali v tem navodilu, in kot vedno se veselim vaših komentarjev ali predlogov. Srečno kodiranje in AVR'ing!

Priporočena: