
ODNFC-LAN на MicroPython — руководство
NFC/RFID считыватель-контроллер с сетевым интерфейсом и прошивкой MicroPython: возможности, веб-интерфейс, подключение, технические характеристики, примеры кода, восстановление и обновление.
ODNFC-LAN и ODNFC-LAN-C — NFC/RFID считыватели-контроллеры с сетевым интерфейсом и прошивкой MicroPython. Логику работы можно изменить во встроенном редакторе кода под вашу задачу.
Быстрый маршрут
| Нужно | Раздел |
|---|---|
| Подключить Ethernet и найти IP-адрес | «Подключение» |
| Загрузить или изменить программу | «Веб-интерфейс» → «Редактор кода» |
| Понять состав конкретного исполнения | «Исполнения» и «Технические характеристики» |
| Посмотреть рабочую основу программы | «Код, который идёт в устройстве» |
| Вернуть доступ после ошибки | «Восстановление устройства» |
Для первого теста не начинайте с полной СКУД. Проверьте последовательно: считывание UID, индикацию, ручное переключение выхода, сетевую отправку одного события — и только затем добавляйте базу пользователей и прикладные правила.
Ключевые возможности
- Поддерживаемые метки. Чтение-запись MIFARE Classic 1K/4K/Mini, MIFARE Plus S/X (SL0/SL1/SL3), MIFARE Ultralight, Ultralight Nano, Ultralight EV1, NTAG 213/215/216, S50/S70 — полная поддержка; MIFARE Plus X (SL2), Ultralight C, DESFire — только чтение UID.
- Работа в локальной сети. Подключение по Ethernet с DHCP или статическим адресом, встроенный веб-интерфейс, передача данных и приём команд по сети.
- Совместимые бесконтактные карты. Устройство может использовать идентификатор, который отдаёт физическая карта; это не обязательно напечатанный номер или платёжный PAN. Мобильный кошелёк может выдавать отдельный и меняющийся идентификатор. Обычный пропуск в Apple Wallet или Google Wallet не становится совместимой NFC-картой автоматически. Подробнее — в статье «Телефон как пропуск».
- Изменяемая логика. Встроенный редактор позволяет задать прикладной алгоритм на MicroPython.
- Дискретный вход и выход. Один вход можно использовать для кнопки, а выход — для управления замком или другой нагрузкой. Проверьте допустимый ток, напряжение и защиту индуктивной нагрузки до подключения.
- Управляемая индикация. Программное управление звуковым излучателем и RGB-светодиодом (ODNFC-LAN); вместо одного диода можно подключить адресную ленту до 40 светодиодов. ODNFC-LAN-C управляет классической парой «красный-зелёный».
- Локальная база данных. Устройство хранит данные о пользователях локально, работает автономно или синхронизируется с сервером.
Исполнения
| Артикул | Название | Индикация | Корпус | Разъём | Флеш-память / ОЗУ, МБ |
|---|---|---|---|---|---|
ONL-N4-P-I-C | ODNFC-LAN | 2 × RGB | Тип A | IDC381-8-110 | 4/0.2 |
ONL-N4-P-K-C | ODNFC-LAN | 2 × RGB | Тип A | Клеммники | 4/0.2 |
ONC-N4-P-K-C | ODNFC-LAN-C | зелёный/красный | Тип B | Клеммники | 4/0.2 |
В конце артикула C означает устройство в корпусе, B — плату без корпуса.
Полную расшифровку артикулов см. в разделе поддержки.
Лицевая панель ODNFC-LAN покрыта тонкой защитной транспортировочной плёнкой. Удалите её перед использованием.
Подключение
Интерфейс — Ethernet, питание — Passive PoE 7–24 В. Индикация сети: красный —
нет соединения, зелёный — соединение установлено. По умолчанию устройство
получает IP-адрес от DHCP-сервера. Если за 30–40 секунд адрес получить не
удалось, устройство назначает себе статический адрес 192.168.1.1.
Распиновка Passive PoE для устройств UnitX ODNFC:
- контакты 1 и 2 — Ethernet, первая пара данных;
- контакты 3 и 6 — Ethernet, вторая пара данных;
- контакты 4 и 5 — «+» питания;
- контакты 7 и 8 — «−» питания.
Нумерация относится к контактам разъёма 8P8C (RJ45) или соответствующим контактам колодки. Passive PoE подаёт постоянное напряжение без согласования с устройством — это не IEEE 802.3af/at. Перед включением убедитесь, что напряжение источника входит в допустимый для устройства диапазон.
Веб-интерфейс
Веб-редактор использует WebSocket. Если браузер блокирует незащищённое соединение или смешанный HTTP/HTTPS-контент, откройте интерфейс устройства по HTTP в доверенной локальной сети либо используйте сервисное подключение. Не ослабляйте глобальные настройки безопасности браузера.
Основной экран. Общая информация об устройстве и сообщения из кода
(отправленные командой eprint).
Редактор кода. Состоит из трёх элементов: файловый менеджер
(создание/удаление файлов и папок, загрузка файлов на устройство), редактор кода
и интерактивная консоль. Консоль нужна для экспериментов с кодом — чтобы её
активировать, нажмите в ней Ctrl+C. После этого основная программа
остановится; для восстановления работы перезагрузите устройство.
Экран настроек. Изменяет основные настройки. Часть из них предназначена для обработки пользовательской программой и устройством не используется. Здесь же можно закрыть паролем редактор и веб-интерфейс целиком.
Обратите особое внимание на пункты:
- «Установить пароль на web» — закрывает веб-интерфейс паролем (basic auth).
- «Установить пароль на Настройки» — задаёт пароль для страницы настроек. Пароль доступен только для записи: при открытии страницы он из устройства не считывается, а браузер может подставить его из кеша — внимательно следите за состоянием этих полей.
- «Включить редактор» — скрывает редактор кода со страницы и закрывает WebSocket для удалённой отладки.
Экран «Об устройстве». Информация об устройстве, обновление веб-интерфейса и переход в веб-загрузчик.





Технические характеристики
- Чтение и запись меток: MIFARE Classic 1K/4K/Mini, MIFARE Plus S/X (SL0/SL1/SL3), MIFARE Ultralight, Ultralight Nano, Ultralight EV1 80/164, NTAG 213/215/216, S50/S70 — полная поддержка; MIFARE Plus X (SL2), Ultralight C, DESFire — только чтение UID.
- Дальность считывания: до 6 см.
- Габариты: 120 × 76 × 22 мм (ODNFC-LAN), 115 × 75 × 20 мм (ODNFC-LAN-C).
- Проводные интерфейсы: Ethernet.
- Индикация: RGB-светодиод, звуковой излучатель.
- Вход: один канал (3 В, подтянут к «1»).
- Выход: один канал (макс. 1 А), напряжение равно напряжению питания.
- Крепление: четыре отверстия M3.
- Питание: Passive PoE 7–24 В.
Чтобы читать не только UID, но и выбранные области памяти карты, задайте строку форматирования.
Код, который идёт в устройстве
Ниже показана основа штатной программы. При запуске устройство подаёт короткий сигнал, читает из настроек параметры сторожевого таймера, строки форматирования и отправки по UDP. Затем оно опрашивает считыватель с двухсекундным фильтром: при успешном чтении отправляет UDP-пакет и на 5 секунд включает выход.
from time import time
from uasyncio import sleep_ms, sleep
from machine import WDT
from rfid_utils import RFID, BUZZ, LED_PIN, CardFilter, OUT
from webserver import eprint
from config import settings
from uasyncio import AsyncUDP
import rfid as urfid
from multi_led import SmartLED
async def door():
OUT.off()
await sleep(5)
OUT.on()
async def run():
await eprint("User code started")
rfid = RFID(urfid.G_43dB)
LEDS = SmartLED(LED_PIN, count=2)
LEDS.fill('#000000')
OUT.on()
c_filter = CardFilter(2)
wdt_enabled = settings['sys-i-wdt']
str_format = settings['rfid-format']
udp_en = (settings['rfid-protocol'] == 'UDP')
if wdt_enabled:
wdt = WDT(timeout=10000)
await BUZZ.beep(100)
while 1:
if wdt_enabled:
wdt.feed()
await sleep_ms(100)
c_filter.clean(time())
uid = rfid.read(str_format)
if uid and uid not in c_filter:
c_filter.append(uid)
LEDS.fill('#00FF00')
await BUZZ.beep()
LEDS.fill('#000000')
if udp_en:
await AsyncUDP.udp_send(uid, (settings['rfid-dest'], settings['rfid-i-dport']))
await door()
Сетевые примеры
Готовые шаблоны передачи и приёма данных — переключайте вкладки.
Устройство подключается к TCP-серверу и раз в секунду отправляет сообщение
hello со звуковым сигналом.
from time import time
from uasyncio import sleep, TCPClient
from rfid_utils import BUZZ
from webserver import eprint
from config import settings
async def run():
await eprint("User code started")
client = TCPClient(settings['rfid-dest'], settings['rfid-i-dport'])
client.connect()
while 1:
await BUZZ.beep()
await client.send('hello')
await sleep(1)
Восстановление устройства
Если записаны неправильные настройки:
- Выключите устройство.
- Замкните контакты HARD RESET на плате.
- Включите устройство, удерживая HARD RESET замкнутым.
- Дождитесь, пока замигает красный светодиод.
- Откройте веб-страницу загрузчика. Устройство попробует получить адрес от
DHCP; если не удастся за 30–40 секунд — назначит себе
10.10.0.1. - Нажмите «Настройки» → «К заводским настройкам» → «Запустить».
Если доступ потерян из-за неправильного usercode.py: выполните шаги 1–5,
затем нажмите «Дополнительно», выберите назначение «Пользовательские
данные», директория — ., файл — usercode.py (он должен содержать корректный
код или быть пустым), нажмите «Загрузить» → «Запустить».
Обновление устройства
- Откройте вкладку «Об устройстве» и нажмите «Bootloader».
- Дождитесь, пока замигает красный светодиод, и откройте веб-страницу загрузчика (адрес как при восстановлении).
- Нажмите «Выбрать» и укажите файл
*.efw. - Нажмите «Загрузить» и дождитесь окончания (прогресс-бар внизу).
- Нажмите «Запустить» и убедитесь, что на вкладке «Об устройстве» версия прошивки соответствует желаемой.



Дополнительные материалы
- Кнопка, замок, реле, второй считыватель и адресная RGB-лента
- Программирование на MicroPython — как написать свою программу.
- Строка форматирования — формат данных, считываемых с карты.
- Пример: Modbus TCP на MicroPython.
История обновлений ODNFC на Lua
Если установлена версия ниже 1.7.0, сначала обновите её до 1.7.0, а затем до более новой версии. Перед обновлением отключите сторожевой таймер и сотрите пользовательскую программу.
1.8.2
- Улучшена работа устройства и исправлены ошибки.
- Для устройств, работающих с метками 125 кГц, добавлено обнаружение типовых клонов EM-Marine.
1.8.1
Улучшения:
- Новый веб-интерфейс.
- Улучшена работа RFID-модулей MFRC и EM-Marine.
- Улучшена работа Modbus.
- Оптимизирована работа устройства.
1.7.0
Улучшения:
- улучшена работа MFRC и EM-Marine;
- в раздел «Редактор» добавлен простой файловый менеджер;
- улучшена работа сетевых модулей;
- оптимизирована работа устройства.
Исправлена ошибка в HTTP-заголовке Content-Length, из-за которой интерфейс не
работал в некоторых операционных системах.
1.6.2
- Улучшена работа MFRC и EM-Marine.
- Улучшена библиотека Modbus.
- Оптимизирована работа устройства.
- В ODNFC-LAN-LUA добавлена регистрация обработчика успешного чтения.
1.6.1
- Добавлена запись в зашифрованные карты MIFARE Classic.
- Упрощена инициализация RFID: используются значения по умолчанию для каждой
платы, поэтому изменён вызов основного класса и больше не требуются многие
Lua-обёртки из
rfid.lua. - Добавлена функция
mfrc522.scan()— упрощённая версия базового класса для типовых операций. - Исправлены библиотеки EM-Marine и HID.
- Оптимизирована библиотека Modbus.
- Исправлена работа TCP-сервера.
1.6.0
Улучшения:
- обновлён редактор кода: устранена проблема с переводами строк в новых версиях Firefox;
- в веб-сервер добавлена поддержка HTTPS и WebSocket;
- добавлены новые классы для работы с RFID-метками;
- добавлена работа с NDEF и счётчиками Ultralight;
- добавлены встроенные библиотеки
cbor,cobs,mlib, Heatshrink иmicrotar; - расширены библиотеки
osc,net,cutils,utils,cpuиemmarine; - LuaSocket больше не входит в прошивку;
- добавлена загрузка сжатых Heatshrink-библиотек Lua;
- добавлен WebSocket REPL для отладки через веб-IDE или расширение VS Code;
- улучшена консоль: Unicode, автодополнение и история;
- расширена поддержка Modbus;
- Paho MQTT заменён собственной реализацией uMqtt;
- ускорена работа устройства и веб-интерфейса;
- выполнены другие небольшие исправления и оптимизации.
Исправлены ошибки, из-за которых после мягкой перезагрузки Wi-Fi запускался через раз, а RFID-модуль мог не инициализироваться.
1.5.0
Улучшения:
- новый интерфейс и редактор кода;
- добавлена библиотека
tinycobs; - добавлены функции
net.tcp.*; - добавлены функции
eprint,hprintиwprintдля вывода в окно «Инфо»; - трассировка ошибки загрузки теперь показывается в окне «Инфо»;
- расширены возможности Telnet, SSH отключён;
- в режиме восстановления Wi-Fi работает без пароля;
- добавлена поддержка BLE-маяков на устройствах с BLE;
- NTP запускается с задержкой 15 секунд, чтобы сеть успела установиться.
Исправлены режим статического Ethernet-адреса и установка яркости NeoPixel.
1.4.0
- Улучшен встроенный веб-сервер.
- Выполнены небольшие изменения для повышения стабильности.
- Исправлена утечка памяти при HTTP-запросах из Windows.
Известная проблема этой версии: режим статического Ethernet-адреса в настройках не работает. Для обхода проблемы в начало пользовательской программы добавляли:
net.en.setup(
net.packip(Settings.get("net_ip")),
net.packip(Settings.get("net_mask")),
net.packip(Settings.get("net_gw")),
net.packip(Settings.get("net_dns"))
)
net.en.start()
1.3.2
- В
os.df()добавлен дополнительный параметр. - Выполнены небольшие изменения для повышения стабильности.
- Исправлена утечка памяти при запросе метрики в интерфейсе.
Известная проблема этой версии: HTTP-запросы из Windows приводят к утечке памяти. После изменения настроек рекомендовалось закрыть браузер, перезагрузить устройство и не выполнять периодические HTTP-запросы.
1.3.1
- Серийный номер синхронизирован с DataMatrix на корпусе модуля, если он есть.
1.3
- Библиотека
Telegram.luaдобавлена в прошивку. - Библиотека LuaSocket теперь распространяется отдельно.