Seit mehreren Jahren versuche ich, eine preiswerte Funkverbindung mit 433 MHz Sendern und Empfängern zwischen Micro-Computer (z.B. Raspberry Pi) und Micro-Controller (z.B. Arduino) aufzubauen.
Alle bisherigen Versuche blieben ergebnislos oder waren im Ergebnis enttäuschend. Die Kombination aus Sender/Transmitter MX-FS-03V und Empfänger/Receiver XD-RF-5V habe ich gar nicht zum Laufen bekommen. Der Code der Funksteckdose wurde am Raspberry angezeigt, aber ich konnte die Steckdose dennoch nicht schalten.
Einzig ein kleiner Spielzeugsender mit vier Knöpfen sendete brauchbare Signale, um z.B. vier GPIO-Pins des Raspberry Pi anzusteuern. Allerdings erforderte der Empfänger mit der 5V-Betriebsspannung viel Schaltungsaufwand mit Spannungsteilern für die 3,3V der Raspi-GPIOs.
In diesem Beitrag möchte ich Ihnen das Funkmodul HC-12 vorstellen, das ich durch meine Mitarbeit am E-Book für dieses neue Produkt im Sortiment ausprobieren konnte. Sie ahnen sicherlich schon, dass ich mit diesem kombinierten Sender-Empfänger-Modul endlich Erfolgserlebnisse hatte.
In diesem ersten Teil möchte ich Ihnen zunächst exemplarisch den Austausch von Text zwischen Raspberry Pi und Arduino bzw. Raspberry Pi und PC zeigen, in den nächsten Teilen dann weitere Möglichkeiten der Datenübertragung sowie Schaltvorgänge, die von einem Mikro-Controller auf dem anderen getriggert werden.
Benötigte Hardware
Anzahl | Bauteil | Anmerkung |
---|---|---|
1 | Arduino Uno | Alternativ Arduino Nano |
1 | Raspberry Pi | Jedes Modell mit J6 header |
2 | HC-12 Funkmodul 433 MHz | |
PC mit USB | USB-Com-Adapter erforderlich, z.B. FT232RL |
Also Datenaustausch zwischen zwei Micro-Computern bzw. -Controllern. Das klingt nach Fernschreiber aus der sogenannten guten alten Zeit. Tatsächlich beruht die UART bzw. COM-Schnittstelle auf dem Wunsch, eine Brücke zu schlagen von den Fernschreibern zu den Computern, eine Voraussetzung für die weitere Automatisierung der Fernmeldetechnik.
Auf den heutigen Computern ist der 9- bzw. 25-polige Steckkontakt für die COM-Schnittstelle längst verschwunden, aber es gibt eine Vielzahl von Adaptern zwischen dem Universal Serial Bus (USB) und der COM-Schnittstelle, z.B. zum Programmieren der Micro-Controller. Aber auf den Raspberry Pis, den Arduinos und ESPs gibt es sie noch, ggf. muss man nur einen Spannungswandler (Logic Level Converter LLC) verwenden, um die Datenverbindung herzustellen.
Und man benötigt ein sogenanntes Terminal-Programm, das den alten Fernschreiber simuliert. Bei der Arduino IDE kann man dafür den Serial Monitor benutzen, der in der obersten Zeile ein Eingabefeld hat und am Ende dieser Zeile den „Send-Button“. Beim Raspberry Pi ist das Programm minicom beliebt, das im Terminal mit sudo und einigen Übergabeparametern aufgerufen wird. Und am PC verwenden wir das Programm PuTTY, das Sie ggf. schon vom Fernzugriff über Secure Shell (SSH) auf den Raspberry Pi kennen, hier aber ohne WLAN auskommt, oder auch die Arduino IDE.
Da diese Programme in der Anwendung nicht selbsterklärend sind, erfolgt parallel eine Einweisung in die für unsere Zwecke genutzten Funktionen. Wir nutzen für die HC-12-Module exakt die Pins, die wir auch für eine direkte Verbindung (ggf. mit Spannungswandler) nutzen würden.
Arduino
Hier zunächst der Schaltplan:
Mit folgendem kleinen Terminalprogramm nutzen wir den Serial Monitor für Ein- und Ausgabe. Dabei ist zu beachten, dass wir die eingebaute Schnittstelle für den Serial Monitor brauchen. Für den HC-12 nutzen wir die Bibliothek SoftwareSerial und die Pins 2 und 3, wobei TX und RX immer über Kreuz verbunden werden.
// Serial Monitor nutzt Hardware Schnittstelle
// HC-12 nutzt Software Schnittstelle an Pin2=RX und Pin3=TX
// Achtung: HC-12 RX und TX über Kreuz an TX und RX
#include <SoftwareSerial.h>
SoftwareSerial softSerial(2, 3); //RX, TX
void setup() {
Serial.begin(115200);
softSerial.begin(9600);
}
void loop() {
if(Serial.available() > 0){
//Eingabe am Serial Monitor and send over HC-12
String input = Serial.readString();
// Senden über HC-12
softSerial.println(input);
}
if(softSerial.available() > 1){
//Empfang am HC-12
String input = softSerial.readString();
// Ausgabe am Seral Monitor
Serial.println(input);
}
delay(20);
}
Raspberry Pi:
Auch hier zunächst der Schaltplan:
Dann wird die serielle Schnittstelle in der Konfiguration aktiviert.
Wer minicom noch nicht auf seinem Raspberry Pi hat, installiert es in der bekannten Weise:
sudo apt-get update
sudo apt-get install minicom
Beim Start im Terminal benötigen wir ebenfalls Administrator-Rechte und wir übergeben zugleich die Parameter für die Konfiguration:
sudo minicom -D /dev/ttyS0 -b9600 8n1 -o
Hinter -D wird der Pfad zur seriellen Schnittstelle S0 angegeben, hinter -b die Baudrate (Übertragungsgeschwindigkeit) und dann die Angaben zu Datenbit, Parity und Stoppbit.
Innerhalb des Terminals öffnet sich dann das minicom Fenster:
An der Stelle des Rechtecks wird gleich der Text geschrieben, den ich in der Arduino IDE im Serial Monitor eingegeben habe. Man erkennt auch in der letzten Textzeile die Tastenkombination, um in das Menü zu wechseln (Strg+A) und um Hilfe zu bekommen (Strg+A, anschließend Z). Das schauen wir uns zunächst an.
Viele der Möglichkeiten sind Überbleibsel aus der Zeit der Modems. Für uns interessant sind die Buchstaben für das ordentliche Beenden (X bzw. Q) sowie das Einschalten des lokalen Echos (E), das wir gleich kennenlernen werden.
Hier nun die Texteingabe in der Arduino IDE …
… und die Ausgabe auf dem Raspberry Pi
In diesem Fenster habe ich dann einen Text eingegeben, der in der Arduino IDE ausgegeben wurde.
Tatsächlich habe ich nicht gesehen, was ich geschrieben habe. Denn beim Starten von minicom ist das lokale Echo ausgeschaltet. Wie eben gesehen: Tastenkombination Strg+A, anschließend E; dann wird der Text sowohl lokal am Raspi als auch in der Arduino IDE ausgegeben.
Windows PC
Nun zur Anbindung des HC-12 an einen Windows-PC. Wie gesagt, die COM-Schnittstelle haben die heutigen PCs schon lange nicht mehr. Dafür aber meist mehrere USB Ports; wir benötigen also einen USB-UART-Adapter. Für die Programmierung der kleinen ESP-Micro-Controller habe ich einen FT232RL USB zu TTL Serial Adapter für 3,3V und 5V. Den kann man wunderbar dafür benutzen. Auch hier gilt: RX mit TX und TX mit RX verbinden.
Als Terminal-Programm nutzen wir PuTTY, das viel mehr Möglichkeiten bietet als nur den Fernzugriff auf den Raspberry Pi mit SSH.
Wir klicken also zunächst auf Serial:
In den Windows-Einstellungen oder in der Arduino IDE unter Werkzeuge/Port suchen wir den Namen der virtuellen Schnittstelle (in meinem Fall COM 8). Als Baudrate nehmen wir wieder 9600.
Bevor wir den virtuellen COM-Port öffnen, nehmen wir unter Terminal in der linken Spalte noch ein paar Einstellungen vor: Wichtig sind vor allem der Wagenrücklauf mit Zeilenumbruch (neue Zeile =CR) sowie Local echo (Force on), damit wir sehen, was wir schreiben.
Wenn wir im Nachhinein noch Einstellungen ändern wollen, klicken wir mit dem Mauszeiger auf das Terminal-Symbol (die zwei verbundenen Bildschirme) in der Menüzeile.
Diese Möglichkeit nutzen wir, um „Local Line editing“ einzuschalten, damit wir Schreibfehler im Terminal korrigieren können.
Das war es schon. Wenn die z.T. sehr alten Anwendungsprogramme nicht so ungewohnt wären, ein leichtes Spiel. Unser HC-12 Funkmodul hat die geringste Mühe gemacht, an 3,3 bzw. besser an 5V und GND anschließen, RX an TX und TX an RX, fertig.
Beim nächsten Mal zeige ich weitere Möglichkeiten der Datenverbindung und dann meine Stoppuhr für das Passrennen der Islandpferde über 100, 150 oder 250 Meter, Startsignal vom Arduino Nano über Funk an einen zweiten Nano mit der Zeitanzeige.
Auf vielfachen Wunsch geht es hier zum Download.
8 commenti
Andreas Wolter
@Michael Eckert: meine Vermutung ist, dass der Puffer mehrmals ausgelesen und dabei der Inhalt immer wieder überschrieben wird. Dadurch bleibt dann nur der letzte Rest in der Variablen stehen, da nichts neues ausgelesen wird.
Die Daten müssen also verarbeitet werden, bevor wieder neu ausgelesen wird.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Michael Eckert
Gibt es eine Begrenzung in der Menge der Daten? Bei mir funktioniert der HC-12 mit Arduino Nano und einem alten Armstrad NC100 (serielle Schnittstelle ausgelötet und HC-12 angeschlossen) eigentlich gut, aber bei langen Texten kommt nur der letzte Teil an – ganze Programme lassen sich so nicht übertragen. Woran kann das liegen ? Auch wenn ich den NC100 außen vor lasse, und 2 Arduinos verwende – gleiches Ergebnis.
Rene
Ich würde gern mit dem HC12 “die Luft scannen”, um die Temperaturdaten meiner vorhandenen Außentemperaturfühler auf 433,9MHz zu empfangen. Wie könnte man sowas bauen? Dann muss sicherlich SET mitverwendet werden.
Bernd Albrecht
@ Veit
Wenn ich Ihre Frage richtig verstehe, wollen Sie nur zwei Steuersignale Strg- alt-t und Strg-alt- h übertragen. Im dritten Teil der Blog-Serie werden wir auf Tastendruck vierstellige Codes übertragen. Auf dem Empfänger wird damit eine Stoppuhr gestartet bzw. gestoppt. Alternativ könnten bei Eintreffen der Codes auch Strings mit den o.g. Zeichenfolgen generiert werden.
veit
Hallo Nochmal
Bei mir haut die Schaltung wunderbar hin. Text wird einwandfrei übertragen.
Mein Problem ist ich muss die Befehle Strg- alt-t und Strg-alt- h übertragen.
Momentan stehe ich irgendwie auf dem Schlauch. Muss ich den Befehl kenntlich machen mit Klammern oder ähnlichem. ich benötige auch keine Text Eingabe sondern nur diese Befehle in Abhängigkeit von 2 Eingängen zu senden. Mir fehlt hier der Ansatz. Vielen Dank
Waltraud Stibernitz
HF-Verbindung einwandfrei.
Warte schon hart auf das eBook, denn so kann ich nur die Werkseinstellung verwenden und nicht nach eigenen Vorstellungen parametrieren.
Andreas
Minicom muss auf dem Raspberry nicht mit Administratorrechten laufen. Es reicht, den Benutzer (z.B. pi) in die Gruppe “dialout” aufzunehmen.
Dazu nur einmal “sudo usermod -a -G dialout pi” aufrufen.
veit
Sehr gut beschrieben. Leicht und verständlich.
Weiter so