Sadržaj:

Pretvorite svoj Arduino u čitač magnetskih kartica!: 9 koraka (sa slikama)
Pretvorite svoj Arduino u čitač magnetskih kartica!: 9 koraka (sa slikama)

Video: Pretvorite svoj Arduino u čitač magnetskih kartica!: 9 koraka (sa slikama)

Video: Pretvorite svoj Arduino u čitač magnetskih kartica!: 9 koraka (sa slikama)
Video: Fixing Marlin Firmware loading issues on 32-bit MCU(s) 2024, Srpanj
Anonim
Pretvorite svoj Arduino u čitač magnetskih kartica!
Pretvorite svoj Arduino u čitač magnetskih kartica!
Pretvorite svoj Arduino u čitač magnetskih kartica!
Pretvorite svoj Arduino u čitač magnetskih kartica!
Pretvorite svoj Arduino u čitač magnetskih kartica!
Pretvorite svoj Arduino u čitač magnetskih kartica!

Vjerujem da su svi koristili čitač magnetskih kartica. Mislim, tko ovih dana nosi gotovinu? Ni njima nije teško doći u ruke, a tijekom putovanja u moju omiljenu lokalnu trgovinu elektronike našao sam kantu punu ovih momaka. Pa ….naravno, uzeo sam jedan i donio ga kući da vidim kakve stvari mogu učiniti s njim i AVR -om.

Ova instrukcija će vam pokazati kako spojiti čitač magnetnih kartica Magtek na AVR ili Arduino/klon i čitati podatke s prvog zapisa kartice. Zakopčajte svoja sjedala; Čitači magnetskih kartica imaju visoku brzinu prijenosa podataka!

Korak 1: Popis opreme

Popis opreme
Popis opreme
Popis opreme
Popis opreme

Evo nekoliko stvari koje će vam trebati za početak.

  • Čitač magnetskih kartica (Moj je Magetk čitač s dvije glave od 90 mm. 5,00 USD)
  • AVR, Arduino ili klon (ATmega328p ~ 4,30 USD s Mouser.com
  • ploča za lemljenje
  • neku žicu
  • možda zaglavlje ako vam se sviđa takva stvar.
  • nešto za čitanje vašeg serijskog porta. Koristim AVR terminal s BattleDroids.net

To je sve što vam treba za početak. Ovisno o čitaču magcard koji ste na kraju dobili, možda ćete morati izmijeniti ove upute, a najvjerojatnije i kôd, kako biste radili s vašim čitačem. Međutim, nadam se da bi kod koji sam napisao trebao daleko stići.

Korak 2: Čitači magnetskih kartica koji se sami otvaraju

Čitači magnetskih kartica sa automatskim otključavanjem
Čitači magnetskih kartica sa automatskim otključavanjem
Čitači magnetskih kartica sa automatskim otključavanjem
Čitači magnetskih kartica sa automatskim otključavanjem
Čitači magnetskih kartica sa samotaktanjem
Čitači magnetskih kartica sa samotaktanjem
Čitači magnetskih kartica sa automatskim otključavanjem
Čitači magnetskih kartica sa automatskim otključavanjem

Čitači magnetskih kartica imaju "samotaktanje", što znači da pružaju sat nazvan stroboskop, s kojim se povezani mikrokontroler može sinkronizirati. Ovo je blagodat. To znači da se ne morate brinuti o traženju takta i signalu za usmjeravanje signala da se centrira izravno na pulsu sata, te da nema smetnji koje osciliraju u slatku točku signala sata. Ovo ima smisla kada razmišljate o prevlačenju kartica: svatko prelazi drugačijim tempom, neki sporije, neki brže od drugih. Samotaktanje omogućuje čak i mojoj dragoj baki mogućnost korištenja kartice bez lomljenja zapešća. Podsjeća me na to da joj moram promijeniti postavku koja određuje koliko vremena vrijedi između klikova za registraciju dvostrukog klika….

Podaci ovog čitača kartica vrijede 1,0 US prije nego što je stroboskop stavljen na liniju, tako da nema brige oko odgode kako biste ušli u "bit time". Za čitač s dvije glave, poput onog koji koristim, postoje dvije podatkovne trake dostupne za čitanje. U ovom ću članku prikazati čitanje s primarne prve pjesme kako biste započeli. Trebate uspostaviti pet veza (četiri ako vam ne smeta odustati od bolje podešene kontrole za manje korištenja I/O portova). Pogledajte donju sliku. Crvena žica ide na +5V, dok crna žica ide na masu. Zelena žica je /CARD_PRESENT; žuta žica je /STROBE, a bijela žica /DATA1. Kosa crta (/) znači da su podaci obrnuti. Nizak signal (tj. 0) čita se kao jedan ili visoki. Ostali priključci su smeđi za /STROBE2 i narančasti za /DATA2. Nećemo ih koristiti. Ako želite, možete zaboraviti na /CARD_PRESENT. Ova linija podataka pada nisko nakon otprilike 17 rotacija protoka glave što ukazuje na to da je kartica prisutna (umjesto, recimo, slučajne buke koja uzrokuje da vaš čitač šalje lažne podatke) i koristi se za provjeru jesu li podaci koje dobivate podaci o kartici i ne smeće. Ovu vezu možete preskočiti ako provjerite postoji li početni nadzornik u podatkovnom toku. O tome kasnije. Kao što možete vidjeti u nastavku, koristio sam pravokutno muško zaglavlje spojeno na ploču za kruh i na to povezao čitač. Spojio sam /STROBE na PIND2 (digitalni pin 2 na Arduinu), /CARD_PRESENT na PIND3 (radi ilustracije) i /DATA1 na PIND4. Omogućite povlačenje na ovim pinovima kako vam pinovi ne bi plutali. Također sam prodao svoj Arduino za AVR s golim kostima jer mi se sviđa način na koji se uklapa u matičnu ploču.

Korak 3: Osnove magnetske kartice

Osnove magnetske kartice
Osnove magnetske kartice

Primarne funkcije koje ćete morati učiniti za čitanje magnetske kartice su: 1. Otkrijte kada je kartica prevučena 2. Čitajte tok podataka 3. Otkrijte kada je kartica otišla 4. Obradite podatke 5. Prikažite podaci Prvo ću vas upoznati s osnovama magnetske kartice koje ćete morati znati kada počnete pisati vlastiti kod.

Standardi magnetskih kartica

Magnetske kartice ISO je standardizirao u sljedećim dokumentima: 7810 Fizičke karakteristike dokumenta veličine kreditne kartice 7811-1 Istiskivanje 7811-2 Magnetska traka-niska koercitivnost 7811-3 Položaj reljefnih znakova 7811-4 Položaj tragova 1 & 2 7811- 5 Položaj kolosijeka 3 7811-6 Magnetska traka - visoka prisilnost 7813 Kartice za financijske transakcije Kao što vidite, financijske kartice navedene su u zasebnom dokumentu i često imaju različite formate od, recimo, vaše kartice za kupnju ili međunarodne pozivnice. Za te razlike morat ćete programirati. Upravo sam imao kreditnu karticu i karticu osiguranja pri ruci, pa sam programirao za ove vrste (koje su obje u formatu B).

Formati kartica

Postoji nekoliko različitih formata za magnetske kartice. Formati A i B su uobičajeni, a B je najčešći koji sam vidio i koji je podržan u ovom kodu. Formati od C do M, ISO su rezervirani, vjerujem, dok N do ?? rezervirani su za institucionalnu prilagođenu uporabu. Zapis 1 Za financijske kartice prvi zapis bilježi se sa 210 bita po inču i predstavlja prvih 0,110 "kartice s vrha. Podaci su kodirani kao" podaci o kartici "kao 7-bita po znaku. To je 6-bita za znak i bit za paritet. Na stazi 1. nalazi se ~ 79 alfanumeričkih znakova. Fizički redoslijed je obrnut. To jest, podaci su zapisani unatrag na kartici (i stoga će ih vaš firmver čitati) kao. paritet je neparan. Format podataka kartice izgleda ovako:

[SS] [FC] [Primarni račun #] [FS] [Naziv] [FS] [Dodatni podaci] [FS] [ES] [LRC] gdje:

SS Start stražar FC Šifra formata FS Razdjelnik polja ES Kraj nadzornika LRC Uzdužna redundancija Znak za provjeru Pratite jedan SS = '%', FC = jedan od formata (bit će B mnogo puta), FS je često '', ES je '?' i LRC znak je obično '<' iako to nije specificirano u standardima. Osim što su zapisani na karticu unatrag, podaci imaju neparni bit pariteta i 0x20 su iz ASCII -a. To ćemo riješiti kad obradimo podatke. Traka 2 Druga staza je široka 0,110 "i počinje 0,110 s vrha kartice. Gustoća snimanja je 75 bita po inču. Podaci su 5-bitni po znaku i sastoje se od samo 40 numeričkih simbola. Ne biste trebali naići na bilo koji slova na ovoj pjesmi. Format podataka kartice trebao bi slijediti ovu strukturu

[SS] [primarni račun #] [FS] [dodatni podaci | diskrecijski podaci] [ES] [LRC]

SS za drugu stazu je točka -zarez: ';' a FS je '=' S ovim svetim znanjem pod pojasom, nastavite do sljedećih koraka kako biste vidjeli kôd koji provodi gore opisani postupak.

Korak 4: Otkrijte kada se kartica prevuče

Otkrijte kada se kartica prevuče
Otkrijte kada se kartica prevuče

1. Otkrijte kada je kartica prevučena Formalno, provjerili biste /CARD_PRESENT pin da vidite je li nisko pao. Srećom, to zapravo nije potrebno. Kasnije ćemo provjeriti valjanost kartice. Alternativno, mogli biste pročitati svoj strobo pin kako biste vidjeli kada su strobovi postavljeni na pin, međutim, to će vam umanjiti mnogo nula takta. Čitatelj će poslati oko 60-70 početnih nula kako bi vas obavijestio da će se podaci uskoro predstaviti. No, koristit ćemo prirodu binarnih podataka kako bismo odredili kada započeti snimanje bitova. Početni nadzornik (SS) za prvu pjesmu je znak postotka (%). Njegova je binarna vrijednost 0010 0101, što znači da će biti pohranjena (i pročitana) kao 1010 001 (7-bitna je, tako da se osmi bit ne prenosi). Pametan čitatelj primijetit će da, iako su podaci unatrag, ne odgovaraju binarnoj ASCII vrijednosti. To je zato što je 0x20 izvan heksa. Simbol % je 0x25, a 0100 0101 0x05. Podaci kartice imaju 0x20 oduzeto od vrijednosti. Onaj koji visi tamo u visokom grickanju je čudan paritet. Stavlja se tako da u vrijednosti postoji neparan broj "1". Dakle, jer znamo da će valjana kartica uvijek početi s ovim početnim nadzornikom, a budući da je paritet bit 1, tada kada otkrijemo prvi prijelaz od VISE do NISKE na podatkovnom pinu, tada znamo da smo tek počeli primati pokrenite nadzornika s kartice. Ovo neće uvijek biti istina, a siguran plan bio bi provjeriti /CARD_PRESENT karticu da provjerite je li dodatno pala. Najjednostavniji način za otkrivanje početka SS -a je stvaranje vanjskog prekida pokrenutog na padajućem rubu /STROBE. Podaci vrijede 1,0 us prije padajućeg ruba, pa kada ste uzorkovali padajući rub, znate da možete pročitati /DATA1 pin i dobiti valjanu vrijednost. Evo koda za stvaranje vanjskog prekida pokrenutog na padu.

voidInitInterrupt (void) {// Postavljanje prekida BSET (EIMSK, INT0); // vanjska maska prekida BSET (EICRA, ISC01); // padajući rub BCLR (EICRA, ISC00); // padajući rub BSET (SREG, 7); // I-bit u SREG}

U mom common.h -u koji uključujem u sve svoje programe mogu se pronaći definicije BSET -a i BCLR -a. Pogledajte tu datoteku ako imate pitanja o tome kako postaviti bitove. Sada, kada se prekid aktivira, želimo uzorkovati /DATA1 (u mom kodu definiranom kao CARD_DATA) i postaviti malo u IO registar opće namjene. Ako smo na 7. bitu, spremite izvan registra kao znak u našem globalnom međuspremniku. Koristim GPIOR0 registar jer ima brz pristup. Pseudo kod je otprilike ovako:

Zaustavi 16-bitni mjerač Očisti tajmer Ako su DATA NISKI Postavite BIT = 1 u REGISTER Decrement BIT Postavite zastavicu tako da više ne preskačemo druge 0 DATA je HIGH Set BIT = 0 u REGISTER Smanji BIT Ako je BIT 0 Dodajte bajt u međuspremnik Indeks povećanja Resetirajte BIT

Ako se pitate zašto se smanjuje umjesto povećanja, imajte na umu da su podaci unatrag, pa umjesto da bilježimo bitove dok ih primamo iz LSB -a u MSB, spremamo ih iz MSB -a u LSB tako da ne moramo obrnuti bitove kasnije pri obradi podataka. Ako ste doista htjeli, ovdje biste mogli dodati i šesterokutni format 0x20, ali budući da je riječ o 5us na ovim strobovima, držim obradu u ovoj rutini prekida usluga na minimumu.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // inverzno nisko = 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 ();} Ako se pitate o čemu se radi s timeingom, to je opisano u koraku u određivanju kada je kartica napustila čitač.

Korak 5: Pročitajte tok podataka

Pročitajte tok podataka

Pa, već sam vam pokazao kako čitati podatke jer su oni dio rutine usluge prekida za naš vanjski prekid. Alternativna metoda bila bi postavljanje zastavice u ISR -u, a u glavnoj petlji anketiranje zastavice i čitanje podataka na taj način, ali vjerujem da je način na koji sam ih predstavio čistiji. Budite sami svoj sudac i napišite svoj kako god vaš MCU to dopustio. S obzirom na to, prijeđimo na otkrivanje kako otkriti kada kartica izvuče Elvisa i napusti zgradu.

Korak 6: Otkrijte karticu koja napušta čitač

Otkrijte karticu koja napušta čitač
Otkrijte karticu koja napušta čitač

Otkrijte kada je kartica nestala

Formalno, jedan bi uzorkovao /CARD_PRESENT pin da provjeri je li opet previsok, ali ne trebamo steenkin ' /CARD_PRESENT koji uzima drugi U /I port. Ovdje dolaze ti mjerači vremena. Svaki put kada se prekid pozove jer smo otkrili opadajući rub na /STROBE, zaustavljamo mjerač vremena, brišemo vrijednost mjerača vremena i započinjemo čitanje. Kad završimo s čitanjem, ponovno pokrećemo mjerač vremena. Ponavljajte ad mučninu ili dok mjerač vremena ne dosegne određenu vrijednost. To znači da je pozvan posljednji prekid i da nema više podataka, pa pretpostavljamo da je to to i započinjemo obradu prikupljenih podataka. Za mjerače vremena koristimo TIMER1, odnosno 16-bitni mjerač vremena. Koristim rezonator od 16 Mhz izvana za svoj AVR. Ako koristite arduino, vjerojatno i jeste. Stoga sam odabrao vrijednost predskalera od 1024, što znači da će svaki (16, 000, 000 /1024) puta tajmer rasti. Odnosno, otkucavat će 15, 625 puta u sekundi. /CARD_PRESENT će biti VISOKO označavajući da je kartica ostavila čitač oko 150 ms nakon zadnjeg bita podataka. Znajući to, samo sam odlučio provjeriti otprilike svake 1/4 sekunde. To bi izgledalo otprilike ovako:

(((F_CPU) / PRESCALER) / 4) što se pokazalo oko 3900. Dakle, kad brojač vremena TCNT1 dosegne 3900, onda znam da je prošlo oko 300 ms i mogu prilično sigurno zaključiti da je kartica napustila čitač. Lako

#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) Vidjeli ste u ISR -u gdje se mjerač vremena pokreće, zaustavlja i briše pri svakom prekidu. Sada u glavnoj petlji samo provjeravamo je li brojač vremena postigao našu ciljnu vrijednost, i ako je tako, započnite obradu podataka

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

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Sada je obrada podataka sigurna

kôd formatiran na

Korak 7: Obradite podatke

Obradite podatke
Obradite podatke

Obradite podatke

Faza obrade sastoji se od:

  • provjera valjanosti SS -a
  • provjera pariteta
  • pretvarajući se u ASCII
  • provjera valjanosti ES -a
  • provjera LRC -a

Ovdje se ne zamaram provjerom pariteta, jer sam samo postavio taj bit na nulu. Također ne računam LRC za ovaj mali vodič. To bi bilo nešto što bi potpunije realizirani firmware mogao htjeti učiniti. Evo koda za obradu podataka radeći gore navedene korake (bez prethodno spomenutog). Pronađite ga na donjoj slici. Komentirano je i prilično samo po sebi razumljivo. Posebna napomena o paritetu i ASCII: Jednostavno očistim paritetni bit (7. bit … tj. 1 sa 6 nula iza njega) i za pretvorbu iz "kartičnih podataka" morate vrijednosti dodati 0x20. To je otprilike to.

Korak 8: Prikažite podatke

Prikažite podatke
Prikažite podatke
Prikažite podatke
Prikažite podatke

Prikažite podatke

Zaslon ide na terminalni program koji sam napisao posebno za povezivanje s AVR -om putem RS232 ili USB -a. Program se naziva AVR terminal. Metoda ReadData () prilično je ružna i potičete se da pronađete čišće rješenje od onog koje sam smislio. Tu je i izlaz funkcije u AVR terminalu. Ispis je prvo kartica zdravstvenog osiguranja, a drugi je kartica VISA. Pritisnite u gornjem lijevom kutu slike i odaberite izvornu ili veliku sliku da biste je bolje vidjeli.

Korak 9: Preuzimanje koda i njegovo zaključavanje

U ovom uputstvu raspravljao sam o osnovama čitača magnetskih kartica i pokazao vam kôd za početak u pravom smjeru čitanja podataka s magnetskih kartica. Moglo bi se učiniti još mnogo posla, poput čitanja i dekodiranja 2. zapisa, izračunavanja LRC -a i izračunavanja neparnog pariteta na svakom bajtu. Cijeli izvorni kod dostupan je za preuzimanje u nastavku. Napisano je u AVR Studiju 4.17. Nadam se da ste uživali u ovom uputstvu i, kao i uvijek, radujem se vašim komentarima ili prijedlozima. Sretno kodiranje i AVR'ing!

Preporučeni: