RFID. Собственный обработчик RFID данных на Lazarus

Программа предназначена для работы с этим RFID считывателем. Написана на кроссплатформенной IDE Lazarus, поэтому код может быть скомпилирован как под ОС Windows так и под OS Linux.

Для работы с COM портом (RS232) используется библиотека TComport.

Установка библиотеки в IDE Lazarus выполняется в соответствии со статьей "Lasarus. Установка дополнительных компонент".

Пример работы программы под OC Windows:



Скачать программу обработчика RFID данных.
Скачать исходный код обработчика RFID данных.
Скачать компонент TComport.
Скачать архив компонента TComport с зеркала.

Lazarus. Установка дополнительных компонент и модулей

Установку дополнительных ВИЗУАЛЬНЫХ компонент в IDE Lazarus рассмотрим на примере библиотеки TComport для работы с COM портом (RS232).

1. Скаченный архив распаковываем в папку "\lazarus\components\comport\":



2. Переходим в папку "comport" и запускаем на выполнение файл "*.lpk", в данном конкретном случае - файл "CPortLib10.lpk":



Файлы *.lpk для установки компонентов можно открывать и из IDE Lazarus выбрав "Пакет -> Открыть файл пакета (*.lpk)":



3. В открывшемся окне нажимаем "Компилировать":



4. После удачной компиляции в этом же окне нажимаем "Использовать -> Установить":



5. На запрос о пересборке Lazarus отвечаем утвердительно:



6. После 5 операции IDE Lazarus будет автоматически закрыта и перезапущена уже с новым установленным компонентом:



Установку НЕ ВИЗУАЛЬНЫХ модулей и библиотек выполняем следующим образом:

1. Скачиваем библиотеку, например Synapse.

2. Распаковываем библиотеку в папку "\lazarus\components\synapse\".

3. Запускаем IDE Lazarus, открываем свойства проекта "Проект -> Параметры проекта -> Пути", заполняем параметр "Другие модули (-Fu)" указав папку с установленным модулем.



4. Можно установить галку "Использовать как параметры по умолчанию", тогда этот путь будет автоматически добавляться для новых проектов.


Lazarus. Уменьшение размера исполняемого файла

При компиляции проектов Lazarus размер исполняемого файла может привышать "разумные" размеры. Так, например, размер приложения, состоящего из одной формы, с настройками компиляции "по умолчанию", составляет 20,7 Мб и 13,9 Мб для Linux и Windows систем соответственно.

Для того что бы уменьшить размер исполняемого файла необходимо настроить параметры компиляции. Для этого в IDE Lazarus выбираем "Project -> Project Options..." ("Проект -> Параметры проекта...") и устанавливаем флажки на вкладках:

1. "Code Generation" (Генерация кода)
- "Smart linkable (-СХ)" - Умная компоновка

Lazarus. Вкладка "Code Generation" (Генерация кода)


2. "Linking" (Компоновка)
- Use external gdb debug symbol file (-Xg) - Использовать внешний файл отладочных символов GDB
- Strip symbol from executable (-Xs) - Вырезать символы из исполняемого файла
- Link smart (-ХХ) - Умная компоновка

Lazarus. Вкладка "Linking" (Компоновка)


Таким образом получается сократить размер исполняемого файла до 3,3 Мб (Linux) и 1,7 Мб (Windows).

Использовав утилиту upx (сжимает исполнительный файл, официальная страница) можно уменьшить размер дополнительно - до 1,0 Мб (Linux) и 0,6 Мб (Windows).

Для Linux мне пришлось установить пакет "upx-ucl" через Synaptic. Для Windows необходимо скачать вот этот архив.

Пример использования утилит для Linux:

upx --best путь_к_исполнительному_файлу


и Windows:

upx.exe --best путь_к_исполнительному_файлу

125kHz RFID reader

Этот считыватель предназначен для чтения 125кГц RFID ключей по протоколу EM4100. Данная реализация - это повторение авторской конструкции взятой с: http://www.serasidis.gr/circuits/RFID_reader/125kHz_RFID_reader.htm, поэтому подробности работы устройства описывать не буду.

Схема 125kHz RFID reader мной "доработана" только в части подключения звукового излучателя (бипера из старого будильника).


Схема 125kHz RFID reader


В качестве переходника USB-COM взят китайский PID_2303, от него же осуществляется и питание девайса. Выход Rx (TTL) считывателя должен быть подключен ко входу RX переходника. Связь девайса с ПК осуществляется на скорости 2400 бод.


Китайский USB-COM переходник PID_2303


Катушка намотана проводом диаметром 0,5 мм, 116 витков на оправке диаметром 60 мм. Автор рекомендует + 2-3 витка для оптимальной настройки расстояния для считывания карты (отмотал - считал карту - сделал выводы). У меня считывание карты работает на расстоянии 5-6 см от катушки с количеством ровно 116 витков.


Катушка для 125kHz RFID reader


Разработка печатной платы выполнялась в программе Sprint-Layout v. 5.0. Размер печатной платы получился 47х21 мм.


Печатная плата 125kHz RFID reader


Печатная плата, изготовленная по технологии ЛУТ:



Готовое устройство:







Девайс помещен в пластиковый корпус и залит силиконом:



Устройство в корпусе:


Общий вид 125kHz RFID reader


Пример настройки программы терминала для работы со считывателем:



Пример чтения карты собственным обработчиком RFID данных:



А это чтение RFID карты в ОС Linux в программе cu:



Видео работы 125kHz RFID reader:


Прошивка микроконтроллера ATTINY13 выполняется с помощью BAT файлов (запускаем сначала fuseprog.bat затем progprog.bat) включенных в архив, или с помощью программы AVRDUDESHELL. Программатор - USBASP настроенный на низкоскоростное программирование. Подключение программатора к девайсу - переходником версии 4.

Теперь о проблемах, которые возникли при изготовлении 125kHz RFID reader:

  • HEX файл, предоставляемый на странице автора (под ATTINY13) у меня не заработал, поэтому пришлось искать старые архивы с программой.
  • Звуковое оповещение о считывании RFID не работает. Судя по исходникам, эта функция отключена.

  • Скачать архив 125kHz RFID reader одним файлом.

    Архив содержит:

  • Схему 125kHz RFID reader.
  • Печатную плату 125kHz RFID reader в формате LAY.
  • Исходный код проекта в AVR Studio 6.
  • Скомпилированный HEX файл проекта.
  • Программу AVRDUDE для прошивки микроконтроллера.
  • BAT файлы для быстрой прошивки программы и фьюзов микроконтроллера.
  • Windows драйвер для USB\VID_067B&PID_2303&REV_0300 (китайский переходник USB-COM).
  • Программу терминала для проверки работы считывателя.

  • Девайсы. Китайский USB - COM переходник

    На этой странице можно скачать драйвер для ОС Windows 7 для китайсого переходника USB - COM с идентификатором USB\VID_067B&PID_2303&REV_0300 (PID_2303&REV_0300):


    Китайский USB - COM переходник PID_2303&REV_0300


    Скачать драйвер для ОС Windows 7 для PID_2303&REV_0300.

    Часы с большими цифрами

    Концепция часов с большими цифрами

    Конструктивно девайс будет состоять из двух плат – одна над другой. Первая плата – матрица светодиодов, образующих разряды часов и минут, Вторая – силовая часть (управление светодиодами), логика и питание. Такая конструкция сделает часики более компактным (без корпуса примерно 22см х 9 см, толщиной сантиметра 4-5) + даст возможность прикрутить матрицу к другому проекту, если что то пойдет не так.

    Силовая часть будет построена на базе драйвера UL2003 и транзисторных ключах. Логическая - на Atmega8 и DS1307. Питание: 220В - трансформатор; логика 5В (через 7805), силовая часть - 12В (через LM2576ADJ). Отделено будет предусмотрена кроватка для батарейки 3В для автономного питания часов реального времени - DS1307.

    Думаю использовать Atmega8 и DS1307 (часики планирую подвесить под потолком, и что бы в случае пропадания электричества каждый раз не лазить за настройкой), однако разводка платы будет предполагать возможность работы девайса и без DS1307 (на первое время, а может и навсегда – уж как получится).

    Таким образом, в зависимости от комплектации алгоритм работы программы часов будет следующим:

    Atmega8 – счетчик времени по таймеру. Работа в цикле без пауз: опрос клавиатуры, корректировка времени (если необходимо), отображение 4 разрядов и разделителя.

    Atmega8 + DS1307. Работа в цикле без пауз: опрос клавиатуры, корректировка времени DS1307 (если необходимо), зачитка времени с DS1307, отображение 4 разрядов и разделителя. Или другой вариант – зачитка с DS1307 по таймеру, остальное в цикле (пока не знаю как лучше).

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

    Силовая часть часов

    Силовая часть часов построена на драйвере UL2003 и транзисторных ключах VT1 и VT2.

    UL2003 отвечает за управление сегментами индикатора, ключи – за управление разрядами.

    Отдельно управляется разделитель часов и минут (сигнал K8).

    Управление сегментами, разрядами и разделителем осуществляется от микроконтроллера подачей положительного потенциала (т.е. подачей +5В) на К1-К8, Z1-Z4.

    Подача сигналов на сегменты и разряды должна осуществляться синхронно и с определенной частотой, для того, что бы обеспечить динамический вывод информации (часов и минут).

    В качестве транзистора VT1 (BCP53) можно использовать транзистор BCP52.

    Схема силовой части часов с большими цифрами


    Печатная плата семисегментного индикатора для часов с большими цифрами

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

    Начнем с разработки и изготовления печатной платы индикатора.

    Разработка печатной платы семисегментного индикатора для часов с большими цифрами


    Печатная плата семисегментного индикатора для часов с большими цифрами в формате "lay" находится конце статьи, в присоединенных файлах. О технологии изготовления печатных плат методом ЛУТ можно почитать тут.

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

    Готовая печатная плата семисегментного индикатора для часов с большими цифрами


    Сборка семисегментного индикатора

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

    Межслоевые переходы на плате индикатора


    Следующий шаг, собственно говоря, сборка индикатора. Для чего нам понадобится пачка красных (зеленых, белых, синих) светодиодов. Я, например, брал эти.

    Подготовка к сборке индикатора


    При установке диодов не забываем, что мы делаем индикатор с общим анодом - т.е. "+" диодов должны быть соединены вместе. Общие аноды на печатной плате - это большие фрагменты меди. Обязательно обратите внимание на анод разделительной точки.

    Расположение анодов на печатной плате индикатора


    В итоге, после 2 часов кропотливой работы должно получиться вот что:

    Семисегментный индикатор


    Цифровая часть часов

    Цифровую часть часов с большими цифрами будем собирать по схеме:

    Схема часов с большими цифрами


    Схема часов довольно прозрачна, поэтому объяснять как она работает не вижу смысла. Печатную плату в формате *.lay можно скачать в конце статьи. Замечу, что печатная плата в основном разработана под детали для поверхностного монтажа.

    Итак, элементная база, которую использовал я:

    1. Диодный мост DFA028 (подойдет любой компактный для поверхностного монтажа);
    2. Регуляторы напряжения LM2576ADJ в корпусе D2PAK, 78M05 в корпусе HSOP3-P-2.30A;
    3. Транзисторные ключи BCP53 (корпус SOT223) и BC847 (корпус SOT23);
    4. Микроконтроллер Atmega8 (TQFP);
    5. Часы реального времени DS1307 (SO8);
    6. Блок питания 14В 1,2А от какого-то старого устройства;
    7. Остальные детали - любого типа, подходящие по размерам для установки на печатную плату.

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

    Обратите внимание на номиналы сопротивлений R3 и R4 - они должны быть именно такими, какие указаны на схеме - не больше не меньше. Это сделано для того, что бы обеспечить на выходе регулятора напряжения LM2576ADJ ровно 12В. Если все таки не удастся найти такие номиналы резисторов, то значение сопротивления R4 может быть рассчитано по формуле:

    R4=R3(12/1.23-1) или R4=8.76R3


    Сборка цифровой части. Версия 1, без DS1307

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

    Я рекомендую начать со сборки блока питания и только за тем выполнить монтаж цифровой части. Это общая рекомендация по самостоятельной сборке девайсов. Почему? Просто потому, что если блок питания собран с ошибкой можно пожечь всю низковольтную электронику, которая должна питаться этим блоком питания.

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

    На рисунке показаны контрольные точки, в которых следует проверить напряжение питания. Если напряжение соответствует заявленному, можно приступать к сборке цифровой части часов. Иначе проверяем монтаж и работоспособность элементов блока питания.

    Контрольные точки и значения напряжений для блока питания часов


    После того, как проверка блока питания выполнена приступаем к сборке цифровой части часов - устанавливаем все остальные элементы на печатную плату. Проверяем на КЗ, особенно в ногах микроконтроллера Atmega и драйвера UL2003.

    Монтаж цифровой части часов


    Обратите внимание на то, что сборку часов мы выполняем БЕЗ установки часов реального времени DS1307, однако вся обвязка этой микросхемы должна быть выполнена. В будущем, если возникнет необходимость, это сэкономит нам время на доработку часов под вторую версию, там где все таки будут использоваться отдельные, независимые часы реального времени на DS1307.

    Предварительная проверка микроконтроллера ATMEGA8

    Для того, что бы проверить правильность и работоспособность микроконтроллера нам потребуется:

    1. Программатор, например USBASP.
    2. Дата-кабель V4 для внутрисхемного программирования микроконтроллера.
    3. Программа AVRDUDESHELL.

    Подключаем плату часов к дата-кабелю. Дата-кабель подключаем к программатору. Программатор к компьютеру, на котором установлена программа AVRDUDESHELL. Подключать плату часов к питающей сети 220В не следует.

    Пытаемся прочитать, например, фьюзы микроконтроллера. Если все ОК - поздравляю. Работу по изготовлению часов с большими цифрами можно считать практически законченной.

    Удачное чтение данных с микроконтроллера программой AVRDUDESHELL


    Если при чтении фьюзов возникла проблемы - проверяйте монтаж - возможно где то есть короткое замыкание или "непропай". Еще один совет - возможно микроконтроллер находится в режиме низкоскоростного программирования, тогда достаточно переключить программатор в этот режим (тык) и заново попробовать прочитать микроконтроллер.

    Сборка цифровой и силовой частей

    Конструкция часов разработана с таким расчетом, что плата семисегментного индикатора должна крепиться над платой электроники. Так и поступаем. Соединяем многожильным (13 проводов) шлейфом платы. Длина шлейфа - сантиметров 5-6.

    Соединение шлейфом печатных плат


    Сами платы соединяем на расстоянии 3 см. В качестве распорок между платами я использовал разрезанный в соответствующий размер фломастер. Была проблема найти достаточно длинные винты М3, поэтому в качестве крепления использовал провод.

    Крепление плат


    Загрузка программы часов в микроконтроллер

    Для загрузки программы нам потребуется программатор USBASP и дата-кабель V4, а так же архив, размещенный в конце статьи.

    Часы подключаем к программатору (расстояние в 3 см между платами как раз позволяет это сделать).

    Архив распаковываем в любую папку. Архив содержит в себе программу для прошивки микроконтроллеров (программа называется avrdude), поэтому достаточно перейти в папку "prog" и по очереди запустить файлы fuseprog.bat а за тем progprog.bat. Первый настроит фьюзы, второй запишет программу.

    И еще, если вы используете программатор отличный от USBASP, вам необходимо скорректировать "батники", указав там свой программатор.

    Результат









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

    Скачать схему, печатную плату и программу часов с большими цифрами

    Atmega. Расчет таймера на 1 сек

    Рассмотрим пример настройки прерывания таймера T1 с периодом 1 раз в 1 сек (1 Гц). на микроконтроллере Atmega8. Такая настройка может очень пригодиться при разработке девайсов отсчитывающих реальное время, например часов. Итак:

    1. Выбраем и устанавливаем делитель в регистре TCCR1B (биты CS12,CS11,CS10). Делитель частоты следует выбирать таким образом, что бы частота кварца, на которой работает контроллер в Гц деленная на делитель было целым числом. Например для кварца 8мГц (8000000Гц) нужно выбрать делитель TCCR1B равный 256 (установиь биты CS12=1,CS11=0,CS10=0).

    2. Делим основную частоту на делитель. Полученное значение нужно будет для корректировки регистра TCNT1 (см. п. 3): 8000000/256=31250.

    3. Корректируем регистр TCNT1 для получения прерывания ровно 1 сек. T1 - 16 разрядный таймер - это 65535 тиков. Тогда регистр TCNT1 будет равен 65535-31250=34285

    4. Незабываем корретировать TCNT1 в самом прерывании.

    Код для WinAvr будет выглядеть следующим образом:

    // Инициализация прерывания
    void t1_init()
    {
       // Настраиваем делитель
       TCCR1B = (1<<CS12)|(0<<CS11)|(0<<CS10);
     
       // Выставляем значение TCNT1   
       // для коррекции счетчика, чтобы время было ровно 1 секунда 
       TCNT1 = 65535-31250;
    
       // Разрешаем прерывание по переполнению таймера
       TIMSK |= (1<<TOIE1);
     
       // Выставляем бит общего разрешения прерываний
       sei();                
    }
    
    // Прерывание
    ISR(TIMER1_OVF_vect)
    {
       // Выставляем значение TCNT1   
       // для коррекции счетчика, чтобы время было ровно 1 секунда 
       TCNT1 = 65535-31250;
    
       // Что-то делаем каждую секунду
       // ...
    }