Содержание
Обзор радио модуля 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.