С устройством и схемотехникой 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!
Автор:
smart_alex