Arduino Firmata

Aus FHEMWiki
Version vom 3. Mai 2020, 09:53 Uhr von JensB (Diskussion | Beiträge) (Beschreibung von FRM_PWM und FRM_SERVO korrigiert.)
Zur Navigation springen Zur Suche springen

Arduino mit Firmata

Für Arduinos (und diverse Arduino kompatible Boards) gibt es eine Standardimplementierung des Kommunikationsprotokolls Firmata [1]. Mit Hilfe des Perl-Moduls Device::Firmata, auch bekannt als perl-firmata [2], kann das Firmata-Protokoll in Perl genutzt werden und mit dem Modul FRM auch in FHEM.

Für die Kommunikation zwischen FHEM (Master) und Arduino (Slave) stehen mehrere Schnittstellen zur Auswahl: RS-232, USB, Ethernet und WiFi. Insbesondere Ethernet und WiFi erlauben die Integration dezentraler IO-Periperie mit FHEM.

Firmata möglich es, mit nur geringen Arduino-Kenntnissen digitale und analoge Signale aus eigenen Schaltungen in FHEM zu verarbeiten. Dabei können Signale sowohl eingelesen als auch ausgegeben werden. Ein Verständnis der Bedienung der Arduino-IDE und elektronische Kenntnisse zum Anschluss von Sensoren und Aktoren sind natürlich erforderlich.

Arduino IDE

Zur Installation von Firmware auf den Arduino wird natürlich erst mal die Arduino-IDE (Version 1.8 oder höher) benötigt [3]. Die gibt es für die Betriebssysteme Windows, Mac OS X und Linux.

Über die Bibliotheksverwaltung der Arduino-IDE (Menü 'Sketch'->'Bibliothek einbinden'->'Bibliotheken verwalten...') stehen verschiedene Firmware-Versionen von Firmata zur Auswahl. Im folgenden wird auf die Version "Firmata by Firmata Developers" und "ConfigurableFirmata by Firmata Developers" eingegangen. Diese beiden Versionen unterscheiden sich in den unterstützten Hardware-Funktionen:

  • Firmata: digitale und analoge I/Os, Servos, I2C
  • ConfigurableFirmata: zusätzlich 1-Wire und Schrittmotoren

Bei ConfigurableFirmata ist es auch außerdem einfacher, nicht benötigte Funktionen zu deaktivieren, damit die Arduino-Firmware möglichst wenig Speicher belegt. Wenn man den zusätzlichen Funktionsumfang von ConfigurableFirmata nicht benötigt, kann man mit etwas Geschick durch Auskommentieren von nicht benötigtem Code aus Firmata z.T. ein noch kompakteres Ergebnis erzielen (das ist aber nur etwas für Fortgeschrittene).

Bei Firmata ist zwischen der Firmata-Protokoll-Version (aktuell 2.6.0) und der Version der jeweiligen Firmware (Firmata: aktuell 2.5.7, ConfigurableFirmata: aktuell 2.10.0) zu unterscheiden, die insbesondere bei ConfigurableFirmata voneinander unabhängig sind.

Nach Installation der gewünschten Firmata-Firmware wählt man eines der funktionsfertigen Beispiele über das Arduino-IDE Menü 'Datei'->'Beispiele'->'Firmata' bzw. 'Datei'->'Beispiele'->'ConfigurableFirmata' aus. Je nach ausgewähltem Beispielprojekt sind noch Anpassungen direkt im Sketch oder in einer zusätzlichen Konfigurationsdatei erforderlich (z.B. um für Ethernet- und WiFi-Schnittstellen die Netzwerkparameter einzustellen).

Über das Arduino-IDE Menü 'Werkzeuge'->'Bords' wählt man das Board aus, das dem eigenen Arduino entspricht. Fehlt das Board in der Auswahl, kann die erforderliche Unterstützung oft über das Menü 'Werkzeuge'->'Bords'->'Boardverwalter...' nachinstalliert werden. Ansonsten hilft ein Blick auf die Hersteller-Webseiten des Boards.

Ist der Arduino korrekt angeschlossen, drückt man den 'Upload'-Knopf (der mit dem Rechspfeil oben links), um den Arduino-Sketch zu kompilieren und auf das Board hochzuladen. Die Vorgehensweise zum Hochladen ist sehr stark davon abhängig, welches Board man verwendet und mit welcher Technik es angeschlossen ist. Bitte die jeweiligen Angaben des Board-Herstellers beachten.

Wer zum ersten mal mit der Arduino-IDE arbeitet, sollte statt Firmata zunächst das Standard Arduino Beispielprojekt 'Blink' auswählen und es auf dem Arduino installieren. Sobald das klappt, kann man mit Firmata weiter machen.

Firmata mit Ethernet oder WiFi

Vor dem Kompilieren muss man unbedingt die Netzwerkparameter anpassen, d.h. die IP-Adresse des FHEM-Servers und den Port des FRM-Moduls eintragen (ggf. auch eine neue eindeutige MAC-Adresse), bei WiFi auch die SSID und den PSK. In älteren Firmata-Versionen und bei ConfigurableFirmata geschieht das direkt im Sketch. Aktuelle Firmata-Versionen haben dazu eine getrennte Konfigurationsdatei (ethernetConfig.h bzw. wifiConfig.h), so dass keine Änderungen am Sketch erforderlich sind.

Falls der Speicherbedarf der kompilierten Arduino-Firmware die Möglichkeiten des Boards übersteigt (insbesondere bei Verwendung eines ENC28J60-Ethernet-Shields [4] in Kombination mit einem "kleinen" Arduiono wie den Uno oder Nano) kann man bei Verwendung von ConfigurableFirmata nicht benötigten Features im Sketch auskommentieren. Wenn der Speicherbedarf nur "knapp" ausreicht, läuft die Firmware u.U. trotzdem nicht zuverlässig.

Als ersten Funktionstest für die Netzwerkverbindung empfiehlt sich ein Ping von FHEM zum Arduino.

Sonderfälle

Je nach verwendetem Board sind u.U. individuelle Besonderheiten zu berücksichtigen. Hier ein paar Beispiele:

Ein MEGA256 z.B. benutzt einen anderen Pin als SS (Slave select) zur Kommunikation mit dem Ethernetmodul. Man muss der Firmata im Setup mitteilen, welche Pins zu ignorieren sind, damit es keine Wechselwirkungen zwischen Firmata und Ethernet Library gibt. Das ist im ConfigurableFirmata-Sketch [5] vorbereitet und muss (wenn man etwas anderes als ein Standard-Ethernetshield am Uno verwendet) geeignet angepasst werden (Beim Mega muss man z.B. den Pin 10 ignorieren und Pin 53 als hardcodiert auf Output stellen). Das gleiche gilt, wenn man eine andere Hardware (z.B. mit ENC28J60 anstelle des WizNet W5100 des Ethernetshields) benutzen möchte, die einen anderen Pin als CS/SS benutzt.

FRM

Der Arduino wird in FHEM über das Modul 10_FRM.pm angesprochen. 10_FRM ist für andere FHEM-Module die Schnittstelle (das IODev) zum Arduino. Es lassen sich jeweils so viele Ein/Ausgabe Devices pro Arduino konfigurieren, wie dieser physikalisch besitzt (natürlich muss man darauf achten, dass nicht alle Arduino-Pins alle Ein-/Ausgabemöglichkeiten besitzen). Konfiguriert man einen Pin für einen nicht unterstützen Modus so gibt es mit der aktuellen Firmata-Version direkt einen Fehler - ältere Versionen (vor 2.3) schlucken Fehlkonfigurationen einfach so, der betreffende Pin funktioniert dann aber nicht.

Hier ein kurzer Ausschnitt aus der fhem.cfg:


# definiere FRM mit USB-Schnittstelle /dev/ttyUSB0, Baudrate 57600 ist Default für StandardFirmata
 define FIRMATA FRM /dev/ttyUSB0@57600
# definiere FRM mit TCP/IP-Schnittstelle auf Port 3030
 define FIRMATA FRM 3030 global

FRM macht bei Netzwerkverbindungen FHEM-seitig einen Serverport auf (dieser wird in der define-Zeile angegeben). 'global' muss zusätzlich angegeben werden, damit der Serversocket an alle IP-addressen gebunden wird. (Sonst wird nur 'localhost' verwendet, was nicht funktionieren würde). Der Arduino verbindet sich aktiv zu diesem Port, sonst gilt im Prinzip alles was auch für den über USB angebunden Arduino gilt.

# für alle analogen Eingangs-Pins
 attr FIRMATA sampling-interval 1000 # [ms] - maximal 16384 setzbar

siehe auch: commandref/FRM FRM

20_FRM_IN.pm

Macht einen Arduino-pin als digitalen Eingang nutzbar.

define Firmata_IN FRM_IN 12 # definiert Arduino Pin 12 als digitalen Eingang

siehe auch: commandref/FRM_IN FRM_IN

20_FRM_OUT.pm

Macht einen Arduino-pin als digitalen Ausgang nutzbar.

define Firmata_OUT FRM_OUT 11 # definiert Arduino Pin 11 als digitalen Ausgang

siehe auch: commandref/FRM_OUT FRM_OUT

20_FRM_AD.pm

Macht einen Arduino-pin als analogen Eingang nutzbar.

define Firmata_ANALOG FRM_AD 17 # definiert Arduino Pin 17 als analogen Eingang

siehe auch: commandref/FRM_AD FRM_AD

20_FRM_PWM.pm

Macht einen Arduino-pin als analogen Ausgang nutzbar. Es wird ein pulsweitenmoduliertes Signal ausgegeben.

define Firmata_ANALOG FRM_PWM 10 # definiert Arduino Pin 10 als PWM-Ausgang

siehe auch: commandref/FRM_PWM FRM_PWM

20_FRM_SERVO.pm

Erlaubt die Ansteuerung von analogen Modelbauservos (Ansteuerung über PWM) am Arduino.

define Firmata_ANALOG FRM_SERVO 9 # definiert Arduino Pin 9 als Servo-Ausgang

siehe auch: commandref/FRM_SERVO FRM_SERVO

20_FRM_I2C.pm

Erlaubt das Auslesen von über I2C angeschlossenen ICs

siehe auch: commandref/FRM_I2CFRM_I2C

Arduino mit OneWireFirmata

die Seite Arduino mit OneWireFirmata beschreibt, wie es möglich ist, mit einer um OneWire erweiterten Version der Standard Firmata an den Arduino angeschlossene 1-Wire Devices in FHEM einzubinden.

siehe auch: commandref/OWX OWX