Мазмұны:

Ардуиноны магниттік картаны оқуға айналдырыңыз!: 9 қадам (суреттермен)
Ардуиноны магниттік картаны оқуға айналдырыңыз!: 9 қадам (суреттермен)

Бейне: Ардуиноны магниттік картаны оқуға айналдырыңыз!: 9 қадам (суреттермен)

Бейне: Ардуиноны магниттік картаны оқуға айналдырыңыз!: 9 қадам (суреттермен)
Бейне: Получение картины магнитного поля прямого тока постоянного магнита 2024, Шілде
Anonim
Arduino -ны магниттік картаны оқу құрылғысына айналдырыңыз!
Arduino -ны магниттік картаны оқу құрылғысына айналдырыңыз!
Arduino -ны магниттік картаны оқу құрылғысына айналдырыңыз!
Arduino -ны магниттік картаны оқу құрылғысына айналдырыңыз!
Arduino -ны магниттік картаны оқу құрылғысына айналдырыңыз!
Arduino -ны магниттік картаны оқу құрылғысына айналдырыңыз!

Барлығы магниттік карта оқу құралын қолданды, менің ойымша. Айтайын дегенім, бұл күндері қолма -қол ақшаны кім алып жүреді? Оларға қол жеткізу қиын емес, мен жергілікті электроника дүкеніне барған кезде мен осы балаларға толы қоқыс жәшігін таптым. Сонымен ….әрине, мен оны алып, үйге алып келдім, онымен мен AVR -мен не істеуге болатынын көрдім.

Бұл нұсқаулық сізге Magtek магниттік карта оқу құралын AVR немесе Arduino/clone -ге қалай қосуға болатынын және картаның бірінші жолындағы мәліметтерді оқуды көрсетеді. Орындықтарыңызды бекітіңіз; магниттік карта оқу құралдарының биттік жылдамдығы жоғары!

1 -қадам: жабдықтар тізімі

Құрал -жабдықтар тізімі
Құрал -жабдықтар тізімі
Құрал -жабдықтар тізімі
Құрал -жабдықтар тізімі

Міне, бастау үшін сізге қажет бірнеше нәрсе.

  • Магниттік карта оқу құралы (Mine-бұл Magetk 90mm қос бас оқу құралы. 5,00 доллар)
  • AVR, Arduino немесе клон (ATmega328p ~ $ 4.30 Mouser.com сайтынан
  • дәнекерленбеген нан тақтасы
  • біраз сым
  • Мүмкін тақырып сізге ұнайтын болса.
  • сериялық портты оқу керек нәрсе. Мен AVR терминалын BattleDroids.net сайтынан қолданамын

Бұл сізге бастау үшін қажет. Сиқырлы картаны оқитын адамға байланысты сіз өзіңіздің жеке оқырманыңызбен жұмыс істеу үшін осы нұсқауларды және, әрине, кодты өзгертуіңіз қажет болуы мүмкін. Дегенмен, мен жазған код сізді алысқа апарады деп үміттенемін.

2-қадам: өздігінен жұмыс істейтін магниттік картаны оқу құрылғылары

Өздігінен жұмыс істейтін магниттік картаны оқу құрылғылары
Өздігінен жұмыс істейтін магниттік картаны оқу құрылғылары
Өздігінен жұмыс жасайтын магниттік картаны оқу құрылғылары
Өздігінен жұмыс жасайтын магниттік картаны оқу құрылғылары
Өздігінен жұмыс істейтін магниттік картаны оқу құрылғылары
Өздігінен жұмыс істейтін магниттік картаны оқу құрылғылары
Өздігінен жұмыс жасайтын магниттік картаны оқу құрылғылары
Өздігінен жұмыс жасайтын магниттік картаны оқу құрылғылары

Магниттік картаны оқитындар «өздігінен жұмыс жасайды», яғни олар микробақылауға синхрондалатын, строб деп аталатын сағатты ұсынады. Бұл - жақсылық. Бұл сізге сағат сигналын іздеу және сигналды сағат импульсінде тікелей орталықтандыратын уақыт туралы алаңдаудың қажеті жоқ екенін білдіреді, және тәуліктік сигналдың тәтті нүктесінде ешқандай тербеліс болмайды. Бұл картаны сырғыту туралы ойлаған кезде мағынасы бар: әркім әр түрлі жылдамдықпен, біреулер баяу, біреулер басқаларына қарағанда жылдам сырғытады. Өздігінен жұмыс жасау менің тәтті әжеме тіпті картасын білегін сындырмай пайдалануға мүмкіндік береді. Маған екі рет шертуді тіркеу үшін нұқу арасында қанша уақыт болатынын анықтайтын параметрді өзгерту керектігін еске салады.

Бұл карта оқырманының деректері строб сызыққа шығарылғанға дейін 1,0 бізде жарамды, сондықтан «битке» кіруді кешіктіру туралы алаңдамаңыз. Мен қолданатын қос бас оқырман үшін оқу үшін екі деректер трегі бар. Бұл кітапта мен сізді бастау үшін бірінші тректен бастап оқуды көрсетемін. Сізге бес қосылым қажет (егер сіз аз енгізу -шығару порттары үшін жақсы реттелген басқарудан бас тартпасаңыз, төртеуі). Төмендегі суретті қараңыз. Қызыл сым +5В, қара сым жерге қосылады. Жасыл сым - /CARD_PRESENT; сары сым /STROBE, ал ақ сым /DATA1. Алға қарай қиғаш сызық (/) деректердің төңкерілгенін білдіреді. Төмен сигнал (яғни 0) бір немесе жоғары деп оқылады. Басқа қосқыштар қоңыр түсті /STROBE2 және қызғылт сары /DATA2 үшін. Біз бұларды қолданбаймыз. Қаласаңыз /CARD_PRESENT туралы ұмыта аласыз. Бұл деректер желісі картаның бар екенін көрсету үшін шамамен 17 бастың ағыны айналуынан кейін төмендейді (мысалы, кездейсоқ шу оқырманға жалған деректерді жіберуге себеп болады) және сіз алатын мәліметтер карта деректері екенін растау үшін қолданылады. қоқыс емес Егер сіз деректер ағынында старт жіберушісін тексерсеңіз, бұл байланысты өткізіп жіберуге болады. Бұл туралы толығырақ кейінірек. Төменде көріп тұрғаныңыздай, мен нан тақтасына қосылған тік бұрышты еркек тақырыбын қолдандым және оқырманымды соған қостым. Мен PIND2 -ге /STROBE (сандық PIN 2 Arduino), /CARD_PRESENT PIND3 -ке (иллюстрация мақсатында) және /DATA1 -ге PIND4 қосылдым. Сіздің түйреуіштеріңіз қалқып кетпеуі үшін осы түйреуіштерді тартуды қосқаныңызға көз жеткізіңіз. Мен сондай -ақ Arduino -ны жалаңаш сүйектерге арналған AVR -мен алмастырдым, себебі оның тақтаға сәйкес келуі ұнайды.

3 -қадам: магниттік картаның негіздері

Магниттік карта негіздері
Магниттік карта негіздері

Магниттік картаны оқу үшін сізге қажет негізгі функциялар: 1. Картаның сырғығанын анықтау 2. Деректер ағынын оқу 3. Картаның кеткенін анықтау 4. Деректерді өңдеу 5. Дисплейді көрсету деректер Алдымен мен сізге өзіңіздің жеке кодты жаза бастағанда білуіңіз керек магниттік карта негіздерімен таныстырамын.

Магниттік карта стандарттары

Магниттік карталар ISO-мен келесі құжаттарда стандартталған: 7810 Несие картасы көлеміндегі құжаттың физикалық сипаттамалары 7811-1 Эмпрессивті 7811-2 Магниттік жолақ-төмен мәжбүрлік 7811-3 Бедерлі таңбалардың орналасуы 7811-4 1 және 2 жолдардың орналасуы 7811- 5 3 -жолдың орналасқан жері 7811-6 Магниттік жолақ - жоғары мәжбүрлік 7813 Қаржылық транзакция карталары Көріп отырғаныңыздай, қаржылық карталар жеке құжатта көрсетілген және көбінесе сіздің азық -түлік картаңызға немесе халықаралық визит картасына қарағанда әр түрлі форматта болады. Сіз бұл айырмашылықтарды бағдарламалауыңыз керек. Менде несие картасы мен сақтандыру картасы ғана болды, сондықтан мен осы түрлерді бағдарламаладым (екеуі де В форматында болады).

Карта форматтары

Магниттік карталардың бірнеше форматтары бар. А және В форматы кең таралған, В - мен көргендердің ең кең тарағаны және осы кодта қолдау көрсетіледі. Менің ойымша, C мен M форматтары ISO арқылы сақталған, ал N арқылы ?? олар институционалды пайдалануға арналған. 1-ші жол Қаржылық карталар үшін дюймге 210 биттен жазылған бірінші карта жоғарыдан картаның бірінші 0.110 дюймі болып табылады. Деректер «карта деректері» ретінде әр таңбаға 7 бит ретінде кодталған. Бұл 6 бит үшін 1 -жолда ~ 79 әріптік -цифрлық таңба бар. Физикалық тәртіп кері бағытта. Яғни, деректер картада артқа жазылады (демек, сіздің микробағдарламаңыз оқиды). паритеті тақ. Картаның деректер форматы келесідей:

[SS] [FC] [Primary Account #] [FS] [Name] [FS] [Қосымша деректер] [FS] [ES] [LRC] мұнда:

SS Start sentinel FC Формат коды FS Өрісті бөлгіш ES End sentinel LRC Longitudinal Redundancy Тексеру сипаты Бір SS = '%', FC = форматтардың бірін қадағалаңыз (жиі B болады), FS жиі '', ES - '?' және LRC таңбасы әдетте '<' болып табылады, бірақ ол стандарттарда көрсетілмеген. Карточкаға артқа жазудан басқа, деректер тақ паритетке ие және ASCII -ден 0x20. Біз бұл деректерді өңдегенде шешеміз. 2-трек Екінші жолдың ені 0,101 дюймді құрайды және картаның жоғарғы жағынан 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 картасын оның LOW төмен кеткенін тексеру үшін тексеру өте жақсы болады. SS басталуын анықтаудың ең қарапайым әдісі /STROBE құлап жатқан шетінде сыртқы үзіліс жасау. Деректер құлап кетпес бұрын бізде 1.0 жарамды, сондықтан сіз сынған кезде /DATA1 түйреуішін оқып, дұрыс мәнді алуға болатынын білесіз. Міне, сыртқы үзілістің құлап бара жатқан шетінде жасалатын код.

voidInitInterrupt (void) {// BSET үзілуін орнату (EIMSK, INT0); // сыртқы үзіліс маскасы BSET (EICRA, ISC01); // құлайтын шегі BCLR (EICRA, ISC00); // құлайтын жиек BSET (SREG, 7); // I-bit SREG-де}

Менің барлық бағдарламаларыма қосылатын менің жалпы.сағымда BSET және BCLR анықтамаларын табуға болады. Егер биттерді орнату туралы сұрақтарыңыз болса, сол файлды қараңыз. Енді үзіліс басталғанда, біз /DATA1 үлгісін (менің кодта CARD_DATA ретінде анықталған) іріктеп алып, жалпы мақсаттағы IO регистріне біраз орнатқымыз келеді. Егер біз 7 -ші разрядта болсақ, регистрді біздің ғаламдық буфердегі таңба ретінде сақтаңыз. Мен GPIOR0 регистрін қолданамын, себебі ол тез қол жетімді. Жалған код келесідей:

16-разрядты таймерді тоқтату Таймерді тазалаңыз, егер ДЕРЕКТЕР ТІРКЕМДІ БІРІТТІРУде БИТ = 1 болса, біз бұдан былай 0-ді өткізіп алмайтын боламыз, ДЕРЕК-ЖОҒАРЫ ТІРКЕУДЕ БИТ = 0 болса, БИТ 0 болса, аралыққа байт қосыңыз Өсу индексі BIT қалпына келтіру

Егер сіз өзіңізге өсудің орнына неге азайту керектігін сұрасаңыз, деректер кері бағытта екенін есте сақтаңыз, сондықтан биттерді LSB -ден MSB -ге жеткізген кезде оларды жазудың орнына біз оларды MSB -тен LSB -ге сақтаймыз, сондықтан биттерді кері қайтарудың қажеті жоқ. кейінірек деректерді өңдеу кезінде. Егер сіз шынымен қаласаңыз, мұнда 0x20 он алтылықты қосуға болады, бірақ бұл стробаларда шамамен 5us болғандықтан, мен бұл үзіліс қызметіндегі өңдеуді минимумға дейін сақтаймын.

ISR (INT0_vect) {StopTimer (); ClearTimer (); егер (! BCHK (PIND, CARD_DATA1)) // кері төмен = 1 {BSET (GPIOR0, бит); -бит; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, бит); -бит; } егер (бит <0) {buff [idx] = (char) GPIOR0; ++ idx; бит = 6; } StartTimer ();} Егер сіз уақыт бизнесі немен байланысты екенін білгіңіз келсе, бұл картаның оқырманнан қашан шыққанын анықтау қадамында қарастырылады.

5 -қадам: Деректер ағынын оқыңыз

Деректер ағынын оқыңыз

Мен сізге деректерді қалай оқу керектігін көрсетіп қойдым, себебі бұл сыртқы үзілістің құлдырауына қызмет көрсету үзілісінің бір бөлігі. Балама әдіс - ISR -де жалауды орнату және негізгі циклде жалаушаны сұрау және деректерді осылай оқу, бірақ мен ұсынған әдіс таза деп ойлаймын. Өзіңіздің судьяңыз болыңыз және өзіңіздің жазыңыз, бірақ сіздің MCU рұқсат береді, бірақ картаның Элвис тартылғанын және ғимараттан шыққанын қалай анықтау керектігін білуге көшейік.

6 -қадам: Оқырманнан шыққан картаны анықтау

Оқырманнан шыққан картаны анықтаңыз
Оқырманнан шыққан картаны анықтаңыз

Картаның қашан кеткенін анықтаңыз

Ресми түрде, /CARD_PRESENT түйреуішінің үлгісі қайтадан жоғары болып кеткенін біледі, бірақ бізге басқа енгізу -шығару портын қосудың қажеті жоқ. Дәл осы жерде таймерлер пайда болады. Үзіліс шақырылған сайын, біз /STROBE -да құлау жиегін анықтадық, біз таймерді тоқтатамыз, таймердің мәнін өшіреміз және оқуды бастаймыз. Оқуды аяқтағаннан кейін таймерді қайта қосамыз. Жарнамалық айнуды немесе таймер белгілі бір мәнге жеткенше қайталаңыз. Бұл соңғы үзіліс шақырылғанын және басқа деректер келмегенін білдіреді, сондықтан біз осылай деп есептейміз және жиналған деректерді өңдей бастаймыз. Таймер үшін біз TIMER1, яғни 16 биттік таймерді қолданамыз. Мен AVR үшін сыртқы 16 МГц резонаторды қолданамын. Егер сіз arduino қолдансаңыз, онда сіз де солай шығарсыз. Сонымен, мен 1024 алдын ала есептегіш мәнін таңдадым, бұл таймердің әр (16000, 000 /1024) есе өсетінін білдіреді. Яғни, ол секундына 15, 625 рет «белгілейді». /CARD_PRESENT ЖОҒАРЫ болады, бұл карта оқырманға соңғы деректер битінен кейін шамамен 150 мс қалдырғанын көрсетеді. Мен мұны біле отырып, әр секундтың 1/4 бөлігін тексеруді шештім. Бұл келесідей көрінеді:

(((F_CPU) / PRESCALER) / 4) Бұл шамамен 3900 шамасында болады. Сонымен, TCNT1 таймерінің есептегіші 3900 -ге жеткенде, мен бұл шамамен 300 мс екенін білемін және картаны оқырманнан қалдырды деп сенімді түрде қорытындылай аламын. Оңай

#define PRESCALER 1024#анықтау CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#startTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler#StopTimer () BCLR (TCCR1) анықтау, CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) Сіз ISR -де таймерді іске қосуды, тоқтатуды және әр үзілісте тазартуды көрдіңіз. Енді негізгі циклде біз таймер есептегіші біздің мақсатты мәнге жеткенін тексереміз, егер солай болса, деректерді өңдеуді бастаймыз.

үшін (;;) {if (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; бит = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Енді деректерді өңдеу қауіпсіз

manoli.net/csharpformat/ пішімделген код

7 -қадам: Деректерді өңдеу

Деректерді өңдеу
Деректерді өңдеу

Деректерді өңдеңіз

Өңдеу кезеңі мыналардан тұрады:

  • жарамды SS бар -жоғын тексеру
  • теңдікті тексеру
  • ASCII түрлендіру
  • жарамды ES -ті тексеру
  • LRC тексеру

Мұнда мен паритетті тексеруден бас тартпаймын, себебі мен бұл битті нөлге қойдым. Мен бұл шағын оқулық үшін LRC есептемеймін. Бұл неғұрлым толық іске асырылған микробағдарлама жасағысы келетін нәрсе болар еді, міне, жоғарыда көрсетілген әрекеттерді орындайтын деректерді өңдеу коды (бұрын айтылғандардан басқа). Оны төмендегі суреттен табыңыз. Бұл түсініктеме және өте түсінікті. Паритет пен ASCII туралы арнайы ескерту: Мен паритеттік битті тазалаймын (7 -ші бит… яғни артында 6 нөлі бар 1) және «карта деректерінен» түрлендіру үшін мәнге 0x20 қосу керек. Бұл туралы.

8 -қадам: Деректерді көрсету

Деректерді көрсету
Деректерді көрсету
Деректерді көрсету
Деректерді көрсету

Деректерді көрсету

Дисплей мен AV2 -ге RS232 немесе USB арқылы қосылу үшін арнайы жазған терминалды бағдарламаға өтеді. Бағдарлама AVR терминалы деп аталады. ReadData () әдісі өте ұсқынсыз, мен сізге мен шешкеннен гөрі таза шешім табуға шақырамын, сонымен қатар AVR терминалында функцияның шығысы бар. Шығару бірінші - медициналық сақтандыру картасы, екіншісі - VISA картасы. Суреттің жоғарғы сол жақ бұрышындағы түймесін басып, оны жақсы көру үшін түпнұсқа немесе үлкен кескінді таңдаңыз.

9 -қадам: кодты жүктеу және жинақтау

Бұл нұсқаулықта мен магниттік карта оқу құралдарының кейбір негіздерін талқылап, магниттік карталардағы деректерді оқуды дұрыс бағытта бастау үшін кодты көрсеттім. Екінші жолды оқу және декодтау, LRC есептеу және әр байттағы тақ теңдікті есептеу сияқты басқа да көптеген жұмыстарды орындауға болады. Толық бастапқы кодты төменде жүктеуге болады. Ол AVR Studio 4.17 -де жазылған. Сізге бұл нұсқаулық ұнады деп үміттенемін және әдеттегідей кез келген пікірлер мен ұсыныстарды асыға күтемін.

Ұсынылған: