Mundarija:

AVR/Arduino RFID o'quvchi UART kodi bilan C: 4 bosqichda
AVR/Arduino RFID o'quvchi UART kodi bilan C: 4 bosqichda

Video: AVR/Arduino RFID o'quvchi UART kodi bilan C: 4 bosqichda

Video: AVR/Arduino RFID o'quvchi UART kodi bilan C: 4 bosqichda
Video: RFID Reader Interface with AVR ATmega32 2024, Iyul
Anonim
AVR/Arduino RFID o'quvchi, UART kodi bilan C
AVR/Arduino RFID o'quvchi, UART kodi bilan C

RFID - bu hamma joyda - inventarizatsiya tizimidan nishon identifikatori tizimigacha bo'lgan aqldan ozish. Agar siz biron marta do'konga borgan bo'lsangiz va kirish/chiqish joylarida metall detektori ko'rinadigan narsalarni ko'rsangiz, siz RFIDni ko'rgansiz. RFID -ni sozlash bo'yicha yaxshi ma'lumotni topish uchun bir nechta joylar bor va bu ko'rsatma AVR -ga Parallax RFID o'quvchisini (Serial TTL) o'rnatishga qaratilgan bo'lib, ketma -ket kirishni o'qish uchun zarur bo'lgan C kodiga e'tibor qaratiladi. Kod Cda va hech qanday tashqi kutubxonalardan foydalanmaydi. Aslida, u RFID o'quvchisining uzatilish tezligi bilan sinxronlash va ulangan raqamli pinni o'qish orqali UART ishlatmasdan to'g'ridan -to'g'ri 2400 bod haqida gapiradi. Hayajonlanganmi? Men ham.

1 -qadam: Tovarlarni oling

Tovarlarni oling
Tovarlarni oling

Sizga quyidagi qismlar ro'yxati kerak bo'ladi:

  • RFID o'quvchi (Parallaks #28140 $ 39.99)
  • RFID yorlig'i (Parallaks #32397 $ 0.99)
  • AVR yoki Arduino klonlari (agar siz AVR -dan foydalansangiz, sizga max232, 5 x 1uF kondansatör va DE9 ulagichi kerak bo'ladi)
  • Lehimsiz non paneli

Majburiy emas

  • 4 pozitsiya sarlavhasi
  • Tel

(va max232 va boshqalar teg ma'lumotlarini uzatish uchun) Siz RS232 orqali teg ma'lumotlarini yuborish o'rniga sevimli LCD ekranni ulashingiz mumkin.

2 -qadam: qismlarni ulang

Qismlarni ulang
Qismlarni ulang
Qismlarni ulang
Qismlarni ulang
Qismlarni ulang
Qismlarni ulang

Ishning apparat tomoni juda oson. RFID o'quvchisini to'g'ridan -to'g'ri non paneliga qo'yish o'rniga, men tez kabelni tanladim, shuning uchun RFID o'quvchisini biroz yaxshiroq harakatlantirishim mumkin edi. Buning uchun men yotadigan va uchta simga lehimlangan ayol rozetkaning 4 ta pozitsiyasini kesib tashladim. Getto ulagichi elektr tasmasi bilan to'ldirilgan, RFID o'quvchi 4 ta ulanishga ega:

  • Vcc
  • YOQISH
  • OUT
  • Gnd

Siz taxmin qilganingizdek, Vccni +5V ga va Gndni erga ulang. RFID o'quvchi juda ko'p quvvat sarflaganligi sababli, siz uni yoqish va yoqish uchun turli vaqt oralig'ida yoqishingiz mumkin. Men shunchaki davom ettirishni tanladim. U teskari bo'lgani uchun uni faollashtirish uchun LOW pastga torting. Shu bilan bir qatorda, uni erga ulashingiz mumkin. Agar men qaror qilsam, yoqish/o'chirish variantlarini berish uchun uni PIND3 ga uladim. OUT pin - bu o'quvchi teg o'qilgandan so'ng ketma -ket ma'lumotlarini yuboradigan joy. Men uni PIND2 ga uladim. Eslatma, Paralaks olamida, qizil - bu ketishni bildiradi. Ya'ni, yashil LED - bu qurilma ishlamayotganligini va ishlamayotganligini, qizil LED esa - qurilma faolligini bildiradi. * yelka qisish* Rasmga o'ting.

3 -qadam: Kodni yozing

Kodni yozing
Kodni yozing

RFID o'quvchisidan ma'lumotlarni o'qish uchun siz teg qachon yuborilganligini bilishingiz, ma'lumotlarni ketma -ket portdan olib tashlashingiz va keyin biron joyga yuborishingiz kerak.

RFID o'quvchi ma'lumot formati

Parallax RFID o'quvchi ma'lumotni muzlik tezligida 2400 bod bilan yuboradi. RFID yorlig'i 10 baytni tashkil qiladi. Xatolarni aniqlash/tuzatishga ruxsat berish uchun, o'quvchi tasodifiy shovqindan o'chirilishi mumkin bo'lganligi sababli, 10 baytli RFID signalni ishga tushirish va to'xtatish bilan chegaralangan. Boshlovchi qo'riqchi chiziqli chiziq (0x0A), to'xtash qo'riqchisi - vagonga qaytish (0x0D). Bu shunday ko'rinadi:

[Sentinel | Bayt 1 | Bayt 2 | Bayt 3 | Bayt 4 | Bayt 5 | Bayt 6 | Bayt 7 | Bayt 8 | Bayt 9 | Bayt 10 | Sentinelni to'xtating]Bu uchta asosiy qadam.

Teg qachon yuborilganligini biling

Men AVR -da pinni o'zgartirishni to'xtatib qo'ydim, bu dasturiy ta'minotni kuzatiladigan pinda o'zgarish yuz berganligi haqida xabar beradi. Buning uchun AVR -ni sozlash oson va bayroqni o'rnatishni, MCU -ga qaysi pinni kuzatishni xohlayotganingizni aytib berishni va global uzilish bitini o'rnatishni talab qiladi. PCINT -ni sozlash

BSET (PCICR, PCIE2); // pinni uzishni nazorat qilish registrini o'zgartirish pcie2 BSET (PCMSK2, PCINT18); // PCINT18 (PD2) BSET (SREG, 7) uchun pin almashtirish uzilishini yoqish; // SREG I-bitini o'rnatingSiz ISRni qisqa tutishni xohlaysiz, shuning uchun uzilish vektorida men butun baytni asta -sekin o'qib chiqaman va baytni global o'zgaruvchan belgilar qatorida saqlayman. Men har bir tanaffusda quyidagilarni bajaraman:

  • Boshlanishimga ishonch hosil qiling
  • Vaqtni o'rta pulsga 2400 bod (RFID o'quvchining tezligi) ga yo'naltiring.
  • Boshlanish bitini o'tkazib yuboring va keyingi bitning o'rtasiga pauza qiling
  • Har bir bitni imzo qo'yilmagan butun songa o'qing
  • Menda 8 bit bo'lsa, baytni belgilar qatoriga qo'ying
  • Men 12 baytni yig'ganimda, MCUga xatoni aniqlash uchun teg o'qilganligini xabar bering.

Men ketma -ket tartibda eksperimental ravishda aniqlangan kechikishlar uchun Devid Mellis kodini o'zgartirgan Mikal Xartdan SoftSerial kodini o'zgartirdim.

RS232 chiqishini tahlil qilish

PCINT protokoli RFID o'quvchisidan RS232 chiqishini o'qish kodini o'z ichiga oladi. Men 12 bayt (10 baytli RFID va sentinellar) olganimda, bDataReady ni 1 ga o'rnatdim va asosiy tsikl ma'lumotlarni qayta ishlashiga va uni ko'rsatishiga ruxsat berdim.

// bu uzilish ishlovchisiISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Boshlash biti past qaytadi; uint8_t bit = 0; TunedDelay (CENTER_DELAY); // (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // bir oz o'tkazib yuboring, aka … agar (BCHK (PIND, RFID_IN)) BSET (bit, x); boshqa BCLR (bit, x); } TunedDelay (INTRABIT_DELAY); // o'tish bitini o'tkazib yuborish RFID_tag [rxIdx] = bit; ++ rxIdx; agar (rxIdx == 12) bDataReady = 1;}

Tagingizni ko'rsatish

Main () da, for (abadiy) siklida bDataReady o'rnatilgan yoki yo'qligini tekshiraman, bu butun RFID tuzilmasi yuborilganligini bildiradi. Keyin men bu tegning to'g'riligini tekshirib ko'raman (ya'ni boshlash va to'xtatish belgilar mos ravishda 0x0A va 0x0D) va agar shunday bo'lsa, men uni RS232 ulanishim orqali yuboraman.

uchun (;;) {if (bDataReady) {#ifdef _DEBUG_ USART_tx_S ("Boshlanish bayt:"); USART_tx_S (itoa (RFID_tag [0], & ibuff [0], 16)); ibuff [0] = 0; ibuff [1] = 0; USART_tx_S ("\ nBaytni to'xtating:"); USART_tx_S (itoa (RFID_tag [11], & ibuff [0], 16));#endif if (ValidTag ()) {USART_tx_S ("\ nRFID Tag:"); uchun (uint8_t x = 1; x <11; x ++) {USART_tx_S (itoa (RFID_tag [x], ibuff, 16)); agar (x! = 10) USART_tx (& apos: & apos); } USART_tx_S ("\ n"); } rxIdx = 0; bDataReady = 0; }}

4 -qadam: Kod va xayrlashuv

Bu sahifada tegishli kodli zip -fayl mavjud. U AVR Studio 4.16 da yozilgan. Agar siz dasturchi bloknotidan, tutilishidan yoki vi -dan (yoki boshqa biror narsadan) foydalansangiz, ishonchli Makefile -ni katalogga nusxalashingiz va bu fayllarni manba qatoriga qo'shishingiz kerak, shuningdek, ketma -ket o'qish bo'limining vaqti 16 MGts chastotali MCU. Agar siz boshqa soat chastotasida ishlayotgan bo'lsangiz, siz tezlikni impulslarini markazlashtirish uchun sozlangan kechikishlarni eksperimental tarzda aniqlashingiz kerak bo'ladi. Umid qilamanki, bu sizga yordam berdi. Agar uni qanday yaxshilash mumkinligi haqida takliflaringiz bo'lsa, menga xabar berishdan tortinmang!

Tavsiya: