Создайте свою собственную технологию rfid, используя ардуиновую мега

Создайте свою собственную технологию rfid, используя ардуиновую мега
Создайте свою собственную технологию rfid, используя ардуиновую мега
Anonim

Создайте свою собственную технологию RFID с помощью Arduino MEGA

В этой статье мы изучим некоторые основы технологии RFID и используем Arduino MEGA для игры с популярным RFID-модулем ID12LA.

RFID означает идентификацию радиочастот. Если вы еще не заметили, это можно найти во многих местах. Эта технология находится рядом с вами прямо сейчас!

Технология RFID обычно встречается в гостиницах, офисах, банках, магазинах и т. Д. RFID-чипы даже имплантируются в домашних животных, чтобы убедиться, что их можно идентифицировать и вернуть домой, если они потеряны. Его часто сравнивают со штрих-кодом. Но даже если он имеет такое же использование, как и штрих-код, эти два отличаются несколькими способами.

В этой статье мы изучим некоторые основы технологии RFID и используем Arduino MEGA для игры с популярным RFID-модулем ID12LA. Вы будете удивлены тем, насколько легко будет включать эту технологию в ваш следующий проект электроники!

Image
Image
ID12LA. Изображение предоставлено Sparkfun

BOM

аппаратные средства

  • Arduino MEGA

    Вам не нужно использовать MEGA, но это будет сделано!

  • ID12LA
  • Плата PCB ID12LA

    Штыри на ID12LA немного странны, поэтому я предлагаю разложечную печатную плату от Sparkfun или любого другого уважаемого дилера.

  • Малый макет
  • Некоторые перемычки
  • Припой и паяльник

Программного обеспечения

Arduino IDE

теория

Прежде чем мы сможем начать любое планирование программного или аппаратного обеспечения, важно иметь представление об основах RFID.

В любой RFID-системе будет устройство, которое будет иметь информацию, обычно называемую тегом или транспондером, и другое устройство, которое будет «смотреть» или «ощущать» эту информацию, обычно называемую читателем или запросчиком. Оба компонента должны иметь свою собственную антенну для связи, и, в зависимости от типа технологии RFID, они могут обмениваться информацией одним или двумя способами.

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

Пассивная RFID

Начнем с пассивного. В пассивной системе тег состоит из антенны и схемы для размещения уникального кода. Но нет источника питания (нет батареи), так как схема внутри получает питание "" src = "// www.allaboutcircuits.com/uploads/articles/Corleto_RFID_2.jpg" />

RFID-метки. Изображение предоставлено RFIDTEK

Активная RFID

Теперь для активной RFID.

Как вы могли догадаться, эти метки всегда питаются и, таким образом, имеют встроенную батарею для передачи своего кода.

Из-за этого, наряду с возможностью работы на частотах 433 МГц или 915 МГц, они имеют очень длинный диапазон считывания до нескольких сотен метров! И поскольку у них есть встроенные батареи, они могут сочетаться с другими технологиями, такими как температурные датчики и модули GPS-слежения, которые могут адаптироваться ко многим различным типам приложений.

Наконец, существует два типа стилей тегов, которые вы можете приобрести: транспондер (например, в пассивной RFID) и маяк.

Тег транспондера аналогичен пассивной системе с точки зрения протокола связи. Читатель отправит сигнал тегу, чтобы запросить его код.

Тег маяка будет делать обратное и посылать сигнал каждый так часто сам по себе, но это действительно сокращает время автономной работы.

В пассивных или активных системах вы можете иметь тег, который доступен только для чтения или доступен для записи. Только для чтения означает, что вы не можете изменить данные тега. Writable означает, что вы можете выбрать, какие данные следует разместить в теге.

Активные метки RFID также могут быть довольно большими. Ниже приведен один тип форм-фактора; в частности, прочный:

Image
Image
Активная метка RFID. Изображение предоставлено RFIDinsider

Общение с ID12LA с Arduino

Уф! Теперь, когда мы получили это в сторону, давайте выясним, как получить ID12LA для связи с Arduino.

Чтобы следовать дальше, я настоятельно рекомендую иметь под рукой таблицу ID12LA (PDF).

Итак, с нашими новыми знаниями RFID мы знаем, что тег отправит код читателю, но что происходит? Хорошо, если мы изучим техническое описание, страница 4 дает нам информацию о выходе данных:

Image
Image

Это означает, что после считывания тега информация может быть отправлена из считывателя в последовательном формате, со скоростью 9600 бод, без бит четности и с 1 стоповым битом. Это довольно распространенная асинхронная настройка последовательной связи и сделает подключение к Arduino доступным.

Когда читатель отправляет данные в Arduino, нам нужен способ узнать, когда начать сбор данных. Рассматривая, как читатель выплескивает данные, мы обнаруживаем, что он использует символ «Пуск текста». В принципе, когда в последовательном буфере есть некоторые данные, мы можем сначала посмотреть, находится ли этот управляющий символ в очереди. Если это так, то мы можем продолжить и записать следующий. Если нет, мы будем продолжать чтение до тех пор, пока не увидим его, или пока серийный буфер не будет пустым.

Предполагая, что мы читаем в символе контроллера Start of Text, мы можем идти и слепо читать в следующих 10 символах ASCII из последовательного буфера. Затем, для следующих 5 символов ASCII (2 для контрольной суммы, 1 для возврата каретки, 1 для перевода строки и 1 для символа контроллера окончания текста), мы будем их читать, но не сохранять в любом месте нашей программы.

Однако, чтобы гарантировать, что наша передача была правильной, мы дважды проверим, увидим ли символ контроллера End of Text. Хотя это может быть редко, передача может потерпеть неудачу, и мы должны выбросить все, что мы сделали из окна, ради целостности системы.

Как только тег будет прочитан и сохранен где-то в нашей программе, мы можем использовать эти данные для чего угодно! Типичным приложением является контроль доступа. Вы берете сохраненный тег и сравниваете его с базой данных тегов, которые считаются действительными (в нашем случае мы используем только один сохраненный тег). Проблема в том, как мы узнаем, что такое код тега, прежде чем мы сохраним его в базе данных? Это не так, как тег поставляется с бумагой с кодом, написанным на ней от производителя.

Чтобы обойти это и начать создавать базу данных для себя, нам нужно будет прочитать код и выплюнуть его на последовательный монитор. В разделе кода Arduino я предоставил бы легкие для отслеживания комментарии о том, где это происходит. Когда это произойдет, нам нужно будет записать этот код вниз, а затем изменить нашу программу, чтобы сохранить этот код при компиляции. Это скорее ручной способ сделать это, но это ради изучения основ RFID.

Как только это будет достигнуто, я бы рекомендовал экспериментировать с программированием простой последовательности программ, которая могла бы сохранить RFID-тег в EEPROM во время работы кода, а также способ сохранить и проверить более одного тега.

Итак, давайте подведем итог тому, что должен сделать код Arduino:

  1. Контролируйте последовательный буфер для доступных данных.
  2. Когда данные присутствуют, прочитайте и сохраните их с некоторой валидацией, обеспечивающей целостность связи.
  3. Выделите данные на последовательный монитор (прежде всего для начальной настройки) и сравните этот тег с нашими сохраненными тегами.
  4. Выполните действие (мы проиграем сообщение для последовательного терминала, чтобы проиллюстрировать это).

Проводят это вверх

Если мы перейдем на страницу 3 в таблице данных, мы увидим распиновки того, что по сути является гигантским IC:

Image
Image

ID12LA имеет некоторые приятные функции, такие как вывод (вывод 6), который указывает, когда метка находится в зоне действия и выдается сигнал будильника (вывод 10). Однако мы не используем эти функции в нашем базовом интерфейсе.

Для нашего приложения мы используем вывод ASCII. Чтобы это произошло, техническое описание сообщает нам (на странице 6), что нам нужно установить вход селектора формата (контакт 7) на массу. Буксом данных, который мы будем использовать, является D0 (вывод 9). Для контроля состояния читателя мы подключим RES (контакт 2) к + 5V таким образом, чтобы читатель всегда был включен.

Для получения полного обзора см. Схему ниже:

Image
Image

Вы также можете ссылаться на описания контактов ID12LA:

Image
Image
Нажмите, чтобы увеличить

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

Для примера о том, как подключаться к макету, пожалуйста, взгляните на мою схему подключения ниже:

Image
Image

Мой совет - стараться быть настолько аккуратным, насколько это возможно, так как легко заблудиться во время проводки. Но независимо от того, что вы делаете, убедитесь, что питание и штыри заземлены там, где они должны быть! Следуйте схеме!

Конденсатор не является дополнительным - он обеспечивает важный высокочастотный обход питания для ID12LA.

Код Arduino

Как и было обещано, вот прокомментированный код, который проведет вас по всей логике. В этом коде показано, как сравнить обнаруженный тег с одним сохраненным тегом. Те же общие методы могут использоваться для расширения кода для сравнения обнаруженного тега с базой данных, которая включает в себя несколько действительных тегов.

Если у вас есть вопросы, оставьте мне комментарий ниже или зайдите на форумы, и кто-то будет рад помочь вам!

Однако, если вы все еще новичок в программировании Arduino, я предлагаю прочитать базовый синтаксис, чтобы помочь с этим кодом.

/ * ================================================================================================= =================================================== Идентификационный код ID12LA RFID Назначение. ……. Чтобы продемонстрировать, как взаимодействовать с ID12LA RFID-модулем Автор ……… Joseph Corleto E-mail ……… Начато …….. 06/28/2016 Закончено ……. 07/02/2016 Обновлено …….. - / - / ---- ============= ================================================== = = = = = = = = = посетите сайт www.allaboutcircuits.com, чтобы найти полную статью! ===================================== ======================================== ========================================================== ================================================== ============================== ================================================================== ================================================== ====== // Заголовочные файлы // ================================================================================== ========================================= // ======= ================================================== ====================== // // ants // ============================================================================================== ========================================================================================================================================================================= Когда вы увидите пример видео // этого действия, я сначала покажу недействительный тег. Затем я прокомментирую эту // строку и раскомментирую действительный тег. Это покажет вам, как вручную установить свой собственный // действительный тег. Единственное отличие состоит в том, что вам нужно будет вручную ввести это. Я / смог раскомментировать, потому что я сделал это до создания видео. // Bogus tag char tag1 (10) = {'X', 'X', ' X ', ' X ', ' X ', ' X ', ' X ', ' X ', ' X ', ' X '}; // Хороший тег // char tag1 (10) = {'3', '6', '0', '0', '6', '6', '0', '0', '5', ' C '}; // ============================================ =================================== Переменные // ========== ================================================== ==================== char ourTag (10); // Мы будем использовать это для хранения данных опрошенных тегов. boolean tagDetected; // Мы можем использовать это, чтобы продолжить действие программы, если наше // чтение похоже на реальный тег. // ================================================ ======================================================================================================================================================================= ========= ================================================== ================ // Входы: // Serial1 (вывод 19) будет использоваться для захвата последовательных данных из буфера, который указан // ID12LA // Выходы: // Serial (pin 2) будет использоваться для вывода последовательных данных в качестве обратной связи с пользователем, чтобы увидеть // что происходит // ========================= ================================================== ==== // Инициализация // ======================================== ================================================= Void setup () {// Инициализировать скорость последовательного порта для последовательный терминал. // Мы будем использовать Serial1 в наших MEGA для RFID-данных и Serial для сообщений // для терминала. Серийный. начало (9600); Серийный номер 1. начало (9600); // Инициализировать флаги данных tagDetected = false; } // =============================================================================================== ================================ // Главная // ============= ================================================== ================ void loop () {// Этот вызов функции возвращает данные опрошенных тегов в форме массива char //. Если в целостности передачи произошла ошибка, она вернет // 0000000000. Конечно, это происходит только в том случае, если в последовательном буфере есть что-то //. Все время мы также // устанавливаем флаг, если там были данные. Это используется позже. if (Serial1. available ()> 0) {// Дать некоторое время для того, чтобы все данные поступали в буфер безопасным и звуковым. delay (250); // Нижеприведенный оператор if гарантирует, что будет отображаться начало тега. // Помните, что начало текста - это десятичное значение 2. Если мы этого не сделаем, увидим, что все ставки отключены, даже продолжая искать в буфере //. Я использую peek просто потому, что мне не нравится касаться данных, пока я / не решит его обработать. if (Serial1. peek ()! = 2) {// Запишите, что у нас не было обнаружено истинного тега. tagDetected = false; // Сбросить буфер, чтобы вернуть его в начальное, известное состояние. flushSerial1Buffer ();} else {// Похоже, что последовательные данные начинаются с допустимого символа начала текста, // пусть отмечают, что мы обнаружили потенциальный тег. tagDetected = true; // Перейти и обработать тег в буфере serial1. fetchTagData (ourTag); // ПРИМЕЧАНИЕ. Функция fetchTagData фактически изменяет массив ourTag //, объявленный ранее ранее. Ничего не возвращается, потому что если имя массива // передается в функцию, оно фактически передается по ссылке, а не по // значению. Это означает, что мы меняем содержимое массива в функции //, поэтому ничего не нужно возвращать! В этой программе есть другие места, где это происходит, поэтому имейте это в виду. // Пока мы на нем, почему бы не распечатать идентификатор тега. Серийный. print («В вашем теге сказано:«); Серийный. flush (); printTag (ourTag);}} else {// Мы не очищаем буфер здесь, так как знаем, что буфер равен нулю. tagDetected = false;} // Если тэг не обнаружен, код ниже никогда не будет выполняться. Но если // есть тег, то мы увидим, принадлежит ли он нашей базе данных. if (tagDetected) {// Теперь вот часть, где мы сравниваем базу данных с нашей удобной функцией // isValidTag. И это, где вы можете выполнить действие //, если оно или недействительно. if (isValidTag (ourTag)) { Серийный. println («Входите и купите свежеиспеченные печеньки! \ n»); Серийный. flush ();} else { Серийный. println («Не знаю, кто ты, но я выпустил гончих !!! \ n»); Серийный. flush ();}}} // ======================================================================================= ===================================== // Функции // ======= ================================================== ====================== //////////////////////// // flushSerial1Buffer / // //////////////////////// void flushSerial1Buffer () {// Теперь на Arduino есть функция, которая называется Serial1.flush //, но она на самом деле не очищает входящий буфер в последних версиях, пожалуйста // проверьте arduino.cc для получения дополнительной информации о причинах. Таким образом, вместо этого мы будем просто // продолжать выгружать данные из последовательного буфера, пока он не станет пустым! while (Serial1. available ()> 0) { Serial. read ();}} ////////////////// // fetchTagData // ////////////////// void fetchTagData (char tempTag ()) {// Во-первых, вырвать символ начала текста Serial1. read (); // Во-вторых, считывать фактические данные ID тега для (int counter = 0; counter <10; counter +) {tempTag (counter) = Serial1. read ();} // В-третьих, вырвать две контрольные суммы, один CR и один символ LF Serial1. читать (); Серийный номер 1. читать (); Серийный номер 1. читать (); Серийный номер 1. read (); // В-четвертых, отбросить то, что должно быть символом конца текста. И // пока мы щипаем, почему бы не бросить проверку здравомыслия (упоминается в // статье), если (Serial1. Read ()! = 3) {// Если по какой-то нечетной причине передача была ошибочной, и мы только читаем // в частичной информации просто введите фиктивные данные для тега for (int counter = 0; counter <10; counter +) {tempTag (counter) = '0';}} else {// Но если все выглядит хорошо, сбросить буфер и сохранить ранее // полученные данные flushSerial1Buffer ();}} //////////////// // isValidTag // //////////// //// boolean isValidTag (char tempTag ()) {boolean result; // Сравните все теги с помощью OR-ing всех результатов сравниваемых тегов. Если в // наименее одно совпадение, то это действительный тег. result = compareTags (tempTag, tag1); return result; } ///////////////// // compareTags // ///////////////// boolean compareTags (char tagA (), char tagB ()) {boolean result = true; // В принципе, мы просто сравним каждый символ в соответствующих ячейках массива // до тех пор, пока не ударим что-то, что не соответствует. Но если это все совпадение //, то наше исходное состояние результата будет истинным. for (int counter = 0; counter <10; counter +) {if (tagA (counter)! = tagB (counter)) {result = false; break;}} return result; } ///////////////// // printTag // ///////////////// void printTag (char tag ()) {/ / Эта функция просто помогает определить, что такое идентификатор тега, чтобы вы // могли сначала прочитать это, жесткий код в вашу программу, скомпилировать, // и затем запустить, чтобы иметь действующий тег в вашей базе данных. for (int counter = 0; counter <10; counter +) { Serial. print (tag (counter));} Serial. println (""); }

Если вы успешно выполнили все эти шаги, у вас должна быть собственная работающая пассивная RFID-система. Вот мое действие:

Приложения RFID

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

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

Если вы хотите пойти еще дальше, я настоятельно рекомендую попробовать активную RFID, чтобы расширить горизонт. Одно приложение, которое прилипает к моей голове, - это кто-то, который помечает всю свою еду и создает базу данных, которая дает рецепты о том, что делать на обед, в зависимости от того, какие метки были в холодильнике; overkill, но определенно здорово!

Попробуйте этот проект сами! Получить спецификацию.

Скачать код