Радиомодули SI4432

Недорогие радиомодули на 433Мгц с привычным подключением к Arduino.

Основные характеристики модулей:

  • Рабочая частота: 240–930 MHz. Модули расчитаны для работы в одном безлицензионном диапазоне 315/433/868/915MHz
  • Выходная мощность передатчика: +20dBm (100мВт)
  • Чувствительность приемника: до -121dBm
  • Модуляция: FSK, GFSK, OOK
  • Скорость передачи по радио: 0.123-256 kbps
  • Напряжение питания: 1.8-3.6 В
  • Радиус действия в прямой видимости: до 1км, с антеннами не из комплекта.

Распиновка и подключение к Arduino:

Существуют несколько версий радиомодулей:

Версия со стандартной гребенкой.
XL4432-SMT, модуль для монтажа на плату с шагом контактов 1,27мм
В качестве переходника на гребенку, можно использовать плату переходник для микросхем в корпусе SOIC24
  • VCC и GND — Пояснений не требует, питание +3,3V и масса, максимальное напряжение питания модуля 3,6V.
  • SDN — Включение модуля, чтобы включить модуль, нужно соединить выход с массой.
  • nIRQ — Выход аппаратного прерывания, на выходе генерируется сигнал когда нужно действие от микроконтроллера, подключается на D2 arduino.
  • nSEL — чип селект интерфейса SPI, подключается на любой свободный выход arduino, обычно это D10.
  • SCK — Тактовый сигнал интерфейса SPI, подключается к D13 arduino uno.
  • SDI — MISO интерфейса SPI, подключается к D11 arduino uno.
  • SDO — MOSI интерфейса SPI, подключается к D12 arduino uno.
  • GPIO0 — GPIO2 — программируемые порты ввода/вывода. Доступен только GPIO2, остальные отданы для управления приемопередачей.

Софт:

Для работы с SI4432 подходит популярная библиотека RadioHead, ссылка на нее тут.

Код:

Первый пример

TX 'Hello'
#include <SPI.h>
#include <RH_RF22.h>  // http://www.airspayce.com/mikem/arduino/RF22/index.html

RH_RF22 rf22(10, 2);    // СS, INT .. по умолчанию 10, (D2)

 
void setup() {
    Serial.begin(9600);
  if (!rf22.init()) // по умолчанию, мощьность 8DBM, частота 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
    Serial.println("init failed");  
  

  rf22.setTxPower(RH_RF22_RF23B_TXPOW_1DBM);        // RH_RF22_TXPOW_1DBM 
                                                    // RH_RF22_TXPOW_2DBM 
                                                    // RH_RF22_TXPOW_5DBM 
                                                    // RH_RF22_TXPOW_8DBM 
                                                    // RH_RF22_TXPOW_11DBM 
                                                    // RH_RF22_TXPOW_14DBM 
                                                    // RH_RF22_TXPOW_17DBM 
                                                    // RH_RF22_TXPOW_20DBM 
  
  rf22.setFrequency(446.0);                         // частота 466.0мгц, шаг 0.05мгц.
//  rf22.setFrequency(446.0, 0.1);                  // тоже, но с автоподстройкой в 100кгц (по умолчанию 0,05)
                    
  rf22.setModemConfig(RH_RF22::GFSK_Rb2_4Fd36);     // скорость и модуляция, Rb = 2.4kbs, Fd = 36kHz. 
                          // http://www.airspayce.com/mikem/arduino/RF22/classRF22.html#a76cd019f98e4f17d9ec00e54e5947ca1
}

void loop() { 
  
    uint8_t data[] = "Hello!";                      // заполняем массив
      
    rf22.send(data, sizeof(data));                 // отправляем 
    rf22.waitPacketSent();                          // ждем пока пакет будет отправлен

    delay(500);                                     // просто ждем
}

RX 'Hello'
#include <SPI.h>
#include <RH_RF22.h>

RH_RF22 rf22;
 
void setup() {
    Serial.begin(9600);
  if (!rf22.init())
    Serial.println("init failed");  
  // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36

  rf22.setTxPower(RH_RF22_RF23B_TXPOW_1DBM);  // 
  rf22.setFrequency(446.0);   
  rf22.setModemConfig(RH_RF22::GFSK_Rb2_4Fd36);   
  
}

void loop() {
  if (rf22.available())  {
    uint8_t buf[RH_RF22_MAX_MESSAGE_LEN];   // буфер
    uint8_t len = sizeof(buf);              // вычесляем размер буфера
    
    rf22.recv(buf, &len);     
    
      Serial.print("buf: ");                // отправляем в Serial содержимое буфера
      Serial.println((char*)buf);
      
      Serial.print("  RSSI: ");             // отправляем уровень сигнала последнего пакета
      Serial.println(rf22.lastRssi(), DEC);
   
  }
}

Второй пример

TX - byte
#include <SPI.h>
#include <RH_RF22.h>

RH_RF22 rf22;

uint8_t data = 0;

void setup() {
    Serial.begin(9600);
  if (!rf22.init()) // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36
    Serial.println("init failed");  
  

  rf22.setTxPower(RH_RF22_RF23B_TXPOW_1DBM);        // RH_RF22_TXPOW_1DBM 
                                                    // RH_RF22_TXPOW_2DBM 
                                                    // RH_RF22_TXPOW_5DBM 
                                                    // RH_RF22_TXPOW_8DBM 
                                                    // RH_RF22_TXPOW_11DBM 
                                                    // RH_RF22_TXPOW_14DBM 
                                                    // RH_RF22_TXPOW_17DBM 
                                                    // RH_RF22_TXPOW_20DBM 
  
  rf22.setFrequency(446.0);                         // частота 466.0мгц, шаг 0.05мгц
  
                    
  rf22.setModemConfig(RH_RF22::GFSK_Rb2_4Fd36);     // скорость и модуляция, Rb = 2.4kbs, Fd = 36kHz. 
                          // http://www.airspayce.com/mikem/arduino/RF22/classRF22.html#a76cd019f98e4f17d9ec00e54e5947ca1
}

void loop() {
   
  
   data++;
  
    rf22.send(&data, sizeof(&data));         // отправили
    rf22.waitPacketSent();
  
}

RX - byte
#include <SPI.h>
#include <RH_RF22.h>

RH_RF22 rf22;
 
void setup() {
    Serial.begin(9600);
  if (!rf22.init())
    Serial.println("init failed");  
  // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36

  rf22.setTxPower(RH_RF22_RF23B_TXPOW_1DBM);
  rf22.setFrequency(446.0);   
  rf22.setModemConfig(RH_RF22::GFSK_Rb2_4Fd36);   
  
}

void loop() {
  if (rf22.available())  {
    uint8_t buf;
    uint8_t len = sizeof(buf);
    
    rf22.recv(&buf, &len);     
    
      Serial.print("buf: "); 
      Serial.print(buf);      
      
      Serial.print("  RSSI: ");
      Serial.println(rf22.lastRssi(), DEC);
   
  }
}


Видео: