Mundarija:

Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!: 9 qadam (rasmlar bilan)
Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!: 9 qadam (rasmlar bilan)

Video: Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!: 9 qadam (rasmlar bilan)

Video: Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!: 9 qadam (rasmlar bilan)
Video: Карта магнит. Как активировать карту магнит 2024, Iyul
Anonim
Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!
Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!
Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!
Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!
Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!
Arduino -ni magnit kartani o'qish qurilmasiga aylantiring!

Hamma magnit kartani o'quvchi ishlatgan, menimcha. Aytmoqchimanki, hozirgi kunda kim naqd pul olib yuradi? Ularni qo'lingizga olish ham qiyin emas va men sevimli mahalliy elektronika do'koniga borganimda, bu bolalar bilan to'la axlat qutisini topdim. Shunday qilib …. Albatta, men bir narsani oldim va uyga olib keldim, u bilan qanday narsalar qilishim va AVR.

Bu ko'rsatma sizga Magtek magnitli kartani o'quvchini AVR yoki Arduino/clone -ga qanday ulashni va kartaning birinchi trekidan ma'lumotlarni o'qishni ko'rsatadi. O'rindiqlarni o'rang; magnit kartani o'qiydiganlar yuqori bit tezligiga ega!

1 -qadam: uskunalar ro'yxati

Uskunalar ro'yxati
Uskunalar ro'yxati
Uskunalar ro'yxati
Uskunalar ro'yxati

Bu erda siz boshlashingiz kerak bo'lgan bir nechta narsalar.

  • Magnit kartani o'quvchi (Mine-bu Magetk 90 mm ikkita boshli o'quvchi. 5,00 dollar)
  • AVR, Arduino yoki klon (ATmega328p ~ $ 4.30 Mouser.com saytidan
  • lehimsiz non paneli
  • qandaydir sim
  • Agar sizga bu narsa yoqsa, ehtimol sarlavha.
  • ketma -ket portni o'qish uchun biror narsa. Men AVR terminalini BattleDroids.net dan foydalanaman

Siz boshlashingiz kerak bo'lgan narsa shu. Magcard o'quvchisiga qarab, siz o'zingizning o'quvchi bilan ishlash uchun ushbu ko'rsatmalarni va, albatta, kodni o'zgartirishingiz kerak bo'ladi. Biroq, men yozgan kod sizni juda uzoqqa olib ketishi kerak deb umid qilaman.

2-qadam: O'z-o'zidan ishlaydigan magnit kartani o'qish moslamalari

O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari
O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari
O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari
O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari
O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari
O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari
O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari
O'z-o'zidan ishlaydigan magnit kartani o'qish vositalari

Magnit kartani o'qiydiganlar "o'z-o'zidan" ishlaydi, ya'ni ular ulangan mikrokontroller sinxronlashi mumkin bo'lgan strobe deb nomlangan soatni ta'minlaydi. Bu ne'mat. Bu shuni anglatadiki, siz soat signalini qidirish va signalni to'g'ridan -to'g'ri soat impulsida markazlashtirish uchun tashvishlanmasligingiz kerak va soat signalining yoqimli joyiga hech qanday bezovta qiluvchi ta'sir ko'rsatmaydi. Bu kartani surish haqida o'ylaganingizda mantiqiy: hamma boshqacha sur'atda, kimdir sekinroq, kimdir boshqalarga qaraganda tezroq siljiydi. Self-clocking hatto mening shirin buvimga ham bilagini sindirmasdan o'z kartasidan foydalanish imkoniyatini beradi. Menga sichqonchani ikki marta bosishni ro'yxatdan o'tkazish uchun qancha vaqt kerakligini belgilaydigan sozlamani o'zgartirish kerakligini eslatadi.

Bu kartani o'quvchi ma'lumoti strob chizig'iga qo'yilgunga qadar bizda 1.0 ga to'g'ri keladi, shuning uchun o'zingizni "bit vaqtiga" kechiktirishdan tashvishlanmang. Ikkita boshli o'quvchi uchun, masalan, men foydalanadigan ikkita o'qish moslamasi mavjud. Bu kitobda men sizni boshlash uchun birinchi trekdan o'qishni ko'rsataman. Siz beshta ulanishni amalga oshirishingiz kerak bo'ladi (agar siz kamroq kirish -chiqish portlari uchun aniq sozlangan boshqaruvdan voz kechmasangiz, to'rttasi). Quyidagi rasmga qarang. Qizil sim +5V ga, qora sim esa erga o'tadi. Yashil sim - CARD_PRESENT; sariq sim /STROBE, oq sim esa /DATA1. Oldinga siljish (/) ma'lumotlarning teskari yo'nalishini bildiradi. Past signal (ya'ni 0) bitta yoki baland sifatida o'qiladi. Boshqa ulagichlar /STROBE2 uchun jigarrang va /DATA2 uchun to'q sariq rangda. Biz bulardan foydalanmaymiz. Agar xohlasangiz, /CARD_PRESENTni unutishingiz mumkin. Bu ma'lumot chizig'i kartaning mavjudligini ko'rsatish uchun taxminan 17 ta bosh aylanishidan keyin past bo'ladi (masalan, tasodifiy shovqin o'quvchingizga noto'g'ri ma'lumotlar yuborishiga olib keladi) va siz olgan ma'lumot karta ma'lumoti ekanligini tasdiqlash uchun ishlatiladi. axlat emas Agar siz ma'lumotlar oqimida boshlang'ich nazoratchini tekshirsangiz, bu ulanishni o'tkazib yuborishingiz mumkin. Bu haqda keyinroq. Quyida ko'rib turganingizdek, men non taxtasiga ulangan to'g'ri burchakli erkak sarlavhasini ishlatdim va o'quvchimni bunga uladim. Men PIND2 ga ulanganman /STROBE (Arduino -dagi raqamli 2 -pin), /CARD_PRESENT PIND3 -ga (rasmlar uchun) va /DATA1 -ni PIND4 -ga. Sizning pinlaringiz suzmasligi uchun bu pinlarda tortishni yoqishingizga ishonch hosil qiling. Men ham Arduino -ni yalang'och suyaklar AVR -ga almashtirdim, chunki uning non taxtasiga to'g'ri kelishi menga yoqdi.

3 -qadam: Magnit karta asoslari

Magnit karta asoslari
Magnit karta asoslari

Magnit kartani o'qish uchun sizga kerak bo'lgan asosiy vazifalar quyidagilardan iborat: 1. Karta qachon siljiganligini aniqlash 2. Ma'lumotlar oqimini o'qish 3. Karta tugaganini aniqlash 4. Ma'lumotni qayta ishlash 5. Displeyni ko'rsatish ma'lumotlar Birinchidan, men sizni o'z kodingizni yozishni boshlaganingizda bilishingiz kerak bo'lgan magnit karta asoslari bilan tanishtiraman.

Magnit karta standartlari

Magnit kartalar ISO tomonidan quyidagi hujjatlarda standartlashtirilgan: 7810 Kredit karta hajmidagi hujjatning fizik xususiyatlari 7811-1 Embrion 7811-2 Magnit tasma-past majburlash 7811-3 Kabartmalı belgilar joylashuvi 7811-4 1 va 2 yo'llarning joylashuvi 7811- 5 3 -trekning joylashuvi 7811-6 Magnit chiziq - yuqori majburlash 7813 Moliyaviy tranzaktsion kartalar Ko'rib turganingizdek, moliyaviy kartalar alohida hujjatda ko'rsatilgan va ko'pincha sizning oziq -ovqat kartangiz yoki xalqaro qo'ng'iroq kartangizdan farqli ravishda turli formatlarga ega. Bu farqlar uchun dasturlash kerak bo'ladi. Menda faqat kredit karta va sug'urta kartasi bor edi, shuning uchun men bu turlarni dasturladim (ikkalasi ham B formatida).

Karta formatlari

Magnit kartalar uchun bir nechta format mavjud. A va B formatlari keng tarqalgan, B men ko'rgan eng keng tarqalgan format va bu kodda qo'llab -quvvatlanadi. Menimcha, C orqali M formatlari ISO tomonidan himoyalangan, lekin N orqali ?? institutsional foydalanish uchun ajratilgan. Track 1 Moliyaviy kartalar uchun birinchi trek dyuymga 210 bitda yoziladi va bu kartaning yuqoridan birinchi 0.110 dyuymidir. Ma'lumotlar "karta ma'lumotlari" sifatida har bir belgi uchun 7 bit sifatida kodlangan. Bu 6 bit uchun 1 -yo'lda ~ 79 ta harfli -raqamli belgilar bor. Jismoniy buyurtma orqaga. Ya'ni ma'lumotlar kartada orqaga yozilgan (va shuning uchun sizning dasturiy ta'minotingiz o'qiydi) kabi. tenglik g'alati. Karta ma'lumotlarining formati quyidagicha:

[SS] [FC] [Asosiy hisob №] [FS] [Ism] [FS] [Qo'shimcha ma'lumotlar] [FS] [ES] [LRC] bu erda:

SS Start sentinel FC Format kodi FS Maydonni ajratuvchi ES End sentinel LRC Uzunlamasına ortiqlikni tekshirish Belgisi Bir SS = '%' ni kuzatib boring, FC = formatlardan biri (ko'p marta B bo'ladi), FS ko'pincha "", ES - "?" va LRC belgisi odatda "<" dir, lekin u standartlarda ko'rsatilmagan. Kartaga orqaga yozilishidan tashqari, ma'lumotlar teng paritetli bitga ega va ASCII dan 0x20. Biz ma'lumotlarni qayta ishlashda buni hal qilamiz. 2-trek 2-trekning kengligi 0,110 dyuym va kartaning yuqori qismidan 0,101 dan boshlanadi. Uning yozish zichligi dyuymga 75 bitni tashkil qiladi. Ma'lumotlar har bir belgi uchun 5 bitdan iborat va faqat 40 ta raqamli belgidan iborat. Siz hech qachon uchramasligingiz kerak. Bu yo'ldagi harflar. Karta ma'lumotlari formati shu tuzilishga mos kelishi kerak

[SS] [asosiy hisob №] [FS] [qo'shimcha ma'lumotlar | ixtiyoriy ma'lumotlar] [ES] [LRC]

Ikkinchi trek uchun SS - nuqta -vergul: ';' va FS '=' Bu muqaddas bilim bilan siz yuqorida ko'rsatilgan tartibni bajarayotgan kodni ko'rish uchun keyingi bosqichlarga o'ting.

4 -qadam: Karta qachon siljishini aniqlang

Karta qachon siljishini aniqlang
Karta qachon siljishini aniqlang

1. Qachon karta rasman siljitilganligini aniqlang, uning pastga tushganligini tekshirish uchun /CARD_PRESENT pinini tekshiring. Yaxshiyamki, bu haqiqatan ham kerak emas. Kartaning haqiqiyligini keyinroq tekshiramiz. Shu bilan bir qatorda, siz strob pinini o'qga o'qga qo'yishingiz mumkin, ammo bu sizga nollarni aniqlab qo'yadi. O'quvchi sizga ma'lumot taqdim etilishi haqida xabar berish uchun 60-70 ga yaqin nollarni yuboradi. Biroq, biz bit ma'lumotlarini yozishni qachon boshlash kerakligini aniqlash uchun ikkilik ma'lumotlarning xususiyatidan foydalanamiz. Birinchi trekning boshlang'ich qo'riqchisi (SS) - foiz belgisi (%). Uning ikkilik qiymati-0010 0101, demak u 1010 001 sifatida saqlanadi (va o'qiladi) (u 7-bit, shuning uchun 8-bit uzatilmaydi). Aqlli o'quvchi, ma'lumotlarning orqada bo'lishiga qaramay, ASCII ikkilik qiymatiga mos kelmasligini payqadi. Buning sababi, u oltilikdan 0x20 gacha. % Belgisi - 0x25, 0100 0101 - 0x05. Karta ma'lumotlari 0x20 qiymatdan chiqariladi. U erda baland pog'onada osilib turadigan narsa - bu g'alati tenglik. Qiymatda "1" ning g'alati soni bo'lishi uchun qo'yilgan. Biz bilamizki, chunki biz joriy karta har doim bu boshlovchi qo'riqchidan boshlanishini bilamiz, va parite biti 1 ga teng bo'lsa, biz ma'lumotlar pinida birinchi pastdan pastgacha o'tishni aniqlaganimizda, biz endigina qabul qila boshlaganimizni bilamiz. qo'riqchini kartadan boshlang. Endi, bu har doim ham to'g'ri bo'lavermaydi va /CARD_PRESENT kartasini qo'shimcha ravishda LOW yo'qolganligini tekshirish kerak. SS boshlanishini aniqlashning eng oddiy usuli bu /STROBE ning tushayotgan chetida tashqi uzilish yaratish. Ma'lumotlar yiqilishdan oldin bizda 1.0 ga to'g'ri keladi, shuning uchun siz tushgan tomonni tanlaganingizda, siz /DATA1 pinini o'qib, to'g'ri qiymatni olishingiz mumkinligini bilasiz. Mana, sizning tashqi uzilishingiz qulab tushadigan chetda paydo bo'lishining kodi.

voidInitInterrupt (void) {// BSET (EIMSK, INT0) uzilishini sozlash; // tashqi uzilish niqobi BSET (EICRA, ISC01); // tushayotgan chekka BCLR (EICRA, ISC00); // pasayayotgan BSET (SREG, 7); // Men SREG-da

Men o'zimning barcha dasturlarimga qo'shgan common.h da BSET va BCLR ta'riflarini topish mumkin. Bitlarni qanday o'rnatish haqida savollaringiz bo'lsa, ushbu faylga qarang. Endi, uzilish ishga tushganda, biz /DATA1 ni (mening kodimda CARD_DATA deb ta'riflanadi) namuna olishni va umumiy maqsadli IO registriga biroz o'rnatishni xohlaymiz. Agar biz 7 -bitda bo'lsak, ro'yxatdan o'tishni global buferdagi belgi sifatida saqlang. Men GPIOR0 registridan foydalanaman, chunki bu tezkor kirish. Soxta kod shunga o'xshash:

16-bitli taymerni to'xtating Taymerni tozalang, agar DATA LOW Set BIT = 1 bo'lsa, Ro'yxatdan o'tishni kamaytiring BITni belgilang, shuning uchun biz boshqa 0 ni o'tkazib yubormaymiz. Kattalashtirish indeksi BITni qayta o'rnating

Agar siz o'zingizga nima uchun o'sishni emas, balki pasayishni so'rasangiz, esda tutingki, ma'lumotlar orqada, shuning uchun bitlarni LSB -dan MSB -ga yozib olish o'rniga, biz ularni MSB -dan LSB -ga saqlaymiz, shuning uchun bitlarni teskari aylantirish shart emas. keyinchalik ma'lumotlarni qayta ishlashda. Agar chindan ham xohlasangiz, bu erga 0x20 oltilikni ham qo'shishingiz mumkin, lekin bu stroblarda taxminan 5us bo'lgani uchun, men bu uzilish xizmat ko'rsatish tartibini minimal darajada ushlab turaman.

ISR (INT0_vect) {StopTimer (); ClearTimer (); agar (! BCHK (PIND, CARD_DATA1)) // teskari past = 1 {BSET (GPIOR0, bit); -bit; bDataPresent = 1; } if if (bDataPresent) {BCLR (GPIOR0, bit); -bit; } agar (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Agar siz taym -biznes nima bilan bog'liqligini bilmoqchi bo'lsangiz, bu karta o'quvchidan qachon chiqib ketganini aniqlash bosqichida yoritilgan.

5 -qadam: Ma'lumotlar oqimini o'qing

Ma'lumotlar oqimini o'qing

Xo'sh, men sizga ma'lumotlarni qanday o'qishni ko'rsatdim, chunki bu tashqi uzilishlar uchun xizmat ko'rsatish tartibining bir qismi. Muqobil usul - ISRda bayroqni o'rnatish va asosiy tsiklda bayroqni so'roq qilish va ma'lumotlarni shu tarzda o'qish, lekin menimcha, men taqdim etgan usul toza. O'zingizning sudyangiz bo'ling va o'zingizni yozing, lekin sizning MCU bunga ruxsat beradi. Aytaylik, keling, kartani Elvis tortib olib, binoni tark etganini qanday aniqlash mumkin.

6 -qadam: O'quvchidan chiqayotgan kartani aniqlang

O'quvchidan chiqayotgan kartani aniqlang
O'quvchidan chiqayotgan kartani aniqlang

Karta qachon ketganini aniqlang

Rasmiy ravishda, /CARD_PRESENT PIN -kodi yana yuqori bo'lib ketganligini tekshirish uchun namuna oladi, lekin boshqa kirish -chiqish portini olish uchun bizga steenkin /CARD_PRESENT kerak emas. Bu erda bu taymerlar keladi. Har safar uzilish chaqirilganda, biz /STROBEda pasayish aniqlanganida, biz taymerni to'xtatamiz, taymer qiymatini o'chirib tashlaymiz va o'qishni boshlaymiz. O'qishni tugatgandan so'ng, taymerni qayta ishga tushiramiz. Ko'ngil aynishni takrorlang yoki taymer ma'lum bir qiymatga yetguncha. Bu shuni anglatadiki, oxirgi uzilish chaqirildi va boshqa ma'lumotlar kelmadi, shuning uchun biz shunday deb hisoblaymiz va yig'ilgan ma'lumotlarni qayta ishlashni boshlaymiz. Taymerlar uchun biz TIMER1, ya'ni 16 bitli taymerdan foydalanamiz. Men AVR uchun tashqi 16 MGtsli rezonatordan foydalanayapman. Agar siz arduino dan foydalanayotgan bo'lsangiz, demak siz ham shundaydir. Shunday qilib, men 1024 ni oldindan hisoblagich qiymatini tanladim, demak, taymer har (16 000 000 000/1024) marta ko'payadi. Ya'ni, u sekundiga 15, 625 marta "belgilaydi". /CARD_PRESENT kartasi o'quvchini oxirgi ma'lumot bitidan taxminan 150ms keyin qoldirganligini bildiradi. Buni bilib, men har soniyaning 1/4 qismini tekshirishga qaror qildim. Bu shunday ko'rinadi:

(((F_CPU) / PRESCALER) / 4) Bu 3900 ga yaqin bo'lib chiqadi. Shunday qilib, TCNT1 taymerining hisoblagichi 3900 ga yetganda, men bilaman, bu taxminan 300ms edi va men ishonch bilan xulosa qila olamanki, kartani o'quvchi tark etdi. Oson

#DESPIN 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) Siz ISRda taymer ishga tushirilgan, to'xtatilgan va har bir uzilishda tozalanganini ko'rdingiz. Endi asosiy tsiklda biz taymer hisoblagichi maqsadli qiymatga yetganligini tekshiramiz va agar shunday bo'lsa, ma'lumotlarni qayta ishlashni boshlaymiz.

uchun (;;) {agar (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Endi ma'lumotlarni qayta ishlash xavfsiz

kodlangan:

7 -qadam: ma'lumotlarni qayta ishlash

Ma'lumotlarni qayta ishlash
Ma'lumotlarni qayta ishlash

Ma'lumotlarni qayta ishlash

Qayta ishlash bosqichi quyidagilardan iborat:

  • haqiqiy SS mavjudligini tekshirish
  • tenglikni tekshirish
  • ASCII -ga o'zgartirish
  • haqiqiy ESni tekshirish
  • LRCni tekshirish

Bu erda men paritetni tekshirishdan bezovta emasman, chunki men bu bitni nolga qo'ydim. Men ham bu kichik qo'llanma uchun LRC ni hisoblamayman. Bu yanada to'liq amalga oshirilgan dasturiy ta'minotni bajarishni xohlaydigan narsa bo'lar edi, bu erda ma'lumotlarni qayta ishlash kodi yuqoridagi amallarni bajaradi (yuqorida aytib o'tilganidek). Buni quyidagi rasmda toping. Bu sharhlangan va o'z-o'zidan tushunarli. Paritet va ASCII haqida maxsus eslatma: Men faqat parit bitini (7 -bit … ya'ni orqasida 6 nol bilan 1) tozalayman va "karta ma'lumotlari" dan aylantirish uchun qiymatga 0x20 qo'shish kerak. Bu haqida.

8 -qadam: ma'lumotlarni ko'rsatish

Ma'lumotlarni ko'rsatish
Ma'lumotlarni ko'rsatish
Ma'lumotlarni ko'rsatish
Ma'lumotlarni ko'rsatish

Ma'lumotlarni ko'rsatish

Displey men RS232 yoki USB orqali AVR -ga ulanish uchun maxsus yozgan terminal dasturiga o'tadi. Dastur AVR terminali deb nomlanadi. ReadData () usuli juda xunuk va men sizni o'ylab topganimdan ko'ra toza echim topishga da'vat etamiz, shuningdek AVR terminalida funksiyaning chiqishi ham bor. Chiqish birinchi tibbiy sug'urta kartasi, ikkinchisi - VISA kartasi. Rasmning yuqori chap burchagidagi ni bosing va uni yaxshiroq ko'rish uchun asl yoki katta tasvirni tanlang.

9 -qadam: Kodni yuklab olish va yig'ish

Bu qo'llanmada men magnit kartani o'qish vositalarining ba'zi asoslarini muhokama qildim va magnit kartalardan ma'lumotlarni o'qishni to'g'ri yo'nalishda boshlash uchun sizga kod ko'rsatdim. 2 -chi trekni o'qish va dekodlash, LRC -ni hisoblash va har bir baytdagi g'alati tenglikni hisoblash kabi yana ko'p ishlarni bajarish mumkin. To'liq manba kodini quyida yuklab olish mumkin. Bu AVR Studio 4.17 da yozilgan. Umid qilamanki, sizga bu ko'rsatma yoqdi va har doimgidek, har qanday sharh yoki taklifni kutaman. Baxtli kodlash va AVR'lash!

Tavsiya: