Turinys:

Paverskite „Arduino“į magnetinį kortelių skaitytuvą!: 9 žingsniai (su nuotraukomis)
Paverskite „Arduino“į magnetinį kortelių skaitytuvą!: 9 žingsniai (su nuotraukomis)

Video: Paverskite „Arduino“į magnetinį kortelių skaitytuvą!: 9 žingsniai (su nuotraukomis)

Video: Paverskite „Arduino“į magnetinį kortelių skaitytuvą!: 9 žingsniai (su nuotraukomis)
Video: Leap Motion SDK 2024, Lapkritis
Anonim
Paverskite „Arduino“į magnetinį kortelių skaitytuvą!
Paverskite „Arduino“į magnetinį kortelių skaitytuvą!
Paverskite „Arduino“į magnetinį kortelių skaitytuvą!
Paverskite „Arduino“į magnetinį kortelių skaitytuvą!
Paverskite „Arduino“į magnetinį kortelių skaitytuvą!
Paverskite „Arduino“į magnetinį kortelių skaitytuvą!

Manau, kad visi naudojo magnetinių kortelių skaitytuvą. Aš turiu galvoje, kas šiais laikais veža grynuosius pinigus? Jiems taip pat nėra sunku patekti į rankas, o kelionės į mano mėgstamą vietinę elektronikos parduotuvę metu radau šiukšlių dėžę, pilną šių vaikinų. Taigi … žinoma, pasiėmiau vieną ir parsinešiau namo, kad pamatyčiau, ką galiu padaryti su juo ir AVR.

Ši instrukcija parodys, kaip prijungti „Magtek“magnetinių kortelių skaitytuvą prie AVR arba „Arduino“/klono ir nuskaityti duomenis iš pirmojo kortelės takelio. Susegti sėdynes; magnetinių kortelių skaitytuvai turi didelį bitų spartą!

1 žingsnis: įrangos sąrašas

Įrangos sąrašas
Įrangos sąrašas
Įrangos sąrašas
Įrangos sąrašas

Štai keletas dalykų, kurių jums reikės norint pradėti.

  • Magnetinis kortelių skaitytuvas (mano yra „Magetk“90 mm dviejų galvučių skaitytuvas. 5,00 USD)
  • AVR, „Arduino“arba klonas (ATmega328p ~ 4,30 USD iš „Mouser.com“)
  • duonos lenta be litavimo
  • kažkokia viela
  • galbūt antraštė, jei jums patinka toks dalykas.
  • ką nors perskaityti jūsų nuoseklųjį prievadą. Aš naudoju AVR terminalą iš „BattleDroids.net“

Tai viskas, ko jums reikia norint pradėti. Priklausomai nuo to, ką gausite „Magcard“skaitytuvą, gali tekti pakeisti šias instrukcijas ir, be abejo, kodą, kad galėtumėte dirbti su konkrečiu skaitytuvu. Tačiau tikiuosi, kad mano parašytas kodas turėtų jus nuvesti gana toli.

2 žingsnis: savaiminio laikymo magnetiniai kortelių skaitytuvai

Magnetiniai kortelių skaitytuvai
Magnetiniai kortelių skaitytuvai
Magnetiniai kortelių skaitytuvai
Magnetiniai kortelių skaitytuvai
Magnetiniai kortelių skaitytuvai
Magnetiniai kortelių skaitytuvai
Magnetiniai kortelių skaitytuvai
Magnetiniai kortelių skaitytuvai

Magnetinių kortelių skaitytuvai yra „savaiminio laikrodžio“, tai reiškia, kad jie pateikia laikrodį, vadinamą „stroboskopu“, su kuriuo prijungtas mikrovaldiklis gali sinchronizuoti. Tai yra palaima. Tai reiškia, kad jums nereikia jaudintis, kad ieškosite laikrodžio signalo ir nustatysite, kad signalas būtų nukreiptas tiesiai į laikrodžio impulsą, ir nebūtų varginančių svyruoti į saldžią laikrodžio signalo vietą. Tai yra prasminga, kai galvojate apie kortelių perbraukimą: visi braukia skirtingu tempu, kai kurie lėčiau, kiti greičiau nei kiti. Savarankiškas laikrodis leidžia net mano mielai močiutei naudotis savo kortele nesulaužant riešo. Primena, kad turiu pakeisti jos nustatymą, kuris nustato, kiek laiko tarp paspaudimų galioja, norint užregistruoti dvigubą paspaudimą….

Šie kortelių skaitytuvo duomenys galioja 1,0 m., Prieš pradedant rodyti „stroboskopą“, todėl nesijaudinkite, kad vėluojate įsijausti į „bitų laiką“. Dviejų galvučių skaitytuvui, pvz., Mano naudojamam, galima skaityti du duomenų takelius. Šiame darbe aš parodysiu skaitymą nuo pagrindinio pirmojo takelio, kad galėčiau pradėti. Turėsite atlikti penkias jungtis (keturias, jei nenorite atsisakyti labiau suderinto valdymo, kad būtų naudojamas mažiau įvesties/išvesties prievadų). Peržiūrėkite paveikslėlį žemiau. Raudona viela eina iki +5 V, o juoda - prie žemės. Žalia viela yra /CARD_PRESENT; geltona viela yra /STROBE, o balta - /DATA1. Į priekį nukreiptas brūkšnys (/) reiškia, kad duomenys yra apversti. Žemas signalas (ty 0) skaitomas kaip vienas arba aukštas. Kitos jungtys yra rudos, skirtos /STROBE2, ir oranžinės, skirtos /DATA2. Šių mes nenaudosime. Jei norite, galite pamiršti apie /CARD_PRESENT. Ši duomenų eilutė sumažėja po maždaug 17 galvos srauto pasukimų, rodančių, kad yra kortelė (o ne, pavyzdžiui, atsitiktinis triukšmas, dėl kurio jūsų skaitytojas siunčia netikrus duomenis), ir naudojama patvirtinti, kad gaunami duomenys yra kortelės duomenys ir ne šlamštas. Galite praleisti šį ryšį, jei patikrinsite, ar duomenų sraute yra pradinis sargybinis. Daugiau apie tai vėliau. Kaip matote žemiau, aš naudoju stačiakampį antgalį, prijungtą prie duonos lentos, ir prijungiau savo skaitytuvą. Aš prijungiau /STROBE prie PIND2 (2 skaitmeninis kaištis „Arduino“), /CARD_PRESENT prie PIND3 (iliustracijai) ir /DATA1 prie PIND4. Įsitikinkite, kad įjungėte šių kaiščių prisitraukimus, kad jūsų smeigtukai neplauktų. Aš taip pat iškeičiau savo „Arduino“į „Bare Bones AVR“, nes man patinka, kaip jis telpa į duonos lentą.

3 žingsnis: magnetinės kortelės pagrindai

Magnetinės kortelės pagrindai
Magnetinės kortelės pagrindai

Pagrindinės funkcijos, kurias turėsite atlikti skaitydami magnetinę kortelę, yra šios: 1. Nustatykite, kada kortelė buvo perbraukta. duomenys Pirmiausia aš supažindinsiu jus su kai kuriais magnetinės kortelės pagrindais, kuriuos turėsite žinoti pradėję rašyti savo kodą.

Magnetinės kortelės standartai

Magnetinės kortelės yra standartizuotos pagal ISO šiuose dokumentuose: 7810 Fizinės kredito kortelės dydžio dokumento charakteristikos 7811-1 Reljefas 7811-2 Magnetinė juostelė-mažas koercyvumas 7811-3 Reljefinių simbolių vieta 7811-4 1 ir 2 takelių vieta 7811- 5 3 takelio vieta 7811-6 Magnetinė juostelė - didelis prievartos koeficientas 7813 Finansinių operacijų kortelės Kaip matote, finansinės kortelės nurodytos atskirame dokumente ir dažnai būna kitokio formato nei, pavyzdžiui, jūsų bakalėjos kortelė ar tarptautinė vizitinė kortelė. Turėsite užprogramuoti šiuos skirtumus. Aš ką tik turėjau kredito kortelę ir draudimo kortelę, todėl programavau šiems tipams (kurie abu būna B formato).

Kortelių formatai

Yra keli magnetinių kortelių formatai. Formatai A ir B yra įprasti, B yra labiausiai paplitęs, kurį mačiau, ir kuris yra palaikomas šiame kode. Formatus nuo C iki M rezervuoja ISO, manau, o nuo N iki ?? yra skirtos instituciniam individualiam naudojimui. 1 takelis Kalbant apie finansines korteles, pirmasis takelis įrašomas 210 bitų colyje greičiu ir yra pirmas 0,110 colio kortelės iš viršaus. Duomenys koduojami kaip „kortelės duomenys“kaip 7 bitai kiekvienam simboliui. Tai yra 6 bitai simbolis ir šiek tiek pariteto. 1 kelyje yra ~ 79 raidiniai ir skaitmeniniai simboliai. Fizinis eiliškumas yra atgalinis. Tai reiškia, kad duomenys yra, bet kortelėje įrašyti atgal (taigi, jūsų programinė įranga bus perskaityta) kaip. paritetas yra keistas. Kortelės duomenų formatas atrodo taip:

[SS] [FC] [Pirminės sąskaitos Nr.] [FS] [Vardas] [FS] [Papildomi duomenys] [FS] [ES] [LRC], kur:

SS Start sentinel FC Formato kodas FS Lauko atskyriklis ES End sentinel LRC Longitudinal Redundancy Check character Vienas takelis SS = '%', FC = vienas iš formatų (daug kartų bus B), FS dažnai yra '', ES yra '?' ir LRC simbolis paprastai yra „<“, nors jis nenurodytas standartuose. Duomenys, be to, įrašyti į kortelę atgal, turi nelyginį pariteto bitą ir yra 0x20 iš ASCII. Mes tai tvarkysime, kai apdorosime duomenis. 2 takelis Antras takelis yra 0,110 colio pločio ir prasideda 0,110 nuo kortelės viršaus. Jo įrašymo tankis yra 75 bitai colyje. Duomenys yra 5 bitai kiekvienam simboliui ir susideda tik iš maždaug 40 skaitinių simbolių. Neturėtumėte susidurti kortelės duomenų formatas turėtų atitikti šią struktūrą

[SS] [pirminė sąskaita #] [FS] [papildomi duomenys | diskreciniai duomenys] [ES] [LRC]

Antrojo takelio SS yra kabliataškis: ';' o FS yra '=' Turėdami šias šventas žinias, tęskite kitus veiksmus, kad pamatytumėte kodą, kaip įgyvendinti aukščiau aprašytą procedūrą.

4 žingsnis: nustatykite, kada kortelė braukiama

Aptikti, kada kortelė braukiama
Aptikti, kada kortelė braukiama

1. Aptikti, kada kortelė buvo perbraukta Formaliai, būtų patikrinta /CARD_PRESENT kaištis, ar ji nenukrito. Laimei, tai tikrai nėra būtina. Vėliau patikrinsime galiojančią kortelę. Arba galite perskaityti savo „stroboskopo“kaištį, kad pamatytumėte, kada ant smeigtuko buvo uždėti švyturiai, tačiau taip gausite daug nulio. Skaitytojas atsiųs apie 60–70 priekinių nulių, kad praneštų, jog duomenys bus pateikti. Tačiau mes naudosime dvejetainių duomenų pobūdį, kad nustatytume, kada pradėti įrašyti bitus. Pirmojo takelio pradžios sargybinis (SS) yra procentinis ženklas (%). Jo dvejetainė vertė yra 0010 0101, o tai reiškia, kad ji bus saugoma (ir skaitoma) kaip 1010 001 (ji yra 7 bitų, todėl 8 bitas neperduodamas). Dabar sumanus skaitytojas pastebės, kad nors duomenys yra atgal, jie neatitinka dvejetainės ASCII vertės. Taip yra todėl, kad jis yra 0x20 nuo šešiakampio. Simbolis % yra 0x25, o 0100 0101 yra 0x05. Kortelės duomenys iš vertės atimti 0x20. Tas, kuris kabo aukštai nibble, yra nelyginis paritetas. Jis įdėtas taip, kad joje būtų nelyginis skaičius „1“. Taigi, kadangi žinome, kad galiojanti kortelė visada prasidės nuo šio pradžios sargybinio, ir kadangi pariteto bitas yra 1, tada, kai duomenų smeigtuke aptinkame pirmąjį perėjimą nuo HIGH to LOW, žinome, kad ką tik pradėjome gauti pradėti sargybą nuo kortelės. Dabar tai ne visada bus tiesa, ir beprasmiškas planas būtų patikrinti /CARD_PRESENT kortelę, kad pamatytumėte, ar ji papildomai išnyko. Paprasčiausias būdas aptikti SS pradžią yra sukurti išorinį pertraukimą, sukeltą ant krintančio /STROBE krašto. Duomenys galioja 1,0 m iki krintančio krašto, taigi, kai atrinksite krentantį kraštą, žinosite, kad galite perskaityti /DATA1 kaištį ir gauti galiojančią vertę. Štai kodas, skirtas sukurti išorinį pertraukimą, suaktyvintą ant krintančio krašto.

voidInitInterrupt (void) {// Sąrankos pertraukimas BSET (EIMSK, INT0); // išorinė pertraukimo kaukė BSET (EICRA, ISC01); // krintantis kraštas BCLR (EICRA, ISC00); // krintantis kraštas BSET (SREG, 7); // „I-bit“SREG}

Mano bendrame.h, kurį įtraukiu į visas savo programas, galima rasti BSET ir BCLR apibrėžimus. Jei turite klausimų apie bitų nustatymą, žiūrėkite tą failą. Dabar, kai suaktyvinamas pertraukimas, norime atrinkti /DATA1 (mano kode, apibrėžtame kaip CARD_DATA) ir šiek tiek nustatyti bendrosios paskirties IO registre. Jei dirbame 7 -ajame bite, išsaugokite registrą kaip simbolį mūsų visuotiniame buferyje. Aš naudoju GPIOR0 registrą, nes tai greita prieiga. Pseudo kodas yra maždaug toks:

Sustabdyti 16 bitų laikmatį Išvalyti laikmatį Jei DATA yra ŽEMA Nustatykite BIT = 1 REGISTRUOJE Sumažėjimas BIT Nustatykite vėliavą, kad daugiau nepraleistume 0, o kiti DUOMENYS AUKŠTI Nustatykite BIT = 0 REGISTRUOJE Sumažinkite bitą Jei BIT yra 0 Pridėkite baitą prie buferio Padidinimo indeksas Iš naujo nustatyti BIT

Jei klausiate savęs, kodėl mažinimas, o ne didinimas, atminkite, kad duomenys yra atgaliniai, todėl užuot įrašę bitus, kai juos gauname iš LSB į MSB, mes juos išsaugome iš MSB į LSB, kad mums nereikėtų keisti bitų vėliau apdorojant duomenis. Jei labai norėjote, čia taip pat galite pridėti 0x20 šešiakampį, bet kadangi šiuose blyksniuose yra apie 5, tai šioje pertraukimo tarnyboje atlieku minimalų apdorojimą.

ISR (INT0_vect) {StopTimer (); „ClearTimer“(); if (! BCHK (PIND, CARD_DATA1)) // atvirkštinis žemas = 1 {BSET (GPIOR0, bitas); -bitų; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bitas); -bitų; } if (bitas <0) {buff [idx] = (char) GPIOR0; ++ idx; bitas = 6; } „StartTimer“();} Jei jums įdomu, koks yra laiko nustatymo verslas, tai bus padaryta nustatant, kada kortelė paliko skaitytuvą.

5 veiksmas: perskaitykite duomenų srautą

Skaitykite duomenų srautą

Na, aš jau parodžiau, kaip skaityti duomenis, nes tai yra mūsų pertraukiamo aptarnavimo rutinos dalis, skirta mūsų blogiausiam išoriniam pertraukimui. Alternatyvus metodas būtų nustatyti vėliavą ISR, o pagrindinėje kilpoje apklausti vėliavą ir taip perskaityti duomenis, tačiau manau, kad mano pateiktas būdas yra švaresnis. Būkite savo teisėjas ir parašykite savo, tačiau jūsų MCU tai leis. Tai pasakius, pereikime prie to, kaip išsiaiškinti, kaip nustatyti, kada kortelė traukia Elvį ir palieka pastatą.

6 veiksmas: aptikite skaitytoją paliekančią kortelę

Aptikti kortelę, paliekančią skaitytoją
Aptikti kortelę, paliekančią skaitytoją

Nustatykite, kada dingo kortelė

Formaliai būtų galima paimti /CARD_PRESENT kaištį, kad pamatytumėte, ar jis vėl HIGH, bet mums nereikia, kad steenkin ' /CARD_PRESENT imtųsi kito įvesties /išvesties prievado. Čia ateina tie laikmačiai. Kiekvieną kartą, kai iškviečiamas pertraukimas, nes aptinkame, kad įjungtas /STROBE kraštas, mes sustabdome laikmatį, išvalome laikmačio vertę ir pradedame skaityti. Baigę skaityti, vėl paleidžiame laikmatį. Kartokite ad nauseum arba tol, kol laikmatis pasieks tam tikrą vertę. Tai reiškia, kad paskambintas paskutinis pertraukimas ir daugiau duomenų neatsirado, todėl manome, kad viskas, ir pradedame tvarkyti surinktus duomenis. Laikmačiams naudojame TIMER1, ty 16 bitų laikmatį. Aš naudoju 16 Mhz rezonatorių išoriškai prie savo AVR. Jei naudojate arduino, greičiausiai taip pat naudojate. Taigi, aš pasirinkau prescaler reikšmę 1024, o tai reiškia, kad kas (16 000 000 000 1024) kartų laikmatis didės. Tai reiškia, kad jis „pažymės“15, 625 kartus per sekundę. /CARD_PRESENT rodys AUKŠTĄ rodydama, kad kortelė iš skaitytuvo paliko maždaug 150 ms po paskutinio duomenų bito. Žinodamas tai, aš tiesiog nusprendžiau patikrinti maždaug kas 1/4 sekundės. Tai atrodytų maždaug taip:

((((F_CPU) / PRESCALER) / 4) Tai pasirodo maždaug 3900. Taigi, kai laikmačio skaitiklis TCNT1 pasiekia 3900, tada žinau, kad tai buvo apie 300 ms, ir galiu gana drąsiai daryti išvadą, kad kortelė paliko skaitytuvą. Lengva

#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) ISR matėte, kur laikmatis paleidžiamas, sustabdomas ir išvalomas kiekvieną kartą pertraukiant. Dabar pagrindinėje grandinėje mes tik patikriname, ar laikmačio skaitiklis pasiekė mūsų tikslinę vertę, ir jei taip, pradėkite duomenų apdorojimą

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

StopTimer (); „ClearTimer“(); ProcessData (); „ReadData“(); idx = 0; bitas = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Dabar saugu apdoroti duomenis

kodas suformatuotas

7 veiksmas: apdorokite duomenis

Apdoroti Duomenis
Apdoroti Duomenis

Apdoroti duomenis

Apdorojimo etapas susideda iš:

  • tikrina galiojančią SS
  • tikrinant paritetą
  • konvertuojant į ASCII
  • tikrinant galiojančią ES
  • tikrinant LRC

Čia aš nesivarginu tikrinti pariteto, nes tiesiog nustatiau tą bitą į nulį. Aš taip pat neskaičiuoju LRC šiai mažai pamokai. Tai būtų kažkas, ką galbūt norėtų padaryti visiškai suprantama programinė įranga. Štai kodas, skirtas duomenims apdoroti, atliekant aukščiau nurodytus veiksmus (be anksčiau paminėtų). Raskite jį žemiau esančiame paveikslėlyje. Tai komentuojama ir gana savaime suprantama. Ypatinga pastaba dėl pariteto ir ASCII: aš tiesiog išvalau pariteto bitą (7 -asis bitas… ty 1 su 6 nuliais už jo) ir norėdami konvertuoti iš „kortelės duomenų“, prie vertės turite pridėti 0x20. Tai tiek.

8 veiksmas: rodykite duomenis

Rodyti duomenis
Rodyti duomenis
Rodyti duomenis
Rodyti duomenis

Rodyti duomenis

Ekranas eina į terminalo programą, kurią parašiau specialiai prijungti prie AVR per RS232 arba USB. Programa vadinama AVR terminalu. „ReadData“() metodas yra gana negražus ir esate raginami rasti švaresnį sprendimą nei tas, kurį aš sugalvojau. Taip pat yra AVR terminalo funkcijos išvestis. Pirmasis rezultatas yra sveikatos draudimo kortelė, o antrasis - VISA kortelė. Spustelėkite viršutiniame kairiajame paveikslėlio kampe ir pasirinkite originalų arba didelį vaizdą, kad jis būtų geriau matomas.

9 veiksmas: kodo atsisiuntimas ir įvyniojimas

Šioje pamokoje aptariau kai kuriuos magnetinių kortelių skaitytuvų pagrindus ir parodžiau jums kodą, kad pradėtumėte teisinga kryptimi skaityti duomenis iš magnetinių kortelių. Galima nuveikti daug daugiau, pvz., Skaityti ir dekoduoti antrąjį takelį, apskaičiuoti LRC ir apskaičiuoti nelyginį kiekvieno baito paritetą. Visą šaltinio kodą galite atsisiųsti žemiau. Tai buvo parašyta „AVR Studio 4.17“. Tikiuosi, kad jums patiko šis pamokomas dalykas, ir, kaip visada, laukiu jūsų pastabų ar pasiūlymų. Laimingas kodavimas ir AVR'ing!

Rekomenduojamas: