Содержание
Обзор радио модуля SI4432
Модули трансивера SI4432 (рисунок 1) на основе микросхемы SI4432 позволяют реализовать устойчивую двустороннюю радиосвязь в диапазоне частот от 240 до 930 МГц на расстоянии до 1 км на открытой местности и 100 - 300м в помещении. Скорость передачи данных 0.123-256 kbps, виды модуляции - FSK, GFSK, OOK. Мощность передатчика до +20 dBm. Модули имеют малый размер.

Рисунок 1. Радиомодуль SI4432.
Характеристики модуля SI4432
Частотный диапазон: 240 –930 МГц;
Чувствительность приемника: до 121 дБм;
Модуляция сигнала: FSK (ЧМн), GFSK (ГЧМн), OOK (АМн);
Максимальная выходная мощность: 20 дБм;
Скорость передачи данных: 0.123-256 Кбит/с;
Напряжение питания: 1.8-3.6 В;
Рабочая температура: от -20 до 60 °C.
Назначение выводов

Рисунок 2. Назначение выводов радиомодуля SI4432.
VDD — питание модуля;
GND — общий;
NSEL — вывод разрешения интерфейса SPI;
SCLK — вывод синхронизации интерфейса SPI;
SDI — вывод получения данных интерфейса SPI;
SDO — вывод отправки данных интерфейса SPI;
NIRQ — вывод прерываний по получению данных;
SDN — вывод перехода в режим энергосбережения (HIGH);
GPIO0, GPIO1, GPIO2 — программируемые порты ввода/вывода.
Подключение к плате Arduino
Модули работают по протоколу SPI. Для Подключение к плате Arduino согласно таблице 1. При этом обязательно согласование уровней 3.3 В → 5 В, необходимо использовать конвертер уровня!!! Для питания модулей желательно использовать внешний источник питания 3.3 В (при передаче на небольшое расстояние возможно брать питание с вывода 3.3 В платы Arduino).
SI4432
Arduino UNO
Arduino Mega
GND
GND
GND
SDN
GND
GND
NIRQ
D2
D2
NSEL
D10
D53
SCLK
D13
D52
SDI
D11
D51
SDO
D12
D50
Схема соединений показана на рис. 3.

Рисунок 3. Схема соединений для подключения радиомодуля SI4432
Для программирования модуля используем библиотеку RF22. Загружаем на одну плату пример из библиотеки rf22_client, на вторую – rf22_server.

Рисунок 4. Примеры библиотеки RF22
Открываем монитор последовательного порта для каждой платы Arduino. Rf22_client (рисунок 5) периодически отправляет данные (Hello world) и в течении 500 мсек ждет ответа от сервера. И выводит сообщение о получении ответа или его отсутствии.

Рисунок 5. Результат работы fr_client
Rf22_server (рисунок 6) постоянно ждет данные по радиоканалу, при получении – отправляет ответ.

Рисунок 6. Результат работы fr_server
Пример использования SI4432
Создадим проект отправки данных датчика влажности и температуры с платы Arduino по запросу на другую плату Arduino по радиоканалу.
Нам потребуются следующие компоненты:
- Плата Arduino Uno – 2;
- Плата прототипирования – 2;
- Модуль трансивера SI4432 – 2;
- Конвертер уровня – 2;
- Модуль GY21 (датчик SHT21) – 1;
- Провода.
Схема соединения элементов показана на рис. 7 и 8.

Рисунок 7. Схема соединений для подключения радио модуля SI4432 – клиент

Рисунок 8. Схема соединений для подключения радиомодуля SI4432 - сервер
Клиент раз в 3 секунды посылает по радиоканалу сообщение tempSH21 (или humiditySH21) и ждет ответа. По получении ответа выводит данные в монитор последовательного порта. Содержимое скетча показано в листинге 1.
Листинг 1 #include <SPI.h> #include <RF22.h>
// создание объекта RF
RF22 si4432client; // для выбора влажность/температура int choice=0;
void setup() { Serial.begin(9600); if (!si4432client.init()) Serial.println("si4432 no init"); }
void loop() { Serial.println("Send request"); // отправить запрос на server if(choice==0) { uint8_t senddata[] = "tempSH21"; si4432client.send(senddata, sizeof(senddata)); } else { uint8_t senddata [] = "humiditySH21"; si4432client.send(senddata, sizeof(senddata)); } si4432client.waitPacketSent(); // ожидание ответа uint8_t getdata [RF22_MAX_MESSAGE_LEN]; uint8_t length1 = sizeof(getdata);
if (si4432client.waitAvailableTimeout(1000)) { // полученное сообщение if (si4432client.recv(getdata, &length1)) { Serial.print("got reply: "); if(choice==0) Serial.print(" tempSH21="); else Serial.print(" humiditySH21="); Serial.println((char*) getdata); } } choice=1-choice; delay(3000); }Сервер, получая запрос tempSH21 (или humiditySH21) получает необходимые данные с датчика SHT21 и отправляет в ответ значение запрошенного параметра. Содержимое скетча показано в листинге 2.
Листинг 2
#include <SPI.h> #include <RF22.h> #include <Wire.h> #include <SHT2x.h>
// создание объекта RF RF22 si4432server;
void setup() { Wire.begin(); Serial.begin(9600); if (!si4432server.init()) Serial.println("si4432 init no"); }
void loop() { si4432server.waitAvailable(); // полученное сообщение uint8_t getdata [RF22_MAX_MESSAGE_LEN]; uint8_t length1 = sizeof(getdata); if (si4432server.recv(getdata, &length1)) { Serial.print("get request: "); Serial.println((char*) getdata); char senddata[] = " "; if(StrContains((char*) getdata,"tempSH21")!=0) { dtostrf(SHT2x.GetTemperature(),10,2,senddata); } else if(StrContains((char*)buf,"humiditySH21")!=0) { dtostrf(SHT2x.GetHumidity(),10,2,sendata); } else { Serial.println("error"); dtostrf(999,10,0,data); }
si4432server.send((uint8_t*)datasend, sizeof(datasend)); si4432server.waitPacketSent(); Serial.println("Sent a reply"); } }Загружаем скетчи на платы Arduino и смотрим данные в мониторе последовательного порта для клиента (рис. 9) и сервера (рис. 10).

Рисунок 9. Отправка и получение данных для клиента.

Рисунок 10. Отправка и получение данных для сервера.

Рисунок 11. Схема в сборе.
Часто задаваемые вопросы
1. Отсутствует передача данных между модулями
- Проверьте подано ли питание на модуль.
- Проверьте, достаточное ли питание подано на модуль.
- Проверьте правильность подключения модуля к плате Arduino.
- Проверьте совпадение параметров частоты, скорости передачи и типа модуляции на модулях SI4432.