Im ersten Teil dieser Blogreihe zur RS485-Schnittstelle hatte ich eine Schaltung mit dem Mikrocontroller mit ATmega 328, dem zihatec RS485 Shield sowie 6 Potis, einem Taster und einer LED an einen PC angeschlossen, um mit einem Modbus-Testprogramm am PC die analogen Werte der Potis und den digitalen Wert des Tasters zu lesen bzw. das Ein- oder Ausschaltsignal für die LED an den Mikrocontroller zu senden. Der Beispiel-Sketch sendet also die sechs analogen Signale und das digitale Signal des Tasters über die RS-485-Verbindung zum PC und empfängt von dort die Information, ob eine LED an- oder ausgeschaltet sein soll.
In diesem Teil möchte ich zunächst zeigen, wie einfach es ist, diese Versuchsanordnung an einen Raspberry Pi mit dem zihatec RS485 HAT anzuschließen und die Funktionalität des Testprogramms mit einem Python-Programm zu realisieren. Zur Verdeutlichung noch einmal die Erklärung der Terminologie: Der Begriff „Shield“ stammt aus der „Arduino-Welt“ und bezeichnet ein Bauteil, das direkt auf den Mikrocontroller, meist in der Bauform des Uno, gesteckt wird. In der „Raspberry Pi-Welt“ nennt man das vergleichbare Bauteil HAT für Hardware Attached on-Top bzw. pHAT für die kleineren Pi Zeros, die ja die gleiche 40-polige Pin-Leiste (J6-header) haben.
Zur Erinnerung: Ich hatte das Shield auf den Mikrocontroller gesteckt, sowie die folgende Schaltung mit sechs Potentiometern an den analogen Eingängen A0 bis A5, eine LED mit Vorwiderstand an dem digitalen Pin 12 und einen Taster (button) mit Pulldown-Widerstand an Pin 7 angeschlossen.
Die DIP Schalter, sowohl auf dem RS-485-Shield, als auch auf dem RS-485-HAT, werden wie auf dem folgenden Bild eingestellt:
Der wichtigste Microschalter ist der erste auf SW 3: Damit wird der Abschlusswiderstand (terminating resistor) aktiviert.
Hier die Erklärung aller DIP-Schalter, häufig als Mäuseklavier bezeichnet, gemäß Datenblatt der Fa. zihatec:
S1 - DIP Switch Configuration – send/receive control:
Channel |
Description |
1 |
Receiver always on |
2 |
Transmitter connected to Receiver |
3 |
Automatic DE/RE control |
4 |
DE/RE control via GPIO18 |
S2 - DIP Switch Configuration – RS422/485 mode:
Channel |
Description |
1 |
Connect Y to terminal K2 |
2 |
Connect Z to terminal K2 |
3 |
Connect internally Y to A |
4 |
Connect internally Z to B |
S3 - DIP Switch Configuration – termination resistors:
Channel |
Description |
1 |
Terminating Resistor on |
2 |
Not used |
3 |
4k7 Pull-down Resistor on B |
4 |
4k7 Pull-up Resistor on A |
Die obigen Schaltereinstellungen bedeuten also:
SW1 ist so konfiguriert, dass automatisch zwischen Sende- und Empfangsmodus umgeschaltet wird. Die Software muss sich darum nicht kümmern.
SW2 ist für die Betriebsart RS485 konfiguriert. Intern werden dazu über die Schalter 3 und 4 Transceiver und Receiver des RS422 Chips verbunden.
An SW3 ist nur der Abschlusswiderstand eingeschaltet. Mit den Schaltern 3 und 4 können zusätzliche Widerstände aktiviert werden, die die Leitungen auf definierte Pegel ziehen.
Als Nächstes ein Bild des Raspberry Pi mit dem RS485 HAT. Es gibt auch eine Ausführung, bei der die 40-polige Steckerleiste mit einem sogenannten Stacking Header ausgerüstet ist. Dann sind die Pins wie auf dem Raspberry Pi frei zugänglich und können in das Projekt einbezogen werden. Vom HAT werden neben der Spannungsversorgung (3,3V und 5V sowie GND) nur TX (GPIO14), RX (GPIO15) und ggf. GPIO18 verwendet.
Folgende Anmerkung gilt nur für Raspberry Pi 4 mit dem seit Oktober 2021 dafür modifizierten HAT:
Alternativ kann bei der aktuellen Version des HAT in Kombination mit einem Raspberry Pi 4 auch die UART3 (TX=GPIO4, RX=GPIO5 und ggf GPIO6 zur Umschaltung) verwendet werden. Die Konfiguration erfolgt in diesem Fall durch Lötjumper auf der Rückseite. Voreinstellung ist aber immer UART1.
Die Verbindung zwischen dem Shield und dem HAT besteht nur aus einer verdrillten zweiadrigen Leitung. Während die Leitung im Versuchsaufbau nur 20 cm lang ist, kann diese wie in Teil 1 beschrieben bis zu 1000 m lang sein, und die Anzahl der Geräte kann statt zwei auch bis zu 32 sein. Und durch die galvanische Trennung können auch widrige Umweltbedingungen wie Spannungsschwankungen oder Überspannungen auftreten, ohne dass Mikrocontroller oder Raspberry Pi beschädigt werden.
Man verbindet jeweils die Buchsen B mit B und A mit A, die anderen drei Anschlüsse bleiben frei. Wenn ein Hersteller die Bezeichnungen R+ und R- bzw. T+ und T- verwendet, wird + mit A und – mit B verbunden.
In der Raspberry Pi Konfiguration aktivieren wir die Serielle Schnittstelle und starten den Pi danach neu.
An dieser Stelle darf nicht verschwiegen werden, dass die alte, abgespeckte COM-Schnittstelle an GPIO14 (Pin 8) und GPIO15 (Pin 10) bei sehr niedrigen oder sehr hohen Baudraten sowie bei Geräten, die eine sehr stabile Baudrate benötigen, Probleme bereiten kann. Wer auf Bluetooth und Wireless verzichten kann, sollte deshalb den PL011 UART benutzen. Details dazu findet man z.B. auf der Internetseite von abelectronics.co.uk. Ich selbst habe diesen Ansatz nicht weiterverfolgt.
Um das Rad nicht neu erfinden zu müssen, benutzen wir eine Programm-Bibliothek (Python-Modul) für die Kommunikation zwischen Raspberry Pi und dem Mikrocontroller. Der Sketch für den MC bleibt übrigens unverändert gegenüber Teil 1.
Das empfohlene Python-Modul für den Modbus heißt minimalmodbus und wird wie folgt installiert.
Öffnen Sie das Terminal und geben Sie „pip3 install -U minimalmodbus“ ein.
Dann öffnen wir unseren Python-Editor – Idle3 oder Thonny. Zu Beginn des Programms werden die Module importiert, dann ein Objekt für den Zugriff auf den Modbus instanziiert und die wichtigsten Einstellungen vorgenommen. Die verwendeten Methoden aus dem Modul minimalmodbus sind read_register für die Register 0 bis 5 sowie 7, das Register 6 für die LED wird mit write_register beschrieben.
import minimalmodbus
from time import sleep
instrument = minimalmodbus.Instrument('/dev/serial0', 1) # port name, slave ad$
instrument.serial.baudrate = 9600 # Baud
instrument.mode = minimalmodbus.MODE_RTU
LED = False
while True:
## Read analog values and button status ##
for i in range(6):
analog = instrument.read_register(i, 0) # Registernumber, number of decim$
print("Analog value ",i," = ",analog)
button = instrument.read_register(7, 0)
print("Button status = ",button)
## SET on board led on ##
LED = not LED
instrument.write_register(6, LED, 0) # Registernumber, value, number of decima$
sleep(1)
Die Ausgabe der Daten erfolgt mit jeweils einer Sekunde Pause in der Shell. Mit jedem Durchgang wird die LED ein- bzw. ausgeschaltet. Während der Datenübertragung leuchten auch auf beiden Geräten die RX und TX LEDs quasi-synchron.
Lassen Sie sich nicht von dem Begriff MinimalModbus in die Irre leiten. Das Handbuch dazu umfasst 142 Seiten. Das Python-Modul ist also mächtiger als der Name vermuten lässt.
Fazit: Mit dem zihatec RS485-HAT kann man den Raspberry Pi mit MODBUS-fähigen Geräten (Industriesteuerung und Gebäudeleittechnik) verbinden. Aufgrund der galvanischen Trennung zwischen dem Pi und dem RS485 Bus werden Fehlfunktionen oder Beschädigung des Raspberry Pi vermieden. Es beherrscht sowohl den halbduplex-Betrieb (RS485) als auch den RS422 (vollduplex) Modus. Im Gegensatz zur RS232-Schnittstelle können mehr als zwei Geräte auch über größere Distanzen verbunden werden.
Grundsätzlich eignet sich der zihatec RS485-HAT nicht nur für MODBUS-Anwendungen, sondern auch für DMX (Beleuchtungstechnik, siehe Teil 2 dieser Reihe), NMEA0183 (maritime Anwendungen), Pelco (Videoüberwachung) uvm.
Wie mit dem RS485-Shield am Mikrocontroller möchte ich nun auch meinen DMX-LED-Strahler mit dem Raspberry Pi bedienen. Wenn das klappt, können Theater und Diskotheken für die Beleuchtungstechnik auf den sowohl in der Anschaffung als auch im Betrieb preiswerten Raspberry Pi umsteigen.