Оглавление:

Считыватель RFID AVR / Arduino с кодом UART на C: 4 шага
Считыватель RFID AVR / Arduino с кодом UART на C: 4 шага

Видео: Считыватель RFID AVR / Arduino с кодом UART на C: 4 шага

Видео: Считыватель RFID AVR / Arduino с кодом UART на C: 4 шага
Видео: Радиомодули на 2,4ГГц c UART интерфейсом, LC12S 2024, Ноябрь
Anonim
Считыватель RFID AVR / Arduino с кодом UART на языке C
Считыватель RFID AVR / Arduino с кодом UART на языке C

RFID - это повальное увлечение, которое встречается повсюду - от систем инвентаризации до систем идентификации значков. Если вы когда-нибудь были в универмаге и проходили через эти металлоискатели в точках входа / выхода, то вы видели RFID. Есть несколько мест, где можно найти полезную информацию по настройке RFID, и это руководство посвящено установке считывателя Parallax RFID (последовательный TTL) на AVR, с акцентом на код C, необходимый для чтения последовательного ввода. Код находится на C и не использует никаких внешних библиотек. Фактически, он говорит со скоростью 2400 бод напрямую, без использования UART, синхронизируя со скоростью передачи считывателя RFID и считывая цифровой вывод, к которому он подключен. В восторге? Я тоже.

Шаг 1. Получите товары

Получить товар
Получить товар

Вам понадобится следующий список деталей:

  • Считыватель RFID (Parallax # 28140 $ 39,99)
  • RFID-метка (Parallax # 32397 $ 0,99)
  • AVR или клон Arduino (если вы используете стандартный AVR, вам также понадобятся max232, 5 конденсаторов по 1 мкФ и разъем DE9)
  • Макетная плата без пайки

По желанию

  • 4-х позиционный заголовок
  • Проволока

(и max232 и т. д. для передачи информации тега) Вы также можете подключить свой любимый ЖК-экран вместо отправки данных тега через RS232.

Шаг 2: соедините детали

Соедините части
Соедините части
Соедините части
Соедините части
Соедините части
Соедините части

Аппаратная сторона дела довольно проста. Вместо того, чтобы втыкать мой считыватель RFID прямо в макетную плату, я решил сделать быстрый кабель, чтобы можно было немного лучше перемещать считыватель RFID. Для этого я просто отрезал 4 позиции от лежащей у меня планки розетки и припаял три провода. Коннектор гетто завершен изолентой. Считыватель RFID имеет 4 соединения:

  • Vcc
  • ВКЛЮЧИТЬ
  • ИЗ
  • Gnd

Как вы, наверное, догадались, подключите Vcc к + 5V и Gnd к земле. Поскольку считыватель RFID потребляет очень много энергии, вы можете нажать на контакт ENABLE, чтобы выключать и включать его через различные промежутки времени. Я просто решил оставить его включенным. Поскольку он перевернут, вы потяните его НИЗКО, чтобы активировать. Как вариант, вы можете подключить его к земле. Я подключил его к PIND3, чтобы дать мне возможность включить / отключить, если я решу. Вывод OUT - это то место, куда считыватель отправляет свои последовательные данные после чтения тега. Я подключил его к PIND2. Обратите внимание, в Parallax Universe красный означает идти. То есть зеленый светодиод означает, что устройство неактивно и находится в режиме ожидания, а красный светодиод означает, что устройство активно. * пожимает плечами * Поймите.

Шаг 3: напишите код

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

Чтобы прочитать данные с RFID-считывателя, вы должны знать, когда тег был отправлен, вытащить данные из последовательного порта, а затем отправить их куда-нибудь.

Формат данных считывателя RFID

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

[Start 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); // Устанавливаем I-бит SREGНапишите свою процедуру обслуживания прерывания Вы хотите, чтобы ISR был коротким, поэтому в моем векторе прерывания я читаю весь байт, бит за битом, и сохраняю байт в глобальном энергозависимом массиве символов. При каждом прерывании делаю следующее:

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

Я модифицировал код SoftSerial от Микала Харта, который модифицировал код Дэвида Меллиса для экспериментально определенных задержек в последовательных процедурах.

Анализ вывода RS232

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

// это обработчик прерывания ISR (PCINT2_vect) {if (BCHK (PIND, RFID_IN)) // Стартовый бит становится низким return; uint8_t бит = 0; TunedDelay (CENTER_DELAY); // Центрировать на стартовом бите для (uint8_t x = 0; x <8; x ++) {TunedDelay (INTRABIT_DELAY); // пропускаем немного, брат… if (BCHK (PIND, RFID_IN)) BSET (bit, x); иначе BCLR (бит, х); } TunedDelay (INTRABIT_DELAY); // пропустить стоповый бит RFID_tag [rxIdx] = bit; ++ rxIdx; если (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 Tag:"); для (uint8_t x = 1; x <11; x ++) {USART_tx_S (itoa (RFID_tag [x], ibuff, 16)); если (x! = 10) USART_tx (& apos: & apos); } USART_tx_S ("\ n"); } rxIdx = 0; bDataReady = 0; }}

Шаг 4: Код и прощание

Эта страница содержит zip-файл с соответствующим кодом. Он был написан в AVR Studio 4.16. Если вы используете блокнот программиста, eclipse или vi (или что-то еще), вам нужно скопировать надежный Makefile в каталог и добавить эти файлы в исходную строку. Также обратите внимание, время для раздела последовательного чтения основано на MCU 16 МГц. Если вы работаете с другой тактовой частотой, вам нужно будет экспериментально определить настроенные задержки, чтобы сосредоточиться на импульсах скорости передачи. Я надеюсь, что это руководство помогло вам в какой-то мере. Если у вас есть предложения по улучшению, не стесняйтесь, дайте мне знать!

Рекомендуемые: