DigiOwls IOT
OD LAN RFID
для разработчиков
Краткое руководство по программированию
RFID считывателя-контроллера
Основные узлы
СВЕТОДИОДЫ МОГУТ БЫТЬ SMD ИЛИ ВЫВОДНЫЕ НА ЛЮБОЙ СТОРОНЕ
Технические характеристики:
1. Поддерживаемые карты: MIFARE Ultralight, Classic 1K, Classic 4K
2. Дальность считывания меток: до 6 см
3. Габаритные размеры: 95х62х20 мм
4. Проводные интерфейсы: USB, Ethernet
5. Индикация: светодиоды (красный и зелёный), звуковой излучатель
6. Один входной канал
7. Один выходной канал
8. Четыре крепёжных отверстия М3.








Вид устройства без корпуса
При монтаже корпуса стоит иметь в виду, что для Ethernet разъёма и кабеля требуется
дополнительное пространство в стене за считывателем.
Как программировать
В устройство используется адаптированный MicroPython, подробную инструкцию по
которому можно скачать по ссылке.
1. Программирование через WEB-интерфейс
Мы подготовили сборку для лёгкого началы работы.
В Web-интерфейс встроен текстовый редактор, который изменяет исполняемый файл.
Основное окно:
settings - настройки устройства
File BROWser - файлы с устройства
UPLOAD - загрузить файл
CONTROL - команды перезагрузки и обновления
telemetry - Сведения о системе
LOG View - лог
DashBOaRD - данное окно
Editor - редактор кода
Вкладка редактора позволяет
сразу написать программу и попробовать её в действии
Программа является задачей asyncio
и должна подчиняться соответвующим
правилам написания

После изменения кода нужно
нажать на SAVE и перезагрузить
кнопкой REBOOT
Что в окне:
import uasyncio as asyncio
from binascii import hexlify
import rfid
import rfid_utils
import config
import pyb
settings = config.settings

async def run():
    await config.log('start')
    dst_addr = ('192.168.0.160', 5555) # ip и порт получателя
    mfrc = rfid.mfrc522() # объект считывателя
    buzzer = rfid_utils.buzzer() # звукогенератор
    while True:
        mfrc.init(gain=rfid.G_43dB) #инициализируем считыватель
        for uid, res in mfrc: #он поддерживает чтение нескольких карт сразу
            if res != rfid.EOK:
                continue
            uid = hexlify(uid)
            await config.log(uid +' found')
            await rfid_utils.udp_send(uid +' \n', dst_addr) #передача по udp
            await buzzer.beep()
        await asyncio.sleep(1) # в сон на 1 сек
Settings
В разделе Settings доступны все необходимые параметры для RFID считывателя.
Доступ к ним из программы можно получить с через config.settings




Доступ к настройкам из
WEB-интерфейса
в виде словаря
Что в окне:
import uasyncio as asyncio
import config
settings = config.settings

async def run():
    await config.log(str(config.settings))
    while True:
        await asyncio.sleep(1)
Для удобства разработки мы подготовили несколько частоиспользуемых функций и объектов и поместили их в файл rfid_utils.py:

Объект gled - зелёный светодиод (класс MicroPython - Pin)
Объект rled - красный светодиод (класс MicroPython - Pin)
Объект chout - выходной канал (класс MicroPython - Pin)
Объект chin - входной канал (класс MicroPython - Pin)
Класс buzzer - звукогенератор
Класс card_filter - инструмент для защиты от повторного прикладывания
Функция udp_send - передача по UDP в asyncio
Функция udp_recv - получение данных по UDP с ожиданием в asyncio
Функция udp_send_recv - передача по UDP с ожиданием ответа в asyncio

Реализацию можно посмотреть, скачав файл через File Browser.



2. Программирование через WEBREPL
Если Web-интерфейс недоступен
К устройству можно подключиться через WEBREPL только в случае, если программа не исполняется. Для подключения необходимо зайти на страницу http://software.open-dev.ru/webrepl/ и ввести ip адрес устройства в вашей локальной сети.

  • Введите ip и нажмите CONNECT
  • Введите пароль (по-умолчанию: digiowls)
  • Если всё пройдет правильно, то появится следующее окно:

3. Программирование через USB
Если "всё сломалось" или нужно сильно изменить программу.
К устройству можно подключиться по MicroUSB с помощью программы-терминала с параметром скорости передачи 115200.
При работе программы в терминале отображается вывод команды print().
При остановленной программы: интерактивная консоль MicroPython.
Консоль используется при невозможности работать с сетевым интерфейсом, для более точной диагностики и для более удобных экспериментов с кодом.
Для начала попробуем сделать программу, которая при запуске зажигает один светодиод, включает считыватель и выводит uid при поднесении любой карты.
Все примеры далее идут в синхронном формате (не для asyncio).
Удалим всё в main.py и запишем:
import pyb
import rfid

gled = pyb.Pin(pyb.Pin.board.LED1, pyb.Pin.OUT)
mfrc = rfid.mfrc522()

while 1:
    mfrc.init(gain=rfid.G_43dB)
    for uid, res in mfrc:
        if res != rfid.EOK:
            continue
        print(uid)
        gled.value(1)
    pyb.delay(200)
    gled.value(0)
Вариант программы, которая передаёт UID поднесённой карты по сети.
Удалим всё в main.py и запишем:
import pyb
import socket
import rfid

DST_IP = '192.168.0.160'
DSP_PORT = 5555

gled = pyb.Pin(pyb.Pin.board.LED1, pyb.Pin.OUT)

mfrc = rfid.mfrc522()
cs = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while 1:
    mfrc.init(gain=rfid.G_43dB)
    for uid, res in mfrc:
        if res != rfid.EOK:
            continue
        cs.sendto(uid, (DST_IP, DSP_PORT))
        gled.on()
    pyb.delay(200)
    gled.off()
Следующий вариант для считывателей с замком:
сравниваем UID и открываем замок, если карта подходит.
Удалим всё в main.py и запишем:
from binascii import unhexlify
import pyb
import rfid

MY_SECRET_CARD_UID = b'030e873e'  #UID

gled = pyb.Pin(pyb.Pin.board.LED1, pyb.Pin.OUT)
mfrc = rfid.mfrc522()

chout = pyb.Pin(pyb.Pin.board.LOCK, pyb.Pin.OUT)
chout.value(1)

while 1:
    mfrc.init(gain=rfid.G_43dB)
    for uid, res in mfrc:
        if res != rfid.EOK:
            continue
        if uid == unhexlify(MY_SECRET_CARD_UID):
            gled.on()
            lock.value(0)
            pyb.delay(5000)
    gled.off()
    chout.value(0)
    pyb.delay(500)
RFID контроллер дверного замка в 49 строк:
Удалим всё в main.py и запишем:
from binascii import hexlify
import pyb
import json
import rfid

class buzzer():
    def __init__(self, use_buzz=True):
        self.buz = pyb.LED(3)
        self.buz.intensity(0)
        if not use_buzz:
            self.beep = lambda x: None

    def beep(self, time_ms):
        self.buz.intensity(128)
        pyb.delay(time_ms)
        self.buz.intensity(0)

def run():
    settings = json.load(open('settings.cfg'))

    mfrc = rfid.mfrc522()
    gled = pyb.Pin(pyb.Pin.board.LED1, pyb.Pin.OUT)
    rled = pyb.Pin(pyb.Pin.board.LED2, pyb.Pin.OUT)

    lock = pyb.Pin(pyb.Pin.board.LOCK, pyb.Pin.OUT)
    lock.high()

    buzz = buzzer(settings['BUZZ_ON'])

    while 1:
        mfrc.init(gain=rfid.G_43dB)
        for uid, res in mfrc:
            if res != rfid.EOK:
                continue
            if hexlify(uid).decode() in settings['USER_LIST']:
                lock.low()
                gled.on()
                buzz.beep(50)
                gled.off()
                pyb.delay(settings['LOCK_TIMEOUT_MS'])
                lock.high()
                break
            else:
                rled.on()
                buzz.beep(500)
                rled.off()
                pyb.delay(1500)
                continue
run()
Файл настроек settings.cfg:
{
	"BUZZ_ON": 1,
	"CARD_FILTER_TIMEOUT": 5,
	"LOCK_TIMEOUT_MS": 15000,
	"USER_LIST" : {"030e873e": "user1", "11111111": "user2", "11111112" : "user3"}
}
Как подключить память устройства к ПК
Пример файловой системы в памяти считывателя
Можно включить режим накопителя, чтобы при подключении к ПК по интерфейсу USB устройство определяется в ОС, как flash память с меткой ODFLASHxxxx. На встроенной памяти хранится исполняемая программа устройства и дополнительные данные.
Программа состоит из двух обязательных файлов и возможных дополнительных данных.
boot.py - файл, который всегда загружается первым.
main.py - основой файл программы.
pybcdc.inf - драйвер последовательного порта (для ОС Windows). По-умолчанию, на памяти стоит защита от записи, чтобы избежать случайного повреждения данных во время отключения носителя от операционной системы.
Для переключения в режим накопителя введите в терминале:
import pyb
pyb.usb_mode('VCP+MSC')


После этого нужно будет переткнуть USB устройства, чтобы ОС переинициализировала USB.

import pyb
pyb.Flash().lock(0) снимает блокировку от записи,
pyb.Flash().lock(1) ставит её обратно.

С открытой записью нужно быть предельно аккуратным при "извлечении тома" в ОС, т.к. кеширование операционной системой может испортить файловую систему устройства и потребуется восстановление ФС.

Дополнительные ресуры
Понравилось устройство?
LAN RFID всегда можно купить в нашем магазине