Click to order
Cart
Ваша корзина
Total: 
Ваше имя
Если планируете получать транспортной компанией, то ФИО
Ваш e-mail
Ваш телефон
Выбор доставки
Комментарий
Промокод
Подписаться на новости
Согласие на обработку персональных данных
Payment method
Content Oriented Web
Make great presentations, longreads, and landing pages, as well as photo stories, blogs, lookbooks, and all other kinds of content oriented projects.
DigiOwls IOT
OD LAN RFID
для разработчиков
Краткое руководство по программированию
RFID считывателя-контроллера
Основные узлы
СВЕТОДИОДЫ МОГУТ БЫТЬ SMD ИЛИ ВЫВОДНЫЕ НА ЛЮБОЙ СТОРОНЕ
Технические характеристики:
1. Поддерживаемые карты: MIFARE Classic 1/4K, Ultralight, S50/70, NTAG 213/214/215.
2. Дальность считывания меток: до 6 см.
3. Габаритные размеры: 95х62х20 мм.
4. Проводные интерфейсы: USB, Ethernet.
5. Индикация: светодиоды (красный и зелёный), звуковой излучатель.
6. Один входной канал (3В, подтянут к "1")
7. Один выходной канал (12-24В 1А max)
8. Четыре крепёжных отверстия М3.
9. Питание Passive PoE 12-24V.








Вид устройства без корпуса
При монтаже корпуса стоит иметь в виду, что для Ethernet разъёма и кабеля требуется
дополнительное пространство в стене за считывателем.
Как начать работать
1. Подключите устройство к роутеру с dhcp-сервером Ethernet кабелем с питанием Passive PoE 12-24V.
2. Найдите в роутере новый ip-адрес, который роутер выдал устройству.
3. Запустите web-браузер и откройте странницу с указанным ip-адресом. Вы должны увидеть главное окно считывателя, как на картинке ниже.
Как программировать
В устройстве используется адаптированный MicroPython, подробную инструкцию по
которому можно скачать по ссылке.
1. Программирование через WEB-интерфейс
Мы подготовили сборку для лёгкого началы работы.
В Web-интерфейс встроен текстовый редактор, который изменяет исполняемый файл.
Основное окно:
settings - настройки устройства
File BROWser - файлы с устройства
UPLOAD - загрузить файл
CONTROL - команды перезагрузки и обновления
telemetry - Сведения о системе
LOG View - лог
DashBOaRD - данное окно
Editor - редактор кода
Важно знать! Модуль надёжно держит
только одно web-подключение одновременно.
Вкладка редактора позволяет
сразу написать программу и попробовать её в действии
Программа является задачей 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 с помощью какой-либо программы-терминала (Putty, minicom и т.п.)с параметром скорости передачи 115200.
При работе программы в терминале отображается вывод команды print().
При остановленной программе - интерактивная консоль MicroPython.
Консоль используется при невозможности работать с сетевым интерфейсом, для более точной диагностики и для удобных экспериментов с кодом.
Драйвер
Работа в ОС ниже Windows7 не поддерживается.
В Windows7 понадобится установить драйвер CDC.
В Windows 8, Windows 10, Linux, macOS установка драйвера не требуется.
Если в Windows8 не заработал системный драйвер CDC, воспользуйтесь инструкцией.
Для начала попробуем сделать программу, которая при запуске зажигает один светодиод, включает считыватель и выводит 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) ставит её обратно.

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

Дополнительные ресуры
1. Руководство по языку MicroPython
2. Техподдержка,
3. Инструкция asyncio.
Понравилось устройство?
LAN RFID всегда можно купить в нашем магазине