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 инициирует сигнал "разрешено"
Запись 2 в 0xF0 инициирует сигнал "запрещено"
Запись серийного номера в ячейки 0xF1 - 0xF4 запускает wifi-сеть на устройстве для доступа к настройкам.
После чтения регистры обнуляются.

Поведение устройства можно самостоятельно (или с нашей помощью) отредактировать с помощью встроенного редактора кода.
Строка форматирования позволяет задать произвольный формат вывода данных с карты, произвести некоторые манипуляции (изменить порядок байт, добавить или вырезать данные и т.п.) ещё в считывателе и выдать уже преобразованный результат.
Подробнее о строке форматирования...
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, поэтому имеет сетевой функционал, который
по-умолчанию отключен, но может пригодиться в некоторых сценариях.
Опции "Формат", "Тип ключа", "Ключ", "Получатель", "WatchDog" - могут использоваться программистом в своей программе. Нужны, чтобы при настройке не требовалось править код.

Опция "Тип Адреса" определяет тип подключения Ethernet/WIFI и тип получения адреса.
Далее идет блок сетевых настроек.

Включение MDNS позволят обращаться к устройству не зная его IP, по адресу типа odnc-[4-последние-цифры-серийного-номера].local. Например http://odnfc-ABCD.local

SSH включает ssh-сервер (доступен не во всех версиях).

WatchDog - обычно запускает в пользовательском коде сторожевой таймер. Отключите его на период разработки.

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 и может вам пригодиться для чтения-записи карт.
Считыватель позволяет легко реализовать считывание разных областей с помощью "строки форматирования".
Код, который идет в устройстве
Базовый код, которорый идет с устройством.
Его можно изменить, чтобы расширить функционал под свои задачи.
Если захотите что-то подправить в логике работы

rfid = require("rfid")
indication = require("indication")
binascii = require("binascii")
reader = rfid.Reader({reset_pin=pio.GPIO25})
leds = indication.Leds.new({RGB=true, ledPin=pio.GPIO32})
snd = indication.Sound.new(pio.GPIO21)
wdt_on = settings_get("sys_wdt") == "on"
leds:start()
snd:start()

function createWebStarter()
    local web_started = false

    return function(tab)
        if (web_started) then
            return
        end
        local sn = table.concat(binascii.hexlify({tab[2], tab[3], tab[4], tab[5]}))
        if sn == os.flashEUI() then
            net.wf.setup(net.wf.mode.AP, nvs.read("system", "net_ssid"), nvs.read("system", "net_password"), net.wf.powersave.NONE, 4, false)
            net.wf.start()
            web_started = true
        end
    end
end

start_web = createWebStarter()


--start modbus thread 
--addr, uartnum, rx, tx, rxtx, baudrate, parity, clear_after_read)
thread.start(function() modbus.rtu.init(1, 2, 13, 14, 12, 115200, 0, true) 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 ret = modbus.rtu.getregs(0xf0, 5, true)
        local cmd = ret[1]
        local sn = ret[2]
        if cmd == 1 then
            leds:ok()
            snd:ok()
        elseif cmd == 2 then
            leds:err()
            snd:err()
        end
        if sn ~= 0 then
            start_web(ret)

        end
    end
})

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

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