DigiOwls IoT
RFID контроллер
Гибкий и функциональный программируемый контроллер-считыватель, работающий с картами
MIFARE Classic и Ultralight.

Пополняемый on-line учебник
Для кого?
Устройство будет полезно для разработчиков:
1. Интеллектуальных систем,
2. Систем "Интернета вещей",
3. Систем автоматизации,
4. СКУД.

А также интеграторам, для кого важно получить гибкий и быстронастраиваемый инструмент.
Что умеет RFID контроллер
Мы реализовали все свои идеи в одном устройстве
1
Автономность
Может работать без базы и ему не нужны провода. Может работать даже от аккумулятора, например, если нужно собрать систему на мероприятии в открытом поле.
2
Гибкость
Можно не только работать с UID карты, но читать/писать области памяти карты. Работать с шифрованием карт.
3
Беспроводной интерфейс
Встроенный беспроводной интерфейс (868 МГц) и возможность ретрансляции радиопосылок открывают большое количество недоступных ранее сценариев использования.
4
Проводные интерфейсы
В считывателе всегда есть USB интефейс для настройки и опциональные CAN/UART для создания проводной сети.
5
Энергоэффективность
Благодаря хорошо реализованным режимам энергосбережения средняя энергия потребления составляет 11ма. Это позволяет использовать его от аккумулятора на протяжении 80 часов активной работы.
6
Программируемость
Устройство имеет встроенный язык программирования Python3 (MicroPython), что позволяет создавать самые разные сценарии работы.
7
"Беспроводная" кнопка включения
Если есть необходимость выключать устройства (на ночь, на время транспортировки и т.д.), а потом включить его, то для этого предусмотрен включатель, активируемый поднесением магнита к корпусу.
Основные узлы


1 - Разъём подключения аккумулятора (опционально).

2 - Геркон (опционально).

3 - Разъём microUSB.

4 - Клеммная колодка (опционально).

5 - Процессорный модуль.

6 - Клемма сброса программного обеспечения.

Технические характеристики:
1. Поддерживаемые карты: MIFARE Ultralight, Classic 1K, Classic 4K
2. Дальность считывания меток: до 6 см
3. Габаритные размеры: 95х62х20 мм
4. Проводные интерфейсы: USB + CAN/UART (опционально)
5. Беспроводной интерфейс: 868 Мгц
6. Идникация: светодиоды (красный и зелёный), звуковой излучатель
7. Аккумулятор Li-ion 3.82V 6.31Whr (опционально)
8. Контроль заряда и состояния аккумулятора.
Как программировать
Считыватели уже идут со встроенным тестовым ПО, но мы напишем с нуля.
Пример файловой системы в памяти считывателя
При подключении к ПК по интерфейсу USB устройство определяется в ОС, как flash память с меткой ODFLASHxxxx. На встроенной памяти хранится исполняемая программа устройства и дополнительные данные.
Программа состоит из двух обязательных файлов и возможных дополнительных данных.
boot.py - файл, который всегда загружается первым.
main.py - основой файл программы.
pybcdc.inf - драйвер последовательного порта (для ОС Windows).

Для начала попробуем сделать программу, которая при запуске зажигает один светодиод, включает считыватель и "пищит" при поднесении любой карты.
Подробную инструкцию по языку можно скачать по ссылке.
Удалим всё в main.py и запишем:
import pyb

#иницилизируем светодиод
gled = pyb.LED(2)

#включаем RFID-считыватель 
mfrc = pyb.MFRC522()
mfrc.init(gain=pyb.MFRC522.G_43dB)

while 1:
    res = mfrc.scan()  #чтение карты
    gled.intensity((0, 255)[res is not None])  #если карта есть, ставим яркость на макс
    pyb.delay(200)
    gled.intensity(0) #яркость на минимум (выкл).
Вариант программы, которая передаёт UID поднесённой карты по радио абоненту 2.
Удалим всё в main.py и запишем:
import pyb

#иницилизируем светодиод
gled = pyb.LED(2)

#включаем RFID-считыватель 
mfrc = pyb.MFRC522()
mfrc.init(gain=pyb.MFRC522.G_43dB)

#включаем радио
radio = pyb.SI446X(address=2)


while 1:
    uids = tuple(mfrc)
    for uid, res in uids:  #uid и статус карты
        if res != pyb.MFRC522.EOK:
            continue
        if radio.send(1, uid) == pyb.SI446X.RES_OK:  # отправка по радио абоненту 1
            gled.on()
    pyb.delay(500)
    gled.off()
Следующий вариант для считывателей с замком:
сравниваем UID и открываем замок, если карта подходит.
Удалим всё в main.py и запишем:
from binascii import unhexlify
import pyb

MY_SECRET_CARD_UID = b'030e873e'  #UID карты в HEX 

#иницилизируем светодиод
gled = pyb.LED(2)

#включаем RFID-считыватель 
mfrc = pyb.MFRC522()
mfrc.init(gain=pyb.MFRC522.G_43dB)

#выход замка
lock = Pin('LOCK', Pin.OUT_PP)
lock.high()

while 1:
    uids = tuple(mfrc)
    for uid, res in uids:  #uid и статус карты
        if res != pyb.MFRC522.EOK:
            continue
        if uid == unhexlify(MY_SECRET_CARD_UID)  # отправка по радио абоненту 1
            gled.on()
            lock.low()
            pyb.delay(5000)  # даём 5 секунд на вход
    gled.off()
    lock.high()
    pyb.delay(500)
Полнофункциональный RFID считыватель - дверной замок в 50 строк:
Удалим всё в main.py и запишем:
from binascii import hexlify
import pyb
import json

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 = pyb.MFRC522()
    mfrc.init(gain=pyb.MFRC522.G_43dB)

    gled = pyb.LED(2)
    rled = pyb.LED(1)

    lock = pyb.Pin('LOCK', pyb.Pin.OUT_PP)
    lock.high()

    buzz = buzzer(settings['USE_BUZZER'])

    while 1:
        uids = tuple(mfrc)
        for uid, res in uids:
            if res != pyb.MFRC522.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:
{
	"SRC_ADDR": 41,
	"DST_ADDR": 1,
	"USE_BUZZER": 1,
	"CARD_FILTER_TIMEOUT": 5,
	"LOCK_TIMEOUT_MS": 15000,
	"USE_SLEEP": 0,
	"USER_LIST" : {"030e873e": "user1", "11111111": "user2", "11111112" : "user3"}
}
Дополнительные ресуры
Понравилось устройство?
Его всегда можно приобрести в одном из наших магазинов