Съдържание:

AVR/Arduino RFID четец с UART код в C: 4 стъпки
AVR/Arduino RFID четец с UART код в C: 4 стъпки

Видео: AVR/Arduino RFID четец с UART код в C: 4 стъпки

Видео: AVR/Arduino RFID четец с UART код в C: 4 стъпки
Видео: Аппаратный реверс-инжиниринг (Часть 2): Коммуникационные интерфейсы 2024, Ноември
Anonim
AVR/Arduino RFID четец с UART код в C
AVR/Arduino RFID четец с UART код в C

RFID е лудостта, която се среща навсякъде - от системи за инвентаризация до системи за идентификация на значки. Ако някога сте били в универсален магазин и сте се разхождали през онези неща, които изглеждат металотърсачи, на входните/изходните точки, значи сте виждали RFID. Има няколко места, където можете да намерите добра информация за настройка на RFID и тази инструкция се фокусира върху инсталирането на Parallax RFID четец (Serial TTL) на AVR, с акцент върху C кода, необходим за четене на серийния вход. Кодът е на C и не използва никакви външни библиотеки. Всъщност той говори 2400 бода директно, без да използва UART, като се синхронизира с скоростта на предаване на RFID четеца и чете цифровия щифт, към който е свързан. Развълнуван? Аз също.

Стъпка 1: Вземете стоките

Вземете стоките
Вземете стоките

Ще ви е необходим следния списък с части:

  • RFID четец (Parallax #28140 $ 39.99)
  • RFID етикет (Parallax #32397 $ 0,99)
  • AVR или Arduino клонинг (ако използвате стандартен AVR, ще ви трябват също max232, 5 x 1uF кондензатори и DE9 конектор)
  • Непояна дъска

По избор

  • 4 позиционен хедър
  • Тел

(и max232 и т.н. за комуникация на информацията за маркера) Можете също така да свържете любимия си LCD екран вместо изпращане на данни за маркер през RS232.

Стъпка 2: Свържете частите

Свържете частите
Свържете частите
Свържете частите
Свържете частите
Свържете частите
Свържете частите

Хардуерната страна на нещата е доста лесна. Вместо да поставя своя RFID четец директно в моята дъска, реших да направя бърз кабел, за да мога да преместя RFID четеца наоколо малко по -добре. За целта просто отрязах 4 позиции от лента за заглавка на женска гнездо, която бях лежал, и запоена на три проводника. Електрическата лента завърши гетото. RFID четецът има 4 връзки:

  • Vcc
  • Активирайте
  • ИЗХОД
  • Gnd

Както вероятно се досещате, свържете Vcc към +5V и Gnd към земята. Тъй като RFID четецът консумира толкова много енергия, можете да ударите щифта ENABLE, за да го изключите и включите на различни интервали. Просто избрах да продължа. Тъй като е обърнат, го дърпате НИСКО, за да го активирате. Като алтернатива можете да го свържете към земята. Свързах го с PIND3, за да ми даде възможности за активиране/деактивиране, ако реша. Изходният извод е мястото, където четецът изпраща своите серийни данни, след като прочете маркер. Свързах го с PIND2. Забележете, във Вселената на Паралакс червеното означава отидете. Това означава, че зеленият светодиод означава, че устройството е неактивно и не работи, докато червеният светодиод означава, че устройството е активно. * свиване на рамене* Отиди фигура.

Стъпка 3: Напишете кода

Напишете кода
Напишете кода

За да прочетете данните от RFID четеца, трябва да знаете кога е подаден маркер, издърпайте данните от серийния порт, след което ги изпратете някъде.

Формат на данни за четец на RFID

RFID четецът Parallax изпраща данни с фиксиран ледников темп от 2400 бода. RFID етикетът е 10 байта. За да се даде възможност за откриване/коригиране на грешки, тъй като четецът може да бъде изключен от случаен шум, 10-байтовият RFID е ограничен от начален и стоп-контролер. Стартовият дозор е подаване на линия (0x0A), а стоп -контролерът е връщане на каретка (0x0D). Изглежда така:

[Стартирайте Sentinel | Байт 1 | Байт 2 | Байт 3 | Байт 4 | Байт 5 | Байт 6 | Байт 7 | Байт 8 | Байт 9 | Байт 10 | Спрете Sentinel]Това са трите основни стъпки.

Знайте кога е подаден маркер

Използвах прекъсване при смяна на щифт на AVR, което уведомява фърмуера, че е настъпила промяна на наблюдаван щифт. Конфигурирането на AVR за това е лесно и изисква настройка на флага, съобщаване на MCU кой щифт искате да наблюдавате и задаване на глобалния бит за прекъсване. Конфигурирайте PCINT

BSET (PCICR, PCIE2); // регистър за управление на прекъсване на промяна pcie2 BSET (PCMSK2, PCINT18); // разрешаване на прекъсване при смяна на щифт за PCINT18 (PD2) BSET (SREG, 7); // Задайте SREG I-битНапишете рутинната си услуга за прекъсване Искате да поддържате вашия ISR кратък, така че във моя вектор на прекъсване чета целия байт, малко по малко и съхранявам байта в глобален променлив символен масив. Правя следното при всяко прекъсване:

  • Проверете дали съм на начален етап
  • Центрирайте времето към средния импулс на 2400 бода (скоростта на RFID четеца)
  • Пропуснете началния бит и направете пауза до средата на следващия бит
  • Прочетете всеки бит в беззначно цяло число
  • Когато имам 8 бита, поставете байта в символен масив
  • Когато събера 12 байта, уведомете MCU, че маркерът е прочетен за откриване на грешки.

Промених кода на SoftSerial от Mikal Hart, който модифицира кода от David Mellis за експериментално определени закъснения в серийните процедури.

Анализирайте RS232 изхода

Процедурата PCINT съдържа кода за четене на RS232 изхода от RFID четеца. Когато получих 12 байта (10-байтов RFID плюс часови), зададох bDataReady на 1 и оставям главния цикъл да обработи данните и да ги покаже.

// това е манипулаторът на прекъсвания ISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Стартовият бит отива с ниска възвръщаемост; uint8_t бит = 0; TunedDelay (CENTER_DELAY); // Центриране на началния бит за (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // пропуснете малко, братко … ако (BCHK (PIND, RFID_IN)) BSET (бит, x); иначе BCLR (бит, х); } TunedDelay (INTRABIT_DELAY); // пропускане на стоп бита RFID_tag [rxIdx] = бит; ++ rxIdx; if (rxIdx == 12) bDataReady = 1;}

Покажете вашия маркер

В main (), по време на цикъла for (ever), проверявам дали bDataReady е настроен, сигнализирайки, че цялата RFID структура е изпратена. След това проверявам дали това е валиден маркер (т.е. началните и крайните знаци са съответно 0x0A и 0x0D) и ако е така, изпращам го чрез моята RS232 връзка.

for (;;) {if (bDataReady) {#ifdef _DEBUG_ USART_tx_S ("Старт байт:"); USART_tx_S (itoa (RFID_tag [0], & ibuff [0], 16)); ibuff [0] = 0; ibuff [1] = 0; USART_tx_S ("\ nСпри байт:"); USART_tx_S (itoa (RFID_tag [11], & ibuff [0], 16));#endif if (ValidTag ()) {USART_tx_S ("\ nRFID маркер:"); for (uint8_t x = 1; x <11; x ++) {USART_tx_S (itoa (RFID_tag [x], ibuff, 16)); if (x! = 10) USART_tx (& apos: & apos); } USART_tx_S ("\ n"); } rxIdx = 0; bDataReady = 0; }}

Стъпка 4: Код и сбогом

Тази страница съдържа zip файл със съответния код. Написано е в AVR Studio 4.16. Ако използвате бележник на програмист, затъмнение или vi (или нещо друго), ще трябва да копирате доверен Makefile в директорията и да добавите тези файлове към изходния ред. Също така имайте предвид, че времето за серийно четене се основава на 16MHz MCU. Ако работите с различна тактова честота, ще трябва експериментално да определите настроените закъснения, за да центрирате импулсите на скоростта на предаване. Надявам се, че тази инструкция ви е помогнала по някакъв начин. Ако имате някакви предложения как може да се подобри, не се колебайте да ме уведомите!

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