Përmbajtje:

Kthejeni Arduino -në tuaj në një Lexues të Kartave Magnetike !: 9 hapa (me fotografi)
Kthejeni Arduino -në tuaj në një Lexues të Kartave Magnetike !: 9 hapa (me fotografi)

Video: Kthejeni Arduino -në tuaj në një Lexues të Kartave Magnetike !: 9 hapa (me fotografi)

Video: Kthejeni Arduino -në tuaj në një Lexues të Kartave Magnetike !: 9 hapa (me fotografi)
Video: Turn Signal Light Flowing LED Strip 2024, Korrik
Anonim
Kthejeni Arduino -n tuaj në një Lexues të Kartave Magnetike!
Kthejeni Arduino -n tuaj në një Lexues të Kartave Magnetike!
Kthejeni Arduino -n tuaj në një Lexues të Kartave Magnetike!
Kthejeni Arduino -n tuaj në një Lexues të Kartave Magnetike!
Kthejeni Arduino -n tuaj në një Lexues të Kartave Magnetike!
Kthejeni Arduino -n tuaj në një Lexues të Kartave Magnetike!

Të gjithë kanë përdorur një lexues magnetik të kartave, besoj. Dua të them, kush mban para këto ditë? As ata nuk janë të vështirë për ju, dhe gjatë një udhëtimi në dyqanin tim të preferuar elektronik lokal, gjeta një kosh plot me këta djem. Kështu që … natyrisht, mora një dhe e solla në shtëpi për të parë se çfarë lloj gjërash mund të bëja me të dhe një AVR.

Ky udhëzues do t'ju tregojë se si të lidhni një lexues të kartës magnetike Magtek me një AVR ose Arduino/klon dhe të lexoni të dhënat nga pjesa e parë e kartës. Mbërtheni vendet tuaja; lexuesit e kartave magnetike kanë një shkallë të lartë të bitit!

Hapi 1: Lista e pajisjeve

Lista e pajisjeve
Lista e pajisjeve
Lista e pajisjeve
Lista e pajisjeve

Këtu janë disa gjëra që ju nevojiten për të filluar.

  • Lexues magnetik i kartave (e imja është një lexues me dy koka Magetk 90mm. 5.00 dollarë)
  • AVR, Arduino ose klon (ATmega328p 4. 4.30 dollarë nga Mouser.com
  • dërrasë buke pa saldim
  • ndonjë tel
  • ndoshta një kokë nëse ju pëlqen kjo gjë e tillë.
  • diçka për të lexuar portin tuaj serik. Unë përdor Terminalin AVR nga BattleDroids.net

Kjo është gjithçka që ju nevojitet për të filluar. Në varësi të lexuesit magcard që përfundoni duke marrë, mund t'ju duhet të modifikoni këto udhëzime, dhe më e sigurt kodin, për të punuar me lexuesin tuaj specifik. Sidoqoftë, kodi që kam shkruar duhet t'ju çojë shumë larg, shpresoj.

Hapi 2: Lexuesit e kartave magnetike të vetë-rregullimit

Lexues të kartave magnetike të vetë-rregullimit
Lexues të kartave magnetike të vetë-rregullimit
Lexues të kartave magnetike të vetë-rregullimit
Lexues të kartave magnetike të vetë-rregullimit
Lexues të kartave magnetike të vetë-rregullimit
Lexues të kartave magnetike të vetë-rregullimit
Lexues të kartave magnetike të vetë-rregullimit
Lexues të kartave magnetike të vetë-rregullimit

Lexuesit e kartave magnetike janë "të vetë-rregulluar", që do të thotë se ato ofrojnë një orë të quajtur strobe, kundër së cilës mikrokontrolluesi i lidhur mund të sinkronizohet. Kjo është një ndihmë. Kjo do të thotë që ju nuk duhet të shqetësoheni për kërkimin e një sinjali të orës dhe vendosjen e sinjalit në qendër direkt në pulsin e orës, dhe asnjë lëkundje shqetësuese në pikën e ëmbël të sinjalit të orës. Kjo ka kuptim kur mendoni për rrëshqitjet e kartave: të gjithë rrëshqasin me një ritëm të ndryshëm, disa më ngadalë, disa më shpejt se të tjerët. Vetë-fiksimi i lejon edhe gjyshes sime të ëmbël aftësinë për të përdorur kartën e saj pa e thyer kyçin e dorës. Më kujton se duhet të ndryshoj cilësimin për të që përcakton sa kohë është e vlefshme midis klikimeve për të regjistruar një klik të dyfishtë….

Të dhënat e lexuesit të kartës janë të vlefshme 1.0 na para se stroboja të vihet në linjë, kështu që nuk ka shqetësim për vonesën për të hyrë në "kohën e bitit". Për një lexues të dyfishtë me kokë të tillë si ai që unë jam duke përdorur, ka dy gjurmë të të dhënave në dispozicion për t'u lexuar. Në këtë 'ible, unë do të tregoj leximin nga pjesa e parë parësore për t'ju filluar. Ekzistojnë pesë lidhje që do t'ju duhet të bëni (katër nëse nuk e keni problem të hiqni dorë nga një kontroll më i rregulluar për më pak porte I/O që përdoren). Shikoni foton më poshtë. Teli i kuq shkon në +5V ndërsa tela e zezë shkon në tokë. Teli i gjelbër është /CARD_PRESENT; tela e verdhë është /STROBE, dhe tela e bardhë është /DATA1. Prerja e përparme (/) do të thotë që të dhënat janë përmbysur. Një sinjal i ulët (p.sh. 0) lexohet si një, ose i lartë. Lidhësit e tjerë janë ngjyrë kafe për /STROBE2 dhe portokalli për /DATA2. Ne nuk do t'i përdorim këto. Nëse dëshironi, mund të harroni për /CARD_PRESENT. Kjo linjë e të dhënave shkon poshtë pas rreth 17 rrotullimeve të fluksit të kokës për të treguar që një kartë është e pranishme (në vend të, të themi, zhurmës së rastësishme që shkakton që lexuesi juaj të dërgojë të dhëna të rreme) dhe përdoret për të vërtetuar që të dhënat që po merrni janë të dhëna të kartës dhe jo hedhurinë. Ju mund ta kaloni këtë lidhje nëse kontrolloni për rojtarin e fillimit në rrjedhën e të dhënave. Më shumë për këtë më vonë. Siç mund ta shihni më poshtë, unë kam përdorur një kokë të kokës mashkull me kënd të drejtë të lidhur me një dërrasë buke dhe e kam lidhur lexuesin tim me të. Unë u lidha /STROBE me PIND2 (pin dixhital 2 në një Arduino), /CARD_PRESENT me PIND3 (për qëllime ilustrimi), dhe /DATA1 me PIND4. Sigurohuni që të aktivizoni tërheqjet në këto kunja në mënyrë që kunjat tuaja të mos notojnë. Unë gjithashtu tregtova Arduino -n tim për një AVR të Bare Bones sepse më pëlqen mënyra se si përshtatet në tryezën e bukës.

Hapi 3: Bazat e Kartës Magnetike

Bazat e kartës magnetike
Bazat e kartës magnetike

Funksionet kryesore që do të duhet të bëni për të lexuar një kartë magnetike janë: 1. Zbuloni kur karta është rrëshqitur 2. Lexoni rrjedhën e të dhënave 3. Zbuloni kur karta ka shkuar 4. Përpunoni të dhënat 5. Shfaqni të dhëna Së pari, unë do t'ju prezantoj me disa baza të kartës magnetike që do t'ju duhet të dini kur filloni të shkruani kodin tuaj.

Standardet e Kartave Magnetike

Kartat magnetike janë të standardizuara nga ISO në dokumentet e mëposhtëm: 7810 Karakteristikat fizike të dokumentit të madhësisë së kartës së kreditit 7811-1 Embossing 7811-2 Shirit magnetik-shtrëngim i ulët 7811-3 Vendndodhja e personazheve të stampuar 7811-4 Vendndodhja e gjurmëve 1 & 2 7811- 5 Vendndodhja e pistës 3 7811-6 Shirit magnetik - shtrëngim i lartë 7813 Kartat e transaksioneve financiare Siç mund ta shihni, kartat financiare janë të specifikuara në një dokument të veçantë dhe shpesh kanë formate të ndryshme sesa, të themi, kartën tuaj ushqimore ose kartën ndërkombëtare të thirrjeve. Ju do të duhet të programoni për këto dallime. Sapo kisha një kartë krediti dhe kartë sigurimi të dobishme, kështu që programova për këto lloje (të cilat të dyja ndodhin të jenë në formatin B).

Formatet e kartave

Ekzistojnë disa formate të ndryshme për kartat magnetike. Formati A dhe B janë të zakonshëm, me B që është më i zakonshmi që kam parë, dhe i cili mbështetet në këtë kod. Formatet C deri në M janë të rezervuara nga ISO, besoj, ndërsa N deri në ?? janë të rezervuara për përdorim me porosi institucionale. Pjesa 1 Për kartat financiare, pjesa e parë regjistrohet në 210 bit për inç dhe është 0.110 "e parë e kartës nga lart. Të dhënat janë të koduara si" të dhëna karte "si 7-bit për karakter. Kjo është 6-bit për karakteri dhe pak për barazi. Ka characters 79 karaktere alfanumerike në rrugën e parë 1. Renditja fizike është prapa. Domethënë, të dhënat janë por janë të shkruara prapa në kartë (dhe kështu, do të lexohen nga firmware -i juaj) si. barazia është e çuditshme. Formati i të dhënave të kartës duket kështu:

[SS] [FC] [Llogaria Kryesore #] [FS] [Emri] [FS] [Të dhëna shtesë] [FS] [ES] [LRC] ku:

SS Start sentinel FC Formati i kodit FS Ndarës i fushës ES Fund sentinel LRC Kontrolli gjatësor i tepricës Ndiqni një SS = '%', FC = një nga formatet (do të jetë B shumë herë), FS është shpesh '', ES është '?' dhe karakteri LRC është zakonisht '<' edhe pse nuk është specifikuar në standarde. Përveç që janë të shkruara në kartë prapa, të dhënat kanë një bit pariteti tek dhe janë 0x20 nga ASCII. Ne do ta trajtojmë këtë kur përpunojmë të dhënat. Pjesa 2 Pjesa e dytë është 0.110 "e gjerë dhe fillon 0.110 nga maja e kartës. Dendësia e regjistrimit është 75 bit për inç. Të dhënat janë 5-bit për karakter dhe përbëhen vetëm nga rreth 40 simbole numerike. Ju nuk duhet të hasni asnjë shkronja në këtë udhë. Formati i të dhënave të kartës duhet të ndjekë këtë strukturë

[SS] [llogaria kryesore #] [FS] [të dhëna shtesë | të dhëna diskrecionale] [ES] [LRC]

SS për pistën e dytë është pikëpresje: ';' dhe FS është '=' Me këtë njohuri të shenjtë nën brezin tuaj, vazhdoni në hapat e ardhshëm për të parë kodin që zbaton procedurën e përshkruar më sipër.

Hapi 4: Zbuloni kur fshihet një kartë

Zbuloni kur fshihet një kartë
Zbuloni kur fshihet një kartë

1. Zbuloni kur një kartë është rrëshqitur zyrtarisht, dikush do të kontrollonte kunjin /CARD_PRESENT për të parë nëse është ulur poshtë. Për fat të mirë, kjo nuk është vërtet e nevojshme. Ne do të kontrollojmë kartën e vlefshme më vonë. Përndryshe, ju mund të lexoni kunjin tuaj të strobës për të parë kur strobet janë vënë në kunj, megjithatë, kjo do t'ju sjellë shumë zero të kohës. Lexuesi do të dërgojë rreth 60-70 zero zero për t'ju bërë të ditur se të dhënat do të paraqiten. Sidoqoftë, ne do të përdorim natyrën e të dhënave binare për të përcaktuar kur të fillojmë regjistrimin e bitëve. Sentineli fillestar (SS) për pjesën e parë është shenja e përqindjes (%). Vlera e tij binare është 0010 0101 që do të thotë se do të ruhet (dhe lexohet) si 1010 001 (është 7-bit kështu që biti i 8-të nuk transmetohet). Tani, lexuesi i zgjuar do të vërejë se edhe pse të dhënat janë prapa, ato nuk përputhen me vlerën binare ASCII. Kjo për shkak se është 0x20 larg nga gjashtëkëndëshi. Simboli % është 0x25 dhe 0100 0101 është 0x05. Të dhënat e kartës janë zbritur 0x20 nga vlera. Ai që rri atje në gërvishtjen e lartë është pjesa e barabartë e çuditshme. Shtë vendosur atje në mënyrë që të ketë një numër tek "1" në vlerë. Pra, sepse ne e dimë që një kartë e vlefshme do të fillojë gjithmonë me këtë roje të fillimit, dhe sepse biti i paritetit është 1, atëherë kur zbulojmë kalimin e parë HIGH në LOW në pinin e të dhënave, atëherë e dimë që sapo kemi filluar të marrim filloni rojtarin nga një kartë. Tani, kjo nuk do të jetë gjithmonë e vërtetë, dhe një plan i patëmetë do të ishte të kontrolloni kartën /CARD_PRESENT për të parë nëse ka shkuar LOW përveç kësaj. Mënyra më e thjeshtë për të zbuluar fillimin e SS, është krijimi i një ndërprerjeje të jashtme të shkaktuar në skajin në rënie të /STROBE. Të dhënat janë të vlefshme 1.0 na para skajit në rënie, kështu që kur të keni marrë mostrën e skajit në rënie, atëherë e dini që mund të lexoni pinin /DATA1 dhe të merrni një vlerë të vlefshme. Këtu është kodi për të krijuar ndërprerjen tuaj të jashtme të shkaktuar në një avantazh në rënie.

voidInitInterrupt (void) {// Ndërprerja e konfigurimit BSET (EIMSK, INT0); // maskë ndërprerëse e jashtme BSET (EICRA, ISC01); // buzë në rënie BCLR (EICRA, ISC00); // buzë në rënie BSET (SREG, 7); // I-bit në SREG}

Në Common.h që përfshij në të gjitha programet e mia, mund të gjenden përkufizimet e BSET dhe BCLR. Referojuni atij skedari nëse keni ndonjë pyetje se si të vendosni bit. Tani, kur ndërpritet ndërprerja, ne duam të marrim mostrën e /DATA1 (në kodin tim të përcaktuar si CARD_DATA) dhe të vendosim pak në një regjistër IO me qëllim të përgjithshëm. Nëse jemi në bitin e 7 -të, ruani regjistrin si një personazh në tamponin tonë global. Unë përdor një regjistër GPIOR0 sepse ka qasje të shpejtë të shpejtë. Pseudo kodi është diçka si kjo:

Ndalo kohëmatësin 16-bit Fshij kohëmatësin Nëse të dhënat janë të ulëta BIT = 1 në REGJISTRIM BREZIMI BIT Vendosni flamurin në mënyrë që të mos anashkalojmë më 0 të dhëna të tjera janë të LARTA BIT = 0 në REGJISTRIM BIT në rënie Nëse BIT është 0 Shtoni bajt në tampon Indeksi i rritjes Rivendos BIT

Nëse po pyesni veten pse zvogëloni në vend që të rriteni, mbani mend se të dhënat janë prapa, kështu që në vend që të regjistrojmë bitët kur i marrim nga LSB në MSB, ne i ruajmë ato nga MSB në LSB kështu që nuk kemi pse të përmbysim bitët më vonë gjatë përpunimit të të dhënave. Nëse dëshironi me të vërtetë, mund të shtoni edhe magji 0x20 këtu, por meqenëse është rreth 5 në këto strobe, unë po e mbaj në minimum përpunimin në këtë rutinë të shërbimit të ndërprerë.

ISR (INT0_vect) {StopTimer (); ClearTimer (); nëse (! BCHK (PIND, CARD_DATA1)) // inversi i ulët = 1 {BSET (GPIOR0, bit); --bit; bDataPranishme = 1; } tjetër nëse (bDataPresent) {BCLR (GPIOR0, bit); --bit; } if (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Nëse po pyesni se për çfarë bëhet fjalë për biznesin e kohës, kjo mbulohet në hapin për të përcaktuar kur karta është larguar nga lexuesi.

Hapi 5: Lexoni rrjedhën e të dhënave

Lexoni rrjedhën e të dhënave

Epo, unë tashmë ju kam treguar se si t'i lexoni të dhënat, pasi është pjesë e Rutinës së Shërbimit Ndërprerës për ndërprerjen tonë të jashtme. Një metodë alternative do të ishte vendosja e një flamuri në ISR, dhe në sondazhin e lakut kryesor flamurin dhe leximin e të dhënave në atë mënyrë, por besoj se mënyra se si e kam paraqitur është më e pastër. Bëhuni gjykatësi juaj dhe shkruani tuajin sidoqoftë MCU -ja juaj do ta lejojë atë. Thënë kështu, le të kalojmë në zbulimin se si të zbulojmë kur karta tërheq një Elvis dhe është larguar nga ndërtesa.

Hapi 6: Zbuloni kartën që largohet nga lexuesi

Zbuloni kartën që largohet nga lexuesi
Zbuloni kartën që largohet nga lexuesi

Zbuloni kur një kartë është zhdukur

Zyrtarisht, dikush do të merrte mostrën e kunjit /CARD_PRESENT për të parë nëse ka dalë përsëri LART HIGH, por nuk kemi nevojë të marrim parasysh një port tjetër I /O. Këtu hyjnë ato kohëmatësit. Sa herë që ndërprerja thirret sepse kemi zbuluar një avantazh në rënie në /STROBE, ndalojmë një kohëmatës, pastrojmë vlerën e kohëmatësit dhe fillojmë të lexojmë. Kur të kemi mbaruar së lexuari fillojmë përsëri kohëmatësin. Përsëriteni nauseum, ose derisa kohëmatësi të arrijë një vlerë të caktuar. Kjo do të thotë që ndërprerja e fundit është thirrur dhe nuk ka më shumë të dhëna, kështu që ne supozojmë se është ajo dhe fillojmë të përpunojmë të dhënat që kemi mbledhur. Për kohëmatësit, ne përdorim TIMER1, domethënë kohëmatësin 16-bit. Unë jam duke përdorur një rezonator 16 Mhz nga jashtë në AVR tim. Nëse jeni duke përdorur një arduino, atëherë me siguri jeni gjithashtu. Pra, unë kam zgjedhur një vlerë parashkruese prej 1024 që do të thotë çdo (16, 000, 000 /1024) herë që kohëmatësi do të rritet. Kjo do të thotë, do të "shënojë" 15, 625 herë në sekondë. /CARD_PRESENT do të shkojë LART duke treguar që karta i ka lënë lexuesit rreth 150ms pas bitit të fundit të të dhënave. Duke e ditur këtë, unë thjesht vendosa të kontrolloj çdo 1/4 të sekondës. Do të duket diçka si kjo:

((((F_CPU) / PRESCALER) / 4) që rezulton të jetë rreth 3900. Pra, kur numëruesi i kohëmatësit TCNT1 arrin 3900, atëherë e di që ka qenë rreth 300ms dhe mund të konkludoj me siguri se karta është larguar nga lexuesi. Lehtë

#define PRESCALER 1024#përcakto CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#përcakto StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler#define StopTimer () BCLR (TCCR1, CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) Ju keni parë në ISR ku kohëmatësi është nisur, ndaluar dhe pastruar në secilën ndërprerje. Tani, në lakin kryesor ne thjesht kontrollojmë për të parë nëse numëruesi i kohëmatësit ka arritur vlerën tonë të synuar, dhe nëse po, filloni përpunimin e të dhënave

për (;;) {nëse (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); DataData (); Lexo të dhënat (); idx = 0; bit = 6; bDataPranishme = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Tani është e sigurt të përpunoni të dhënat

kodi i formatuar nga

Hapi 7: Përpunoni të dhënat

Përpunoni të dhënat
Përpunoni të dhënat

Përpunoni të dhënat

Faza e përpunimit përbëhet nga:

  • duke kontrolluar për një SS të vlefshme
  • kontrollimi i barazisë
  • duke u konvertuar në ASCII
  • kontrollimi për një ES të vlefshme
  • duke kontrolluar LRC

Këtu, unë nuk shqetësohem me kontrollimin e barazisë, pasi thjesht e vendosa atë bit në zero. Unë gjithashtu nuk e llogaris LRC për këtë mësim të vogël. Kjo do të ishte diçka që një firmware i realizuar më plotësisht mund të dëshirojë të bëjë. Këtu është kodi për të përpunuar të dhënat duke bërë hapat e mësipërm (pa të përmendurit më parë). Gjeni atë në imazhin më poshtë. Commentedshtë e komentuar dhe mjaft vetë-shpjeguese. Një shënim i veçantë për barazinë dhe ASCII: Unë thjesht pastroj bitin e paritetit (biti i 7 -të … dmth një 1 me 6 zero pas tij) dhe për të konvertuar nga "të dhënat e kartës" duhet të shtoni 0x20 në vlerë. Kjo është për të.

Hapi 8: Shfaqni të dhënat

Shfaq të dhënat
Shfaq të dhënat
Shfaq të dhënat
Shfaq të dhënat

Shfaq të dhënat

Ekrani shkon në një program terminal që kam shkruar posaçërisht për t'u lidhur me një AVR përmes RS232 ose USB. Programi quhet AVR Terminal. Metoda ReadData () është shumë e shëmtuar dhe ju jeni të inkurajuar të gjeni një zgjidhje më të pastër se ajo me të cilën kam dalë. Ekziston edhe një dalje e funksionit në Terminalin AVR. Rezultati është së pari i një karte të sigurimit shëndetësor, dhe e dyta është e një karte VISA. Klikoni në këndin e sipërm të majtë të figurës dhe zgjidhni imazhin origjinal ose të madh për ta parë më mirë.

Hapi 9: Shkarkimi dhe Përfundimi i Kodit

Në këtë udhëzues unë kam diskutuar disa bazat e lexuesve të kartave magnetike dhe ju kam treguar disa kode për të filluar në drejtimin e duhur në leximin e të dhënave nga kartat magnetike. Ka shumë punë që mund të bëhen, të tilla si leximi dhe deshifrimi i pjesës së dytë, llogaritja e LRC dhe llogaritja e barazisë tek në secilin bajt. Kodi i plotë burimor është në dispozicion për shkarkim më poshtë. Shtë shkruar në AVR Studio 4.17. Shpresoj që ju ka pëlqyer kjo udhëzuese dhe, si gjithmonë, mezi pres çdo koment apo sugjerim që mund të keni. Kodim të lumtur dhe AVR'ing!

Recommended: