2023
HOME

LoRa und RadioLib - Senden und Empfangen ohne Lizenz | Sad-Ham
SX1278Logo ESP8266BASIC sendet RTTY
Radio-Fernschreiben wie damals mit dem ESP8266 und Raspberry Pi Pico.

Mit der RadioLib für die Arduino IDE ist es ziemlich einfach geworden die klassischen RTTY-Signale in den Äther zu senden. An dieser Stelle soll mit einem ESP8266 oder einem RP Pico etwas Text gesendet -, und per RTLSDR am PC mit FlDigi dekodiert und angezeigt werden.

Logo ESP8266BASIC

RadioLib und SX1278 mit Ausstrahlung von RTTY;Wasserfall des eigenen RTTY-Signals in HD-SDR

Die Bibliothek verwendet die Anschlüsse eines Arduino als Voreinstellung, so dass diese Pinbelegung zunächst sorgfältig angepasst werden muss. Nachdem die Header angebracht sind, folgt der Aufbau auf einem Steckbrett.

Nach der Installation der RadioLib für die Arduino-IDE kann ein erster Test erfolgen.



ESP8266 und RP Pico mit RTTY-Sketch


Ein ESP8266 oder RP Pico soll mit der RadioLib Verwendung finden und das Beispiel RTTY_Transmit aus dem Menü zunächst nur kompiliert werden, um mögliche Fehlermeldungen vor dem Hochladen zu erkennen. Danach soll die Pinbelegung des Arduino an den ESP8266 angepasst werden.

Unter Beispiele/RadioLib/RTTY liegt der Sketch RTTY_Transmit:

RadioLib RTTY Transmit Example. This example sends RTTY message using SX1278's FSK modem.

Der Sketch meldet unter esp8266 den Fehler :

Arduino\libraries\RadioLib\src\protocols\LoRaWAN\LoRaWAN.cpp:625:43: error: 'LoRaWANNodeOnDownlink' was not declared in this scope

   this->phyLayer->setPacketReceivedAction(LoRaWANNodeOnDownlink);

Derselbe Sketch unter dem RP Pico macht keine Probleme beim Übersetzen. Um schnell auch mit dem ESP8266 zum Ziel zu kommen, wird kurzerhand für diesen Test die Bibliothek angepasst. Nach Auskommentierung von IRAM_ATTR in LoraWan und Pager läuft der Sketch auch unter dem ESP8266 fehlerfrei durch und ändert für den Pi Pico nichts.

// interrupt service routine to handle downlinks automatically

#if defined(ESP8266) || defined(ESP32)

  //IRAM_ATTR

#endif


ESP8266 und RP Pico Pin-Belegung


Die Arduino-Voreinstellung ist NSS 10, DIO0 2, RESET 9 und DIO1 3. Entsprechend verwendet der Sketch für ESP8266 bzw. RP Pico die folgenden Anschlüsse:

ESP8266 Wemos D1 SX1278 RP Pico Bemerkung
GND GND GND Masse
3.3V 3.3V 3.3V Spannung
D8 NSS GPIO17
SPI CS
D7 MOSI GPIO19
SPI MOSI TX
D6 MISO GPIO16
SPI MISO RX
D5 SCK GPIO18
SPI Clock
D0 RST GPIO15 Reset
D2 DIO0 GPIO13 IO
D3 DIO1 GPIO14 IO

Beim Anlegen eines neuen Radio-Moduls erfolgt die Pin-Festlegung mit den übergebenen Parametern. Reihenfolge: NSS, DIO0, RESET, DIO1:

//SX1278 radio = new Module(10, 2, 9, 3); //Arduino
//SX1278 radio = new Module(15, 4, 16, 0);//ESP8266
SX1278 radio = new Module(17, 13, 15, 14);//RP PicoW

Die SPI-Verbindungen entsprechen der LoRa-Verschaltung und bleiben unverändert.


RTTY Sender Sketch


Mit der Anpassung der Pinbelegung über den Modul-Aufruf kann nun ein erster Test vollzogen werden. Auf die Verbindung DIO0 und DIO1 wird zunächst verzichtet. Der Sendemodus der Ausstrahlung soll dem Deutschen Wetterdienst entsprechen und wird mit state = rtty.begin(433.0, 450, 50) in HF, Shift und Baudrate festgelegt. Damit sollte der Empfang im RTLSDR-Empfänger denselben Klang erzeugen, wie die bekannten Wettermeldungen auf Kurzwelle. Der folgende verkürzte und angepasste Sketch erzeugt das weiter oben dargestellte Bild im Wasserfall bei 433 MHz in der HDSDR-Software auf einem PC.

Für den ESP8266 oder den RP Pi Pico sieht das Listing wie folgt aus:


									
/// Modified Pager and LoraWan... for esp
#include <RadioLib.h>

//SX1278 radio = new Module(10, 2, 9, 3);   // ARDUINO
//SX1278 radio = new Module(15, 4, 16, 0);  // ESP8266
SX1278 radio = new Module(17, 13, 15, 14);  // RP PicoW

RTTYClient rtty(&radio);

void setup() 
{Serial.begin(115200);
 Serial.println("\n\n\n RTTY Sender 433 MHz sending loop\n\n\n");
 Serial.print(F("[SX1278] Initializing ... "));
 int state = radio.beginFSK();
 if(state == RADIOLIB_ERR_NONE) 
 {Serial.println(F("success!"));
 } 
 else 
 {Serial.print(F("failed, code "));
  Serial.println(state);
  while(true);
 }
 Serial.print(F("[RTTY] Initializing ... "));
 state = rtty.begin(433.0, 450, 50);
 if(state == RADIOLIB_ERR_NONE) 
 {Serial.println(F("success!"));
 } 
 else 
 {Serial.print(F("failed, code "));
  Serial.println(state);
  while(true);
 }

void loop() 
{Serial.print(F("[RTTY] Sending RTTY data ... "));
 rtty.idle();
 delay(5000);
 String aStr = "ARDUINO STRING";
 rtty.println(aStr);
 rtty.println("CZCZ RYRY RYRY NNNN");
 rtty.println('C');
 rtty.println(255, HEX);
 int i = 1000;
 rtty.println(i);
 float f = -3.1415;
 rtty.println(f, 3);
 rtty.println(analogReadTemp());
 rtty.println("-------------");
 rtty.standby();
 Serial.println(F("done!"));
}


Empfang mit RTLSDR und Dekodierung mit Fldigi


Das empfangene Signal ist klar und deutlich und entspricht im Klang den Erwartungen. Eine Dekodierung mit FlDigi am PC oder DroidRTTY auf dem Smartphone führt jedoch nicht zu der erwarteten Ausgabe. Vielmehr erscheint:

YGDUSJAQAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL

YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZVL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY

JWBY ZXL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGCUAZY JWBY ZL YDCKAGCUFAGC

UAZY JWBY ZL YDCKAGCUFAGCUAZY JWB 

Da scheint ein Dekodier-Fehler vorzuliegen. Nach etwas Recherche stellt sich heraus, dass die RadioLib als Voreinstellung ASCII verwendet und nicht die im Wetterdienst übliche und auch sonst verbreitete ITA2 Kodierung. Zwar wird diese Art der Kodierung genannt, die genaue Konstante findet man jedoch erst in den jeweiligen Quellen. Mit der Änderung der Zeile

state = rtty.begin(433.0, 450, 50, RADIOLIB_ITA2);

sendet der SX1278-Baustein dekodierbare Zeichen.

Dekodierung über Mikrofon oder Virtual Cable in FlDigi


Billigst Receiver für 433 MHz-RTTY


Um auch ohne SSB-Receiver die Ausstrahlungen des SX1278-RTTY-Signals zu empfangen gibt es Billigstempfänger aus dem fernen Osten.

Mit Vcc = 3,3 V, Gnd und data zu einem Verstärker über einen Kondensator steht der Empfänger bereit, um alles zu empfangen was irgendwo bei 433 MHz sendet. Damit und dem RadioLib RTTY Transmit AFSK Example ist kein SSB-Empfänger mehr notwendig.

Dabei sendet der Pico zusätzlich über GPIO05 PWM-Audio an den SX-DIO2-Pin für den Abschnitt AFSKClient audio(&radio, 5) im Sketch.

Der Data-Pin liefert ein NF-Signal, welches über einen Verstärker z. B. dem Mikro eines Smartphones mit RTTY-Software zugeführt werden kann. Unter Beispiele/RadioLib/RTTY liegt der Sketch RTTY_Transmit_AFSK, der den Audio-Modus verwendet (gekürzt und angepasst):

/*
   RadioLib RTTY Transmit AFSK Example
   This example sends RTTY message using SX1278's
   FSK modem. The data is modulated as AFSK.
   https://jgromes.github.io/RadioLib/
*/

#include <RadioLib.h>
SX1278 radio = new Module(17, 13, 15, 14);  // RP PicoW

AFSKClient audio(&radio, 5);

RTTYClient rtty(&audio);

void setup() 
{ Serial.begin(9600);
  Serial.print(F("[SX1278] Initializing ... "));
  int state = radio.beginFSK();
  if(state == RADIOLIB_ERR_NONE) 
  { Serial.println(F("success!"));
  } 
  else 
  { Serial.print(F("failed, code "));
    Serial.println(state);
    while(true);
  }
  Serial.print(F("[RTTY] Initializing ... "));
  state = rtty.begin(500, 420, 50, RADIOLIB_ITA2);
  if(state == RADIOLIB_ERR_NONE) 
  { Serial.println(F("success!"));
  } 
  else 
  { Serial.print(F("failed, code "));
    Serial.println(state);
    while(true);
  }
}

void loop() 
{ Serial.print(F("[RTTY] Sending RTTY data ... "));
  rtty.idle();
  delay(500);
  String aStr = "Arduino String";
  rtty.println(aStr);
  rtty.println("C-String");
  rtty.println(F("Flash String"));
  rtty.println('c');
  rtty.println(255, HEX);
  int i = 1000;
  rtty.println(i);
  float f = -3.1415;
  rtty.println(f, 3);
  rtty.standby();
  Serial.println(F("done!"));
  delay(1000);
}


Mehr zum SX1278 auf dieser Seite (in Klammern die Anzahl der verwendeten Module):



						


						

Software/Radio

.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt