Jetzt hat es  endlich gefunkt! (433MHz Modul HC-12) - [Teil 2] - AZ-Delivery

Willkommen zum zweiten Teil. Im ersten Teil haben wir gesehen, wie eine einfache Funkverbindung mit den Voreinstellungen (default settings) des HC-12 funktioniert, und im Terminal-Fenster „gechattet“, wie man heute sagt.

Diesmal möchte ich Ihnen weitere Möglichkeiten des Programms minicom auf dem Raspberry Pi zeigen. Nachdem ich die Tastenkombination <Strg+A> und anschließend <Z> für Hilfe gedrückt habe, konnte ich weitere Möglichkeiten für Einstellungen und Funktionen „erforschen“.


Wie im ersten Teil erwähnt, sind einige der Funktionen für Telefon-Modems gedacht, die in der DSL-Zeit kaum noch jemand kennt. Erinnern Sie sich noch?

Mein erstes Modem mit sagenhaften 2400 Baud:


Und mein letztes Modem mit 56 kBaud, bevor die DSL-Zeit begann:


Funktionen wie „Dialing directory“, „Hangup“ und „initialize Modem“ werden wir also nicht benötigen. Aber „Send files“ hört sich nach Datenfernübertragung (DFÜ) an und das ist es auch. Nach <Strg+A> und anschließend <S> öffnet sich ein neues Fenster, in dem wir zunächst das bereits markierte „zmodem“ mit <Return> bestätigen:


Leider funktioniert nichts mit Mausklick. Deshalb verschieben wir die Markierung mit den Cursor-Tasten auf [Goto] und drücken <Return>.  Im dann geöffneten Textfeld geben wir /home/pi ein, um in unser Nutzerverzeichnis zu gelangen. Dann werden in alphabetischer Reihenfolge zunächst die Verzeichnisse und dann die Dateien angezeigt.

Nicht wundern: Zunächst werden als erstes die versteckten Verzeichnisse bzw. Dateien mit einem Punkt am Anfang aufgelistet; diese sehen wir normalerweise nicht im Datei-Manager. Deshalb klicken wir viele Male mit der Cursor-Taste nach unten, bis wir die Datei erreichen, die wir versenden wollen und dafür mit der Leertaste markieren. Mit zweimal Leertaste können wir auch ein Unterverzeichnis anwählen und dorthin wechseln.

Wenn die gewünschte Datei markiert ist, wird sie mit der Return-Taste verschickt. Und dann macht man eine Zeitreise und befindet sich in den 1990-er Jahren. Die Übertragungsrate liegt bei ca. 880 bis 890 bps (=Bytes pro Sekunde). Das muss auch so sein bei unseren Einstellungen 9600 Baud mit 8N1 (=8  Datenbits, No parity bit und 1 Stoppbit). Damit dauert die Übertragung eines kleinen Python-Programms (4,9 kB) ca. 6 Sekunden, die eines Bildschirmfotos mit 1,6 MB über 20 Minuten.

Da hilft nur eine höhere Übertragungsgeschwindigkeit, also schauen wir, wie die eingestellt wird:

Zunächst wieder <Strg+A> und <Z>, dann wechseln wir mit <P> zu „comm Parameters“ und sehen weitere Möglichkeiten, mit einer Buchstabentaste eine andere Einstellung zu wählen. Mit <D> wählen wir als Übertragungsgeschwindigkeit 38400 Baud, also viermal so schnell wie bisher.


Nachdem ich diese Änderung auf beiden Raspberry Pis vorgenommen hatte, kam zunächst einmal die Ernüchterung: Es kamen nur noch kryptische Zeichen auf der anderen Seite an. Was hatte ich falsch gemacht?

Zum Glück kam ich sehr schnell darauf, dass die Raspis ja gar nicht direkt verbunden sind, sondern das jeweilige Terminalprogramm mit seinem Funkmodul HC-12 kommuniziert; also müssen die auch auf 38400 Baud umgestellt werden. Also Blick in das data sheet des HC-12, wie man hier die Einstellungen vornimmt. Den bisher nicht benutzten Pin „Set“ am Modul hatte ich ja schon gesehen.


Wenn man den „Set“-Pin mit Ground verbindet (auch im laufenden Betrieb möglich), kann man die Einstellungen mit sogenannten AT-Befehlen ändern. Auch dieses AT (=attention) ist ein Relikt aus der Zeit der Fernschreiber. Für die einfachere Bedienung und Sichtbarkeit schließe ich das Funkmodul wieder mit dem USB-UART-Adapter FT232 RL an den PC an und nutze die Arduino IDE.

Nachdem wir die richtige virtuelle COM-Schnittstelle ausgewählt haben, erfolgt die Eingabe von AT und Senden in der obersten Zeile des Serial Monitor; dies wird durch ein ok bestätigt. Nach AT+V wird die Version ausgegeben (siehe Bild) und nach AT+RX alle aktuellen Einstellungen. Dann ändere ich die Baudrate mit AT+B38400 und den Funkkanal auf Channel 3. Das entspricht statt der 433,4 MHz einer Frequenz von 434,2 MHz (Bandbreite je Kanal = 400 kHz). Zum Schluss gebe ich noch einmal AT+RX ein, um zu sehen, ob die Änderungen gespeichert sind.

Anmerkungen: 1. Die waagerechten Trennlinien habe ich zur besseren Unterscheidung eingefügt.

2. Die Angabe hinter RP sagt etwas über die Sendeleistung aus, FU3 ist der voreingestellte Mode.

Weitere Details entnehmen Sie bitte dem data sheet.

Das Ganze mal zwei und dann schließe ich die Module (ohne „Set“ an GND) wieder an die Raspis. Und siehe da: Es funkt wieder ordnungsgemäß und die Datenübertragung ist viermal schneller.

Und wie schaut es aus mit Python? Kann man das Funkmodul auch in ein eigenes Python-Programm einbinden, z.B. um Sensordaten zu empfangen und auszugeben oder sogar Alarm zu schlagen?

Man kann! Dafür gibt es das Python-Modul „pyserial“, das sofern noch nicht vorhanden mit

sudo apt-get update
sudo apt-get install python-serial

 installiert wird.

Folgender Code empfängt die Daten. Sie können diesen wie immer für eigene Zwecke modifizieren:

import time
import serial

ser = serial.Serial(
    port='/dev/ttyS0',
    baudrate = 38400,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1
    )
while True:
#     x = ser.read() # read one byte
#     print(x)
#     s = ser.read(10) # read up to ten bytes (timeout)
#     print(s)
    line = ser.readline() # read a '\n' terminated line
    print(line)

Nun brauchen wir noch einen Sender. Exemplarisch habe ich das Programm von Lady Ada für den Temperatur- und Luftfeuchtigkeitssensor DHT22 am Arduino Uno so modifiziert, dass dieser auch Daten über das Funkmodul HC-12 sendet, und zwar mit den zuletzt eingestellten 38400 Baud. 

// Example testing sketch for various DHT humidity/temperature sensors written by ladyada
// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
// - modified for radio transmission with HC-12 by Bernd54Albrecht for AZ-Delivery

#include <SoftwareSerial.h>
#include "DHT.h"

SoftwareSerial softSerial(2, 3); //RX, TX

#define DHTPIN 4 // Digital pin connected to the DHT sensor
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to 3.3V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(115200);
Serial.println(F("DHTxx test!"));
softSerial.begin(38400);

dht.begin();
}

void loop() {
// Wait a few seconds between measurements.
delay(2000);

// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (it’s a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);

// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}

Serial.print(F("Humidity: "));
Serial.print(h);
softSerial.println(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
softSerial.println(t);
Serial.println(F("°C "));
delay(20);

Ausgabe in der Arduino IDE:


Ausgabe
 am Raspberry Pi:


Wir haben gesehen, wie man die wichtigsten Terminalprogramme für Raspberry Pi, Arduino und PC benutzt, wie man die Einstellungen am Funkmodul HC-12 vornehmen kann und wie man das Funkmodul in Python einbindet. Beim nächsten Mal kommen endlich die Maker zu ihrem Recht. Wir werden mit zwei Arduino Nanos eine Stoppuhr für den 100m-Lauf aufbauen und programmieren.

Projekte für fortgeschritteneRaspberry pi

1 Kommentar

Äd Franzis

Äd Franzis

Hallo Bernd,

auch der 2. Teil ist wieder ein sehr interessanter Artikel – und schön geschrieben. Finde sehr gut, dass du auch deinen Weg zum Finden der Lösungen beschreibst und nicht einfach das Endergebnis “vom Himmel fällt”.

Meine Frage: Welche Reichweiten konntest du mit deiner Funkstrecke überbrücken und unter welchen Bedingungen (Decken, Wände, freies Feld)?

Vielen Dank .

Liebe Grüße
Äd

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery