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, Juli
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č magnetnih kartica. Mislim, ko ovih dana nosi gotovinu? Ni njima nije teško doći u ruke, a tijekom putovanja u moju omiljenu lokalnu radnju elektronike našao sam kantu punu ovih momaka. Pa …, naravno, uzeo sam jedan i odnio ga kući da vidim kakve stvari mogu učiniti s njim i AVR -om.

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

Korak 1: Lista opreme

Lista opreme
Lista opreme
Lista opreme
Lista opreme

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

  • Čitač magnetnih kartica (Moj je Magetk čitač sa 90 glava sa dvije glave. 5,00 USD)
  • AVR, Arduino ili klon (ATmega328p ~ 4,30 USD sa Mouser.com
  • lemna ploča
  • malo žice
  • možda zaglavlje ako vam se dopada takva stvar.
  • nešto za čitanje vašeg serijskog porta. Koristim AVR terminal sa BattleDroids.net

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

Korak 2: Čitači magnetnih kartica sa automatskim otključavanjem

Čitači magnetnih kartica sa automatskim otključavanjem
Čitači magnetnih kartica sa automatskim otključavanjem
Čitači magnetnih kartica sa automatskim otključavanjem
Čitači magnetnih kartica sa automatskim otključavanjem
Čitači magnetnih kartica sa automatskim otključavanjem
Čitači magnetnih kartica sa automatskim otključavanjem
Čitači magnetnih kartica sa automatskim otključavanjem
Čitači magnetnih kartica sa automatskim otključavanjem

Čitači magnetnih kartica su "samotaktni", što znači da pružaju sat nazvan stroboskop, s kojim se povezani mikrokontroler može sinkronizirati. Ovo je blagodat. To znači da ne morate brinuti o traženju signala taktiranja i namještanju signala za centriranje direktno na taktnom pulsu, i bez smetnji koje osciliraju u slatku takt signala. Ovo ima smisla kada razmišljate o prevlačenju kartica: svi prevlače različitim tempom, neki sporije, neki brže od drugih. Samotaktanje omogućava čak i mojoj dragoj baki mogućnost korištenja kartice bez lomljenja zgloba. 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 da ćete odgoditi da uđete u "bit time". Za čitač s dvije glave, poput onog koji koristim, dostupne su za čitanje dvije podatkovne trake. U ovom će se članku prikazati čitanje s prve primarne pjesme kako biste započeli. Morate 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) se čita kao jedan ili visoki. Ostali konektori 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 opada 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 da su podaci koje dobivate podaci o kartici i nije smeće. Ovu vezu možete preskočiti ako provjerite postoji li početni nadzornik u toku podataka. 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 Bare Bones -om 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 trebate učiniti za čitanje magnetne 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 magnetne kartice koje ćete morati znati kada počnete pisati vlastiti kod.

Standardi magnetnih 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 Lokacija reljefnih znakova 7811-4 Lokacija tragova 1 & 2 7811- 5 Lokacija kolosijeka 3 7811-6 Magnetska traka - visoka prinuda 7813 Kartice za finansijske transakcije Kao što vidite, finansijske kartice su navedene u zasebnom dokumentu i često imaju različite formate od, na primjer, vaše kartice za kupovinu ili međunarodne pozivne kartice. 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 magnetnih kartica. 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 vjeruju ISO, vjerujem, dok N do ?? su rezervirane za institucionalnu prilagođenu upotrebu. Pravac 1 Za finansijske kartice, prvi zapis se bilježi pri 210 bita po inču i predstavlja prvih 0,110 "kartice od 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, ali su zapisani unatrag na kartici (i stoga će ih vaš firmver čitati) kao. paritet je čudan. Format podataka kartice izgleda ovako:

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

SS Pokreni nadzornik FC Šifra formata FS Odvajač 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 se zapisuju na karticu unatrag, podaci imaju neparan paritetni bit 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 od 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 da vidite kod koji implementira gore opisanu proceduru.

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, ovo 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. Čitač će poslati oko 60-70 početnih nula kako bi vas obavijestio da će se podaci uskoro predstaviti. Međutim, koristit ćemo prirodu binarnih podataka kako bismo odredili kada započeti snimanje bitova. Početni nadzornik (SS) za prvu pjesmu je znak postotka (%). Njegova binarna vrijednost je 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). Pronicljivi čitač će primijetiti da, iako su podaci unatrag, ne odgovaraju binarnoj ASCII vrijednosti. To je zato što je 0x20 izvan heksa. Simbol % je 0x25, a 0100 0101 je 0x05. Podaci kartice imaju 0x20 oduzeto od vrijednosti. Onaj koji visi tamo u visokom grickanju je čudan paritet. Stavljeno je tako da u vrijednosti postoji neparan broj "1". Dakle, jer znamo da će valjana kartica uvijek početi s ovim startnim nadzornikom, a budući da je paritet bit 1, tada kada otkrijemo prvi prijelaz HIGH to LOW na podatkovnom pinu, tada znamo da smo tek počeli primati pokrenite nadzornika s kartice. Ovo neće uvijek biti istina, a siguran plan bi bio 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ćoj ivici /STROBE. Podaci vrijede 1,0 us prije padajuće ivice, pa kada ste uzorkovali padajuću ivicu, znate da možete pročitati /DATA1 pin i dobiti valjanu vrijednost. Evo koda za stvaranje vanjskog prekida pokrenutog na opadajućoj ivici.

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, sačuvajte registar kao znak u našem globalnom baferu. Koristim GPIOR0 registar jer ima brz pristup. Pseudo kod je otprilike ovako:

Zaustavi 16-bitni tajmer Očisti tajmer Ako su DATA NISKI Postavite BIT = 1 u REGISTER Decrement BIT Postavite zastavicu da više ne preskačemo druge 0 DATA je HIGH Postavi BIT = 0 u REGISTER Smanji BIT Ako je BIT 0 Dodajte bajt u bafer Indeks povećanja Resetiraj 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 prilikom obrade podataka. Ako ste zaista htjeli, ovdje biste mogli dodati i heksadecimalni 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 timingom, to je opisano u koraku u određivanju kada je kartica napustila čitač.

Korak 5: Pročitajte tok podataka

Čitajte tok podataka

Pa, već sam vam pokazao kako čitati podatke, jer su oni dio rutine usluge prekida za naš padajući 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, neko bi uzeo uzorak /CARD_PRESENT pina da vidimo da li je opet previsok, ali ne treba nam steenkin ' /CARD_PRESENT koji zauzima drugi I /O port. Ovdje dolaze ti mjerači. Svaki put kada se pozove prekid jer smo otkrili opadanje na /STROBE, zaustavljamo tajmer, brišemo vrijednost tajmera i započinjemo čitanje. Kad završimo s čitanjem, ponovo 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 nije došlo više podataka, pa pretpostavljamo da je to to i započinjemo obradu prikupljenih podataka. Za tajmere koristimo TIMER1, odnosno 16-bitni mjerač vremena. Koristim rezonator od 16 Mhz izvana za svoj AVR. Ako koristite arduino, vjerojatno i vi jeste. Dakle, odabrao sam 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 je ispalo 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 tajmer pokreće, zaustavlja i briše pri svakom prekidu. Sada u glavnoj petlji samo provjeravamo da li je brojač vremena dosegao našu ciljnu vrijednost, i ako je tako, započnite obradu podataka

for (;;) {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
  • pretvaranje u ASCII
  • provjera valjanosti ES -a
  • provera LRC -a

Ovdje se ne zamaram provjerom pariteta, jer sam samo postavio taj bit na nulu. Takođe ne računam LRC za ovaj mali vodič. To bi bilo nešto što bi potpunije realizirani firmver 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 samorazumljivo. Posebna napomena o paritetu i ASCII: Jednostavno očistim paritetni bit (7. bit … tj. 1 sa 6 nula iza njega) i za pretvaranje iz "kartičnih podataka" morate dodati 0x20 u vrijednost. 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 terminal program koji sam napisao posebno za povezivanje na AVR putem RS232 ili USB -a. Program se zove AVR terminal. Metoda ReadData () je prilično ružna i ohrabrujete se da pronađete čišće rješenje od onog koje sam smislio. Tu je i izlaz funkcije u AVR terminalu. Ispis je prvi na kartici zdravstvenog osiguranja, a drugi na VISA kartici. Kliknite na u gornjem lijevom kutu slike i odaberite originalnu ili veliku sliku da biste je bolje vidjeli.

Korak 9: Preuzimanje koda i njegovo zaključavanje

U ovom uputstvu sam raspravljao o osnovama čitača magnetnih kartica i pokazao vam kôd za početak u pravom smjeru čitanja podataka s magnetnih kartica. Moglo bi se obaviti još mnogo posla, poput čitanja i dekodiranja drugog zapisa, izračunavanja LRC -a i izračunavanja neparnog pariteta na svakom bajtu. Cijeli izvorni kod dostupan je za preuzimanje ispod. Napisano je u AVR Studio 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čuje se: