Новая система nooLite-F с обратной связью и шифрованием

nooLite-F

На днях в лабораторию Hi-Lab.ru поступили модули новой системы nooLite-F компании Ноотехника для тестирования и интеграции с Arduino Mega Server и я предлагаю вашему вниманию небольшое резюме по новой системе, своё мнение о ней и простые примеры кода Arduino для управления новыми устройствами.

Эта статья — одна из первых ласточек по этой системе и я думаю, что скоро вы увидите много других отчётов о ней, а пока самая горячая и актуальная информация из первых рук.

Что такое nooLite?


Для тех кто не знал или забыл, напомню, что nooLite это беспроводная система управления электрооборудованием, таким, как освещение в вашем доме или электроприборы, которые можно включать и выключать при помощи беспроводных пультов управления. Пульты имеют много вариантов исполнения, но в основном они выглядят как обычные выключатели освещения. Управляющие блоки, которые принимают команды, представляют собой небольшие коробочки с несколькими проводами, часть из которых подключается к питающему напряжению, а часть — к нагрузке.

Просто и понятно. Благодаря этой простоте система nooLite завоевала популярность и продаётся в большом количестве сетевых и оффлайновых магазинов. Но есть одно «но». Всем хороша система nooLite, но она имеет один (и даже два) существенных недостатка. Первый — это отсутствие серьёзного шифрования передаваемых команд и данных. Для большинства бытовых применений это не очень критично, но для многих людей это неприемлемо с точки зрения безопасности — существует хоть небольшая, но не нулевая вероятность того, что вам не повезёт и кто-то из хулиганских или криминальных соображений решит вскрыть ваше соединение и поуправлять вашим оборудованием.

Второй недостаток — это отсутствие в системе обратной связи (есть правда псевдо-обратная связь при помощи специальных блоков, но это не очень серьёзно). Что это значит? Это значит, что вы, отдав команду на включение чего-либо, не можете быть уверены, что эта команда реально выполнена, а не ушла бесследно в мировой эфир.

Вот как раз с этими двумя недостатками и призвана бороться новая версия системы под названием nooLite-F. Разговоры необходимости выпуска новой версии шли уже давно и вот наконец в продаже появились первые приборы новой серии.

Немного технических подробностей


С технической точки зрения система nooLite представляет собой приёмно-передающие устройства, работающие на частоте 433 МГц и использующие амплитудную модуляцию передаваемого сигнала. Выбор амплитудной модуляции обусловлен тем, что по мнению производителя системы, это простой и слабо восприимчивый к помехам способ передачи команд на небольшое расстояние. В системе используются PIC контроллеры (12, 16, 18). Энергопотребление устройств невелико и пульты и сенсоры системы работают на батарейках.

В новой системе nooLite-F частота работы осталась прежней, 433 МГц, и что ещё более важно — сохранилась совместимость со старой версией оборудования. То есть вы можете при помощи управляющих модулей nooLite-F работать с обычными приборами nooLite.

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

Новые трансиверы имеют лучшую чувствительность и, как следствие, примерно на 30% большую дальность связи.

Безопасность и шифрование


В системе nooLite-F используется серьёзное шифрование по стандарту AES, что должно надёжно обезопасить работу и использование этого оборудования. В свою очередь работа с шифрованием потребовала повышения вычислительной мощности и заставило перейти на использование контроллеров PIC 32. Но это по прежнему энергоэффективное решение и блоки и модули системы могут длительное время работать от батареек.

Доступное оборудование


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

  • Адаптер MTRF-64-USB для управления через USB интерфейс с компьютера
  • Модуль MTRF-64 для управления при помощи контроллеров с UART интерфейсом
  • Беспроводной силовой блок SLF-1–300


Мы будем проводить свои эксперименты с силовым блоком SLF-1–300 и модулем MTRF-64.

Всего три изделия это временное явление — в планах компании выпуск целой линейки оборудования системы nooLite-F, в том числе устройств на DIN-рейку.

SRF-10-1000

Силовой блок SLF-1–300


Внешне силовые блоки новой системы ничем не отличаются от привычных блоков nooLite. Тот же аккуратный корпус и те же несколько проводов для подключения питания и нагрузки.

Силовой блок SLF-1-300

Несколько интересней выглядит содержимое блока. Слева на картинке видны две микросхемы — одна (поменьше) это микросхема трансивера, точная маркировка:

MRF49XA
1637
RG3

и вторая микросхема контроллера, управляющего блоком, точная маркировка

STI E4 7B572
32F030F4P6
PHL 648 A

Плата SLF-1-300

Всё очень компактно и аккуратно. Это и есть долгожданный nooLite с шифрованием и обратной связью.

Обратная сторона платы практически полностью закрыта радиатором.

Обратная сторона SLF-1-300

Что находится под радиатором можно увидеть, посмотрев на плату силового блока сбоку: несколько объёмных деталей не уместившихся на обратной стороне платы. Вот и вся схемотехника.

Вид сбоку SLF-1-300

Модуль MTRF-64


Как я уже сказал, мы будем рассматривать модуль MTRF-64 с UART интерфейсом, его собрата с USB подключением мы трогать не будем, они практически идентичны, за исключением нескольких деталей о которых будет сказано чуть ниже. Фото управляющего модуля:

MTRF-64

Как вы видите, он очень похож на силовой блок, те же микросхемы, кварц и ещё несколько деталей. Вот точная маркировка микросхем, установленных на плате. Трансивер:

MRF49XA
1636
M5H

Микроконтроллер:

STI E4 7B573
32F042F6P6
PHL 648 A

Пустующее место для недостающей микросхемы — это место для установки FTDI переходника USB-UART. Тут же видно место для установки USB разъёма — очевидно, что для обоих устройств используется одна и та же печатная плата.

Теперь немного о подключении модуля к микроконтроллерам вообще и к Arduino в частности: для работы модуля достаточно подключить всего четыре провода — RX, TX, VCC, GND. Проще, как говориться, некуда.

Схема подключения MTRF-64

Для тех, кто не только читает статьи, но что-то делает своими руками замечу, что модуль питается строго от 3,3 вольт и его выводы не толерантны к 5-вольтовым сигналам, так что имейте это в виду и будьте внимательны при подключении модуля.

Немного о функционале модуля. Он имеет четыре основных режима работы:

  • Передатчик для «старых» устройств системы nooLite. Это аналог функционала модуля nooLite MT1132
  • Приёмник для «старых» устройств системы nooLite. Аналог модуля nooLite MR1132
  • Передатчик для нового оборудования nooLite-F
  • Приёмник для нового оборудования nooLite-F


То есть этот модуль является универсальным решением для взаимодействия микроконтроллеров с системой nooLite. Плюс, в отличие от своих аналогов, имеет возможность работать с 64-я каналами, вместо 32-х.

Arduino и nooLite-F


Теперь давайте разберём простой пример, который даст вам представление о работе с этим модулем в среде Arduino. По аналогии вы сможете организовать работу с этим модулем с любой другой системой.

Модуль взаимодействует с управляющим контроллером по последовательному интерфейсу (Serial) на скорости 9600 б/с. Поскольку MTRF-64 работает только с напряжением 3,3 В, то мы отложим в сторону нашу любимую Arduino Mega и возьмём с полки Arduino Due и подключим модуль к ней. Четыре проводка и всё готово. Для связи с модулем будем использовать Serial3.

  • Вывод RX модуля подключаем к TX3 (14) Arduino Due.
  • Вывод TX модуля подключаем к RX3 (15) Arduino Due.


Теперь можно написать тестовый демонстрационный скетч. Начнём с функции setup ().

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("NooLite-F test"));
  
  Serial3.begin(9600);
  delay(1);
  bootOut();

  // Commands:
  // 0 - Off
  // 2 - On
  // 4 - Switch  
  // 9 - Unbind
  //15 - Bind
  
  setCommand(0);
  setChannel(0);
  setChecksum();
  
  Serial.print(F("CH:       ")); Serial.println(TO_MTRF[4]);
  Serial.print(F("CMD:      ")); Serial.println(TO_MTRF[5]);
  Serial.print(F("CHECKSUM: ")); Serial.println(TO_MTRF[15]);
  
  mtrfSend();
  delay(100);
}


Запускаем Serial для вывода отладочных сообщений и Serial3 для работы с модулем MTRF-64. При старте модуль входит в режим обновления ПО на 12 секунд и для прерывания этого режима мы включаем функцию

void bootOut() {
  for (byte i = 0; i <= 16; i++) {
    Serial3.write(BOOT_OUT[i]);
  }
}


Которая отправляет магические данные модулю, выводящие его из режима обновления ПО.
Далее формируем команду:

  // Commands:
  // 0 - Off
  // 2 - On
  // 4 - Switch  
  // 9 - Unbind
  //15 - Bind


На самом деле команд гораздо больше, с полным описанием протокола и работы модуля вы можете ознакомиться в документе на сайте производителя.

Далее выводим тестовые сообщения о канале, команде и контрольной сумме посылки. На этом начальная процедура setup () закончена и скетч входит в бесконечный цикл loop ().

void loop() {
  //setBind();
  //setUnbind();
  //setOn();
  //setOff();
  setSwitch();
  delay(1000);
}


Здесь находятся пять строк, которые инициируют посылку той или иной команды модулю MTRF-64. Вы должны выбрать какую-либо одну команду и запустить скетч (остальные команды должны быть закомментированы). Начинать нужно с команды привязки силового блока к модулю setBind ().

Процедура привязки:

  • Нажимаете кнопку на силовом блоке — на нём начинает мигать светодиод
  • Запускаете скетч с раскомментированной строкой setBind ()
  • Подтверждаете привязку, нажав ещё раз кнопку на силовом блоке


Всё, теперь комментируете строку setBind () и раскомментируете, например, строку setSwitch (), запускаете скетч и тестовая лампа, подключённая к силовому блоку, начинает мигать раз в секунду. Это только тестовый пример и на основе этого скетча вы можете создать любую, сколь угодно сложную систему управления приборами nooLite.

Ещё немного о работе скетча. В коде формируется содержимое массива TO_MTRF в соответствии с документацией на MTRF-64, ссылку на которую я дал чуть выше. Далее содержимое этого массива посылается по последовательному интерфейсу непосредственно модулю.

После этого ожидается ответ модуля и пришедшими данными заполняется массив FROM_MTRF, далее этот массив анализируется и принимаются заранее запрограммированные решения.

Вот назначение прочих функций тестового скетча:

setChannel (byte ch) — устанавливает требуемый номер канала (0 — 63).
setCommand (byte cmd) — устанавливает нужную команду.
setChecksum () — вычисляет контрольную сумму посылки.
mtrfSend () — отсылка данных.
mtrfReceive () — приём и парсинг ответов модуля.

Таким образом вы можете привязывать и отвязывать устройства на любом канале, включать, выключать и переключать свет при помощи Ардуино и MTRF-64. Ещё раз напомню, что это только демонстрация работы и пример для дальнейшей разработки.

Полный код тестового скетча управления MTRF-64 при помощи Arduino
/*
 * NooLite-F
 * MTRF-64 test Sketch
 */
 
//                      0  1  2  3  4  5  6  7  8  9 10 11 12 13 14  15  16
byte  BOOT_OUT[17] = {171, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,175,172};
byte   TO_MTRF[17] = {171, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,172};
byte FROM_MTRF[17];

// Передача адаптеру посылки для выхода из режима обновления ПО
void bootOut() {
  for (byte i = 0; i <= 16; i++) {
    Serial3.write(BOOT_OUT[i]);
  }
}

void setChannel(byte ch) {
  TO_MTRF[4] = ch;
}

void setCommand(byte cmd) {
  TO_MTRF[5] = cmd;
}

void setChecksum() {
  TO_MTRF[15] = 0; // младший байт
  for (byte i = 0; i <= 14; i++) {
    TO_MTRF[15] += TO_MTRF[i];
  }
}

void mtrfSend() {
  for (byte i = 0; i <= 16; i++) {
    Serial3.write(TO_MTRF[i]);
  }
  delay(50);
  mtrfReceive();
}

void setOff() {
  setCommand(0);
  setChecksum();
  mtrfSend();
}

void setOn() {
  setCommand(2);
  setChecksum();
  mtrfSend();
}

void setSwitch() {
  setCommand(4);
  setChecksum();
  mtrfSend();
}

void setBind() {
  setCommand(15);
  setChecksum();
  mtrfSend();
}

void setUnbind() {
  setCommand(9);
  setChecksum();
  mtrfSend();
}

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("NooLite-F test"));
  
  Serial3.begin(9600);
  delay(1);
  bootOut();

  // Commands:
  // 0 - Off
  // 2 - On
  // 4 - Switch  
  // 9 - Unbind
  //15 - Bind
  
  setCommand(0);
  setChannel(0);
  setChecksum();
  
  Serial.print(F("CH:       ")); Serial.println(TO_MTRF[4]);
  Serial.print(F("CMD:      ")); Serial.println(TO_MTRF[5]);
  Serial.print(F("CHECKSUM: ")); Serial.println(TO_MTRF[15]);
  
  mtrfSend();
  delay(100);
}

void loop() {
  //setBind();
  //setUnbind();
  //setOn();
  //setOff();
  setSwitch();
  delay(1000);
}

void printFromMTRF() {
  Serial.println();
  for(byte i = 0; i < 17; i++) {
    Serial.print(FROM_MTRF[i]); Serial.print(" ");
  }
  Serial.println();
}

void mtrfReceive() {
  if (Serial3.available() > 0) {
    Serial3.readBytes(FROM_MTRF, 17);

    if (FROM_MTRF[0] == 173 && FROM_MTRF[1] == 2 && FROM_MTRF[16] == 174) {
      //printFromMTRF();
      Serial.print(F("Receive: "));
      if (FROM_MTRF[10] != 0 && FROM_MTRF[2] == 0) {Serial.println(F("On!"));}
      if (FROM_MTRF[10] == 0 && FROM_MTRF[2] == 0) {Serial.println(F("Off!"));}
      if (FROM_MTRF[2] == 1)                       {Serial.println(F("Error!"));}
    } else {
        Serial.println(F("Receive error or bind"));
        printFromMTRF();
      }
  }
}



Заключение


В этот краткий обзор не вошёл рассказ о многих функциях новой системы, например о прошивке по воздуху, дистанционной привязке и многих других возможностях — всё невозможно объять в рамках одной обзорной статьи, но я уверен, что скоро появятся другие статьи про nooLite-F от множества любителей и энтузиастов автоматизации.

Теперь моё мнение о новой системе nooLite-F. Однозначно, это большой шаг вперёд для компании Ноотехника. Разница между старой системой и новой большая — шифрование делает её безопасной, а обратная связь позволяет быть уверенным в выполнении отданных команд. А всё вместе это выводит nooLite на новый уровень и позволяет строить на этой системе серьёзные проекты автоматизации.

© Geektimes