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

    Mifare Classic 1K/4K/Mini: полная поддержка
    Mifare Ultralight: полная поддержка
    Mifare Ultralight Nano: полная поддержка
    Mifare Ultralight C: ограниченная поддержка - только чтение UID
    NTAG 213/215/216: полная поддержка
    S50/S70: полная поддержка
  • Работа в локальной сети
    Считыватель подключается в сеть RS485 в роли ведомого устройства с протоколом MODBUS.
    Имеет встроенный 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
Чтение
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-сеть на устройстве для доступа к настройкам и изменению кода.
  • Запись числа в регистр 0xF1 изменяет адрес устройства на полученный (с учетом маски 0xFE). После чего происходит немедленная перезагрузка с новым адресом.
После чтения регистры обнуляются.

Поведение устройства можно самостоятельно (или с нашей помощью) отредактировать с помощью встроенного редактора кода.
Если не требуется изменение алгоритма работы устройства, то на этом месте можно перестать читать.
Web-интерфейс
Чтобы включить web-интерфейс нужно записать в адреса 0xF1 - 0xF4 серийный номер после чего, у устройства появится wifi-сеть вида odnfc-[s/n], где s/n - этот серийный номер.
На момент написания этой заметки некоторые сборки Chrome могут блокировать часть функционала, т.к. устройство работает через http, а не https. Подробнее: https://itecnote.com/tecnote/websocket-connection-fails-on-chrome-without-ssl.
Если у вас возникает эта проблема, пожалуйста, используйте другой браузер.

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

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


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

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

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

Также в настройках можно закрыть паролем доступ к web-интерфейсу.

Считыватель может работать с WiFi, поэтому имеет сетевой функционал, который
по-умолчанию отключен, но может пригодиться в некоторых сценариях.
  • Опции "Формат", "Тип ключа", "Ключ" - могут использоваться программистом в своей программе для упрощения настройки RFID при интеграции. Нужны, чтобы при настройке не требовалось править код.
  • "WatchDog" - функция, которая перезагрузит устройство, если что-то пойдет не так. Отключите на время разработки.
  • Опция "Тип Адреса" определяет тип подключения Ethernet/WIFI и тип получения адреса.
Далее идет блок сетевых настроек.
  • Включение MDNS позволят обращаться к устройству не зная его IP, по адресу типа odnc-[4-последние-цифры-серийного-номера].local. Например http://odnfc-ABCD.local
  • SSH включает ssh-сервер (доступен не во всех версиях).
  • Telnet - позволяет получить доступ к устройству по сети, если у вас не осталось никакого другого интерфейса для взаимодействия (он менее удобен, но гораздо легче, чем ssh).

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

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

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


Экран "об устройстве"

Экран для получения информации об устройстве, обновления устройства локально или через интернет.

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

На картинке ниже содержимое начальных секторов некоторых типов карт из нашей программы ODRFIDKit, которая используется со считывателями ODRFID-M/N и может вам пригодиться для чтения-записи карт.
Считыватель позволяет легко реализовать считывание разных областей с помощью "строки форматирования".
Код, который идет в устройстве
Данный код идет в устройстве и доступен в web-редакторе.
Вы можете самостоятельно или с нашей помощью внести изменения для адаптации алгоритма под вас.

-- раздел импорта
local rfid = require("rfid")
local indication = require("indication")
local binascii = require("binascii")
local hw = require("hw")

-- инициализация необходимых объектов
local reader = rfid.Reader({reset_pin=pio.GPIO25})
local leds = indication.Leds.new({RGB=true, ledPin=pio.GPIO32})
local snd = indication.Sound.new(pio.GPIO21)
local start_web = hw.WebStarter()
local wdt_on = Settings.get("sys_wdt") == "on"
local locker = hw.OUT(nil, false, 1)
local btn = hw.IN()

-- настройки modbus
local params = {
	addr = tonumber(Settings.get("net_dest")),
	port = uart.UART2,
	rxpin = 13,
	txpin = 14,
	rtspin = 12,
	baudrate = 115200,
	parity = uart.PARNONE,
	clear= true
}
-- переопределим световые эффекты
function leds:ok(time_ms)
	leds:set(100, 255, 100, time_ms or 100)
end

function leds:err(time_ms)
	leds:set(255, 100, 100, time_ms or 100)
end

-- индикация при запуске
leds:start()
snd:start()

-- запускаем поток modbus
thread.start(function() modbus.rtu.init(params.addr, params.port, params.rxpin, params.txpin, params.rtspin, params.baudrate, params.parity, params.clear) end)

-- основной цикл
reader.process({
    timeout_ms = 200,
    mode = rfid.MODE_LOOP,
    uidtype = rfid.UID_TAB,
    wdt = wdt_on,
    checkfunc = function(uid)
        modbus.rtu.setregs8(0, table.unpack(uid.tab))
    end,
    waitfunc = function()
    	local req = {addr = 0xf0, qty = 3, clear = true}
        local ret = modbus.rtu.getregs(req.addr, req.qty, req.clear)
        local action, web_pwd, new_addr = ret[1], ret[2], ret[3]
        if action == 1 then
            locker.open()
            leds:ok()
            snd:ok()
        elseif action == 2 then
            locker.close() 
            leds:err()
            snd:err()
        end
        if web_pwd ~= 0 then
            start_web(web_pwd)
        end
        if new_addr ~= 0 then
        	Settings.set("net_dest", string.format("%d", new_addr & 0xfe))
        	os.exit()
        end
    end
})
Восстановление устройства
Порядок действий, если вы "закирпичили" устройство и не можете получить к нему доступ.

  1. Выключить устройство.
  2. Замкнуть контакты HARD RESET на плате устройства.
  3. Включить устройство держа замкнутым разъём HARD RESET.
  4. Подождать несколько секунд (после контакты можно размокнуть).
  5. Устройство создаст WiFi-точку доступа вида ODNFC-[серийный номер].
  6. Пароль сети - последние 8 цифр серийного номера.
  7. Устройство запустит Web-сервер и telnet-сервер, чтобы вы могли исправить настройки/программу и восстановить доступ к устройству.
  8. IP устройства: 192.168.4.1
Дополнительные материалы
0
Строка форматирования
Как пользоваться, если выхотите читать не uid, а данные с карты.
1
Консоль
Как работать с консолью.
2
Как программировать ODNFC на Lua
Инструкции, учебники, советы, обсуждения.
3
Справочник по Lua
Русскоязычная он-лайн версия с поиском и перекрестными ссылками.