Sisukord:

Muutke oma Arduino magnetkaardilugejaks!: 9 sammu (piltidega)
Muutke oma Arduino magnetkaardilugejaks!: 9 sammu (piltidega)

Video: Muutke oma Arduino magnetkaardilugejaks!: 9 sammu (piltidega)

Video: Muutke oma Arduino magnetkaardilugejaks!: 9 sammu (piltidega)
Video: 30 лучших советов и рекомендаций по Windows 10 на 2020 год 2024, November
Anonim
Muutke oma Arduino magnetkaardilugejaks!
Muutke oma Arduino magnetkaardilugejaks!
Muutke Arduino magnetkaardilugejaks!
Muutke Arduino magnetkaardilugejaks!
Muutke oma Arduino magnetkaardilugejaks!
Muutke oma Arduino magnetkaardilugejaks!

Ma arvan, et kõik on kasutanud magnetkaardilugejat. Ma mõtlen, kes kannab tänapäeval sularaha? Neid pole ka raske kätte saada ja reisi ajal minu lemmikesse kohalikku elektroonikapoodi leidsin prügikasti neid tüüpe. Niisiis … Muidugi võtsin ühe ja tõin selle koju, et näha, mida ma sellega ja AVR -iga teha saan.

See juhend annab teile teada, kuidas ühendada Magteki magnetkaardilugeja AVR -i või Arduino/klooniga ja lugeda andmeid kaardi esimeselt rajalt. Kinnitage oma istmed; magnetkaardilugejatel on kõrge bitikiirus!

Samm: seadmete loend

Varustuse nimekiri
Varustuse nimekiri
Varustuse nimekiri
Varustuse nimekiri

Siin on mõned asjad, mida peate alustama.

  • Magnetiline kaardilugeja (minu oma on Magetk 90 mm kahe peaga lugeja. 5,00 dollarit)
  • AVR, Arduino või kloon (ATmega328p ~ 4,30 dollarit saidilt Mouser.com)
  • jooteta leivalaud
  • mingi traat
  • võib -olla päis, kui sulle selline asi meeldib.
  • midagi teie jadaporti lugeda. Ma kasutan BattleDroids.neti AVR -terminali

See on kõik, mida alustamiseks vaja läheb. Sõltuvalt sellest, millist magcardilugejat lõpuks saate, peate võib -olla neid juhiseid ja kindlasti koodi muutma, et teie konkreetse lugejaga töötada. Loodetavasti peaks minu kirjutatud kood teid siiski üsna kaugele viima.

2. samm: isekelluvad magnetkaardilugejad

Isekelluvad magnetkaardilugejad
Isekelluvad magnetkaardilugejad
Isekelluvad magnetkaardilugejad
Isekelluvad magnetkaardilugejad
Isekelluvad magnetkaardilugejad
Isekelluvad magnetkaardilugejad
Isekelluvad magnetkaardilugejad
Isekelluvad magnetkaardilugejad

Magnetkaardilugejad on "isekelluvad", mis tähendab, et nad pakuvad kella, mida nimetatakse stroboskoobiks, mille vastu ühendatud mikrokontroller saab sünkroonida. See on õnnistus. See tähendab, et te ei pea muretsema selle pärast, et otsite kella signaali ja ajastate signaali otse kella pulsi keskele ning et tülikas võnkumine kellasignaali magusasse kohta. See on mõttekas, kui mõtlete kaardilõigetele: kõik libistavad erinevas tempos, mõned aeglasemalt, mõned kiiremini kui teised. Enesekella tegemine võimaldab isegi mu armsal vanaemal kasutada oma kaarti ilma randmet murdmata. Tuletab mulle meelde, et pean muutma tema seadistust, mis määrab, kui palju aega topeltklõpsu registreerimiseks klõpsude vahel kehtib….

Need kaardilugeja andmed kehtivad enne strobi joonele panemist 1,0 inimest, seega pole vaja muretseda, et viivitate "bitiaega". Kahe peaga lugeja puhul, nagu see, mida ma kasutan, on lugemiseks saadaval kaks andmerada. Selles tabelis näitan teile alustamiseks esmase esimese loo lugemist. Peate looma viis ühendust (neli, kui te ei pahanda, kui loobute peenhäälestatud juhtimisest vähemate I/O -pordide kasutamisel). Vaadake allolevat pilti. Punane juhe läheb +5V, must juhe aga maandub. Roheline juhe on /CARD_PRESENT; kollane juhe on /STROBE ja valge traat on /DATA1. Kaldkriips (/) tähendab, et andmed on ümberpööratud. Madal signaal (st 0) loetakse üks või kõrge. Muud pistikud on /STROBE2 jaoks pruunid ja /DATA2 jaoks oranžid. Me ei kasuta neid. Kui soovite, võite unustada /CARD_PRESENT. See andmerida läheb pärast umbes 17 pea voo pööramist madalaks, näidates, et kaart on olemas (näiteks juhusliku müra asemel, mis põhjustab teie lugejale võltsitud andmete saatmist) ja seda kasutatakse kinnitamaks, et teie saadud andmed on kaardi andmed ja mitte rämps. Selle ühenduse saate vahele jätta, kui kontrollite andmevoo algust. Sellest pikemalt hiljem. Nagu allpool näete, kasutasin leivalauaga ühendatud täisnurkset isaspäist ja ühendasin sellega oma lugeja. Ühendasin /STROBE PIND2 -ga (Arduino digitaalne tihvt 2), /CARD_PRESENT PIND3 -ga (näitlikustamiseks) ja /DATA1 PIND4 -ga. Veenduge, et lubate nende tihvtide tõmbamise, et teie tihvtid ei hõljuks. Vahetasin ka oma Arduino välja Bare Bones AVR -i vastu, sest mulle meeldib, kuidas see leivalauale sobib.

3. samm: magnetkaardi põhitõed

Magnetkaardi põhitõed
Magnetkaardi põhitõed

Peamised funktsioonid, mida peate magnetkaardi lugemiseks tegema, on järgmised: 1. Tuvastage, millal kaarti on pühkitud. 2. Andmevoo lugemine 3. Kaardi kadumise tuvastamine 4. Andmete töötlemine 5. Kuvake andmed Esiteks tutvustan teile mõningaid magnetkaardi põhitõdesid, mida peate teadma, kui hakkate oma koodi kirjutama.

Magnetkaardi standardid

Magnetkaardid on ISO poolt standarditud järgmistes dokumentides: 7810 Krediitkaardi suuruse dokumendi füüsilised omadused 7811-1 Reljeef 7811-2 Magnetriba-madal koercitiivsus 7811-3 Reljeefsete märkide asukoht 7811-4 Rööbaste 1 ja 2 asukoht 7811- 5 Raja 3 asukoht 7811-6 Magnetriba - kõrge koercitiivsus 7813 Finantstehingute kaardid Nagu näete, on finantskaardid määratletud eraldi dokumendis ja neil on sageli erinevad vormingud kui näiteks teie toidukaardil või rahvusvahelisel kõnekaardil. Nende erinevuste jaoks peate programmeerima. Mul oli lihtsalt krediitkaart ja kindlustuskaart käepärast, nii et programmeerisin nende tüüpide jaoks (mis mõlemad on vormingus B).

Kaardivormingud

Magnetkaartide jaoks on mitu erinevat vormingut. Vorming A ja B on tavalised, kusjuures B on kõige tavalisem, mida ma näinud olen ja mida see kood toetab. Ma usun, et vormingud C kuni M on reserveeritud ISO poolt, N aga ?? on reserveeritud institutsionaalseks kohandatud kasutamiseks. Rada 1 Finantskaartide puhul salvestatakse esimene rada kiirusega 210 bitti tolli kohta ja see on kaardi esimene 0,110 tolli ülalt. Andmed on kodeeritud kaardi andmetena 7-bitisena tähemärgi kohta. See on 6-bitine iseloomu ja natuke pariteedi jaoks. Rajal 1 on ~ 79 tähtnumbrilist tähemärki. Füüsiline järjestus on tagurpidi. See tähendab, et andmed on, kuid need on kaardile tagurpidi kirjutatud (ja seega loeb teie püsivara) kui. pariteet on veider. Kaardi andmevorming näeb välja selline:

[SS] [FC] [Esmane konto #] [FS] [Nimi] [FS] [Täiendavad andmed] [FS] [ES] [LRC], kus:

SS Start sentinel FC Vormingukood FS Välja eraldaja ES End sentinel LRC Longitudinal Redundancy Check character Üks rada SS = '%', FC = üks vormingutest (tuleb mitu korda B), FS on sageli '', ES on '?' ja LRC märk on tavaliselt "<", kuigi see pole standardites täpsustatud. Lisaks sellele, et andmed on kaardile tagurpidi kirjutatud, on andmetel paaritu paarisbit ja need on 0x20 ASCII -st. Me käsitleme seda andmete töötlemisel. 2. rada 2. rada on 0,110 tolli lai ja algab 0,110 kaardi ülaosast. Selle salvestustihedus on 75 bitti tolli kohta. Andmed on 5-bitised tähemärgi kohta ja koosnevad ainult umbes 40 numbrilisest sümbolist. kaardi andmete vorming peaks järgima seda struktuuri

[SS] [esmane konto #] [FS] [täiendavad andmed | valikulised andmed] [ES] [LRC]

Teise raja SS on semikoolon: ';' ja FS on '=' Selle püha teadmisega oma vöö all jätkake järgmiste sammudega, et näha eespool kirjeldatud protseduuri rakendavat koodi.

Samm: tuvastage, millal kaarti pühitakse

Tuvastage kaardi pühkimine
Tuvastage kaardi pühkimine

1. Tuvastage, millal kaart on ametlikult pühkitud, kontrolliks /CARD_PRESENT tihvti, et näha, kas see on madalale langenud. Õnneks pole see tegelikult vajalik. Kontrollige hiljem kehtivat kaarti. Teise võimalusena võiksite lugeda oma strobi tihvti, et näha, millal striibud on tihvtile pandud, kuid see annab teile palju nullpunkte. Lugeja saadab teile umbes 60–70 esimest nulli, et anda teada, et andmed esitatakse. Siiski kasutame binaarsete andmete olemust, et otsustada, millal alustada bittide salvestamist. Esimese raja algusmärk (SS) on protsendimärk (%). Selle binaarne väärtus on 0010 0101, mis tähendab, et see salvestatakse (ja loetakse) kujul 1010 001 (see on 7-bitine, nii et 8. bitti ei edastata). Nutikas lugeja märkab nüüd, et kuigi andmed on tagurpidi, ei ühti see binaarse ASCII väärtusega. Seda seetõttu, et see on 0x20 kuuskantvõrgust väljas. Sümbol % on 0x25 ja 0100 0101 on 0x05. Kaardi andmetest lahutatakse väärtusest 0x20. See, kes seal kõrge näksimise juures ripub, on veider pariteedibitt. See on paigutatud nii, et väärtuses on paaritu arv "1". Kuna me teame, et kehtiv kaart algab alati selle algusmärgiga, ja kuna pariteedibitt on 1, siis kui me tuvastame andmestiku esimese ülemineku HIGH to LOW, siis me teame, et oleme just hakanud alusta valvurit kaardist. Nüüd ei pruugi see alati tõsi olla ja lollikindel plaan oleks kontrollida /CARD_PRESENT kaarti, et näha, kas see on lisaks LOW. Lihtsaim viis SS -i alguse tuvastamiseks on luua väline katkestus, mis käivitatakse /STROBE langeval serval. Andmed kehtivad 1.0 me enne langevat serva, nii et kui olete langenud serva proovi võtnud, siis teate, et saate lugeda /DATA1 tihvti ja saada kehtiva väärtuse. Siin on kood välise katkestuse loomiseks, mis käivitatakse langeval serval.

voidInitInterrupt (void) {// Setup interrupt BSET (EIMSK, INT0); // väline katkestusmask BSET (EICRA, ISC01); // langev serv BCLR (EICRA, ISC00); // langev serv BSET (SREG, 7); // I-bit SREG-s}

Minu ühises.h -s, mille lisan kõikidesse oma programmidesse, võib leida BSET -i ja BCLR -i definitsioonid. Kui teil on küsimusi bitti seadistamise kohta, vaadake seda faili. Nüüd, kui katkestus käivitatakse, tahame proovi /DATA1 (minu koodis määratletud kui CARD_DATA) ja määrata natuke üldotstarbelises IO registris. Kui me kasutame seitsmendat bitti, salvestage register globaalse puhvri tegelasena. Ma kasutan GPIOR0 registrit, kuna see on kiire kiire juurdepääsuga. Pseudokood on umbes selline:

Peata 16-bitine taimer Tühjenda taimer Kui DATA on LOW Määra BIT = 1 REGISTREERIMISES Decrement BIT Määra lipp, nii et me ei jäta enam 0-sid vahele Suurendusindeks Lähtesta BIT

Kui te küsite endalt, miks juurdekasvu asemel vähendamine, pidage meeles, et andmed on tagurpidi, nii et selle asemel, et salvestada bitte LSB -lt MSB -le, salvestame need MSB -lt LSB -le, nii et me ei pea bitte ümber pöörama hiljem andmete töötlemisel. Kui sa tõesti tahtsid, võiksid siia lisada ka 0x20 kuuskantkuju, aga kuna nende strobide puhul on see umbes 5, siis hoian selle katkestusteenuse rutiini töötlemise miinimumini.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // pöördmadal = 1 {BSET (GPIOR0, bit); --bit; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --bit; } kui (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bitt = 6; } StartTimer ();} Kui te ei tea, mis ajastusalaga tegeletakse, siis seda käsitletakse kaardi lugejast lahkumise kindlaksmääramise etapis.

Samm: lugege andmevoogu

Lugege andmevoogu

Noh, ma olen teile juba näidanud, kuidas andmeid lugeda, kuna see on osa katkestusteenuse rutiinist meie langeva servaga välise katkestuse jaoks. Alternatiivne meetod oleks määrata lipp ISR -is ja põhisilmus küsitleda lippu ja lugeda andmeid nii, kuid ma usun, et see, kuidas ma seda esitasin, on puhtam. Olge oma kohtunik ja kirjutage oma, kuid teie MCU seda lubab. Sellest hoolimata jätkame, et teada saada, kuidas tuvastada, kui kaart tõmbab Elvist ja on hoonest lahkunud.

6. samm: lugejalt lahkuva kaardi tuvastamine

Tuvastage lugeja juurest lahkuv kaart
Tuvastage lugeja juurest lahkuv kaart

Tuvastage, millal kaart on kadunud

Ametlikult prooviks üks /CARD_PRESENT nööpnõela, et näha, kas see on jälle KÕRGE, kuid me ei vaja, et steenkin ' /CARD_PRESENT asuks teise I /O pordi juurde. Siin tulevad need taimerid sisse. Iga kord, kui katkestusele helistatakse, kuna oleme tuvastanud /STROBE langeva serva, peatame taimeri, tühjendame taimeriväärtuse ja alustame lugemist. Kui oleme lugemise lõpetanud, käivitame taimer uuesti. Korrake reklaami muuseumi või kuni taimer saavutab teatud väärtuse. See tähendab, et viimasele katkestusele on helistatud ja rohkem andmeid pole tulnud, seega eeldame, et see on kõik ja hakkame kogutud andmeid töötlema. Taimerite puhul kasutame TIMER1 ehk 16-bitist taimerit. Ma kasutan oma AVR -i väliselt 16 Mhz resonaatorit. Kui kasutate arduinot, siis tõenäoliselt kasutate ka seda. Niisiis, olen valinud eelkvalifitseerija väärtuse 1024, mis tähendab, et taimer suureneb iga (16 000, 000 /1024) korda. See tähendab, et see tiksub 15, 625 korda sekundis. /CARD_PRESENT läheb KÕRGE, näidates, et kaart on lugejast lahkunud umbes 150 ms pärast viimast andmebitti. Seda teades otsustasin lihtsalt kontrollida umbes iga 1/4 sekundi järel. See näeks välja umbes selline:

((((F_CPU) / PRESCALER) / 4) mis osutub umbes 3900. Niisiis, kui taimeriloendur TCNT1 jõuab 3900 -ni, siis ma tean, et see on olnud umbes 300 ms ja võin üsna kindlalt järeldada, et kaart on lugejast lahkunud. Lihtne

#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) Olete ISR -is näinud, kus taimer käivitatakse, peatatakse ja kustutatakse igal katkestusel. Nüüd kontrollime põhisilmus lihtsalt, kas taimeriloendur on jõudnud meie sihtväärtuseni, ja kui jah, siis alustame andmetöötlust

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

Stopper (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bitt = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Nüüd on andmete töötlemine ohutu

koodi vormindas

Samm 7: Andmete töötlemine

Töötle Andmeid
Töötle Andmeid

Töötle andmeid

Töötlemisetapp koosneb:

  • kehtiva SS -i kontrollimine
  • pariteedi kontrollimine
  • teisendamine ASCII -ks
  • kehtiva ES -i kontrollimine
  • LRC kontrollimine

Siinkohal ei viitsi ma pariteeti kontrollida, kuna seadsin selle biti lihtsalt nulli. Samuti ei arvuta ma selle väikese õpetuse jaoks LRC -d. See oleks midagi, mida võiks paremini realiseerida püsivara. Siin on kood andmete töötlemiseks, tehes ülaltoodud samme (ilma eelnevalt mainitud). Leidke see allolevalt pildilt. See on kommenteeritud ja üsna iseenesestmõistetav. Eriline märkus pariteedi ja ASCII kohta: ma lihtsalt kustutan pariteedibiti (7. bit… st 1, mille taga on 6 nulli) ja "kaardi andmetest" teisendamiseks peate väärtusele lisama 0x20. Umbes nii.

Samm: kuvage andmed

Kuva andmed
Kuva andmed
Kuva andmed
Kuva andmed

Kuva andmed

Ekraan läheb terminaliprogrammi, mille kirjutasin spetsiaalselt AVR -i ühendamiseks RS232 või USB kaudu. Programmi nimi on AVR Terminal. ReadData () meetod on üsna kole ja teil soovitatakse leida puhtam lahendus kui see, mille ma välja pakkusin. AVR -terminalis on ka funktsiooni väljund. Väljund on esiteks haigekassakaart ja teine VISA -kaart. Klõpsake pildi vasakus ülanurgas olevat ja valige originaal või suur pilt, et seda paremini näha.

9. samm: koodi allalaadimine ja kokku pakkimine

Selles juhendis olen arutanud mõningaid magnetkaardilugejate põhitõdesid ja näidanud teile koodi, mis aitab teil magnetkaartidelt andmeid lugeda. Seal on veel palju tööd, mida saaks teha, näiteks teise raja lugemine ja dekodeerimine, LRC arvutamine ja paaritu pariteedi arvutamine iga baidi kohta. Täielik lähtekood on allalaadimiseks saadaval allpool. See oli kirjutatud AVR Stuudios 4.17. Loodan, et teile meeldis see õpetlik ja nagu alati, ootan teie kommentaare või ettepanekuid. Head kodeerimist ja AVR -i!

Soovitan: