Obsah:

Premeňte svoje Arduino na čítačku magnetických kariet!: 9 krokov (s obrázkami)
Premeňte svoje Arduino na čítačku magnetických kariet!: 9 krokov (s obrázkami)

Video: Premeňte svoje Arduino na čítačku magnetických kariet!: 9 krokov (s obrázkami)

Video: Premeňte svoje Arduino na čítačku magnetických kariet!: 9 krokov (s obrázkami)
Video: Превратите свой Raspberry Pi Pico в ПЛК Mitsubishi FX1N 2024, Júl
Anonim
Premeňte svoje Arduino na čítačku magnetických kariet!
Premeňte svoje Arduino na čítačku magnetických kariet!
Premeňte svoje Arduino na čítačku magnetických kariet!
Premeňte svoje Arduino na čítačku magnetických kariet!
Premeňte svoje Arduino na čítačku magnetických kariet!
Premeňte svoje Arduino na čítačku magnetických kariet!

Verím, že každý používal čítačku magnetických kariet. Myslím tým, kto v dnešnej dobe nosí hotovosť? Nie je ani ťažké dostať sa do rúk a počas výletu do môjho obľúbeného miestneho obchodu s elektronikou som našiel kôš plný týchto chalanov. Takže … samozrejme, jeden som zdvihol a priniesol domov, aby som zistil, aké veci s ním a AVR môžem robiť.

Tento návod vám ukáže, ako pripojiť čítačku magnetických kariet Magtek k AVR alebo Arduino/klonu a čítať údaje z prvej stopy karty. Pracka sedadiel; čítačky magnetických kariet majú vysoký bitový tok!

Krok 1: Zoznam vybavenia

Zoznam vybavenia
Zoznam vybavenia
Zoznam vybavenia
Zoznam vybavenia

Tu je niekoľko vecí, ktoré budete na začiatok potrebovať.

  • Čítačka magnetických kariet (moja je 90 mm dvojhlavá čítačka Magetk. 5,00 dolárov)
  • AVR, Arduino alebo klon (ATmega328p ~ 4,30 dolárov od Mouser.com
  • nespájkovateľné nepájivé pole
  • nejaký drôt
  • možno hlavička, ak sa ti páči taká vec.
  • niečo na čítanie vášho sériového portu. Používam AVR Terminal z BattleDroids.net

To je všetko, čo potrebujete, aby ste mohli začať. V závislosti od čítačky čipových kariet, ktorú nakoniec získate, budete možno musieť tieto pokyny a najpravdepodobnejšie kód upraviť tak, aby fungovali s vašou konkrétnou čítačkou. Dúfam však, že kód, ktorý som napísal, by vás mal dostať dosť ďaleko.

Krok 2: Samočinné čítačky magnetických kariet

Samočinné čítačky magnetických kariet
Samočinné čítačky magnetických kariet
Samočinné čítačky magnetických kariet
Samočinné čítačky magnetických kariet
Samočinné čítačky magnetických kariet
Samočinné čítačky magnetických kariet
Samočinné čítačky magnetických kariet
Samočinné čítačky magnetických kariet

Čítačky magnetických kariet sú „samočinné“, čo znamená, že poskytujú hodiny nazývané stroboskop, proti ktorým sa pripojený mikrokontrolér môže synchronizovať. To je požehnanie. Znamená to, že si nemusíte robiť starosti s hľadaním taktovacieho signálu a s načasovaním signálu, aby sa vycentroval priamo na hodinový impulz, a aby vás žiadny rušivý osciloval do sladkého bodu hodinového signálu. To dáva zmysel, keď premýšľate o potiahnutí karty: každý švihne iným tempom, niekto pomalšie, niekto rýchlejšie ako ostatní. Automatické hodiny umožňujú aj mojej sladkej babičke používať kartu bez toho, aby si zlomila zápästie. Pripomína mi to, že som pre ňu musel zmeniť nastavenie, ktoré určuje, koľko času je platného medzi kliknutiami na registráciu dvojitého kliknutia ….

Údaje tejto čítačky kariet sú platné 1,0 USD pred zaradením blesku na linku, takže si nemusíte robiť starosti s oneskorením, kým sa dostanete do „bitového času“. V prípade dvojitej čítačky, ako je tá, ktorú používam, sú k dispozícii dve dátové stopy na čítanie. V tomto článku ukážem čítanie z prvej skladby, aby ste mohli začať. Budete musieť vykonať päť pripojení (štyri, ak vám nevadí vzdať sa viac vyladeného ovládania pre menej používaných I/O portov). Pozrite sa na obrázok nižšie. Červený vodič ide na +5V, zatiaľ čo čierny vodič uzemňuje. Zelený vodič je /CARD_PRESENT; žltý vodič je /STROBE a biely vodič je /DATA1. Lomítko (/) znamená, že údaje sú invertované. Nízky signál (tj 0) sa číta ako jeden alebo vysoký. Ostatné konektory sú hnedé pre /STROBE2 a oranžové pre /DATA2. Tieto nebudeme používať. Ak chcete, môžete na /CARD_PRESENT zabudnúť. Tento údajový riadok sa zhruba po 17 otáčkach toku hlavy zníži, aby naznačil, že je prítomná karta (namiesto povedzme náhodného šumu, ktorý spôsobuje, že čítačka odosiela falošné údaje) a slúži na overenie, či údaje, ktoré získavate, sú údaje o karte a nie brak. Toto pripojenie môžete preskočiť, ak v toku údajov skontrolujete počiatočný signál. Viac o tom neskôr. Ako vidíte nižšie, použil som pravouhlý konektor samca spojený s doskou na chlieb a k tomu som pripojil svoju čítačku. Pripojil som /STROBE k PIND2 (digitálny pin 2 na Arduine), /CARD_PRESENT k PIND3 (na ilustračné účely) a /DATA1 k PIND4. Uistite sa, že na týchto kolíkoch povoľujete sťahovanie, aby vaše kolíky neplávali. Tiež som vymenil svoje Arduino za Bare Bones AVR, pretože sa mi páči, ako sa zmestí do dosky na pečenie.

Krok 3: Základy magnetickej karty

Základy magnetickej karty
Základy magnetickej karty

Primárne funkcie, ktoré budete musieť vykonať pri čítaní magnetickej karty, sú tieto: 1. Zistiť, kedy bola karta potiahnutá prstom 2. Čítať prúd údajov 3. Zistiť, keď karta zmizla 4. Spracovať údaje 5. Zobraziť dáta Najprv vás zoznámim so základmi magnetickej karty, ktoré budete potrebovať, keď začnete písať vlastný kód.

Štandardy magnetických kariet

Magnetické karty sú štandardizované ISO v nasledujúcich dokumentoch: 7810 Fyzické charakteristiky dokumentu o veľkosti kreditnej karty 7811-1 Reliéf 7811-2 Magnetický prúžok-nízka koercitivita 7811-3 Umiestnenie reliéfnych znakov 7811-4 Umiestnenie stôp 1 a 2 7811- 5 Umiestnenie stopy 3 7811-6 Magnetický prúžok - vysoká koercitivita 7813 Karty finančných transakcií Ako vidíte, finančné karty sú uvedené v samostatnom dokumente a často majú iný formát ako povedzme karta s potravinami alebo medzinárodná telefónna karta. Na tieto rozdiely budete musieť programovať. Práve som mal poruke kreditnú kartu a kartu poistenca, a tak som naprogramoval pre tieto typy (oba sú zhodou okolností vo formáte B).

Formáty kariet

Existuje niekoľko rôznych formátov magnetických kariet. Formát A a B sú bežné, pričom B je najbežnejší, aký som kedy videl, a ktorý je v tomto kóde podporovaný. Verím, že formáty C až M sú vyhradené ISO, zatiaľ čo od N do ?? sú vyhradené pre inštitucionálne vlastné použitie. Stopa 1 V prípade finančných kariet je prvá stopa zaznamenaná pri 210 bitoch na palec a je to prvých 0,110 "karty zhora. Údaje sú zakódované ako" údaje karty "ako 7 bitov na znak. To je 6 bitov pre znak a bit pre paritu. Na stope 1 je ~ 79 alfanumerických znakov. Fyzické usporiadanie je spätné. To znamená, že údaje sú zapísané spätne na kartu (a preto ich bude čítať váš firmvér) ako. parita je nepárna. Formát údajov karty vyzerá takto:

[SS] [FC] [Číslo primárneho účtu] [FS] [Názov] [FS] [Ďalšie údaje] [FS] [ES] [LRC] kde:

SS Začiatok indikátora FC Formátovací kód FS Oddeľovač poľa ES Koniec indikátora LRC Pozdĺžna nadbytočnosť Kontrolný znak Sledujte jeden SS = '%', FC = jeden z formátov (mnohokrát bude B), FS je často '', ES je '?' a znak LRC je bežne „<“, aj keď to nie je uvedené v normách. Okrem toho, že sú údaje zapísané na kartu dozadu, majú nepárny paritný bit a sú 0x20 z ASCII. Spracujeme to, keď spracujeme údaje. Stopa 2 Druhá stopa je široká 0,110 "a začína 0,110 zhora na karte. Jeho hustota záznamu je 75 bitov na palec. Údaje sú 5 bitov na znak a pozostávajú iba z asi 40 numerických symbolov. Nemali by ste naraziť na žiadne tejto skladbe. Dátový formát karty by mal zodpovedať tejto štruktúre

[SS] [primárny účet #] [FS] [dodatočné údaje | diskrečné údaje] [ES] [LRC]

SS pre stopu dva je bodkočiarka: ';' a FS je '=' S týmito svätými znalosťami pod palcom pokračujte v ďalších krokoch, aby ste videli kód implementujúci vyššie uvedený postup.

Krok 4: Zistite, či je karta potiahnutá

Zistiť, kedy je karta potiahnutá
Zistiť, kedy je karta potiahnutá

1. Zistite, či bola karta formálne potiahnutá, alebo nie. Našťastie to nie je skutočne potrebné. Platnú kartu skontrolujeme neskôr. Alternatívne by ste si mohli prečítať svoj stroboskopický kolík, aby ste zistili, kedy boli na kolíky umiestnené blesky, to vám však ušetrí veľa taktovacích núl. Čitateľ odošle asi 60-70 úvodných núl, aby vás informoval, že údaje sa budú uvádzať. Použijeme však povahu binárnych údajov na určenie, kedy začať zaznamenávať bity. Počiatočný indikátor (SS) pre stopu jedna je znak percenta (%). Jeho binárna hodnota je 0010 0101, čo znamená, že bude uložený (a načítaný) ako 1010 001 (má 7 bitov, takže 8. bit sa neprenáša). Bystrý čitateľ si teraz všimne, že aj keď sú údaje späť, nezhodujú sa s binárnou hodnotou ASCII. Je to preto, že je to 0x20 z hexu. Symbol % je 0x25 a 0100 0101 je 0x05. Údaje o karte sú odpočítané od hodnoty 0x20. Ten, ktorý visí tam vonku vo vysokej papani, je nepárny paritný bit. Je tam vložený tak, že v hodnote je nepárny počet „1“s. Pretože vieme, že platná karta bude vždy začínať týmto počiatočným indikátorom, a pretože paritný bit je 1, potom keď na dátovom pine zistíme prvý prechod HIGH do LOW, vieme, že sme práve začali prijímať začnite stráženie z karty. Teraz to však nebude vždy pravda a spoľahlivým plánom by bolo skontrolovať kartu /CARD_PRESENT a zistiť, či navyše nezmizla NÍZKO. Najjednoduchší spôsob, ako zistiť začiatok SS, je vytvoriť externé prerušenie spustené na klesajúcej hrane /STROBE. Údaje platia 1,0 us pred zostupnou hranou, takže keď ste vzorkovali zostupnú hranu, potom viete, že si môžete prečítať pin /DATA1 a získať platnú hodnotu. Tu je kód na vytvorenie vášho externého prerušenia spusteného na klesajúcej hrane.

voidInitInterrupt (void) {// Nastavenie prerušenia BSET (EIMSK, INT0); // maska externého prerušenia BSET (EICRA, ISC01); // klesajúca hrana BCLR (EICRA, ISC00); // padajúca hrana BSET (SREG, 7); // I-bit v SREG}

V mojom common.h, ktorý zahrnujem do všetkých svojich programov, možno nájsť definície BSET a BCLR. Ak máte otázky týkajúce sa nastavenia bitov, pozrite sa do tohto súboru. Teraz, keď sa spustí prerušenie, chceme vzorkovať /DATA1 (v mojom kóde definovanom ako CARD_DATA) a nastaviť bit vo všeobecnom registri IO. Ak sme na 7. bite, uložte register ako znak v našej globálnej vyrovnávacej pamäti. Používam register GPIOR0, pretože je to rýchly rýchly prístup. Pseudokód je niečo také:

Zastaviť 16-bitový časovač Vymazať časovač Ak je DÁTA NÍZKA Nastaviť BIT = 1 v REGISTER Znížiť BIT Nastaviť príznak, aby sme nepreskočili žiadne ďalšie 0 DATA je VYSOKÁ Nastaviť BIT = 0 v REGISTRÁCI Znížiť BIT Ak je BIT 0 Pridať byte do vyrovnávacej pamäte Index prírastku Reset BIT

Ak sa pýtate, prečo namiesto prírastku znižovať, pamätajte na to, že údaje sú späť, takže namiesto zaznamenávania bitov, ako ich dostaneme z LSB do MSB, ich uložíme z MSB do LSB, aby sme bity nemuseli obrátiť neskôr pri spracovaní údajov. Ak by ste naozaj chceli, môžete sem tiež pridať 0x20 hex, ale keďže na tieto blesky je to asi 5us, obmedzujem spracovanie v tejto rutinnej službe prerušenia na minimum.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // inverzná nízka = 1 {BSET (GPIOR0, bit); --trocha; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --trocha; } if (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Ak vás zaujíma, o čom je načasovanie, je to zahrnuté v kroku pri určovaní, kedy karta opustila čítačku.

Krok 5: Prečítajte si dátový tok

Prečítajte si prúd údajov

Už som vám ukázal, ako čítať údaje, pretože je to súčasť rutiny služby prerušenia pre naše externé prerušenie na hrane. Alternatívnou metódou by bolo nastaviť príznak v ISR a v prieskume hlavnej slučky vlajku a prečítať údaje týmto spôsobom, ale verím, že spôsob, akým som ich predstavil, je čistejší. Buďte svojim vlastným sudcom a píšte svoj, ale váš MCU to umožní. Ako už bolo povedané, prejdime k zisteniu, ako zistiť, kedy karta ťahá Elvisa a opustila budovu.

Krok 6: Zistite, že karta odchádza z čítačky

Zistite, ako karta opúšťa čítačku
Zistite, ako karta opúšťa čítačku

Zistite, kedy karta zmizla

Formálne by sme mohli ochutnať pin /CARD_PRESENT, aby sme zistili, či opäť nezmizol HIGH, ale nepotrebujeme žiadny steenkin ' /CARD_PRESENT, ktorý zaberá ďalší I /O port. Tu vstupujú tieto časovače. Zakaždým, keď sa vyvolá prerušenie, pretože sme zistili klesajúcu hranu na /STROBE, zastavíme časovač, vymažeme hodnotu časovača a začneme čítať. Keď sme dočítali, znova spustíme stopky. Opakujte ad nauseum, alebo kým časovač nedosiahne určitú hodnotu. To znamená, že bolo zavolané posledné prerušenie a neprišli žiadne ďalšie údaje, takže predpokladáme, že to je ono a začneme spracovávať údaje, ktoré sme zhromaždili. Na časovače používame TIMER1, teda 16-bitový časovač. Externe používam 16 Mhz rezonátor k svojmu AVR. Ak používate arduino, pravdepodobne aj vy. Vybral som teda hodnotu predzosilňovača 1024, čo znamená, že každých (16 000 000 000/1024) krát sa časovač zvýši. To znamená, že to bude „zaškrtávať“15, 625 krát za sekundu. /CARD_PRESENT bude VYSOKÝ, čo znamená, že karta opustila čítačku asi 150 ms po poslednom dátovom bite. Keď som to vedel, rozhodol som sa skontrolovať asi každú 1/4 sekundy. Vyzeralo by to asi takto:

((((F_CPU) / PRESCALER) / 4) čo sa ukazuje okolo 3900. Takže, keď počítadlo časovača TCNT1 dosiahne 3900, potom viem, že to bolo asi 300 ms a môžem celkom bezpečne usúdiť, že karta opustila čítačku. Ľahko

#define PRESCALER 1024#define CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#define StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler#define StopTimer () BCLR (TCCR1B (CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) V ISR ste videli, kde sa časovač spustí, zastaví a vymaže pri každom prerušení. Teraz v hlavnej slučke len skontrolujeme, či počítadlo časovača dosiahlo našu cieľovú hodnotu, a ak áno, spustite spracovanie údajov

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

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Teraz je možné údaje bezpečne spracovať

kód vo formáte

Krok 7: Spracujte údaje

Spracovať údaje
Spracovať údaje

Spracujte údaje

Fáza spracovania pozostáva z:

  • kontrola platného SS
  • kontrola parity
  • prevod na ASCII
  • kontrola platného ES
  • kontrola LRC

Tu sa neobťažujem s kontrolou parity, pretože som nastavil tento bit na nulu. Tiež nepočítam LRC pre tento malý návod. To by bolo niečo, čo by mohol chcieť plne implementovaný firmvér. Tu je kód na spracovanie údajov vykonaním vyššie uvedených krokov (bez vyššie uvedeného). Nájdite to na obrázku nižšie. Je to komentované a dosť samozrejmé. Špeciálna poznámka k parite a ASCII: Jednoducho vyčistím paritný bit (7. bit… tj 1 so 6 nulami za ním) a na konverziu z „údajov karty“musíte k hodnote pripočítať 0x20. To je asi tak všetko.

Krok 8: Zobrazte údaje

Zobraziť údaje
Zobraziť údaje
Zobraziť údaje
Zobraziť údaje

Zobrazte údaje

Displej prejde na terminálový program, ktorý som napísal špeciálne na pripojenie k AVR cez RS232 alebo USB. Program sa nazýva AVR Terminal. Metóda ReadData () je dosť škaredá a odporúča sa vám nájsť čistejšie riešenie, než aké som vymyslel. V AVR Terminal je aj výstup tejto funkcie. Výstupom je najskôr preukaz zdravotného poistenia a druhý preukaz VISA. Kliknite na v ľavom hornom rohu obrázku a vyberte pôvodný alebo veľký obrázok, aby bol obrázok lepšie.

Krok 9: Stiahnutie kódu a zabalenie

V tomto návode som diskutoval o niektorých základoch čítačiek magnetických kariet a ukázal som vám kód, ktorý vám pomôže začať správnym smerom pri čítaní údajov z magnetických kariet. Je tu ešte veľa práce, ako je čítanie a dekódovanie 2. stopy, výpočet LRC a výpočet nepárnej parity na každom bajte. Úplný zdrojový kód je k dispozícii na stiahnutie nižšie. To bolo napísané v AVR Studio 4.17. Dúfam, že sa vám tento návod páčil a ako vždy sa teším na vaše prípadné pripomienky alebo návrhy. Šťastné kódovanie a AVR'ing!

Odporúča: