Программирование ODNFC на MicroPython
Руководство по программированию считывателя-контроллера ODNFC на MicroPython: ограничения встроенного устройства, настройки, библиотеки и пример программы.
Краткое руководство по программированию RFID-считывателя-контроллера ODNFC с прошивкой MicroPython.
MicroPython поддерживается только в ранее выпущенных устройствах. Для новых проектов выбирайте Lua-прошивку.
Другие инструкции для этой платформы собраны в разделе MicroPython.
Если вы поддерживаете такой проект с помощью ИИ, скопируйте промпт для MicroPython.
Ключевые правила разработки
Пользовательская программа делит ограниченные ресурсы устройства с сетью, считывателем и веб-интерфейсом.
- Время исполнения и веб-интерфейс. Если пользовательская задача постоянно
занимает процессор, веб-интерфейс перестаёт вовремя отвечать и браузер
разрывает соединение. Всегда оставляйте время другим
потокам — в основном цикле должна быть строка вроде
await uasyncio.sleep_ms(100). - Ограниченные ресурсы. Памяти и вычислительной мощности мало: избегайте больших структур и долгих вычислений.
- Сборщик мусора (GC). В MicroPython работает GC, и его работа может быть заметна как короткая пауза. Не создавайте много временных объектов; при необходимости вызывайте GC сами там, где такая пауза допустима.
- Порядок разработки. Код, не зависящий от железа, отлаживайте на «обычном»
Python для ПК, учитывая различия между CPython и MicroPython.
Аппаратно-зависимые части проверяйте в консоли устройства (чёрное окно внизу
страницы редактора). Чтобы открыть REPL, нажмите
Ctrl+C: выполнение пользовательской программы остановится. Чтобы устройство не перезагрузилось по сторожевому таймеру, заранее отключите его в настройках или коде. - Применение нового кода. Нажмите кнопку «дискета» в правом верхнем углу редактора и убедитесь, что появилось уведомление «успешно». Затем перезагрузите устройство. Браузер не всегда подхватывает перезагрузку — при необходимости обновите страницу.
Доступ к настройкам веб-интерфейса
Самые используемые настройки выведены в веб-интерфейс. Какие из них применяются —
зависит от пользовательского кода. Настройки доступны как объект settings
класса Settings из модуля config:
from config import settings
Доступ — через settings.get('параметр'). Основные параметры:
Системные:
sys-version— версия прошивки (только чтение);sys-i-ntp,sys-ntp-pool,sys-ntp-off— использование NTP, адрес сервера, смещение от UTC ('00:00');sys-lang('auto'/'ru'/'en') — язык интерфейса;sys-i-web-port— порт веб-интерфейса;sys-set-pwd,sys-i-set-auth— пароль окна настроек и его использование;sys-web-pwd,sys-i-web-auth— пароль веб-интерфейса (пользовательadmin) и его использование;sys-i-wdt— включить сторожевой таймер;sys-i-editor,sys-i-dash— показывать редактор кода и информационную панель;sys-i-info— период отправки сообщений в веб-интерфейс (с);sys-i-leds— количество светодиодов в ленте.
Сеть:
net-i-dhcp— тип получения адреса (1 — DHCP, 0 — статический);net-ip,net-mask,net-gw,net-dns— параметры при статическом адресе.
RFID:
rfid-format— строка форматирования;rfid-protocol('TCP'/'UDP') — протокол передачи данных о метке;rfid-dest,rfid-i-dport— адрес и порт получателя;rfid-keytype('A'/'B'/'UL'/'PL'),rfid-key— тип и значение ключа шифрования (hex).
from config import settings
dst_ip = settings.get('rfid-dest')
dst_port = settings.get('rfid-i-dport')
format_str = settings.get('rfid-format')
wdt_en = settings.get('sys-i-wdt', False)
Разбор примера: OSC из памяти карты
Задача примера: ODNFC-LAN-C читает данные из заданной области MIFARE-карты и отправляет их как OSC-сообщение.
1. Загрузка библиотеки. Если в ревизии нет встроенной поддержки OSC, скачайте и загрузите библиотеку: нажмите значок «загрузить» (стрелка вверх) и выберите файл.
2. Подготовка карты. Картой и программой ODRFIDKit (со считывателем
ODRFID-N) записываем в карту число 01 в шестнадцатеричном формате.
3. Настройки устройства. Используем «RFID формат» (какую область карты читать), «Получатель» и «Порт». Описание формата — в статье о строке форматирования.
4. Код. Трёхсекундный фильтр защищает от повторной обработки карты, которая остаётся в поле считывателя. Вставьте код в редактор, нажмите «дискету», дождитесь сообщения «успешно» и перезагрузите устройство.




import uasyncio as asyncio
from time import time
from rfid_utils import RFID, BUZZ, CardFilter
# если модуль встроен:
# from uosc.client import Client
# если скачивали сами:
from uosc import Client
from machine import WDT
from config import settings
async def run():
rfid = RFID()
BUZZ.beeps()
dst_ip = settings.get('rfid-dest')
dst_port = settings.get('rfid-i-dport')
format_str = settings.get('rfid-format')
wdt_en = settings.get('sys-i-wdt', False)
wdt = None
sender = Client(dst_ip, dst_port)
c_filter = CardFilter(3)
if wdt_en:
wdt = WDT(timeout=10000)
while 1:
if wdt_en:
wdt.feed()
c_filter.clean(time())
uid = rfid.read(fmt=format_str)
if uid and uid not in c_filter:
c_filter.append(uid)
sender.send('/lan', uid)
await asyncio.sleep_ms(250)
Дополнительные материалы
- ODNFC-LAN на MicroPython — больше примеров (TCP, UDP, HTTP).
- Пример: 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 теперь распространяется отдельно.