Turinys:
- 1 žingsnis: įrangos sąrašas
- 2 žingsnis: savaiminio laikymo magnetiniai kortelių skaitytuvai
- 3 žingsnis: magnetinės kortelės pagrindai
- 4 žingsnis: nustatykite, kada kortelė braukiama
- 5 veiksmas: perskaitykite duomenų srautą
- 6 veiksmas: aptikite skaitytoją paliekančią kortelę
- 7 veiksmas: apdorokite duomenis
- 8 veiksmas: rodykite duomenis
- 9 veiksmas: kodo atsisiuntimas ir įvyniojimas
Video: Paverskite „Arduino“į magnetinį kortelių skaitytuvą!: 9 žingsniai (su nuotraukomis)
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:51
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
Š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
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
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
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ę
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
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
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:
Prekybos kortelių aparato kortelių skaitytuvas: 13 žingsnių (su paveikslėliais)
Prekių kortelių aparato kortelių skaitytuvas: Prekybos kortelių aparato kortelių skaitytuvas Pakeitimų žurnalą galite rasti paskutiniame žingsnyje. Fonas „Card Feeder Intro“paaiškinau pagrindinę savo projekto motyvaciją. Bet trumpai tariant, aš ir mano vaikai sukaupėme daug prekybos kortelių
Kortelių tiektuvas prekybos kortelių mašinai: 10 žingsnių (su paveikslėliais)
Kortelių tiektuvas prekybos kortelių mašinai: kortelių tiektuvas prekybinių kortelių aparatui Fonas Kai buvau jaunas, surinkau daugybę prekybos kortelių, tačiau keletą metų aistra rinkti mažėjo. Tuo tarpu aš turiu vaikų ir lėtai, bet tikrai jie taip pat pradeda augti
Kaip naudoti vidinį PS3 atminties kortelių skaitytuvą kaip USB įrenginį kompiuteryje: 6 veiksmai
Kaip naudoti vidinį PS3 atminties kortelių skaitytuvą kaip USB įrenginį jūsų kompiuteryje: Pirmiausia tai yra mano pirmasis Instructable (yippie!), Esu tikras, kad bus daug. Taigi, turėjau sugedusį PS3 ir norėjau šiek tiek panaudoti darbinius komponentus. Pirmas dalykas, kurį padariau, buvo ištraukti PS3 kortelės keitiklio lusto duomenų lapą
Nulaužkite USB kortelių skaitytuvą: 6 žingsniai
Nulaužkite USB kortelių skaitytuvą: Prieš kelias dienas namuose radau pamirštą SD kortelę. Man buvo įdomu nutraukti tai, kas ten parašyta. Aš ieškojau kortelių skaitytuvo, norėdamas patikrinti informaciją. Namuose buvo galima rasti tik pigų kelių kortelių skaitytuvą, įsigytą „Aliexpress“arba „Ebay“
„Nintendo“valdiklis į kompiuterio kortelių skaitytuvą: 4 žingsniai (su paveikslėliais)
„Nintendo“valdiklis į kompiuterio kortelių skaitytuvą: įdėkite kortelių skaitytuvą į „Nintendo“valdiklį, skirtą staliniam ar nešiojamam kompiuteriui. Bet kokiame šio projekto paminėjime turi būti nuoroda į www.zieak.com su Ryano McFarlando kreditu