Obsah:

Proměňte svůj Arduino na čtečku magnetických karet!: 9 kroků (s obrázky)
Proměňte svůj Arduino na čtečku magnetických karet!: 9 kroků (s obrázky)

Video: Proměňte svůj Arduino na čtečku magnetických karet!: 9 kroků (s obrázky)

Video: Proměňte svůj Arduino na čtečku magnetických karet!: 9 kroků (s obrázky)
Video: Pod pokličkou RFID (Adam Hořčica) 2024, Červenec
Anonim
Proměňte svůj Arduino na čtečku magnetických karet!
Proměňte svůj Arduino na čtečku magnetických karet!
Proměňte svůj Arduino na čtečku magnetických karet!
Proměňte svůj Arduino na čtečku magnetických karet!
Proměňte svůj Arduino na čtečku magnetických karet!
Proměňte svůj Arduino na čtečku magnetických karet!

Věřím, že každý používal čtečku magnetických karet. Chci říct, kdo dnes nosí hotovost? Také není těžké se dostat do rukou a během výletu do mého oblíbeného místního obchodu s elektronikou jsem našel popelnici plnou těchto chlapů. Takže … samozřejmě jsem jednu zvedl a přinesl domů, abych zjistil, jaké věci s ní a AVR mohu dělat.

Tento návod vám ukáže, jak připojit čtečku magnetických karet Magtek k AVR nebo Arduino/klonu a číst data z první stopy karty. Připoutejte se; čtečky magnetických karet mají vysokou přenosovou rychlost!

Krok 1: Seznam vybavení

Seznam vybavení
Seznam vybavení
Seznam vybavení
Seznam vybavení

Zde je pár věcí, které budete pro začátek potřebovat.

  • Čtečka magnetických karet (Důl je 90mm dvouhlavá čtečka Magetk. 5,00 USD)
  • AVR, Arduino nebo klon (ATmega328p ~ 4,30 $ od Mouser.com
  • nepájivé prkénko
  • nějaký drát
  • možná hlavička, pokud se vám ta věc líbí.
  • něco ke čtení vašeho sériového portu. Používám AVR Terminal z BattleDroids.net

To je vše, co byste pro začátek měli potřebovat. V závislosti na čtečce magcard, kterou nakonec získáte, budete možná muset upravit tyto pokyny a nejjistěji kód, aby fungovaly s vaší konkrétní čtečkou. Doufám, že kód, který jsem napsal, by vás měl dostat dost daleko.

Krok 2: Samočinné čtečky magnetických karet

Samočinné magnetické čtečky karet
Samočinné magnetické čtečky karet
Samočinné magnetické čtečky karet
Samočinné magnetické čtečky karet
Samočinné čtečky magnetických karet
Samočinné čtečky magnetických karet
Samočinné magnetické čtečky karet
Samočinné magnetické čtečky karet

Čtečky magnetických karet jsou „samosvorné“, což znamená, že poskytují hodiny zvané stroboskop, proti kterým se připojený mikrokontrolér může synchronizovat. To je požehnání. To znamená, že si nemusíte dělat starosti s hledáním hodinového signálu a načasováním signálu tak, aby se vycentroval přímo na hodinový impuls, a žádný otravný kmitající do sladkého bodu hodinového signálu. To dává smysl, když přemýšlíte o přejezdech karet: každý švihá jiným tempem, někdo pomaleji, někdo rychleji než ostatní. Samočinné hodiny umožňují i mé sladké babičce používat kartu bez zlomení zápěstí. Připomíná mi to, že jsem pro ni musel změnit nastavení, které určuje, kolik času je platné mezi kliknutími, aby se zaregistrovalo dvojité kliknutí….

Data této čtečky karet jsou platná 1,0 us před vložením stroba na linku, takže si nemusíte dělat starosti se zpožděním, abyste se dostali do „bit time“. U čtečky se dvěma hlavami, jako je ta, kterou používám, jsou k dispozici dvě datové stopy, které je možné přečíst. V tomto článku ukážu čtení z první první skladby, abyste mohli začít. Budete muset provést pět připojení (čtyři, pokud vám nevadí vzdát se více jemně vyladěného ovládání pro méně používaných I/O portů). Podívejte se na obrázek níže. Červený vodič jde na +5V, zatímco černý vodič uzemňuje. Zelený vodič je /CARD_PRESENT; žlutý vodič je /STROBE a bílý vodič je /DATA1. Lomítko (/) znamená, že data jsou invertována. Nízký signál (tj. 0) se čte jako jeden nebo vysoký. Ostatní konektory jsou hnědé pro /STROBE2 a oranžové pro /DATA2. Tyto nebudeme používat. Pokud chcete, můžete na /CARD_PRESENT zapomenout. Tato datová linka se po přibližně 17 otáčkách toku hlavy sníží, aby indikovala, že je přítomna karta (namísto například náhodného šumu způsobujícího, že vaše čtečka odesílá falešná data) a slouží k ověření, že získávaná data jsou data karty a ne haraburdí. Toto připojení můžete přeskočit, pokud zkontrolujete počáteční odeslání v datovém proudu. Více o tom později. Jak vidíte níže, použil jsem pravoúhlý samčí konektor připojený k desce chleba a připojil jsem k tomu svou čtečku. Připojil jsem /STROBE na PIND2 (digitální pin 2 na Arduinu), /CARD_PRESENT na PIND3 (pro ilustraci) a /DATA1 na PIND4. Ujistěte se, že na těchto pinech povolíte vytahování, aby vaše piny neplavaly. Také jsem vyměnil své Arduino za Bare Bones AVR, protože se mi líbí, jak zapadá do prkénka.

Krok 3: Základy magnetické karty

Základy magnetické karty
Základy magnetické karty

Chcete -li přečíst magnetickou kartu, musíte provést tyto primární funkce: 1. Zjistit, kdy byla karta přetažena 2. Číst proud dat 3. Zjistit, kdy karta odešla 4. Zpracovat data 5. Zobrazit data Nejprve vás seznámím se základy magnetických karet, které budete potřebovat vědět, když začnete psát vlastní kód.

Standardy magnetických karet

Magnetické karty jsou standardizovány ISO v následujících dokumentech: 7810 Fyzické charakteristiky dokumentu velikosti kreditní karty 7811-1 Reliéf 7811-2 Magnetický proužek-nízká koercitivita 7811-3 Umístění reliéfních znaků 7811-4 Umístění stop 1 a 2 7811- 5 Umístění stopy 3 7811-6 Magnetický proužek - vysoká koercitivita 7813 Karty finančních transakcí Jak vidíte, finanční karty jsou uvedeny v samostatném dokumentu a často mají jiné formáty než například vaše karta s potravinami nebo mezinárodní telefonní karta. Na tyto rozdíly budete muset programovat. Právě jsem měl po ruce kreditní a pojišťovací kartu, a tak jsem naprogramoval pro tyto typy (které jsou shodou okolností ve formátu B).

Formáty karet

Existuje několik různých formátů magnetických karet. Formát A a B jsou běžné, přičemž B je nejběžnější, který jsem viděl, a který je v tomto kódu podporován. Věřím, že formáty C až M jsou vyhrazeny ISO, zatímco N až ?? jsou vyhrazeny pro vlastní institucionální použití. Stopa 1 U finančních karet je první stopa zaznamenána na 210 bitů na palec a je to prvních 0,110 "karty shora. Data jsou kódována jako" data karty "jako 7 bitů na znak. To je 6 bitů pro znak a bit pro paritu. Na stopě 1 je ~ 79 alfanumerických znaků. Fyzické řazení je zpětné. To znamená, že data jsou, ale jsou zapsána zpět na kartu (a proto je bude číst váš firmware) jako. parita je lichá. Formát dat karty vypadá takto:

[SS] [FC] [Číslo primárního účtu] [FS] [Název] [FS] [Další údaje] [FS] [ES] [LRC] kde:

SS Start sentinel FC Format code FS Field separator ES End sentinel LRC Longitudinal Redundancy Check character Sledujte jeden SS = '%', FC = jeden z formátů (mnohokrát bude B), FS je často '', ES je '?' a znak LRC je obvykle '<', i když to není uvedeno v normách. Kromě toho, že jsou data zapsána na kartu zpět, mají lichý paritní bit a jsou 0x20 od ASCII. Vyřešíme to při zpracování dat. Track 2 Track two is 0.110 "wide and starts 0.110 from the top of the card. It's printed density is 75 bits per inch. The data is 5-bits per character and includes a around 40 numeric symbols only. You might become any na této stopě. Formát dat karty by měl odpovídat této struktuře

[SS] [primární účet #] [FS] [další údaje | diskreční údaje] [ES] [LRC]

SS pro stopu dvě je středník: ';' a FS je '=' S těmito svatými znalostmi pod opaskem pokračujte v dalších krocích, abyste viděli kód implementující postup popsaný výše.

Krok 4: Zjistěte, kdy je karta přejetá

Zjistit, kdy je karta přetažena
Zjistit, kdy je karta přetažena

1. Zjistěte, kdy byla karta formálně vyhozena, zkontrolujte pin /CARD_PRESENT, abyste zjistili, zda neklesla. Naštěstí to není opravdu nutné. Platnou kartu zkontrolujeme později. Alternativně byste si mohli přečíst svůj stroboskopický pin, abyste zjistili, kdy byly na pin umístěny záblesky, nicméně tím získáte spoustu taktovacích nul. Čtečka odešle přibližně 60–70 úvodních nul, aby vás informovala, že data budou brzy prezentována. Použijeme však povahu binárních dat k určení, kdy začít zaznamenávat bity. Počáteční indikátor (SS) pro stopu jedna je znak procenta (%). Jeho binární hodnota je 0010 0101, což znamená, že bude uloženo (a načteno) jako 1010 001 (je to 7 bitů, takže 8. bit není přenášen). Bystrý čtenář si nyní všimne, že i když jsou data zpětně, neodpovídají binární hodnotě ASCII. Je to proto, že je to 0x20 z hexu. Symbol % je 0x25 a 0100 0101 je 0x05. Data karty jsou od hodnoty odečtena 0x20. Ten, který visí venku ve vysokém okusování, je lichý paritní bit. Je tam vloženo tak, že v hodnotě je lichý počet „1“s. Protože víme, že platná karta bude vždy začínat tímto počátečním indikátorem, a protože paritní bit je 1, pak když na datovém pinu zjistíme první přechod VYSOKÝ na NÍZKÝ, pak víme, že jsme právě začali přijímat začněte sledovat z karty. Nyní to nemusí být vždy pravda a spolehlivým plánem by bylo zkontrolovat kartu /CARD_PRESENT a zjistit, zda navíc nezmizela NÍZKO. Nejjednodušší způsob, jak zjistit začátek SS, je vytvořit externí přerušení spuštěné na sestupné hraně /STROBE. Data jsou platná 1,0 us před sestupnou hranou, takže když jste vzorkovali sestupnou hranu, pak víte, že si můžete přečíst pin /DATA1 a získat platnou hodnotu. Zde je kód pro vytvoření externího přerušení spuštěného na sestupné hraně.

voidInitInterrupt (void) {// Přerušení instalace BSET (EIMSK, INT0); // externí maska přerušení BSET (EICRA, ISC01); // sestupná hrana BCLR (EICRA, ISC00); // sestupná hrana BSET (SREG, 7); // I-bit v SREG}

V mém common.h, který zahrnuji do všech svých programů, lze najít definice BSET a BCLR. Pokud máte nějaké dotazy týkající se nastavení bitů, podívejte se na tento soubor. Nyní, když je spuštěno přerušení, chceme ochutnat /DATA1 (v mém kódu definovaném jako CARD_DATA) a nastavit bit v obecném registru IO. Pokud jsme na 7. bitu, uložte registr jako znak v naší globální vyrovnávací paměti. Používám registr GPIOR0, protože je to rychlý rychlý přístup. Pseudokód je něco takového:

Zastavit 16bitový časovač Vymazat časovač Je-li DATA NÍZKÁ Nastavit BIT = 1 v REGISTERU Zmenšit BIT Nastavit příznak, abychom nepřeskočili žádné další 0 DATA je VYSOKÁ Nastavit BIT = 0 v REGISTRU Snížit BIT Pokud je BIT 0 Přidat byte do bufferu Index přírůstku Reset BIT

Pokud se ptáte, proč místo přírůstku snižovat, pamatujte, že data jsou zpět, takže místo toho, abychom zaznamenávali bity tak, jak je získáváme z LSB do MSB, ukládáme je z MSB do LSB, abychom nemuseli bity obracet později při zpracování dat. Pokud byste opravdu chtěli, můžete zde také přidat 0x20 hex, ale protože je to na těchto blescích asi 5us, omezuji zpracování v této rutině služby přerušení na minimum.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // inverzní low = 1 {BSET (GPIOR0, bit); --bit; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --bit; } if (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Pokud vás zajímá, o čem je načasování, je to pokryto v kroku při určování, kdy karta opustila čtečku.

Krok 5: Přečtěte si datový proud

Přečtěte si datový proud

No, už jsem vám ukázal, jak číst data, protože je to součást rutiny služby Přerušení pro naše externí přerušení na hraně. Alternativní metodou by bylo nastavení příznaku v ISR a v hlavní smyčce hlasování vlajky a čtení dat tímto způsobem, ale věřím, že způsob, jakým jsem to představil, je čistší. Buďte svým vlastním soudcem a pište svůj, jakkoli vám to MCU dovolí. To znamená, že přejdeme k tomu, abychom zjistili, jak zjistit, kdy karta táhne Elvise a opustila budovu.

Krok 6: Detekce opuštění karty ze čtečky

Zjistěte, že karta opouští čtečku
Zjistěte, že karta opouští čtečku

Zjistěte, kdy karta zmizela

Formálně by člověk mohl ochutnat pin /CARD_PRESENT, aby zjistil, zda je znovu VYSOKÝ, ale nepotřebujeme žádný steenkin ' /CARD_PRESENT zabírající další I /O port. Tady přicházejí ty časovače. Pokaždé, když je vyvoláno přerušení, protože jsme detekovali klesající hranu na /STROBE, zastavíme časovač, vymažeme hodnotu časovače a začneme číst. Když jsme dočetli, spustíme časovač znovu. Opakujte ad nauseum, nebo dokud časovač nedosáhne určité hodnoty. To znamená, že bylo vyvoláno poslední přerušení a nepřišla žádná další data, takže předpokládáme, že to je ono, a začneme zpracovávat data, která jsme shromáždili. Pro časovače používáme TIMER1, tedy 16bitový časovač. Externě používám 16 Mhz rezonátor ke svému AVR. Pokud používáte arduino, pravděpodobně také. Zvolil jsem tedy hodnotu předzapalovače 1024, což znamená, že každý (16 000 000 000/1024) krát se časovač zvýší. To znamená, že to „zatrhne“15, 625krát za sekundu. /CARD_PRESENT přejde na VYSOKOU, což znamená, že karta opustila čtečku asi 150 ms po posledním datovém bitu. Když jsem to věděl, rozhodl jsem se zkontrolovat asi každou 1/4 sekundy. To by vypadalo nějak takto:

((((F_CPU) / PRESCALER)) / 4) což se ukazuje kolem 3900. Takže, když čítač časovače TCNT1 dosáhne 3900, pak vím, že to bylo asi 300 ms a mohu docela bezpečně dojít k závěru, že karta opustila čtečku. Snadný

#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) V ISR jste viděli, kde je časovač spuštěn, zastaven a vymazán při každém přerušení. Nyní v hlavní smyčce pouze zkontrolujeme, zda čítač časovače dosáhl naší cílové hodnoty, a pokud ano, spusťte zpracování dat

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

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Nyní je bezpečné data zpracovávat

kód formátovaný

Krok 7: Zpracování dat

Zpracovat Data
Zpracovat Data

Zpracovat data

Fáze zpracování se skládá z:

  • kontrola platného SS
  • kontrola parity
  • převod na ASCII
  • kontrola platného ES
  • kontrola LRC

Tady se neobtěžuji s kontrolou parity, protože jsem ten bit nastavil na nulu. Pro tento malý návod také nepočítám LRC. To by bylo něco, co by mohl chtít plněji realizovaný firmware. Zde je kód pro zpracování dat provedením výše uvedených kroků (bez výše uvedeného). Najděte to na obrázku níže. Je to komentované a docela samozřejmé. Zvláštní poznámka k paritě a ASCII: Jednoduše vymažu paritní bit (7. bit… tj. 1 se 6 nulami za ním) a pro převod z „dat karty“musíte k hodnotě přidat 0x20. To je asi tak všechno.

Krok 8: Zobrazte data

Zobrazit data
Zobrazit data
Zobrazit data
Zobrazit data

Zobrazit data

Displej přejde na terminálový program, který jsem napsal speciálně pro připojení k AVR přes RS232 nebo USB. Program se nazývá AVR Terminal. Metoda ReadData () je docela ošklivá a doporučujeme vám najít čistší řešení, než jaké jsem vymyslel. Existuje také výstup funkce v AVR Terminal. Výstupem je nejprve karta zdravotního pojištění a druhá karta VISA. Klikněte na v levém horním rohu obrázku a vyberte původní nebo velký obrázek, aby byl lépe vidět.

Krok 9: Stažení kódu a zabalení

V tomto pokynu jsem probral některé základy čteček magnetických karet a ukázal vám nějaký kód, který vám pomůže začít správným směrem při čtení dat z magnetických karet. Je možné vykonat spoustu práce, jako je čtení a dekódování 2. stopy, výpočet LRC a výpočet liché parity v každém bajtu. Úplný zdrojový kód je k dispozici ke stažení níže. To bylo napsáno v AVR Studio 4.17. Doufám, že se vám tento návod dal líbit a jako vždy se těším na vaše případné komentáře nebo návrhy. Šťastné kódování a AVR'ing!

Doporučuje: