Bezdrátová komunikace na frekvenci 433 MHz je mezi kutily velmi oblíbená především díky velkému dosahu a skvělé schopnosti procházet zdmi a překážkami. Obyčejné levné moduly (jako například známý vysílač FS1000A) ale umí data posílat jen jedním směrem a v éteru často trpí rušením. Mnohem lepším řešením je rádiový modul CC1101, který zvládá vysílání i příjem a v kombinaci s oblíbeným ESP32 tvoří spolehlivou bezdrátovou linku.

V tomto návodu si ukážeme, jak mezi dvěma deskami ESP32 vytvořit obousměrnou komunikaci na principu Ping-Pong. Vysílač (TX) každou sekundu odešle zprávu ping a ihned začne čekat na odpověď. Přijímač (RX) zprávu zachytí, odfiltruje okolní šum, zkontroluje správnost dat a automaticky odpoví zprávou pong. Na obou stranách si navíc do sériového monitoru vypíšeme sílu signálu (RSSI) i kvalitu spojení (LQI).

Pokud s deskami ESP32 teprve začínáte a nemáte je ještě v prostředí zprovozněné, podívejte se nejprve na náš návod Jak přidat desky ESP32 do Arduino IDE.

Zapojení modulu

Modul CC1101 komunikuje s mikrokontrolérem ESP32 přes standardní sběrnici SPI a přerušovací pin GDO0.

DŮLEŽITÉ UPOZORNĚNÍ: Modul CC1101 vyžaduje napájení pouze 3,3 V. Napájejte jej proto výhradně z pinu 3V3 na desce ESP32. Pokud byste modul připojili na 5V (nebo pin VIN), došlo by k jeho zničení!

  • VCC: 3V3 (napájení 3,3 V z ESP32)
  • GND: Společná zem (GND)
  • CSN (SS): Digitální pin 5 (SPI Chip Select)
  • SCK: Digitální pin 18 (SPI Hodiny)
  • MOSI (SI): Digitální pin 23 (SPI Data do modulu)
  • MISO (SO): Digitální pin 19 (SPI Data z modulu)
  • GDO0: Digitální pin 4 (Datový a přerušovací pin)
  • GDO2: Digitální pin 15 (Volitelný stavový pin)
 

 

Instalace knihovny a nahrání programu

Pro správnou funkci modulu CC1101 je nezbytné mít v Arduino IDE nainstalovanou příslušnou knihovnu.

Potřebnou knihovnu SmartRC-CC1101-Driver-Lib naleznete v Manažeru knihoven v Arduino IDE (případně můžete využít knihovnu přiloženou v souborech ke stažení). Podrobný postup pro práci s knihovnami naleznete v tomto návodu:

Než se pustíte do nahrávání, v nabídce Nástroje zvolte vaši desku (např. ESP32 Dev Module) a správný COM port. Kliknutím na tlačítko Nahrát spusťte nahrávání programu. Pokud se objeví výpis Connecting..., stačí krátce podržet tlačítko BOOT na desce ESP32.

 

 

Vzorový kód 1: Vysílač (Transmitter - TX)

#include <ELECHOUSE_CC1101_SRC_DRV.h> // Vložení knihovny pro komunikaci s modulem CC1101
 
// Definice pinů pro ESP32
#define CC1101_CSN   5
#define CC1101_GDO0  4
#define CC1101_GDO2 15
 
// Časovač pro periodické odesílání
unsigned long lastSend = 0;
 
void setup() {
  // Spuštění sériové komunikace pro výpis do Sériového monitoru
  Serial.begin(115200);
  delay(1000);
  Serial.println("--- ESP32 + CC1101 Transmitter Start ---");
 
  // Nastavení vlastních SPI pinů a pinu GDO pro ESP32
  ELECHOUSE_cc1101.setSpiPin(18, 19, 23, CC1101_CSN);
  ELECHOUSE_cc1101.setGDO0(CC1101_GDO0);
  
  // Inicializace modulu CC1101
  ELECHOUSE_cc1101.Init();
 
  // Kontrola komunikace po sběrnici SPI
  if (!ELECHOUSE_cc1101.getCC1101()) {
    Serial.println("Chyba modulu CC1101! Zkontrolujte zapojeni.");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("CC1101 uspesne inicializovan.");
 
  // Konfigurace pro spolehlivou komunikaci v pásmu 433 MHz
  ELECHOUSE_cc1101.setCCMode(1);              // Zapnutí paketového režimu s FIFO bufferem
  ELECHOUSE_cc1101.setMHZ(433.92);            // Nastavení frekvence 433.92 MHz
  ELECHOUSE_cc1101.setSyncWord(0x12, 0x34);   // Synchronizační slovo pro filtr cizích zpráv
  ELECHOUSE_cc1101.setCrc(1);                 // Kontrola integrity dat CRC
  ELECHOUSE_cc1101.setPacketLength(61);       // Maximální délka paketu v bufferu
  
  // Nastavení registrů pro modulaci 2-FSK (rychlost 4.8 kBaud a šířka pásma 100 kHz)
  ELECHOUSE_cc1101.SpiWriteReg(0x10, 0xC7);
  ELECHOUSE_cc1101.SpiWriteReg(0x11, 0x83);
  ELECHOUSE_cc1101.SpiWriteReg(0x12, 0x02);
  ELECHOUSE_cc1101.SpiWriteReg(0x15, 0x40);
  ELECHOUSE_cc1101.SpiWriteReg(0x22, 0x10);
  
  ELECHOUSE_cc1101.setPA(10);                 // Nastavení maximálního výkonu +10 dBm
 
  // Přepnutí do režimu příjmu pro zachycení odpovědi
  ELECHOUSE_cc1101.SetRx();
}
 
void loop() {
  // Periodické odesílání každou sekundu
  if (millis() - lastSend >= 1000) {
    lastSend = millis();
 
    Serial.print("Odesilam zpravu: ping ... ");
    char msg[] = "ping";
    ELECHOUSE_cc1101.SendData(msg, 30);
    ELECHOUSE_cc1101.SetRx();
    Serial.println("Odeslano.");
  }
 
  // Kontrola přijaté odpovědi v bufferu
  if (ELECHOUSE_cc1101.CheckRxFifo(20)) {
    byte buffer[64] = {0};
    byte len = ELECHOUSE_cc1101.ReceiveData(buffer);
    
    if (len > 0 & ELECHOUSE_cc1101.CheckCRC()) {
      buffer[len] = ' ';
      Serial.print("Prijata odpoved: ");
      Serial.print((char*)buffer);
      Serial.print(" | RSSI: ");
      Serial.print(ELECHOUSE_cc1101.getRssi());
      Serial.print(" dBm | LQI: ");
      Serial.println(ELECHOUSE_cc1101.getLqi());
    }
  }
}

 

Vzorový kód 2: Přijímač (Receiver - RX)

#include <ELECHOUSE_CC1101_SRC_DRV.h> // Vložení knihovny pro komunikaci s modulem CC1101
 
// Definice pinů pro ESP32
#define CC1101_CSN   5
#define CC1101_GDO0  4
#define CC1101_GDO2 15
 
void setup() {
  // Spuštění sériové komunikace pro výpis do Sériového monitoru
  Serial.begin(115200);
  delay(1000);
  Serial.println("--- ESP32 + CC1101 Receiver Start ---");
 
  // Nastavení vlastních SPI pinů a pinu GDO pro ESP32
  ELECHOUSE_cc1101.setSpiPin(18, 19, 23, CC1101_CSN);
  ELECHOUSE_cc1101.setGDO0(CC1101_GDO0);
  
  // Inicializace modulu CC1101
  ELECHOUSE_cc1101.Init();
 
  // Kontrola komunikace po sběrnici SPI
  if (!ELECHOUSE_cc1101.getCC1101()) {
    Serial.println("Chyba modulu CC1101! Zkontrolujte zapojeni.");
    while (1) {
      delay(1000);
    }
  }
  Serial.println("CC1101 uspesne inicializovan.");
 
  // Konfigurace pro spolehlivou komunikaci v pásmu 433 MHz
  ELECHOUSE_cc1101.setCCMode(1);              // Zapnutí paketového režimu s FIFO bufferem
  ELECHOUSE_cc1101.setMHZ(433.92);            // Nastavení frekvence 433.92 MHz
  ELECHOUSE_cc1101.setSyncWord(0x12, 0x34);   // Synchronizační slovo pro filtr cizích zpráv
  ELECHOUSE_cc1101.setCrc(1);                 // Kontrola integrity dat CRC
  ELECHOUSE_cc1101.setPacketLength(61);       // Maximální délka paketu v bufferu
  
  // Nastavení registrů pro modulaci 2-FSK (rychlost 4.8 kBaud a šířka pásma 100 kHz)
  ELECHOUSE_cc1101.SpiWriteReg(0x10, 0xC7);
  ELECHOUSE_cc1101.SpiWriteReg(0x11, 0x83);
  ELECHOUSE_cc1101.SpiWriteReg(0x12, 0x02);
  ELECHOUSE_cc1101.SpiWriteReg(0x15, 0x40);
  ELECHOUSE_cc1101.SpiWriteReg(0x22, 0x10);
  
  ELECHOUSE_cc1101.setPA(10);                 // Nastavení maximálního výkonu +10 dBm
 
  // Přepnutí do režimu trvalého příjmu
  ELECHOUSE_cc1101.SetRx();
}
 
void loop() {
  // Kontrola nového přijatého paketu v bufferu
  if (ELECHOUSE_cc1101.CheckRxFifo(20)) {
    byte buffer[64] = {0};
    byte len = ELECHOUSE_cc1101.ReceiveData(buffer);
    
    if (len > 0 & ELECHOUSE_cc1101.CheckCRC()) {
      buffer[len] = ' ';
      
      Serial.print("Prijata zprava: ");
      Serial.print((char*)buffer);
      Serial.print(" | RSSI: ");
      Serial.print(ELECHOUSE_cc1101.getRssi());
      Serial.print(" dBm | LQI: ");
      Serial.println(ELECHOUSE_cc1101.getLqi());
 
      // Pokud přijatá zpráva odpovídá textu ping, odešleme odpověď pong
      if (strcmp((char*)buffer, "ping") == 0) {
        delay(40);
        
        Serial.print("Odpovidam: pong ... ");
        char msg[] = "pong";
        ELECHOUSE_cc1101.SendData(msg, 30);
        ELECHOUSE_cc1101.SetRx();
        Serial.println("Odeslano.");
      }
    }
  }
}

Výstup ze Sériového monitoru (115200 baud)

Po nahrání obou programů uvidíte v Sériovém monitoru spolehlivou obousměrnou komunikaci v reálném čase:

Vysílač (TX):

--- ESP32 + CC1101 Transmitter Start ---
CC1101 uspesne inicializovan.
Odesilam zpravu: ping ... Odeslano.
Prijata odpoved: pong | RSSI: -85 dBm | LQI: 0
Odesilam zpravu: ping ... Odeslano.
Prijata odpoved: pong | RSSI: -86 dBm | LQI: 0

 

Přijímač (RX):

--- ESP32 + CC1101 Receiver Start ---
CC1101 uspesne inicializovan.
Prijata zprava: ping | RSSI: -81 dBm | LQI: 130
Odpovidam: pong ... Odeslano.
Prijata zprava: ping | RSSI: -81 dBm | LQI: 130
Odpovidam: pong ... Odeslano.

Závěr

Modul CC1101 představuje spolehlivé řešení pro bezdrátový přenos dat na frekvenci 433 MHz. Díky SPI rozhraní, hardwarovému CRC filtru a obousměrné komunikaci jde o výrazně kvalitnější alternativu k běžným levným modulům bez zpětné vazby.

 

Použité komponenty:

FB tw

Další podobné články