ODNFC-RS485 ModBus
Считыватель с интерфейсом RS485 ModBus
Ключевые возможности
актуальной версии устройства
  • Широкий список поддерживаемых меток
    В зависимости от исполнения:

    Метки 13,56 МГц
    Чтение-запись меток следующих стандартов:
    Mifare Classic 1K/4K/Mini: полная поддержка
    Mifare Ultralight: полная поддержка
    Mifare Ultralight Nano: полная поддержка
    Mifare Ultralight C: ограниченная поддержка - только чтение UID
    NTAG 213/215/216: полная поддержка
    S50/S70: полная поддержка

    Метки 125 КГц
    Чтение UID меток стандарта Em-marine EM4100, HID ProxCard II.

    Может быть установлен, как один из интерфейсов, так и оба обновременно.
  • Работа в локальной сети
    Считыватель подключается в сеть RS485 в роли ведомого устройства с протоколом MODBUS.
    Можно реализовать другой протокол взаимодействия на базе RS485.
    Можно одновременно использовать WiFi (не является основным интерфейсом).
    Имеет встроенный WEB-интерфейс для настройки устройства.
  • Использование банковских карт в качестве метки
    Использование номера карты в качестве метки. Также можно использовать электронные карты из Apple Pay и Android Pay.
  • Самостоятельная модификация кода
    Считыватель имеет встроенный редактор кода, который позволяет расширить функционал устройства и сделать логику работы такой, как нужно именно вам.
  • Дискретный вход и выход
    Считыватель имеет один выход для подключения напрямую замка, а также вход для подключения кнопки. Это позволяет уменьшить количество используемого оборудования.
  • Управляемая индикация
    Считыватель позволяет программно управлять звуковым излучателем и RGB-светодиодом. Вместо диода можно подключить управляемую ленту длиной 40-60 светодиодов и реализовывать световые эффекты.
  • Локальное хранение данных
    Устройство может хранить данные о пользователях локально и/или использоваться автономно или синхронизироваться с сервером по сетевому интерфейсу для запроса данных с его БД.
У ODNFC-MODBUS лицевая панель покрыта тонкой защитной транспортировочной плёнкой (это не царапины на панели). Удалите её перед установкой.
Подключение
Назначение выводов

  • A - RS485
  • B - RS485
  • GND - «Земля»
  • IN - Сигнальный входной контакт
  • OUT+ «+» исполнительного устройства / замка. Напряжение равно напряжению питания.
  • OUT- «-» исполнительного устройства / замка
  • GND - «Земля»
  • +12V - питание. Допустимые значения 7-24В.



Дополнительные контакты в виде группы отверстий на плате "GND, OUT, +5" служат для установки разъема для подключения светодиодной ленты вместо встроенных светодиодов.
При этом, при запуске контакты GND-OUT выполняют функции HARD RESET.

Настройки порта по-умолчанию: 115200 8N1
Адрес устройства: 1
Чтение
Read Holding Registers
0..n - данные поднесенной метки. По-умолчанию это UID, но тип считываемых с карты данных можно изменить с помощью строки форматирования.
Данные побайтно упакованы последовательно по два байта на регистр. Например, четырехбайтный UID занимает регистры 0x0, 0x1.

Пример считанного UID (7-байтный UID Mifare Ultralight): 34772FC11139E7
Пример укладки в регистры с 0: [13431, 12225, 4409, 59136]
После чтения регистры обнуляются.

Запись
Write Holding Registers
  • Запись 1 в 0xF0 инициирует сигнал "разрешено" и "открывает замок" (снимает напряжение с OUT). Запись 2 в 0xF0 инициирует сигнал "запрещено" и "закрывает замок" (подает напряжение на OUT).
  • Запись последних двух байт серийного номера в ячейку 0xF1 запускает wifi-сеть на устройстве для доступа к настройкам и изменению кода.
  • Запись числа в регистр 0xF2 изменяет адрес устройства на полученный (с учетом маски 0xFF). После чего происходит немедленная перезагрузка с новым адресом.
После чтения регистры обнуляются.

Поведение устройства можно самостоятельно (или с нашей помощью) отредактировать с помощью встроенного редактора кода.
Тестируем
Для работы с устройством мы будем использовать кросплатформенную утилиту mbpoll (https://github.com/epsilonrt/mbpoll).

Чтение метки
mbpoll -m rtu -a 1 -r 0 -0 -c 4 -t 4:hex -b 115200 -P none -l 500 -o 0.5 /dev/ttyACM0

Разрешено
mbpoll -m rtu -a 1 -r 240 -0 -b 115200 -P none -1 -o 0.5 /dev/ttyACM0 1

Запрещено
mbpoll -m rtu -a 1 -r 240 -0 -b 115200 -P none -1 -o 0.5 /dev/ttyACM0 2

Закрыть замок
mbpoll -m rtu -a 1 -r 240 -0 -b 115200 -P none -1 -o 0.5 /dev/ttyACM0 3

Включить web
mbpoll -m rtu -a 1 -r 241 -0 -b 115200 -P none -1 -o 0.5 /dev/ttyACM0 0x3709(зависит от s/n)

Сменить адрес с 1 на 2
mbpoll -m rtu -a 1 -r 242 -0 -b 115200 -P none -1 -o 0.5 /dev/ttyACM0 2
На карте бывают надписи с номером, которые не совпадают с UID, который вы получаете с карты.
Расскажем, как из UID получить напечатанные на карте номера.

Например, вы получили UID 7A403AB9, а на карте написано два набора данных: 3107602554 и 058,16506

  1. Исходный номер 7A 40 3A B9 переводим в little-endian порядок байт, получаем B9 3A 40 7A и переводим в десятичное число: 0xB93A407A = 3107602554
  2. Преобразованное в формат Wiegand 26: берем развернутые, как в предыдущем примере байты, при этом используются только 3 байта UID, а первый байт отбрасывается. Оставшиеся 3 байта разбивают следующим образом: 3A 40 7A в десятичном виде: 0x3A = 58 (с ведущим нулём – 058). и оставшиеся два байта – 40 и 7A: 0x407A = 16506.
Функции для преобразования уже реализованы в наших библиотеках.
В исполнении "комбо", когда в устройстве активны оба интерфейса: 13,56 МГц и 125 КГц, данные о поднесенной метке 125КГц укладываются с регистра №4, т.е. читать нужно в 2 раза больше регистров. C включенным чтением HID добавляется еще 4 регистра.

На изображении 4 байт UID карты Mifare с адреса 0 и 5 байт (идентификатор производителя + UID) карты EM-Marine. Форматы передачи и упаковку в регистры можно поменять самостоятельно под логику своего контроллера.
Если не требуется изменение алгоритма работы устройства, то на этом месте можно перестать читать.
Web-интерфейс
Web-интерфейс нужен только для изменения кода или изменения настроек, которые невозможно изменить по протоколу ModBus.

Чтобы включить web-интерфейс нужно записать в адрес 0xF1 два последних байта серийного номера. После чего, у устройства появится wifi-сеть вида odnfc-[s/n], где s/n - этот серийный номер.

Основной экран

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


Экран настроек

Данный экран позволяет изменять основные настройки устройства.

Часть из настроек сделаны для обработки из пользовательской программы и устройством не обрабатываются (в данном случае это Формат, Тип Ключа, Ключ, Получатель), остальное используется для загрузки устройства.

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

HTTPS-сервер будет включать web-сервер с самоподписанными сертификами: браузер все-равно будет заходить на такую страницу только с ручным подтвержденим (и работать будет гораздо медленнее), поэтому включайте только если это действительно вам нужно.

Websocket REPL - включает удаленный доступ к устройству по сети. Используется в IDE lua.unitx.pro (вместе с https) и в плагине VSCode (без https).

Считыватель может работать с WiFi, поэтому имеет сетевой функционал, который
по-умолчанию отключен, но может пригодиться в некоторых сценариях.
Окно настроек унифицировано. Влияет ли конкретная настройка на работу вашего устройства зависит от конкретного загруженного скрипта.
Пример некоторых опций:
  • Опции "Формат", "Тип ключа", "Ключ" - могут использоваться программистом в своей программе для упрощения настройки RFID при интеграции. Нужны, чтобы при настройке не требовалось править код.
  • "WatchDog" - функция, которая перезагрузит устройство, если что-то пойдет не так. Отключите на время разработки.
  • Опция "Тип Адреса" определяет тип подключения Ethernet/WIFI и тип получения адреса.

Редактор кода

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

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

При написании кода не стесняйтесь обращаться к нам - мы поможем.

Технические характеристики
1. Дальность считывания меток: до 6-10 см (зависит от качества метки).
2. Габаритные размеры: 120х76х22мм/.
3. Проводные интерфейсы: RS485.
4. Беспроводные интерфейсы: WiFi.
4. Индикация: RGB светодиод, звуковой излучатель.
5. Один входной канал (3В, подтянут к "1").
6. Один выходной канал (1А max), напряжение соответствует напряжению питания.
7. Четыре крепёжных отверстия М3.
RFID метки устроены гораздо сложнее, чем это кажется на первый взгляд.
Метки Mifare позволяют не только читать их номер, но и производить чтение и запись ее встроенной памяти, использовать специальные ячейки-счетчики для хранения "баллов", шифровать отдельные блоки и т.п.

На картинке ниже содержимое начальных секторов некоторых типов карт из нашей программы ODRFIDKit, которая используется со считывателями ODRFID-M/N и может вам пригодиться для чтения-записи карт или понимания их структуры.
Считыватель позволяет легко реализовать считывание разных областей с помощью "строки форматирования".
Код, который идет в устройстве (и который можно изменить)
Данный код идет в устройстве и доступен в web-редакторе (может немного отличаться в зависимости от исполнения).
Вы можете самостоятельно или с нашей помощью внести изменения для адаптации алгоритма под вас.
indication = require("indication")                           
                                                                                                                                                                                                                                                                          
leds = indication.Leds.new({RGB=true, ledPin=pio.GPIO32})                                                                                                                                                                                                                                      
snd = indication.Sound.new(pio.GPIO21)
wdt_on = Settings.get("sys_wdt") == "on"                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
pio.pin.setdir(pio.OUTPUT, pio.GPIO2) -- Замок
lock = function() pio.pin.setval(1, pio.GPIO2) end;
unlock = function() pio.pin.setval(0, pio.GPIO2) end;                                                                                                                                                                                                                                                  
lock()

modbus.rtu.init(Settings.get("rs485_addr"))

-- функция запуска wifi-интерфейса по modbus-команде
local web_start = (function()
  local web_started = false
  local sn = cpu.getmac(0, 1)
  return function(num)
      if web_started then return end
      if string.sub(sn, -4) == string.format("%02X", num) then
          net.wf.setup(net.wf.mode.AP, Settings.get("net_ssid"), Settings.get("net_password"), net.wf.powersave.NONE, 4, false)
          net.wf.start()
          web_started = true
      end
  end
end)()

if cpu.resetreason() == cpu.RESET_POWERON then
  leds:start()
  snd:start()
end

-- главный цикл
local uid, ret, action, web_pwd, new_addr

while true do
  if wdt_on then cpu.watchdog.reset() end

  uid = mfrc522.scan(7)
  if uid then
      modbus.setregs8(0, uid)
  end

  ret = modbus.getregs(0xf0, 3, true)
  action, web_pwd, new_addr = ret[1], ret[2], ret[3]
  if action == 1 then -- разрешено
      unlock()
      leds:ok()
      snd:ok()
  elseif action == 2 then -- запрещено
      lock()
      leds:err()
      snd:err()
  elseif action == 3 then -- закрыть замок (после прохода)
      unlock()
  end
  if web_pwd and web_pwd ~= 0 then
      web_start(web_pwd)
  end
  if new_addr and new_addr ~= 0 then
      Settings.set("rs485_addr", string.format("%d", new_addr & 0xff))
      os.exit()
  end

  thread.sleepms(200)
end
Восстановление устройства
Порядок действий, если вы "закирпичили" устройство и не можете получить к нему доступ.

  1. Выключить устройство.
  2. Замкнуть контакты HARD RESET или RECV (зависит от ревизии) на плате устройства.
  3. Включить устройство держа замкнутым разъём HARD RESET/RECV.
  4. Подождать несколько секунд (после контакты можно размокнуть).
  5. Устройство создаст WiFi-точку доступа вида OD-[серийный номер].
  6. Сеть без пароля
  7. С версии 1.6.0 дополнительно запустит Ethernet интерфейс с DHCP-клиентом.
  8. Устройство запустит Web-сервер и telnet-сервер, чтобы вы могли исправить работать с консолью устройства: изменить настройки/программу и восстановить доступ к устройству.
  9. WiFi ip-адрес устройства: 192.168.4.1
Обновление устройства
Порядок действий
Открыть вкладку "Настройки" (в веб-браузере).
Если включен сторожевой таймер, то выключить его и перезагрузить устройство.

Открыть вкладку "Система" (в веб-браузере).

Обновление с файла
1. Скачать с этого сайта подходящую прошивку.
2. Нажать кнопку "Из файла", выбрать файл.
3. Нажать "Загрузить". Дождаться сообщения о готовности.
4. При успешной загрузке устройство перезагрузится.
5. После обновления нужно убедиться, что данные о сборке изменились на желаемые.

Актуальные прошивки можно скачать по ссылке

Дополнительные материалы
0
Строка форматирования
Как пользоваться, если выхотите читать не uid, а данные с карты.
1
Консоль
Как работать с консолью.
2
Как программировать ODNFC на Lua
Инструкции, учебники, советы, обсуждения.
3
Справочник по Lua
Русскоязычная он-лайн версия с поиском и перекрестными ссылками.
4
ИИ генератор кода
Дообученный нашей документацией и примерами ИИ для более легкого старта.