Modbus auf Arduino meistern: Schritt-für-Schritt-Anleitung
Komponenten und Zubehör
| Arduino UNO | 1 |
| Professionelles RS422/RS485 Shield für Arduino | 1 |
| USB-zu-RS485-Konverter | 1 |
| Steckbrett (Breadboard) | 1 |
| LED (beliebig) | 1 |
| Widerstand 10 kΩ | 1 |
| Widerstand 220 Ω | 1 |
| Jumper-Kabel | 1 |
| Taster (12 mm) | 1 |
Software und Online-Dienste
- Arduino IDE
- ModbusTester (Windows-Tool zum Testen)
Projektbeschreibung
Modbus ist ein serieller Kommunikationsstandard, der sich als De-facto-Protokoll für die Vernetzung industrieller elektronischer Geräte etabliert hat. Bei Modbus RTU und Modbus ASCII dient RS485 als physikalische Übertragungsschicht. Ein Arduino kann als Modbus-Slave (und mit Einschränkungen auch als Master) eingesetzt werden, benötigt dafür jedoch ein RS485-Interface. Unser RS422/RS485-Shield ist ein vollständig galvanisch isoliertes Kommunikations-Shield, das für Arduino UNO und kompatible Boards (Arduino 101, STM Nucleo u. a.) konzipiert ist – die ideale Wahl für solche Anwendungen.
Ziel dieser Anleitung ist es, gemeinsam mit einem Arduino UNO ein einfaches Modbus-Slave-Gerät zu realisieren. Als Modbus-Master dient ein PC.
Werkzeuge & Materialien
- Arduino UNO
- RS485-Shield für Arduino
- Beliebiger RS485-USB-Adapter für die PC-Verbindung
Optional:
- Steckbrett
- Taster
- Rote LED
- 220-Ω-Widerstand
- 10-kΩ-Widerstand
- Jumper-Kabel
Software:
- Arduino IDE
- ModbusTester
RS485-Verdrahtung
Die Verdrahtung ist sehr einfach: Verbinden Sie lediglich die A- und B-Klemmen des Shields mit den A- und B-Leitungen des Modbus-Systems. Die Y- und Z-Klemmen werden für diese Anwendung nicht benötigt. Für lange Strecken wird die Verwendung verdrillter Paare für A und B empfohlen.
Arduino-Verdrahtung (optional)
Es empfiehlt sich, eine LED und einen Taster am Arduino anzuschließen, um Auswirkungen der Modbus-Kommunikation sichtbar zu machen. Dies ist optional und nicht zwingend erforderlich.
DIP-Schalter-Einstellungen
Das RS422/RS485-Shield verfügt über drei DIP-Schalterbänke. Für Modbus müssen diese wie folgt eingestellt werden:
- Schalter 1: 1-OFF, 2-ON, 3-ON, 4-OFF
- Schalter 2: 1-OFF, 2-OFF, 3-ON, 4-ON
- Schalter 3: 1-OFF oder ON*, 2-OFF, 3-OFF, 4-OFF
*Abhängig von der Position des Shields im Modbus-Strang muss der Abschlusswiderstand ein- oder ausgeschaltet werden. Schalten Sie den Widerstand nur auf ON, wenn das Shield an einem Ende der Busleitung sitzt. In allen anderen Fällen OFF.
Jumper-Einstellungen
Auf dem Shield finden sich drei Jumper-Bereiche. Besonders wichtig ist Jumper JP1 für die Versorgungsspannung. Der Arduino UNO arbeitet intern mit 5 V; setzen Sie diesen Jumper daher auf die 5-V-Position (bei 3,3-V-Boards wie Arduino 101 auf 3,3 V).
Setzen Sie die Jumper für die Kommunikationsports (obere linke Ecke) wie im Bild gezeigt. Damit wird der interne UART (Pins 0 und 1) mit dem RS485-Interface des Shields verbunden.
Zuletzt muss der Jumper für die RX/TX-Steuerung gesetzt werden. Wir nutzen ihn nicht, da die automatische RX/TX-Umschaltung konfiguriert ist.
ModbusTester-Software auf dem PC installieren
Wir nutzen den PC als Modbus-Master. Laden Sie ModbusTester herunter, entpacken Sie das ZIP-Archiv in ein neues Verzeichnis und starten Sie die Software. Konfigurieren Sie die markierten Felder wie im Screenshot gezeigt. Wichtig: Schließen Sie den USB-RS485-Adapter vor dem Start an und wählen Sie in ModbusTester den richtigen COM-Port für diesen Adapter.
Arduino-Software
Laden Sie die Firmware in die Arduino IDE, kompilieren und flashen Sie sie auf den Arduino.
Funktionstest
Jetzt testen Sie Ihre Arbeit! Drücken Sie in ModbusTester die Read-Taste. Dieser Befehl liest 8 Bytes aus dem Speicher unseres Slave-Geräts. In Adresse 400008 finden Sie den Tasterstatus. Die Adressen 400001–400006 enthalten die ADC-Portwerte.
Mit der Write-Taste können Sie Register im Slave beschreiben. Geben Sie in Adresse 400007 eine 0 oder 1 ein, um die LED ein- oder auszuschalten.
Quellcode
Beispielcode für Arduino UNO
/* Testprogramm für Arduino RS422/RS485 Shield
* Version 1.0
* Copyright (C) 2018 Hartmut Wendt www.zihatec.de
* (basiert auf Quellen von https://github.com/angeloc/simplemodbusng)
* Lizenz: GNU GPL v3
*/
#include <SimpleModbusSlave.h>
#define ledPin 12 // Onboard-LED
#define buttonPin 7 // Taster
// Register-Layout des Slaves (9 Holding-Register)
// 6 Analogeingänge, 1 Taster, 1 digitaler Ausgang, 1 Fehlerzähler
enum {
ADC0, ADC1, ADC2, ADC3, ADC4, ADC5,
LED_STATE, BUTTON_STATE, TOTAL_ERRORS,
TOTAL_REGS_SIZE
};
unsigned int holdingRegs[TOTAL_REGS_SIZE];
void setup() {
// modbus_configure(baudrate, slaveID, txEnablePin, regCount, lowLatency)
// txEnablePin = 6 (Pin 6 steuert RS485-Treiber)
modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
// modbus_update() aktualisiert holdingRegs und prüft Kommunikation
holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
// Analogwerte einlesen (6 Kanäle)
for (byte i = 0; i < 6; i++) {
holdingRegs[i] = analogRead(i);
delayMicroseconds(50);
}
// Tasterstatus in Register schreiben
byte buttonState = digitalRead(buttonPin);
holdingRegs[BUTTON_STATE] = buttonState;
// LED-Register auswerten und LED steuern (via Funktion 16)
byte ledState = holdingRegs[LED_STATE];
if (ledState) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
holdingRegs[LED_STATE] = 0;
}
}
Schaltplan
Verdrahtung der Testkomponenten am Arduino (siehe Bild im Originalprojekt).
Herstellungsprozess
- C# Queues meistern: Enqueue, Dequeue und First-In-First-Out Operationen erklärt
- LED-Helligkeit per PWM und Taster am Arduino Mega steuern
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Unopad: Nahtloser Arduino MIDI-Controller für Ableton Live
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- DIY Arduino Lenkrad / Joystick für Rennspiele – USB-HID-Umbau
- Thermistor (NTC) einfach nutzen: Schritt-für-Schritt Arduino-Anleitung
- Musikalische Töne mit Arduino erzeugen: Schritt-für-Schritt-Anleitung
- Arduino an NMEA‑0183 anschließen: Schritt-für-Schritt-Anleitung