Satura rādītājs:

Pārvērtiet savu Arduino par magnētisko karšu lasītāju!: 9 soļi (ar attēliem)
Pārvērtiet savu Arduino par magnētisko karšu lasītāju!: 9 soļi (ar attēliem)

Video: Pārvērtiet savu Arduino par magnētisko karšu lasītāju!: 9 soļi (ar attēliem)

Video: Pārvērtiet savu Arduino par magnētisko karšu lasītāju!: 9 soļi (ar attēliem)
Video: EP25 Part1 - Магнитная рамочная антенна для LoRa 2024, Jūlijs
Anonim
Pārvērtiet savu Arduino par magnētisko karšu lasītāju!
Pārvērtiet savu Arduino par magnētisko karšu lasītāju!
Pārvērtiet savu Arduino par magnētisko karšu lasītāju!
Pārvērtiet savu Arduino par magnētisko karšu lasītāju!
Pārvērtiet savu Arduino par magnētisko karšu lasītāju!
Pārvērtiet savu Arduino par magnētisko karšu lasītāju!

Es uzskatu, ka visi ir izmantojuši magnētisko karšu lasītāju. Es domāju, kurš mūsdienās nes skaidru naudu? Viņus arī nav grūti paņemt rokās, un ceļojuma laikā uz manu iecienīto vietējo elektronikas veikalu es atradu pilnu miskasti ar šiem puišiem. Tātad … protams, es paņēmu vienu un atvedu mājās, lai redzētu, kādas lietas es varētu ar to un AVR darīt.

Šī pamācība parādīs, kā savienot Magtek magnētisko karšu lasītāju ar AVR vai Arduino/klonu un nolasīt datus no pirmās kartes versijas. Piesprādzējiet sēdekļus; magnētisko karšu lasītājiem ir augsts bitu pārraides ātrums!

1. darbība: aprīkojuma saraksts

Aprīkojuma saraksts
Aprīkojuma saraksts
Aprīkojuma saraksts
Aprīkojuma saraksts

Šeit ir dažas lietas, kas jums būs nepieciešamas, lai sāktu darbu.

  • Magnētiskais karšu lasītājs (mans ir Magetk 90 mm divu galvu lasītājs. 5,00 ASV dolāri)
  • AVR, Arduino vai klons (ATmega328p ~ $ 4.30 no Mouser.com
  • maizes dēlis bez lodēšanas
  • kāds vads
  • varbūt galvene, ja jums patīk šāda veida lieta.
  • kaut ko lasīt jūsu seriālajā portā. Es izmantoju AVR termināli no BattleDroids.net

Tas ir viss, kas jums nepieciešams, lai sāktu darbu. Atkarībā no magnētisko karšu lasītāja, ko jūs galu galā saņemat, iespējams, jums būs jāmaina šīs instrukcijas un, visdrīzāk, kods, lai strādātu ar konkrēto lasītāju. Tomēr manis rakstītajam kodam vajadzētu jūs novest diezgan tālu, es ceru.

2. darbība. Magnētisko karšu lasītāju pašregulēšana

Magnētisko karšu nolasītāji, kas paši ieslēdzas
Magnētisko karšu nolasītāji, kas paši ieslēdzas
Magnētisko karšu nolasītāji, kas paši ieslēdzas
Magnētisko karšu nolasītāji, kas paši ieslēdzas
Magnētisko karšu nolasītāji, kas paši ieslēdzas
Magnētisko karšu nolasītāji, kas paši ieslēdzas
Magnētisko karšu nolasītāji, kas paši ieslēdzas
Magnētisko karšu nolasītāji, kas paši ieslēdzas

Magnētisko karšu lasītāji ir “pašregulējoši”, kas nozīmē, ka tie nodrošina pulksteni, ko sauc par stroboskopu, pret kuru var sinhronizēt pievienoto mikrokontrolleri. Tas ir svētīgs. Tas nozīmē, ka jums nav jāuztraucas par pulksteņa signāla meklēšanu un laika noteikšanu signāla centrā tieši pulksteņa impulsā, un nav apgrūtinošas svārstības pulksteņa signāla labajā vietā. Tam ir jēga, domājot par kāršu pārvilkšanu: visi pārvelk citā tempā, daži lēnāk, citi ātrāk nekā citi. Pašpulkstināšana ļauj pat manai mīļajai vecmāmiņai izmantot savu karti, nesalaužot plaukstas locītavu. Atgādina, ka man ir jāmaina viņas iestatījums, kas nosaka, cik ilgs laiks ir spēkā starp klikšķiem, lai reģistrētu dubultklikšķi….

Šie karšu lasītāja dati ir derīgi 1,0 reizi pirms stroboskopa ievietošanas līnijā, tāpēc nav jāuztraucas par kavēšanos, lai iekļūtu "bitu laikā". Divu galvu lasītājam, piemēram, tam, kuru izmantoju, ir pieejami divi datu celiņi. Šajā rakstā es parādīšu lasīšanu no pirmā pirmā ieraksta, lai sāktu darbu. Jums būs jāizveido pieci savienojumi (četri, ja nevēlaties atteikties no precīzākas vadības, lai izmantotu mazāk I/O portu). Apskatiet zemāk redzamo attēlu. Sarkanais vads iet uz +5V, bet melnais - zemē. Zaļais vads ir /CARD_PRESENT; dzeltenais vads ir /STROBE, bet baltais vads ir /DATA1. Slīpsvītra uz priekšu (/) nozīmē, ka dati ir apgriezti. Zems signāls (ti, 0) tiek nolasīts kā viens vai augsts. Pārējie savienotāji ir brūni /STROBE2 un oranži - /DATA2. Mēs šos neizmantosim. Ja vēlaties, varat aizmirst par /CARD_PRESENT. Šī datu līnija kļūst zema pēc aptuveni 17 galvas plūsmas pagriezieniem, norādot, ka karte ir pieejama (nevis, teiksim, nejaušs troksnis, kas jūsu lasītājam sūta viltus datus), un to izmanto, lai apstiprinātu, ka iegūtie dati ir kartes dati un nav junk. Šo savienojumu var izlaist, ja datu straumē pārbaudāt, vai nav sākuma signāla. Vairāk par to vēlāk. Kā redzat zemāk, es izmantoju taisna leņķa vīriešu galviņu, kas savienota ar maizes dēli, un pievienoju tam savu lasītāju. Es savienoju /STROBE ar PIND2 (Arduino digitālā tapa 2), /CARD_PRESENT ar PIND3 (ilustratīviem nolūkiem) un /DATA1 ar PIND4. Pārliecinieties, vai šajās tapās ir iespējota pievilkšanās, lai tapas nepeldētu. Es arī nomainīju savu Arduino pret Bare Bones AVR, jo man patīk veids, kā tas iekļaujas maizē.

3. darbība: Magnētiskās kartes pamati

Magnētiskās kartes pamati
Magnētiskās kartes pamati

Galvenās funkcijas, kas jums jāveic, lai lasītu magnētisko karti, ir šādas: 1. noteikt, kad karte ir pārvilkta; dati Pirmkārt, es jūs iepazīstināšu ar dažiem magnētiskās kartes pamatiem, kas jums jāzina, kad sākat rakstīt savu kodu.

Magnētisko karšu standarti

Magnētiskās kartes ISO standartizē šādos dokumentos: 7810 Kredītkartes izmēra dokumenta fiziskās īpašības 7811-1 Reljefs 7811-2 Magnētiskā josla-zema koercivitāte 7811-3 Reljefu rakstzīmju atrašanās vieta 7811-4 1. un 2. celiņa atrašanās vieta 7811- 5 3. celiņa atrašanās vieta 7811-6 Magnētiskā josla - augsta koercivitāte 7813 Finanšu darījumu kartes Kā redzat, finanšu kartes ir norādītas atsevišķā dokumentā, un tām bieži ir atšķirīgs formāts nekā, piemēram, jūsu pārtikas preču kartei vai starptautiskajai vizītkartei. Jums būs jāprogrammē šīs atšķirības. Man tikko bija pa rokai kredītkarte un apdrošināšanas karte, tāpēc es ieprogrammēju šiem tipiem (kas abi ir B formāts).

Kartes formāti

Magnētiskajām kartēm ir vairāki dažādi formāti. A un B formāts ir izplatīts, un B ir visizplatītākais, ko esmu redzējis, un kas tiek atbalstīts šajā kodā. Formātus no C līdz M rezervē ISO, es uzskatu, bet N līdz ?? ir rezervētas institucionālai lietošanai. 1. ieraksts Finanšu kartēm pirmais celiņš tiek ierakstīts ar 210 bitiem collā un ir kartes pirmais 0.110 collas no augšas. Dati tiek kodēti kā "kartes dati" kā 7 biti uz rakstzīmi. Tas ir 6 biti raksturu un mazliet paritāti. 1. celiņā ir ~ 79 burtciparu rakstzīmes. Fiziskā secība ir atpakaļ. Tas nozīmē, ka dati ir, bet kartē tie ir ierakstīti atpakaļ (un līdz ar to jūsu programmaparatūra tos nolasīs) kā. paritāte ir nepāra. Kartes datu formāts izskatās šādi:

[SS] [FC] [Primārais konts #] [FS] [Nosaukums] [FS] [Papildu dati] [FS] [ES] [LRC], kur:

SS Start sentinel FC Formāta kods FS Lauku atdalītājs ES Beigu kontrolieris LRC Gareniskā atlaišana Pārbaudīt rakstzīmi Viens maršruts SS = '%', FC = viens no formātiem (daudzkārt būs B), FS bieži ir '', ES ir '?' ' un LRC raksturs parasti ir “<”, lai gan tas nav noteikts standartos. Papildus tam, ka kartē ir ierakstīts atpakaļ, datiem ir nepāra paritātes bits un tie ir 0x20 no ASCII. Mēs to apstrādāsim, kad apstrādāsim datus. 2. celiņš Otrais celiņš ir 0,110 collas plats un sākas 0,110 no kartes augšdaļas. Tā ierakstīšanas blīvums ir 75 biti collā. Dati ir 5 biti uz rakstzīmi un sastāv tikai no aptuveni 40 ciparu simboliem. Jums nevajadzētu saskarties burtiem šajā ceļā. Kartes datu formātam jāatbilst šai struktūrai

[SS] [primārais konts #] [FS] [papildu dati | diskrecionāri dati] [ES] [LRC]

Otrā celiņa SS ir semikols: ';' un FS ir '=' Ar šīm svētajām zināšanām, turpiniet nākamo darbību, lai redzētu kodu, kas ievieš iepriekš izklāstīto procedūru.

4. darbība. Noteikt, kad karte tiek pārvilkta

Noteikt, kad tiek pārvilkta karte
Noteikt, kad tiek pārvilkta karte

1. Noteikt, kad karte ir oficiāli pārvilkta, pārbaudot /CARD_PRESENT tapu, lai redzētu, vai tā ir samazinājusies. Par laimi, tas nav īsti nepieciešams. Vēlāk pārbaudīsim derīgu karti. Alternatīvi, jūs varētu izlasīt savu stroboskopu, lai redzētu, kad uz tapas ir uzlikti strobi, tomēr tas ļaus jums iegūt daudz nulles. Lasītājs nosūtīs aptuveni 60–70 sākuma nulles, lai jūs informētu, ka dati tiks iesniegti. Tomēr mēs izmantosim bināro datu raksturu, lai noteiktu, kad sākt bitu ierakstīšanu. Pirmā celiņa sākuma kontrolsargs (SS) ir procentuālā zīme (%). Tā binārā vērtība ir 0010 0101, kas nozīmē, ka tā tiks saglabāta (un nolasīta) kā 1010 001 (tas ir 7 biti, tāpēc astotais bits netiek pārraidīts). Tagad gudrais lasītājs pamanīs, ka, pat ja dati ir atpakaļ, tie neatbilst binārajai ASCII vērtībai. Tas ir tāpēc, ka tas ir 0x20 no hex. Simbols % ir 0x25 un 0100 0101 ir 0x05. Kartes dati no vērtības ir atņemti 0x20. Tas, kas tur karājas augstajā kodienā, ir nepāra paritātes bits. Tas ir ievietots tā, lai vērtībā būtu nepāra skaits “1”. Tā kā mēs zinām, ka derīga karte vienmēr sāksies ar šo sākuma kontrolsargu un paritātes bits ir 1, tad, kad datu tapā konstatēsim pirmo pāreju no HIGH to LOW, mēs zinām, ka esam tikko sākuši saņemt sāciet sardzi no kartes. Tagad tas ne vienmēr būs taisnība, un bezjēdzīgs plāns būtu pārbaudīt /CARD_PRESENT karti, lai redzētu, vai tā papildus ir pazudusi. Vienkāršākais veids, kā noteikt SS sākumu, ir izveidot ārēju pārtraukumu, kas iedarbināts uz /STROBE krītošās malas. Dati ir derīgi 1,0 mums pirms krītošās malas, tādēļ, kad esat izlasījis krītošās malas paraugu, jūs zināt, ka varat izlasīt /DATA1 tapu un iegūt derīgu vērtību. Šeit ir kods, lai izveidotu ārēju pārtraukumu, kas iedarbināts uz krītošas malas.

voidInitInterrupt (void) {// Setup interrupt BSET (EIMSK, INT0); // ārējā pārtraukuma maska BSET (EICRA, ISC01); // krītošā mala BCLR (EICRA, ISC00); // krītošā mala BSET (SREG, 7); // I-bit SREG}

Manā kopējā.h, ko iekļauju visās savās programmās, var atrast BSET un BCLR definīcijas. Ja jums ir kādi jautājumi par bitu iestatīšanu, skatiet šo failu. Tagad, kad tiek aktivizēts pārtraukums, mēs vēlamies izlasīt /DATA1 (manā kodā, kas definēts kā CARD_DATA) un mazliet iestatīt vispārēja lietojuma IO reģistrā. Ja izmantojam 7. bitu, saglabājiet reģistru kā rakstzīmi mūsu globālajā buferī. Es izmantoju GPIOR0 reģistru, jo tam ir ātra piekļuve. Pseidokods ir apmēram šāds:

Apturēt 16 bitu taimeri Notīrīt taimeri Ja DATI ir LOW Iestatīt BIT = 1 REGISTER Decrement BIT Set karodziņš, lai mēs vairs neizlaistu 0's other DATA is HIGH Set BIT = 0 in REGISTER Decrement BIT Ja BIT ir 0 Pievienojiet baitu buferim Palielinājuma indekss Atiestatīt BIT

Ja jūs sev jautājat, kāpēc samazinājums, nevis pieaugums, atcerieties, ka dati ir atpakaļ, tāpēc tā vietā, lai ierakstītu bitus, kad tos saņemam no LSB uz MSB, mēs tos saglabājam no MSB uz LSB, lai mums nebūtu jāmaina biti. vēlāk, apstrādājot datus. Ja jūs patiešām gribējāt, šeit varat pievienot arī 0x20 hex, bet, tā kā šajos strobos ir aptuveni 5us, es šajā pārtraukuma pakalpojuma rutīnā apstrādāju līdz minimumam.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // apgriezti zems = 1 {BSET (GPIOR0, bits); -bitu; bDataPresent = 1; } cits if (bDataPresent) {BCLR (GPIOR0, bits); -bitu; } ja (bits <0) {buff [idx] = (char) GPIOR0; ++ idx; bits = 6; } StartTimer ();} Ja jums rodas jautājums, kāds ir laika noteikšanas bizness, tas ir aprakstīts solī, lai noteiktu, kad karte ir atstājusi lasītāju.

5. darbība: izlasiet datu plūsmu

Izlasiet datu plūsmu

Nu, es jau parādīju, kā lasīt datus, jo tā ir daļa no pakalpojumu pārtraukšanas rutīnas mūsu krītošajam ārējam pārtraukumam. Alternatīva metode būtu karoga iestatīšana ISR un galvenās cilpas aptaujā karogs un datu nolasīšana šādā veidā, bet es uzskatu, ka veids, kādā es to prezentēju, ir tīrāks. Esiet savs tiesnesis un uzrakstiet savu, tomēr jūsu MCU to atļaus. To sakot, pāriesim pie tā, lai uzzinātu, kā noteikt, kad karte velk Elvisu un atstāj ēku.

6. darbība: atklājiet karti, kas atstāj lasītāju

Atklāt karti, kas atstāj lasītāju
Atklāt karti, kas atstāj lasītāju

Noteikt, kad karte ir pazudusi

Formāli varētu izlasīt /CARD_PRESENT tapu, lai redzētu, vai tas vairs nav AUGSTS, bet mums nav nepieciešams, lai steenkin ' /CARD_PRESENT ieņemtu citu I /O portu. Šeit ierodas šie taimeri. Katru reizi, kad tiek izsaukts pārtraukums, jo esam konstatējuši krītošu malu /STROBE, mēs apturējam taimeri, notīrām taimera vērtību un sākam lasīt. Kad esam pabeiguši lasīšanu, mēs atkal ieslēdzam taimeri. Atkārtojiet ad nauseum vai līdz taimeris sasniedz noteiktu vērtību. Tas nozīmē, ka ir izsaukts pēdējais pārtraukums un vairs nav ienākuši dati, tāpēc mēs pieņemam, ka tas tā ir, un sākam apkopot apkopotos datus. Taimeriem mēs izmantojam TIMER1, ti, 16 bitu taimeri. Ārēji savam AVR izmantoju 16 Mhz rezonatoru. Ja jūs izmantojat arduino, iespējams, arī jūs to izmantojat. Tātad, es esmu izvēlējies prescaler vērtību 1024, kas nozīmē katru (16 000 000 /1024) reizes, kad taimeris palielināsies. Tas nozīmē, ka tas "atzīmēs" 15, 625 reizes sekundē. /CARD_PRESENT parādīsies HIGH, norādot, ka karte ir atstājusi lasītāju apmēram 150 ms pēc pēdējā datu bita. Zinot to, es vienkārši nolēmu pārbaudīt apmēram ik pēc 1/4 sekundes. Tas izskatītos apmēram šādi:

((((F_CPU) / PRESCALER) / 4) kas izrādās ap 3900. Tātad, kad taimera skaitītājs TCNT1 sasniedz 3900, tad es zinu, ka ir pagājuši aptuveni 300 ms, un es varu diezgan droši secināt, ka karte ir atstājusi lasītāju. Viegli

#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) Jūs esat redzējis ISR, kur taimeris tiek iedarbināts, apturēts un notīrīts katrā pārtraukumā. Tagad galvenajā cilpā mēs vienkārši pārbaudām, vai taimera skaitītājs ir sasniedzis mūsu mērķa vērtību, un, ja tā, tad sāciet datu apstrādi

par (;;) {ja (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bits = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Tagad ir droši apstrādāt datus

kodu formatējis

7. darbība: apstrādājiet datus

Apstrādāt datus
Apstrādāt datus

Apstrādājiet datus

Apstrādes posms sastāv no:

  • pārbaudot derīgu SS
  • paritātes pārbaude
  • konvertēšana uz ASCII
  • pārbaudot derīgu ES
  • LRC pārbaude

Šeit es neuztraucos ar paritātes pārbaudi, jo es vienkārši iestatīju šo bitu uz nulli. Es arī neaprēķinu LRC šai mazajai apmācībai. Tas būtu kaut kas, ko varētu vēlēties darīt pilnībā realizēta programmaparatūra. Šeit ir kods, lai apstrādātu datus, veicot iepriekš minētās darbības (bez iepriekš minētā). Atrodiet to attēlā zemāk. Tas ir komentēts un diezgan pašsaprotams. Īpaša piezīme par paritāti un ASCII: es vienkārši notīrīju paritātes bitu (7. bits… ti, 1 ar 6 nullēm aiz tā) un, lai konvertētu no “kartes datiem”, vērtībai jāpievieno 0x20. Apmēram tā.

8. darbība: parādiet datus

Parādiet datus
Parādiet datus
Parādiet datus
Parādiet datus

Parādiet datus

Displejs iet uz termināļa programmu, kuru es rakstīju, lai izveidotu savienojumu ar AVR, izmantojot RS232 vai USB. Programmu sauc par AVR termināli. ReadData () metode ir diezgan neglīta, un jūs esat aicināti atrast tīrāku risinājumu nekā tas, ko es izdomāju. AVR terminālī ir arī funkcijas izvade. Rezultāts vispirms ir veselības apdrošināšanas karte, bet otrais - VISA karte. Noklikšķiniet uz attēla augšējā kreisajā stūrī un izvēlieties oriģinālu vai lielu attēlu, lai to labāk redzētu.

9. darbība: koda lejupielāde un apkopošana

Šajā pamācībā esmu apspriedis dažus magnētisko karšu lasītāju pamatus un parādījis jums kodu, lai sāktu pareizajā virzienā lasīt datus no magnētiskajām kartēm. Ir vēl daudz darba, ko varētu paveikt, piemēram, otrā celiņa lasīšana un atšifrēšana, LRC aprēķināšana un nepāra paritātes aprēķināšana katrā baitā. Pilns avota kods ir pieejams lejupielādei zemāk. Tas tika rakstīts AVR Studio 4.17. Es ceru, ka jums patika šī pamācība, un, kā vienmēr, es ceru uz jūsu komentāriem vai ieteikumiem. Laimīgu kodēšanu un AVR'ing!

Ieteicams: