KC868-Uair: пролетая над гнездом кукушки. Часть 2. Подключаем nRF24 и LoRa

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!



С устройством и схемотехникой Kincony KC868-Uair мы разобрались в предыдущей статье, в этой статье мы продолжим знакомство с этим контроллером, разберём его распиновку и попробуем подключить к нему популярные беспроводные модули nRF24L01. KC868-Uair и сам по себе достаточно функциональный контроллер, а с добавлением поддержки беспроводной связи nRF24 его возможности значительно расширяются — к нему станет возможно подключение десятков DIY датчиков и актуаторов.

К KC868-Uair не обязательно подключать именно nRF24L01, вместо этих модулей можно подключить любое другое оборудование, например, беспроводную LoRa связь — на основе информации из этой статьи и моих пояснений вы легко сможете это сделать.

▍ Распиновка KC868-Uair


Сначала о трудностях, которые нас ждут при подключении беспроводных модулей (и прочего оборудования) к KC868-Uair. Дело в том, что инженеры компании Kincony, проектируя KC868-Uair, делали, так сказать, «вещь в себе»: несмотря на то, что они оставили свободные пины в специальном разъёме, они не обратили внимания на необходимость, как минимум, сделать доступным «стандартные» выводы I2C и SPI интерфейсов и как максимум — выделить их в отдельные разъёмы. Ничего этого на плате KC868-Uair нет. Мало того, GPIO I2C интерфейса выведены только на внешний разъём (и отсутствуют внутри корпуса), а GPIO SPI интерфейса вообще свободны только частично, что значительно осложняет задачу подключения дополнительного SPI оборудования к KC868-Uair.

Все эти проблемы можно тем или иным способом обойти, но для этого нам придётся в одних случаях браться за паяльник, а в других заниматься изощрённым программированием, используя специализированные версии библиотек или переопределяя стандартные (by default) выводы для работы с I2C и SPI интерфейсами.

Вот список всех функциональных блоков KC868-Uair:

  • Встроенный датчик температуры DS18B20.
  • Инфракрасные (IR) приёмник и передатчик.
  • Модули приёмника/передатчика 433 МГц.
  • Пьезокерамическая пищалка (Buzzer).
  • 2 блока (1/4 шт.) индикаторных светодиодов WS2812.
  • Разъём для подключения внешних I2C датчиков и IR светодиода.
  • Внутренний разъём с 12-ю свободными GPIO.

Теперь собственно распиновка. На иллюстрации ниже представлена распиновка KC868-Uair с различными пояснениями, что, как и куда подключено на этой плате.



Из представленной выше схемы видно, что почти все пины «стандартного» SPI свободны и выведены на отдельный разъём. Но пин MISO занят приёмником IR сигналов. На мой взгляд, это откровенный косяк проектировщиков платы — IR IN можно было посадить на любой другой GPIO и тогда не возникало бы проблем с подключением SPI компонентов к KC868-Uair.

Но мы имеем то, что имеем и для подключения модулей nRF24L01 к KC868-Uair нам придётся либо перепаивать вход приёмника инфракрасного излучения, либо что-то «мудрить» с софтом для работы SPI MISO на нестандартном GPIO.

Подробнее мы это разберём чуть ниже, а пока ещё несколько пояснений к представленной схеме распиновки KC868-Uair:

  • Кнопки «RESET» и «USER» есть на схеме, но отсутствуют на самом устройстве (поэтому они обозначены серым цветом). Эти кнопки при необходимости можно добавить самостоятельно.
  • Выводы I2C интерфейса инженерами компании Kincony тоже посажены на нестандартные GPIO (4 и 16 вместо 21 и 22). Кроме этого, они блокируют вывод RX2 (GPIO 16) Serial интерфейса, который может понадобиться для обмена данными с другим оборудованием.

В общем, на мой взгляд, распиновку можно было бы сделать более грамотно, чтобы не возникало проблем с подключением к KC868-Uair дополнительного оборудования и компонентов. А так — паяльник это наше всё.

▍ Подключение nRF24L01


Теперь давайте подробнее рассмотрим подключение модулей nRF24L01 к KC868-Uair и, в более широком смысле, к любому контроллеру на ESP32.

Как я уже заметил выше, проблема подключения SPI оборудования к KC868-Uair заключается в том, что стандартный вывод MISO (GPIO19) занят приёмником инфракрасного излучения и нам нужно либо перепаивать этот пин, либо что-то мудрить с софтом. В случае с nRF24L01 можно обойтись гомеопатическими средствами: подключить MISO на свободный вывод и затем попытаться обойти эту проблему в софте.

Вот проверенный и на 100% рабочий расклад GPIO для подключения nRF24L01 к KC868-Uair (на схеме представлен разъём P7 и цветом обозначены подключённые к нему выводы модуля nRF24L01).



Но если вы попытаетесь при таком подключении работать с модулем nRF24L01 при помощи стандартной библиотеки RF24, то у вас ничего не получится — она рассчитана на работу только со стандартными GPIO SPI интерфейса (подробнее о программном обеспечении мы поговорим чуть ниже).



▍ Подключение LoRa


Подключение LoRa к KC868-Uair аналогично, за тем исключением, что там подобные вольности с GPIO не проходят — вам нужно иметь в своём распоряжении все стандартные SPI пины (5, 18, 19, 23). Другими словами, для подключения LoRa модулей к KC868-Uair вам придётся взяться за паяльник и освободить GPIO19, занятый инфракрасным приёмником (благо с практической точки зрения это сделать не очень сложно, если вы обладаете минимальными навыками пайки).

Также в случае подключения LoRa к KC868-Uair, нужно будет обратить внимание на энергопотребление передатчика в различных режимах и протестировать корректность работы LoRa модуля в нужных вам режимах с питающей подсистемой KC868-Uair.

Далее мы больше не будем касаться LoRa и подробно разберём программную поддержку работы nRF24L01 в связке с KC868-Uair.

▍ Программная среда


По традиции программировать и проводить эксперименты с контроллером мы будем в среде Arduino 1.8.5 (предполагается, что вы знакомы с Arduino IDE и умеете программировать микроконтроллер ESP32). Для работы с KC868-Uair вам нужно выбрать «NodeMCU-32S».



Мой экземпляр KC868-Uair по какой-то причине отказывается передавать данные со стандартной скоростью 921600 и начинает корректно работать только при снижении в настройках скорости до 230400 — вам нужно учесть этот факт, если ваш контроллер откажется загружать прошивки.

▍ Передача данных на nRF24L01


Поскольку мы подключили модуль nRF24L01 на нестандартные SPI пины, то для работы с таким модулем нам понадобится специализированная RF24 библиотека, которая допускает произвольный выбор GPIO для SPI интерфейса.

Далее создаём тестовый скетч, который посылает в эфир текстовые данные, которые могут быть приняты соответствующим образом настроенным nRF24 приёмником.

/*
  Kincony KC868-Uair
  nRF24 Send example
*/

#include "SPI.h"
#include "nRF24L01.h"
#include "RF24.h"

char msg[6] = "hello";

// ce, cs, sck, miso*, mosi
RF24 radio(21, 5, 18, 17, 23);
const uint64_t pipee = 0xE8E8F0F0E1LL;

unsigned long count = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start Kincony KC868-Uair nRF24 Send example..."));
 
  radio.begin();
  radio.setChannel(2);
  radio.setPayloadSize(7);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipee);
}

void loop() {
  Serial.print("send... ");
  Serial.println(count);
  radio.write(msg, 6);
  count++;
  delay(3000);
}

Здесь: подключаем необходимые библиотеки. Обратите внимание, что библиотека RF24 должна быть именно та, которую я указал выше, с обычной библиотекой RF24 ничего работать не будет.

#include "SPI.h"
#include "nRF24L01.h"
#include "RF24.h"

Задаём тестовое слово.

char msg[6] = "hello";

Указываем выбранные нами нестандартные пины.

// ce, cs, sck, miso*, mosi
RF24 radio(21, 5, 18, 17, 23);

Задаём номер «трубы».

const uint64_t pipee = 0xE8E8F0F0E1LL;

И вводим переменную для подсчёта посланных в эфир пакетов данных.

unsigned long count = 0;

Далее проводим стандартную инициализацию скетча

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start Kincony KC868-Uair nRF24 Send example..."));

и инициализируем поддержку nRF24L01 в нужной нам конфигурации.

  radio.begin();
  radio.setChannel(2);
  radio.setPayloadSize(7);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipee);

Далее компилируем, загружаем скетч в KC868-Uair и смотрим его вывод в Serial:



И убеждаемся, что модуль nRF24L01 действительно посылает данные в эфир.



▍ Приём данных на nRF24L01


Теперь создадим «комплиментарный» скетч для приёма посылаемых nRF24 данных, чтобы убедиться в полной работоспособности нашего решения.

/*
  Kincony KC868-Uair
  nRF24 Receive example
*/

#include "SPI.h"
#include "nRF24L01.h"
#include "RF24.h"

char msg[6];

// ce, cs, sck, miso*, mosi
RF24 radio(21, 5, 18, 17, 23);
const uint64_t pipee = 0xE8E8F0F0E1LL;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start Kincony KC868-Uair nRF24 Receive example..."));

  radio.begin();
  radio.setChannel(2);
  radio.setPayloadSize(7);
  radio.setDataRate(RF24_250KBPS);
  radio.openReadingPipe(1,pipee);
  radio.startListening();
}
 
void loop(void) {
  if (radio.available()) {
    radio.read(msg, 6);      
    Serial.println(msg);
    delay(10);
  }
}

Здесь всё то же самое, как и в предыдущем скетче, за небольшими исключениями. Инициализации модуля nRF24L01 заканчивается инструкциями, переводящими модуль в режим приёма.

  radio.begin();
  radio.setChannel(2);
  radio.setPayloadSize(7);
  radio.setDataRate(RF24_250KBPS);
  radio.openReadingPipe(1,pipee);
  radio.startListening();

А сам приём осуществляется непрерывно в бесконечном цикле loop().

void loop(void) {
  if (radio.available()) {
    radio.read(msg, 6);      
    Serial.println(msg);
    delay(10);
  }
}

Все nRF24 данные, поступающие из эфира, принимаются и выводятся в Serial — всё работает предсказуемо и именно так, как и ожидалось.



▍ Немного о перспективах


Теперь (после успешного физического подключения и пройденных тестов) наш KC868-Uair может служить «базой» (управляющим хабом) для десятков nRF24 датчиков и актуаторов. У меня в различных проектах подобные nRF24 решения отлично работают со стационарными («привязанными к розетке») и батарейными (полностью автономными) датчиками температуры, влажности, давления, освещённости, контакта, расхода воды/электроэнергии и т. д., а также с релейными и прочими актуаторами.

В общем, наше скромное «гнездо» KC868-Uair превращается в кольцо IoT всевластия локального масштаба, а если мы ещё добавим управление через интернет (например, как я описал в статье «… управление контроллером через Telegram-бота»), то и глобального.

Вопросы обеспечения помехоустойчивости, обратной связи и шифрования беспроводных nRF24 соединений выходят далеко за рамки этой статьи и тянут на целый IoT курс, поэтому мы здесь их затрагивать не будем, отмечу только, что на nRF24 можно создавать достаточно надёжные решения с гарантированной доставкой пакетов и их серьёзным шифрованием связкой AES + SHA256 (можно ещё ATSHA204A добавить, если кому-то AES + SHA256 покажется мало).

▍ Заключение


Вот и закончилось наше путешествие в удивительный мир контроллера KC868-Uair, мы познакомились с его устройством и схемотехникой, а также научились подключать к нему устройства по SPI интерфейсу и разобрали базовые примеры посылки и приёма nRF24 данных. На самом деле это только вершина айсберга и экспериментировать с этим «гнездом кукушки» можно бесконечно и также бесконечно можно получать удовольствие (и пользу) от этого процесса. Удачных вам экспериментов с KC868-Uair!

Источник: https://habr.com/ru/company/ruvds/blog/656281/


Интересные статьи

Интересные статьи

В прошлой статье рассказ шел о технологиях и инструментах, которые внедряют в Wi-Fi. Часть 2 будет о типовых сценариях внедрения. Если лень читать- проматывай (ссылка на ...
В этой статье мы рассмотрим, в какую сторону движется рынок BIM CAD программ сегодня. Какие программы BIM CAD выбирают конструкторы в разных странах мира и как кардинальн...
Здравствуйте. Меня зовут Ник, я фронтенд разработчик (жидкие аплодисменты). Кроме того, что я пишу код, я преподаю в Школе программистов hh.ru. Записи наших лекций от 2018-2019 учебн...
Это заключительная часть расследования о Scala-движении в России. В первой части я узнал от Романа Гребенникова о воронежском бомонде, C++ и Erlang, а от Романа Тимушева о первой Akka и рождении ...