Съдържание:

Превърнете вашия Arduino в четец на магнитни карти!: 9 стъпки (със снимки)
Превърнете вашия Arduino в четец на магнитни карти!: 9 стъпки (със снимки)

Видео: Превърнете вашия Arduino в четец на магнитни карти!: 9 стъпки (със снимки)

Видео: Превърнете вашия Arduino в четец на магнитни карти!: 9 стъпки (със снимки)
Видео: Програмируем дом - Цветан Узунов 2024, Юли
Anonim
Превърнете вашия Arduino в четец на магнитни карти!
Превърнете вашия Arduino в четец на магнитни карти!
Превърнете вашия Arduino в четец на магнитни карти!
Превърнете вашия Arduino в четец на магнитни карти!
Превърнете вашия Arduino в четец на магнитни карти!
Превърнете вашия Arduino в четец на магнитни карти!

Всеки е използвал четец на магнитни карти, вярвам. Искам да кажа, кой носи пари в наши дни? Те също не са трудни за хващане и по време на пътуване до любимия ми местен магазин за електроника открих кошче, пълно с тези момчета. Така че… разбира се, взех един и го донесох у дома, за да видя какви неща мога да направя с него и AVR.

Тази инструкция ще ви покаже как да свържете четец на магнитни карти Magtek към AVR или Arduino/клониране и да прочетете данни от първия запис на картата. Закопчавайте седалките си; четците на магнитни карти имат висок битрейт!

Стъпка 1: Списък на оборудването

Списък на оборудването
Списък на оборудването
Списък на оборудването
Списък на оборудването

Ето няколко неща, които ще ви трябват, за да започнете.

  • Магнитен четец на карти (Моят е четец с двойна глава Magetk 90 мм. $ 5,00)
  • AVR, Arduino или клонинг (ATmega328p ~ $ 4,30 от Mouser.com
  • макет без запояване
  • малко жица
  • може би заглавие, ако харесвате това нещо.
  • нещо за четене на вашия сериен порт. Използвам AVR терминал от BattleDroids.net

Това е всичко, което трябва да имате, за да започнете. В зависимост от четеца на magcard, който в крайна сметка получавате, може да се наложи да промените тези инструкции и най -сигурно кода, за да работите с вашия конкретен четец. Надявам се обаче, че кодът, който съм написал, трябва да ви отведе доста далеч.

Стъпка 2: Самозадействащи се четци на магнитни карти

Самозатварящи се четци на магнитни карти
Самозатварящи се четци на магнитни карти
Самозатварящи се четци на магнитни карти
Самозатварящи се четци на магнитни карти
Самозатварящи се четци на магнитни карти
Самозатварящи се четци на магнитни карти
Самозатварящи се четци на магнитни карти
Самозатварящи се четци на магнитни карти

Магнитните четци на карти са „самостоятелно синхронизирани“, което означава, че те осигуряват часовник, наречен строб, срещу който свързаният микроконтролер може да се синхронизира. Това е благодат. Това означава, че не е нужно да се притеснявате за търсене на синхронизиращ сигнал и синхронизиране на сигнала за центриране директно върху тактовия импулс и без притеснителни колебания в сладкото място на часовника. Това има смисъл, когато мислите за плъзгане на карти: всеки плъзга с различно темпо, някои по -бавно, някои по -бързо от други. Самостоятелното синхронизиране позволява дори на моята сладка баба да може да използва картата си, без да си счупи китката. Напомня ми, че трябва да й променя настройката, която определя колко време е валидно между кликванията, за да регистрирам двойно щракване….

Данните на този четец на карти са валидни 1,0 us преди стробоскопа да бъде пуснат в линията, така че няма притеснения за забавяне, за да влезете в „малкото време“. За четец с двойна глава, като този, който използвам, има две трасета с данни, достъпни за четене. В тази таблица ще покажа четене от първото първо парче, за да започнете. Има пет връзки, които ще трябва да направите (четири, ако нямате нищо против да се откажете от по -фино настроен контрол за по -малко използвани I/O портове). Вижте снимката по -долу. Червеният проводник преминава към +5V, докато черният проводник отива към земята. Зеленият проводник е /CARD_PRESENT; жълтият проводник е /STROBE, а белият проводник е /DATA1. Наклонената черта (/) означава, че данните са обърнати. Нисък сигнал (т.е. 0) се чете като единица или висок. Другите съединители са кафяви за /STROBE2 и оранжеви за /DATA2. Няма да ги използваме. Ако искате, можете да забравите за /CARD_PRESENT. Тази линия с данни се понижава след около 17 завъртания на потока на главата, за да покаже, че има карта (вместо, да речем, случаен шум, който кара вашия четец да изпраща фалшиви данни) и се използва за потвърждаване, че данните, които получавате, са данни от карта и не боклуци. Можете да пропуснете тази връзка, ако проверите за стартовия дозор в потока от данни. Повече за това по -късно. Както можете да видите по -долу, използвах правоъгълен мъжки хедър, свързан към дъска за хляб и свързах моя четец с това. Свързах /STROBE към PIND2 (цифров пин 2 на Arduino), /CARD_PRESENT към PIND3 (за илюстрация) и /DATA1 към PIND4. Уверете се, че сте активирали издърпвания на тези щифтове, така че щифтовете ви да не плават. Аз също продадох моя Arduino за AVR с Bare Bones, защото харесвам начина, по който се вписва в макета.

Стъпка 3: Основи на магнитната карта

Основи на магнитната карта
Основи на магнитната карта

Основните функции, които трябва да направите, за да прочетете магнитната карта, са: 1. Откриване, когато картата е прекарана с пръст 2. Прочетете потока от данни 3. Открийте, когато картата е изчезнала 4. Обработете данните 5. Покажете данни Първо ще ви запозная с някои основи на магнитната карта, които ще трябва да знаете, когато започнете да пишете свой собствен код.

Стандарти за магнитни карти

Магнитните карти са стандартизирани от ISO в следните документи: 7810 Физически характеристики на документ с размер на кредитна карта 7811-1 Релефен 7811-2 Магнитна лента-ниска коерцитивност 7811-3 Местоположение на релефни знаци 7811-4 Местоположение на следи 1 & 2 7811- 5 Местоположение на писта 3 7811-6 Магнитна лента - висока коерцитивност 7813 Карти за финансови транзакции Както можете да видите, финансовите карти са посочени в отделен документ и често имат различни формати, отколкото, да речем, вашата карта за хранителни стоки или международна телефонна карта. Ще трябва да програмирате за тези различия. Току -що имах удобна кредитна карта и застрахователна карта, затова програмирах за тези типове (и двата са формат В).

Формати на карти

Има няколко различни формата за магнитни карти. Формат A и B са често срещани, като B е най -често срещаният, който съм виждал, и който се поддържа в този код. Вярвам, че форматите C до M са запазени от ISO, докато N до ?? са запазени за институционална потребителска употреба. Песен 1 За финансови карти първият запис се записва при 210 бита на инч и е първият 0,110 "от картата отгоре. Данните се кодират като" данни на картата "като 7 бита на символ. Това са 6 бита за символът и малко за паритет. Има около 79 буквено -цифрови знака на писта 1. Физическото подреждане е обратно. Тоест данните са, но са записани назад на картата (и следователно, ще се четат от вашия фърмуер) като. паритетът е нечетен. Форматът на данните на картата изглежда така:

[SS] [FC] [Основен акаунт #] [FS] [Име] [FS] [Допълнителни данни] [FS] [ES] [LRC], където:

SS Старт караул FC Код на формат FS Разделител на полета ES Край на стража LRC Надлъжен излишък Проверка на символа Проследявайте един SS = '%', FC = един от форматите (ще бъде B много пъти), FS често е '', ES е '?' и символът LRC обикновено е '<', въпреки че не е посочен в стандартите. Освен че са записани на картата назад, данните имат нечетен бит за паритет и са 0x20 от ASCII. Ще се справим с това, когато обработваме данните. Песен 2 Втората писта е широка 0,110 "и започва с 0,110 от горната част на картата. Плътността на запис е 75 бита на инч. Данните са 5-битови на символ и се състоят само от около 40 цифрови символа. Не трябва да срещате никакви букви в тази песен. Форматът за данни на картата трябва да следва тази структура

[SS] [първичен акаунт #] [FS] [допълнителни данни | дискреционни данни] [ES] [LRC]

SS за песен втора е точката с запетая: ';' и FS е '=' С тези свети знания под колана си, продължете към следващите стъпки, за да видите кода, изпълняващ процедурата, описана по -горе.

Стъпка 4: Открийте, когато картата се плъзне

Откриване при плъзгане на карта
Откриване при плъзгане на карта

1. Открийте, когато картата е прекарана Формално, човек би проверил щифта /CARD_PRESENT, за да види дали е паднал ниско. За щастие, това всъщност не е необходимо. По -късно ще проверим за валидна карта. Алтернативно, можете да прочетете своя щифт за строб, за да видите кога са поставени стробоскопи на щифта, но това ще ви осигури много нули. Читателят ще изпрати около 60-70 водещи нули, за да ви уведоми, че данните са на път да бъдат представени. Ние обаче ще използваме естеството на двоичните данни, за да определим кога да започнем да записваме битове. Стартовият страж (SS) за първа писта е знакът за процент (%). Двоичната му стойност е 0010 0101, което означава, че ще се съхранява (и чете) като 1010 001 (това е 7-бита, така че 8-мият бит не се предава). Проницателният читател ще забележи, че въпреки че данните са обратно, те не съвпадат с двоичната ASCII стойност. Това е така, защото е 0x20 извън шестнадесетичния. Символът % е 0x25, а 0100 0101 е 0x05. Данните от картата са извадени 0x20 от стойността. Този, който виси там във високото хапване, е странният бит. Поставя се така, че да има нечетен брой "1" в стойността. Така че, тъй като знаем, че валидна карта винаги ще започва с този начален контролер и тъй като битът за паритет е 1, тогава когато открием първия преход от ВИСОКО към НИСКО на извода за данни, знаем, че току -що сме започнали да получаваме стартирайте стража от карта. Сега това не винаги ще бъде вярно и надежден план би бил да проверите /CARD_PRESENT картата, за да видите дали е изчезнала НИСКО в допълнение. Най -простият начин за откриване на стартирането на SS е да се създаде външно прекъсване, задействано по падащия ръб на /STROBE. Данните са валидни 1,0 us преди падащия ръб, така че когато сте взели проба от падащия ръб, тогава знаете, че можете да прочетете /DATA1 щифта и да получите валидна стойност. Ето кода за създаване на външно прекъсване, задействано от падащ ръб.

voidInitInterrupt (void) {// Настройка прекъсване BSET (EIMSK, INT0); // външна маска за прекъсване BSET (EICRA, ISC01); // падащ ръб BCLR (EICRA, ISC00); // падащ ръб BSET (SREG, 7); // I-bit в SREG}

В моя common.h, който включвам във всичките си програми, могат да се намерят определенията на BSET и BCLR. Обърнете се към този файл, ако имате въпроси относно това как да зададете битове. Сега, когато прекъсването се задейства, искаме да вземем проба от /DATA1 (в моя код, дефиниран като CARD_DATA) и да зададем малко в регистъра за входове /изходи с общо предназначение. Ако сме на 7 -ми бит, запазете регистъра като знак в нашия глобален буфер. Използвам регистър GPIOR0, защото има бърз достъп. Псевдо кодът е нещо подобно:

Спрете 16-битовия таймер Изчистване на таймера Ако DATA е НИСКИ Задайте BIT = 1 в REGISTER Decrement BIT Задайте флаг, така че да не пропускаме повече 0, иначе DATA е HIGH Set BIT = 0 в REGISTER Decrement BIT Ако BIT е 0 Добавете байт към буфера Индекс на увеличаване Нулирайте BIT

Ако се питате защо намаление вместо увеличаване, не забравяйте, че данните са обратно, така че вместо да записваме битовете, докато ги получаваме от LSB в MSB, ние ги запазваме от MSB в LSB, така че не е нужно да обръщаме битовете по -късно при обработката на данните. Ако наистина искате, можете също да добавите 0x20 шестнадесетица тук, но тъй като това е около 5us на тези стробове, свеждам обработката в тази рутинна услуга за прекъсване до минимум.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // обратно ниско = 1 {BSET (GPIOR0, бит); --бит; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, бит); --бит; } if (бит <0) {buff [idx] = (char) GPIOR0; ++ idx; бит = 6; } StartTimer ();} Ако се чудите за какво става въпрос с времето, това е обхванато в стъпката за определяне кога картата е напуснала четеца.

Стъпка 5: Прочетете потока от данни

Прочетете потока от данни

Е, вече ви показах как да четете данните, тъй като те са част от рутинната услуга за прекъсване за нашето външно прекъсване. Алтернативен метод би бил да зададете флаг в ISR, а в основния цикъл да огледате флага и да прочетете данните по този начин, но вярвам, че начинът, по който съм го представил, е по -чист. Бъдете ваш собствен съдия и напишете своя, но вашият MCU ще го позволи. Като се има предвид това, нека да преминем към откриването как да разпознаем, когато картата дърпа Елвис и е напуснала сградата.

Стъпка 6: Открийте картата, напускаща четеца

Открийте картата, напускаща четеца
Открийте картата, напускаща четеца

Открийте, когато картата е изчезнала

Формално, човек би взел проба от /CARD_PRESENT щифта, за да види дали отново е висок, но не се нуждаем от steenkin ' /CARD_PRESENT, заемащ друг I /O порт. Тук влизат тези таймери. Всеки път, когато прекъсването е извикано, защото сме открили падащ ръб на /STROBE, спираме таймера, изчистваме стойността на таймера и започваме да четем. Когато приключим с четенето, стартираме таймера отново. Повторете рекламния гадене или докато таймерът достигне определена стойност. Това означава, че последното прекъсване е извикано и не са постъпили повече данни, затова приемаме, че това е всичко и започваме да обработваме събраните от нас данни. За таймери използваме TIMER1, т.е. 16-битов таймер. Използвам 16 Mhz резонатор външно към моя AVR. Ако използвате arduino, вероятно и вие сте. Така че, аз съм избрал стойност на предварителния дебитор от 1024, което означава всеки (16, 000, 000 /1024) пъти, когато таймерът ще се увеличава. Тоест, той ще „цъка“15, 625 пъти в секунда. /CARD_PRESENT ще стане ВИСОК, което показва, че картата е напуснала четеца около 150 мс след последния бит данни. Знаейки това, просто реших да проверявам на всеки 1/4 от секундата. Това би изглеждало така:

(((F_CPU) / PRESCALER) / 4) което се оказва около 3900. И така, когато броячът на таймера TCNT1 достигне 3900, тогава знам, че са минали около 300 мс и мога спокойно да заключа, че картата е напуснала четеца. Лесно

#дефинирайте PRESCALER 1024#дефинирайте CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#определете StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 предсказващо устройство#дефинирайте StopTimer () BCLR (TCCR1B, CS10), BCLR (TCCR1B, CS12)#дефинирайте ClearTimer () (TCNT1 = 0) Виждали сте в ISR къде таймерът се стартира, спира и изчиства при всяко прекъсване. Сега в основния цикъл просто проверяваме дали броячът на таймера е достигнал нашата целева стойност и ако е така, започнете обработката на данни

за (;;) {ако (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; бит = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Сега е безопасно да се обработват данните

код, форматиран от

Стъпка 7: Обработете данните

Обработвайте данните
Обработвайте данните

Обработвайте данните

Фазата на обработка се състои от:

  • проверка за валиден SS
  • проверка на паритета
  • конвертиране в ASCII
  • проверка за валиден ES
  • проверка на LRC

Тук не се притеснявам да проверявам паритета, тъй като просто зададох този бит на нула. Аз също не изчислявам LRC за този малък урок. Това би било нещо, което един по -напълно реализиран фърмуер може да иска да направи. Ето кода за обработка на данните, изпълнявайки горните стъпки (без споменатото по -горе). Намерете го на изображението по -долу. Това е коментирано и доста обяснително. Специална бележка за паритета и ASCII: Просто изчиствам бита за паритет (7 -ми бит … т.е. 1 с 6 нули зад него) и за преобразуване от "данни на картата" трябва да добавите 0x20 към стойността. Това е всичко.

Стъпка 8: Показване на данните

Показване на данните
Показване на данните
Показване на данните
Показване на данните

Показване на данните

Дисплеят отива към терминална програма, която написах специално за свързване към AVR чрез RS232 или USB. Програмата се нарича AVR Terminal. Методът ReadData () е доста грозен и се насърчавате да намерите по -чисто решение от това, което измислих. Има и изход на функцията в AVR терминала. Резултатът е първият от здравноосигурителна карта, а вторият е от VISA карта. Щракнете върху в горния ляв ъгъл на картината и изберете оригинално или голямо изображение, за да го видите по -добре.

Стъпка 9: Изтегляне на кода и опаковане

В тази инструкция съм обсъдил някои основи на четците на магнитни карти и ви показах код, за да започнете в правилната посока при четене на данни от магнитни карти. Има още много работа, която може да се свърши, като четене и декодиране на втората песен, изчисляване на LRC и изчисляване на нечетния паритет за всеки байт. Пълният изходен код е достъпен за изтегляне по -долу. Написано е в AVR Studio 4.17. Надявам се да ви хареса тази инструкция и, както винаги, очаквам с нетърпение всякакви коментари или предложения, които може да имате. Щастливо кодиране и AVR'ing!

Препоръчано: