Предыстория


Впервые про данную розетку я узнал из статьи Умная розетка Redmond SkyPlug RSP-100S Анализ конструкции и схемы электрической принципиальной. Выявление недостатков. Помню, что прочитав ее, в первую очередь заинтересовался схемой бестрансформаторного источника питания и тем, насколько компактно размещены элементы в корпусе розетки при том, что внутри полноценное реле, а не, скажем, симистор.

О каких-то попытках перепрограммировать Bluetooth-модуль и речи не было, тк программирование BLE устройств исторически было делом очень непростым. Вот пример: Разработка IoT устройств с использованием Bluetooth LE, явно не DIY уровень.

Однако, за прошедший год ситуация кардинальным образом изменилась…

Началось все с того, что индийский программист Sandeep Mistry (на фото)…

image

...портировал Wiring, он же Arduino framework, он же просто «ардуино» на чипы Nordic Semiconductor nRF51822 и nRF52832, написав до кучи еще и библиотеку BLEPeripheral для создания на вышеупомянутых чипах периферийных устройств с поддержкой BLE4.x

Потом компания Arduino AG (ex-arduino.org) вступила в коллаборацию с Nordic и выпустила плату Arduino Primo

image

… основанную на чипе nrf52832. Интересно, как быстро вы найдете на плате собственно nRF52832 (подсказка: большой слева — это не он). Для совместимости с Ардуино плата использует код, созданный Сандипом, а самого его приняли в штат. Повторяется история с espressif, esp8266 и Иваном Грохотковым (igrr), где все так же начиналось с «народных» наработок.

Adafruit и Sparkfun вскоре тоже отметились выпуском плат на nRF52.



В общем, похоже, что семейство nRF5 (nRF51822 и nRF52832) сейчас самый «модный» чип среди всех мейджоров, которые определяют электронный DIY-рынок. Под «мейджорами» я имею в виду Arduino, Adafruit и Sparkfun. Азиаты в лице ITEAD или SEEED пока отстают, но, думаю, это ненадолго. По крайней мере, noname китайцы с Али вовсю штампуют модули на этих чипах, причем, если модули на nRF51822 были довольно несуразными, то модули на nRF52832 отличные.

Что же за чип такой примечательный и почему, судя по всему, у него есть большие шансы наконец-то заменить собой знаменитую atmega328 в DIY-поделках?

nRF5 SoC


image

Общее описание


nRF52832 — новая мощная, малопотребляющая и гибкая «система на кристалле» с поддержкой протоколов Bluetooth Smart, ANT и проприетарных стеков собственной разработки пользователя в частотном диапазоне 2.4GHz.

nRF52832 построен на 32-разрядном процессорном ядре ARM Cortex-M4F с 512kB Flash и 64kB RAM памяти. По протоколу работы nRF52832 полностью совместим с предыдущими сериями nRF51, nRF24L и nRF24AP производства Nordic Semiconductor.

Вот это тоже очень важно, например, у меня вся домашняя автоматизация сделана на nRF24L01 и такая обратная совместимость позволяет легко заменить комбинацию atmega328+nRf24 на один nRF5

Повышенная производительность процессора


nRF52832 содержит мощное процессорное ядро ARM Cortex-M4F, соответствующее требованиям многих требовательных к вычислительной производительности, но при этом компактных приложений, способных работать на одном кристалле. Ядро способно решать задачи цифровой обработки сигналов, выполнять операции с плавающей точкой, выполнять операции с мультиплексированием и накоплением в пределах одного рабочего цикла, аппаратно поддерживает энергетически эффективно реализованную операцию деления в вещественной и комплексной формах.

Мультипротокольная радио часть


Радиочасть 2.4 ГГц совместима со стеками протоколов Bluetooth Smart, ANT и любыми проприетарными стеками. Радио имеет встроенный регистр RSSI высокого разрешения с возможностью автоматической работы в режиме EasyDMA для прямого доступа к памяти в момент приема и передачи данных по радиоканалу. Nordic предоставляет стеки протоколов Bluetooth Smart, ANT и Gazel (2.4GHz) в качестве загружаемого контента на своем официальном веб-сайте.

Стек Bluetooth в версии Nordic называется SoftDevice, запомните это слово, оно нам сегодня еще встретится.

Энергетическая эффективность


nRF52832 является сверхмалопотребляющей системой на кристалле, способной использовать питание в диапазоне от 1.7В до 3.6В. Вся периферия и тактовые генераторы могут оперативно отключаться в автоматическом режиме с целью сведения энергопотребления до минимального уровня. Встроенное процессорное ядро имеет автоматизированную адаптивную систему управления энергопотреблением. Энергопотребление автоматически регулируется в зависимости от операций, выполняемых в данный момент процессорным ядром при обращении к периферийным устройствам таким образом, чтобы работали только те составные части системы, которые необходимы для выполнения текущей задачи.

Добавлю: возможность переназначения пинов, поддержка до 8 прерываний и прочая, прочая, прочая. Практически идеальный чип :)

Превращение начинается


Но вернемся к нашей розетке. Как выяснилось, она идеально приспособлена для DIY, не хуже, чем культовые модули Sonoff от ITEAD. Разъем для программирования любезно вынесен и обозначен как XP1:

image

Порядок пинов, естественно не подписан, но это не беда, ведь у нас есть схема. В ней есть одна маленькая неточность, правильный порядок пинов такой (слева направо):

  • vcc
  • swdio
  • swdclk
  • gnd

Отладочный интерфейс — SWD. Итак, поехали:

  • В Arduino IDE заходим в Preferences и добавляем url sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json в поле «Additional Board Manager URL»

  • Устанавливаем поддержку nRF5 через Board Manager

  • Устанавливаем библиотеку BLE Peripheral либо через Sketch|Libraries|Manage Libraries:



    Либо через скачивание и добавление через Add .zip library

  • Выбираем плату Generic nRF51 и вариант 16kB RAM, 256kB flash (xxaa)

  • Выбираем Softdevice: «S110»

  • Кликаем на пункт меню nRf5 Flash SoftDevice (это достаточно сделать один раз, в дальнейшем можно заливать разные скетчи, не перепрошивая SoftDevice) Как вы помните, SoftDevice — это закрытый BLE-стек от самой Nordic, который обеспечивает высокоуровневый api для работы с Bluetooth
  • Выбираем Low Frequency Clock:«RC Oscillator»

  • Заливаем скетч

    Скетч
    #include <SPI.h>
    #include <BLEPeripheral.h>

    // LED pin
    #define LED_PIN 3
    #define ON_PIN 2
    #define AUTH_PIN 1

    BLEPeripheral blePeripheral = BLEPeripheral();

    BLEService ledService = BLEService(«19b10000e8f2537e4f6cd104768a1214»);
    BLECharCharacteristic switchCharacteristic = BLECharCharacteristic(«19b10001e8f2537e4f6cd104768a1214», BLERead | BLEWrite);

    void setup() {
    // set LED pin to output mode
    pinMode(LED_PIN, OUTPUT);
    //pinMode(ON_PIN, OUTPUT);
    //pinMode(AUTH_PIN, OUTPUT);
    //pinMode(0, INPUT_PULLUP);

    blePeripheral.setLocalName(«LED»);
    blePeripheral.setAdvertisedServiceUuid(ledService.uuid());

    blePeripheral.addAttribute(ledService);
    blePeripheral.addAttribute(switchCharacteristic);

    blePeripheral.begin();
    }

    void loop() {
    BLECentral central = blePeripheral.central();

    if (central) {
    while (central.connected()) {
    if (switchCharacteristic.written()) {
    // central wrote new value to characteristic, update LED
    if (switchCharacteristic.value()) {
    // Serial.println(F(«LED on»));
    digitalWrite(LED_PIN, HIGH);
    //digitalWrite(ON_PIN, HIGH);
    //digitalWrite(AUTH_PIN, HIGH);
    }
    else {
    //Serial.println(F(«LED off»));
    digitalWrite(LED_PIN, LOW);
    //digitalWrite(ON_PIN, LOW);
    //digitalWrite(AUTH_PIN, LOW);
    }
    }
    }

    }
    }


    Используя любой программатор с поддержкой SWD, например, SEGGER J-Link. Я использовал J-Link, встроенный в отладочную плату nrf52 Development Kit, он позволяет прошивать не только сам development kit, но и внешние платы.


На этом программирование собственно розетки можно считать законченным и она УЖЕ работает. Как это проверить?

  • скачиваем программу BLEScanner

    image

    > Ссылка для iOS:

    > Ссылка для Android
  • В списке устройств находим Arduino и нажимаем Connect

  • Далее кликаем на поле Custom Service

  • И потом на поле Write Value. Теперь, если записать 01, реле включится, 00 — выключится.


Часть вторая Добавляем поддержку Homekit


К сожалению, пока не существует общедоступного способа прикрутить поддержку Homekit к BLE устройству напрямую. Это требует сертификации от Apple по программе Mfi, поэтому поддержка возможна только через прокладку в виде Homekit-сервер'a, самым известным из которых является Homebridge.

Устанавливаем сам homebridge

У меня успешно работает homebridge на Raspberry pi 2, но для целей данной публикации, я поставил еще один на Raspberry Pi Zero W (в подробности вдаваться не буду, если интересно, готов ответить на вопросы в комментариях)

sudo apt-get install npm
sudo npm install -g --unsafe-perm homebridge node-gyp

Устанавливаем BLE плагин

1) Ставим javascript библиотеку NOBLE от уже известного нам Сандипа Мистри, он и тут отметился:

sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
sudo npm install -g noble

2) Ставим собственно плагин

sudo npm install -g homebridge-bluetooth

Конфигурируем Homebridge

Редактируем config.json в папке .homebridge. Если у вас Raspberry Pi 2, то она находится в домашней директории /home/pi

nano /home/pi/.homebridge/config.json

И заменяем его содержимое на

вот это
{
«bridge»: {
«name»: «igrushkin»,
«username»: «CC:22:3D:E3:CE:30»,
«port»: 51826,
«pin»: «314-15-926»
},
«description»: «Raspberry Pi Homebridge-Bluetooth Lightbulb Example»,
«platforms»: [
{
«platform»: «Bluetooth»,
«accessories»: [
{
«name»: «Arduino»,
«address»: «ff:86:91:c7:50:66»,
«services»: [
{
«name»: «LED»,
«type»: «Lightbulb»,
«UUID»: «19b10000e8f2537e4f6cd104768a1214»,
«characteristics»: [
{
«type»: «On»,
«UUID»: «19b10001e8f2537e4f6cd104768a1214»
}
]
}
]
}
]
}
]
}

Запускаем homebridge в отладочном режиме (ключ -D, буква ПРОПИСНАЯ):

sudo homebridge -D

внимательно следим за сообщениями. Находим строчку “LED — Ignored” и выписываем оттуда BLE адрес нашей розетки (аналог MAC-адреса).

Альтернативный вариант: запускаем hcitool (утилита для работы с BLE-устройствами)

sudo hcitool lescan

и находим адрес в списке устройств.

Выходим, нажимая Ctrl-C. Меняем адрес в config.json на корректный:

nano /home/pi/.homebridge/config.json

Снова запускаем homebridge. В этот раз все должно быть ОК, и Homebridge с радостью распознает нашу розетку.



Заключение


Писать, как добавить новое устройство в Homekit, думаю, смысла, нет, об этом написано много, включая информацию на сайте самой Apple. Скажу только, что для этого удобнее пользоваться программой Elgato Eve, а не нативным приложением Home.

image

Использованные материалы:


  1. Умная розетка Redmond SkyPlug RSP-100S Анализ конструкции и схемы электрической принципиальной. Выявление недостатков
  2. Arduino Core for Nordic Semiconductor nRF5 based boards
  3. homebridge-bluetooth plugin
  4. noble A Node.js BLE (Bluetooth Low Energy) central module.
  5. Решение nRF52832 Bluetooth smart

Комментарии (20)


  1. codrem
    30.10.2017 12:04

    У меня есть koogeek p1eu которая умеет ещё и статистику потребления собирать и отдавать по WiFi. Хотел настроить её через homebridge но так и не разобрался с конфигом. Также думал сделать какой-то переходник homebridge — Android home, может знаете какие-то решения на эту тему и где почитать?


    1. igrushkin Автор
      30.10.2017 12:10

      а она же, вроде, нативно поддерживает Homekit? В чем сложность?
      Ставите упомянутый Elgato Eve и выбираете Add Accessory.
      По пункту (б) ничего не скажу, от Андроида стараюсь держаться подальше, но про такое, в любом случае, не слышал


    1. kolayuk
      30.10.2017 16:06

      А что за Android Home? Сейчас юзаю HomeAssistant, не очень нравится его вебморда, было бы круто запихнуть в мобильную приложуху как у Apple HomeKit, но на андроиде, как мне казалось, ничего подобного нет…


  1. Boomburum
    30.10.2017 12:46

    У меня пара этих розеток, увидел заголовок, ну, думаю, наконец-то добавлю им ума ) Думал, нужно будет корпус вскрыть и через какой-нибудь скрытый разъёмчик прошивку накатить неофициальную....))( Но всё равно спасибо за статью!


    1. igrushkin Автор
      30.10.2017 12:49

      дык! так оно и есть: вскрыть и накатить. В принципе, можно и bin выложить, но не уверен, насколько это легально.


  1. dmitryrf
    30.10.2017 13:00

    Здорово, спасибо! Подумал, что раз внутри тот же кортекс, после stm32 должно быть не очень сложно переехать.


    1. igrushkin Автор
      30.10.2017 13:18

      для продвинутых есть очень хороший родной SDK


  1. fedor1210
    30.10.2017 13:08
    +1

    Есть HomeKit-стек для nRF51: github.com/aanon4/HomeKit


    1. igrushkin Автор
      30.10.2017 13:18

      очень интересно! спасибо. Попробую залить в nRF52DK, поиграться.
      Жаль, что последний коммит сделан 2 года назад, с того момента много изменилось, уже и Homekit спецификацию открыли и лицензия на SDK Nordic'a стала гораздо более либеральной.
      Скажу по секрету, я эту розетку использую в режиме совместимости с nRF24 :-) и тоже через Homekit, но как плагин к Domoticz'у


      1. fedor1210
        30.10.2017 16:10

        а я вот пользую Xiaomi Aqara/Mijia + самоделки на ESP8266 (по MQTT) на Home Assistant. Ну и оттуда же HomeBride «шпарит».


        1. igrushkin Автор
          30.10.2017 16:15

          у Xiaomi нет розеток под европейскую вилку


  1. Serge78rus
    30.10.2017 16:17

    А контакты реле действительно, как на схеме размыкают нейтраль, а не фазу, или это опечатка?


    1. igrushkin Автор
      30.10.2017 16:32

      а как это можно гарантировать с неполярной европейской вилкой? Схему делал автор статьи, упомянутой в начале, ее я проверял только в части того, что касается перепрограммирования модуля


      1. Serge78rus
        30.10.2017 17:29

        Когда рисуешь схему, такие вещи рисуются на автомате.


        1. nafikovr
          31.10.2017 14:57

          ну вы нарисуйте, а я пойду, вилку переверну


  1. BurlakovSG
    30.10.2017 17:59

    А как обстоят дела с защитой? Из примера, как я понял, может любой включать/выключать розетку?


    1. igrushkin Автор
      31.10.2017 09:23

      Стоящий в 10м, установивший программу и знающий, что с ней делать — да :-)


  1. safari2012
    30.10.2017 18:27

    в самую обычную розетку спокойно влазит компактный полноценный блок питания на 3.3 или 5В, модуль wemos D1 mini и SSR типа китайского клона omron G3MB-202P. Конечно, никакие киловатты такая штука коммутировать не сможет, но для освещения более чем.


    1. igrushkin Автор
      31.10.2017 09:22

      Ну, во-первых, я никому ничего не навязываю. Во-вторых, давайте смотреть по пунктам:
      а) перечисленные Вами детали стоят на Али порядка 500 руб, «моя» розетка — 700, очень сравнимо
      б) дальше: «самую обычную розетку спокойно влазит». В какую? В накладную? А дальше что с ней делать?
      в) wifi — не лучший транспорт для домашней автоматизации, а esp8266 — мягко говоря неидеальный чип, но тут уже вкусовщина.


      1. safari2012
        31.10.2017 18:20

        да я тоже не навязываю. сам начинал с когда-то X-10, потом nRF24L01.
        1) если брать по одной, то можно собрать комплект в пределах 400руб.
        если по 5шт., то за счет скидки и бесплатной доставки будет в пределах 270руб. (я совсем надавно брал).
        2) В самую обычную типа Legrand Valeno, при условии, что достаточно глубокий подрозетник (70мм проверял, меньше не проверял). Могу сфоткать, если надо. Во внешнюю вообще без проблем лезет.
        3) esp8266 (если брать в исполнении 12E) на текущий момент работает отлично. У меня долго всё жило на одном роутере, бывало торренты забивали напрочь трафик так, что браузер зависал. При этом, весь умный дом работал, как часы. Сейчас я поднял hostapd на той же малинке, что и сервер умного дома живет и посадил её на ИБП, точно такой, как в вашей статье (контроллер + Li-Po АКБ). И конечно, состояние выключателей и розеток после сброса питания сразу восстанавливается через сервер.