INHOUDSOPGAWE:

Verander u Arduino in 'n magnetiese kaartleser !: 9 stappe (met foto's)
Verander u Arduino in 'n magnetiese kaartleser !: 9 stappe (met foto's)

Video: Verander u Arduino in 'n magnetiese kaartleser !: 9 stappe (met foto's)

Video: Verander u Arduino in 'n magnetiese kaartleser !: 9 stappe (met foto's)
Video: Marlin Firmware 2.0.x Explained 2024, Julie
Anonim
Verander u Arduino in 'n magnetiese kaartleser!
Verander u Arduino in 'n magnetiese kaartleser!
Verander u Arduino in 'n magnetiese kaartleser!
Verander u Arduino in 'n magnetiese kaartleser!
Verander u Arduino in 'n magnetiese kaartleser!
Verander u Arduino in 'n magnetiese kaartleser!

Almal het 'n magnetiese kaartleser gebruik, glo ek. Ek bedoel, wie dra deesdae kontant? Dit is ook nie moeilik om u in die hande te kry nie, en tydens 'n reis na my gunsteling plaaslike elektroniese winkel, vind ek 'n bak vol van hierdie ouens. So … natuurlik het ek een opgetel en huis toe gebring om te sien watter soort dinge ek daarmee kan doen en 'n AVR.

Hierdie instruksies sal jou wys hoe om 'n Magtek magnetiese kaartleser aan te sluit op 'n AVR of Arduino/kloon en data van die eerste kaartspoor te lees. Maak jou sitplekke vas; magnetiese kaartlesers het 'n hoë bitsnelheid!

Stap 1: Toerustinglys

Die toerustinglys
Die toerustinglys
Die toerustinglys
Die toerustinglys

Hier is 'n paar dinge wat u nodig het om te begin.

  • Magnetiese kaartleser (Myne is 'n Magetk 90mm dubbele kopleser. $ 5,00)
  • AVR, Arduino of kloon (ATmega328p ~ $ 4,30 van Mouser.com
  • soldeerlose broodbord
  • 'n paar draad
  • miskien 'n kop as u van die soort ding hou.
  • iets om u seriële poort te lees. Ek gebruik AVR Terminal van BattleDroids.net

Dit is al wat u nodig het om te begin. Afhangende van die magcard -leser wat u uiteindelik kry, moet u hierdie instruksies, en verseker die kode, verander om saam met u spesifieke leser te werk. Die kode wat ek geskryf het, moet u egter redelik ver bring, hoop ek.

Stap 2: Selfklokende magnetiese kaartlesers

Self-klok magnetiese kaartlesers
Self-klok magnetiese kaartlesers
Self-klok magnetiese kaartlesers
Self-klok magnetiese kaartlesers
Self-klok magnetiese kaartlesers
Self-klok magnetiese kaartlesers
Self-klok magnetiese kaartlesers
Self-klok magnetiese kaartlesers

Magnetiese kaartlesers is 'selfklok', wat beteken dat hulle 'n horlosie genaamd 'n strobe 'verskaf', waarteen die gekoppelde mikrobeheerder kan sinkroniseer. Dit is 'n seën. Dit beteken dat u nie hoef te bekommer oor 'n horlosiesignaal en die tydsberekening van die sein om direk op die klokpuls te sentreer nie, en dat daar geen lastige pendeling na die lieflike plek van die kloksein moet wees nie. Dit is sinvol as u aan kaartvee dink: almal vee teen 'n ander tempo, sommige stadiger, sommige vinniger as ander. Selfklok laat selfs my liewe ouma toe om haar kaart te gebruik sonder om haar pols te breek. Herinner my daaraan dat ek die instelling vir haar moet verander wat bepaal hoeveel tyd tussen kliks is om 'n dubbelklik te registreer …

Die gegewens van hierdie kaartleser is geldig 1.0 ons voordat die strobe op die spel geplaas word, dus hoef u nie te vertraag om in die 'bietjie tyd' te kom nie. Vir 'n dubbelkopleser, soos die een wat ek gebruik, is daar twee dataspore beskikbaar om te lees. In hierdie artikel gaan ek die lees van die eerste snit wys om aan die gang te kom. Daar is vyf verbindings wat u sal moet maak (vier as u nie omgee om meer fyn ingestelde beheer prys te gee vir minder I/O -poorte nie). Kyk na die prentjie hieronder. Die rooi draad gaan na +5V terwyl die swart draad grond toe gaan. Die groen draad is /CARD_PRESENT; die geel draad is /STROBE, en die wit draad is /DATA1. Die vorentoe -skuinsstreep (/) beteken dat die data omgekeer is. 'N Lae sein (dws 0) word gelees as een, of hoog. Die ander verbindings is bruin vir /STROBE2 en oranje vir /DATA2. Ons sal dit nie gebruik nie. As u wil, kan u vergeet van /CARD_PRESENT. Hierdie gegewenslyn word laag na ongeveer 17 kopvloei -rotasies om aan te dui dat 'n kaart teenwoordig is (in plaas daarvan dat willekeurige geraas veroorsaak dat u leser valse data stuur) en word gebruik om te bevestig dat die data wat u kry, kaartdata is en rommel nie. U kan hierdie verbinding oorslaan as u na die beginwagter in die datastroom kyk. Meer hieroor later. Soos u hieronder kan sien, gebruik ek 'n reghoekige manlike kop wat aan 'n broodbord gekoppel is en my leser daaraan verbind. Ek het /STROBE gekoppel aan PIND2 (digitale pen 2 op 'n Arduino), /CARD_PRESENT na PIND3 (ter illustrasie), en /DATA1 na PIND4. Maak seker dat u die penne op hierdie penne aktiveer sodat u penne nie dryf nie. Ek het my Arduino ook verruil vir 'n Bare Bones AVR omdat ek hou van hoe dit in die broodbord pas.

Stap 3: Basiese beginsels van magnetiese kaart

Basiese beginsels van magnetiese kaart
Basiese beginsels van magnetiese kaart

Die belangrikste funksies wat u moet doen om 'n magnetiese kaart te lees, is: 1. Bespeur wanneer die kaart gevee is 2. Lees die stroom data 3. Bespeur wanneer die kaart weg is 4. Verwerk die data 5. Vertoon die data Eerstens stel ek u kennis met die basiese beginsels van magnetiese kaart wat u moet weet wanneer u u eie kode begin skryf.

Magnetiese kaartstandaarde

Magnetiese kaarte word gestandaardiseer deur die ISO in die volgende dokumente: 7810 Fisiese kenmerke van kredietkaartgrootte dokument 7811-1 Reliëf 7811-2 Magnetiese streep-lae koersiwiteit 7811-3 Ligging van reliëftekens 7811-4 Ligging van spore 1 & 2 7811- 5 Ligging van baan 3 7811-6 Magnetiese streep - hoë dwang 7813 Finansiële transaksiekaarte Soos u kan sien, word finansiële kaarte in 'n aparte dokument gespesifiseer en het dit dikwels verskillende formate as byvoorbeeld u kruideniersware kaart of internasionale telefoonkaart. U sal vir hierdie verskille moet programmeer. Ek het net 'n kredietkaart en 'n versekeringskaart byderhand, so ek het vir hierdie tipe programme geprogrammeer (wat beide toevallig formaat B is).

Kaartformate

Daar is verskillende formate vir magnetiese kaarte. Formaat A en B is algemeen, met B die algemeenste wat ek gesien het, en wat in hierdie kode ondersteun word. Formate C tot en met M word deur die ISO voorbehou, meen ek, terwyl N tot ?? is gereserveer vir institusionele gebruik. Snit 1 Vir finansiële kaarte word die eerste snit aangeteken teen 210 bits per duim en is die eerste 0.110 "van die kaart van bo af. Die data word as" kaartdata "as 7-bisse per karakter gekodeer. Dit is 6-bisse vir die karakter en 'n bietjie vir pariteit. Daar is ~ 79 alfanumerieke karakters op snit 1. Die fisiese ordening is agteruit. Dit wil sê, data is maar dit word agteruit op die kaart geskryf (en sal dus deur u firmware gelees word) as. pariteit is vreemd. Die kaartdata -formaat lyk so:

[SS] [FC] [Primêre rekening #] [FS] [Naam] [FS] [Bykomende data] [FS] [ES] [LRC] waar:

SS Begin wagter FC Formaatkode FS Veldafskeider ES Eindwagter LRC Longitudinale oortolligheid Kontroleer karakter Volg een SS = '%', FC = een van die formate (word baie keer B), FS is dikwels '', ES is '?' en die LRC -karakter is gewoonlik '<', hoewel dit nie in die standaarde gespesifiseer word nie. Behalwe dat dit agteruit op die kaart geskryf is, het die data 'n vreemde pariteitsbit en is dit 0x20 van ASCII. Ons sal dit hanteer wanneer ons die data verwerk. Snit 2 Snit twee is 0.110 "breed en begin 0.110 van die bokant van die kaart af. Die opnamedigtheid is 75 bis per duim. Die data is 5 bis per karakter en bestaan slegs uit ongeveer 40 numeriese simbole. letters op hierdie snit. Die kaartdataformaat moet hierdie struktuur volg

[SS] [primêre rekening #] [FS] [addisionele data | diskresionêre data] [ES] [LRC]

Die SS vir snit twee is die kommapunt: ';' en die FS is '=' Met hierdie heilige kennis onder u band, gaan u voort met die volgende stappe om te sien hoe die kode hierbo geïmplementeer word.

Stap 4: Ontdek wanneer 'n kaart gevee word

Ontdek wanneer 'n kaart gevee word
Ontdek wanneer 'n kaart gevee word

1. Ontdek of 'n kaart afgevee is. Gelukkig is dit nie regtig nodig nie. Ons kyk later na die geldige kaart. Alternatiewelik kan u u stroboskoppen lees om te sien of strofe op die pen gesit is, maar dit sal u baie kloknulhede oplewer. Die leser sal ongeveer 60-70 vooraanstaande nulle stuur om u te laat weet dat data op die punt staan om te verskyn. Ons gaan egter die aard van binêre data gebruik om te bepaal wanneer ons stukkies moet opneem. Die beginwag (SS) vir snit een is die persentasie teken (%). Die binêre waarde is 0010 0101, wat beteken dat dit gestoor (en gelees) word as 1010 001 (dit is 7-bis sodat die 8ste bis nie oorgedra word nie). Nou sal die skerpsinnige leser agterkom dat alhoewel die data agteruit is, dit nie ooreenstem met die binêre ASCII -waarde nie. Dit is omdat dit 0x20 van hex is. Die % -simbool is 0x25 en 0100 0101 is 0x05. Kaartdata is 0x20 van die waarde afgetrek. Die een wat daar in die hoë nibble hang, is die vreemde pariteit. Dit word daar geplaas sodat daar 'n onewe aantal "1" s in die waarde is. Dus, omdat ons weet dat 'n geldige kaart altyd met hierdie beginwag begin, en omdat die pariteitsbit 'n 1 is, dan, as ons die eerste HOOG na LAAG -oorgang op die datapennet opspoor, weet ons dat ons pas die ontvangs van die begin wag op 'n kaart. Dit gaan nie altyd waar wees nie, en 'n dwaas plan is om die /CARD_PRESENT -kaart na te gaan of dit ook laag is. Die eenvoudigste manier om die begin van die SS op te spoor, is om 'n eksterne onderbreking te skep wat veroorsaak word op die valrand van die /STROBE. Die data is geldig 1.0 ons voor die valrand, dus as u die valrand gemonster het, weet u dat u die /DATA1 -pen kan lees en 'n geldige waarde kan kry. Hier is die kode om u eksterne onderbreking op 'n dalende rand te skep.

voidInitInterrupt (void) {// Setup interrupt BSET (EIMSK, INT0); // eksterne onderbrekingsmasker BSET (EICRA, ISC01); // dalende rand BCLR (EICRA, ISC00); // dalende rand BSET (SREG, 7); // I-bit in SREG}

In my algemene.h wat ek in al my programme insluit, kan u die definisies van BSET en BCLR vind. Raadpleeg die lêer as u enige vrae het oor hoe om stukkies in te stel. As die onderbreking geaktiveer word, wil ons die /DATA1 (in my kode gedefinieer as CARD_DATA) proe en 'n bietjie in 'n algemene IO -register stel. As ons op die 7de bietjie is, stoor die register as 'n karakter in ons globale buffer. Ek gebruik 'n GPIOR0 -register omdat dit vinnige toegang het. Die pseudokode is so:

Stop 16-bis-timer Maak timer skoon As DATA LOW is Stel BIT = 1 in REGISTER Afneem BIT Stel vlag sodat ons nie meer 0's oorslaan nie DATA is HOOG Stel BIT = 0 in REGISTER Verlaag BIT As BIT 0 is, voeg byte by buffer Verhogingsindeks Herstel BIT

As u uself afvra hoekom dit in plaas van toename verminder, moet u onthou dat die data agteruit is, dus in plaas daarvan om die stukkies op te neem terwyl ons dit van LSB na MSB kry, stoor ons dit van MSB na LSB, sodat ons nie die stukkies hoef om te keer nie later by die verwerking van die data. As u regtig wil, kan u ook hier 0x20 hex byvoeg, maar aangesien dit ongeveer 5 us op hierdie strobes is, hou ek die verwerking in hierdie onderbrekingsroetine tot die minimum beperk.

ISR (INT0_vect) {StopTimer (); ClearTimer (); as (! BCHK (PIND, CARD_DATA1)) // inverse laag = 1 {BSET (GPIOR0, bietjie); --bit; bDataPresent = 1; } anders as (bDataPresent) {BCLR (GPIOR0, bietjie); --bit; } as (bietjie <0) {buff [idx] = (char) GPIOR0; ++ idx; bietjie = 6; } StartTimer ();} As u wonder waaroor die tydsberekening gaan, word dit behandel in die stap om vas te stel wanneer die kaart die leser verlaat het.

Stap 5: Lees die stroom data

Lees die stroom data

Ek het u alreeds gewys hoe u die data moet lees, aangesien dit deel uitmaak van die onderbrekingsdiensroetine vir ons eksterne onderbreking. 'N Alternatiewe metode sou wees om 'n vlag in die ISR op te stel, en die vlag in die hooflus te ondersoek en die data so te lees, maar ek glo dat die manier waarop ek dit voorgestel het, skoner is. Wees u eie beoordelaar en skryf die uwe, maar u MCU sal dit toelaat. As ons dit sê, gaan ons verder om uit te vind hoe die kaart 'n Elvis trek en die gebou verlaat het.

Stap 6: Ontdek die kaart wat die leser verlaat

Ontdek die kaart wat die leser verlaat
Ontdek die kaart wat die leser verlaat

Ontdek wanneer 'n kaart weg is

Formeel sou 'n mens die /CARD_PRESENT -pennetjie proe om te sien of dit weer hoog is, maar ons het nie 'n steenkin /CARD_PRESENT nodig om 'n ander I /O -poort op te neem nie. Dit is waar die tydmeters inkom. Elke keer as die onderbreking ontbied word omdat ons 'n valpunt op /STROBE opgemerk het, stop ons 'n timer, maak die timerwaarde skoon en begin lees. As ons klaar gelees het, begin ons die timer weer. Herhaal ad nauseum, of totdat die timer 'n sekere waarde bereik. Dit beteken dat die laaste onderbreking ontbied is en dat daar nie meer data ingekom het nie, dus neem ons aan dat dit die geval is en begin met die verwerking van die data wat ons versamel het. Vir timers gebruik ons TIMER1, dit wil sê die 16-bis timer. Ek gebruik 'n 16 Mhz resonator ekstern vir my AVR. As u 'n arduino gebruik, is u dit waarskynlik ook. Ek het dus 'n voorverkoelerwaarde van 1024 gekies, wat beteken dat elke (16 000, 000 /1024) keer dat die tydteller toeneem. Dit wil sê, dit sal 15, 625 keer per sekonde 'tik'. Die /CARD_PRESENT gaan hoog om aan te dui dat die kaart die leser ongeveer 150 ms na die laaste databit verlaat het. Omdat ek dit geweet het, het ek net besluit om elke 1/4 van 'n sekonde na te gaan. Dit sou so lyk:

((((F_CPU) / PRESCALER) / 4) wat blykbaar ongeveer 3900 te wees. Dus, as die tydteller TCNT1 3900 bereik, dan weet ek dat dit ongeveer 300 ms was en ek kan redelik tot die gevolgtrekking kom dat die kaart die leser verlaat het. Maklik

#define PRESCALER 1024#definieer CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#definieer StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler#definieer StopTimer () BCLR (TCCR1B, CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) U het in die ISR gesien waar die tydopnemer begin, stop en op elke onderbreking skoongemaak word. In die hooflus kyk ons net of die tydteller ons doelwaarde bereik het, en indien wel, begin die dataverwerking

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

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bietjie = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Nou is dit veilig om die data te verwerk

kode geformateer deur

Stap 7: Verwerk die data

Verwerk die data
Verwerk die data

Verwerk die data

Die verwerkingsfase bestaan uit:

  • kyk vir 'n geldige SS
  • pariteit kontroleer
  • omskakel na ASCII
  • kyk vir 'n geldige ES
  • kontroleer LRC

Hier doen ek nie die moeite om gelykheid te kontroleer nie, aangesien ek die stukkie net op nul gestel het. Ek bereken ook nie die LRC vir hierdie klein tutoriaal nie. Dit sou iets wees wat 'n meer volledig gerealiseerde firmware sou wou doen. Hier is die kode om die data te verwerk deur die bogenoemde stappe te doen (sonder die voorheen genoemde). Vind dit in die onderstaande prent. Dit word opgemerk en redelik selfverduidelikend. 'N Spesiale opmerking oor pariteit en ASCII: ek maak eenvoudig die pariteitsbit skoon (7de bit … dws 'n 1 met 6 nulle daaragter) en om van' kaartdata 'om te skakel, moet u 0x20 by die waarde voeg. Dit is omtrent dit.

Stap 8: Gee die data

Gee die data
Gee die data
Gee die data
Gee die data

Wys die data

Die skerm gaan na 'n terminale program wat ek spesifiek geskryf het om aan te sluit op 'n AVR via RS232 of USB. Die program heet AVR Terminal. Die ReadData () -metode is redelik lelik en u word aangemoedig om 'n skoner oplossing te vind as die een waarmee ek vorendag gekom het. Daar is ook 'n uitset van die funksie in AVR Terminal. Die uitset is die eerste van 'n gesondheidsversekeringskaart en die tweede van 'n VISA -kaart. Klik op die in die linker boonste hoek van die prent en kies die oorspronklike of groot prent om dit beter te sien.

Stap 9: Aflaai en aflaai van kode

In hierdie instruksies het ek 'n paar basiese beginsels van magnetiese kaartlesers bespreek en 'n paar kode gewys om u in die regte rigting te begin om data van magnetiese kaarte te lees. Daar kan nog baie werk gedoen word, soos om die 2de snit te lees en te ontsyfer, die LRC te bereken en die onewe pariteit op elke byte te bereken. Die volledige bronkode kan hieronder afgelaai word. Dit is in AVR Studio 4.17 geskryf. Ek hoop dat u hierdie instruksies geniet het, en soos altyd sien ek uit na enige kommentaar of voorstelle wat u mag hê. Gelukkige kodering en AVR'ing!

Aanbeveel: