Arduino Firmata

Aus FHEMWiki
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.
Info blue.png
Device::Firmata Updates: Bis Oktober 2020 wurde eine Kopie des Perl-Moduls Device::Firmata als Teil von FHEM zur Verfügung gestellt, zuletzt die Version 0.64 aus 05/2018. In neueren Installation von FHEM ist das Modul nicht mehr enthalten. Die aktuelle Version des Moduls gibt es über CPAN. Bei bestehenden Installationen sollte die vorhandene Kopie des Moduls gelöscht und auf die aktuelle Version umgestellt werden (siehe Punkt 1 dieses Beitrags im Forum).



FRM
Zweck / Funktion
Schnittstelle für Firmata-Devices (USB, LAN, WiFi)
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Sonstige Systeme
Modulname 10_FRM.pm
Ersteller JensB (Forum /Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Firmata-Devices

Für Arduinos (und diverse 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 Firmata-Device (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 ermöglicht 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 dem Firmata-Device 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 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 (z.B. 2.6.0) und der Version der jeweiligen Firmware (Firmata: z.B. 2.5.7, ConfigurableFirmata: z.B. 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 Firmata-Device 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 das Firmata-Device 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 Firmata-Device 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 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 Firmata-Device.

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.

FHEM FRM-Device

Bei FHEM stellt ein FRM-Device (Modul 10_FRM.pm) für die FRM-Client-Devices die Schnittstelle (das IODev) zum Firmata-Device zur Verfügung. Jeder FRM-Client erlaubt die Konfiguration eines oder mehrerer Pins eines Firmata-Devices z.B. als analoger Eingang, digitaler Ausang oder I2C-Bus. Es können so viele FRM-Clients für ein FRM-Device definiert werden, bis alle Pins zugeordnet sind. Dabei muss man darauf achten, dass nicht alle Pins alle Ein-/Ausgabemöglichkeiten besitzen. Konfiguriert man einen Pin für einen nicht unterstützen Modus so gibt es bei aktuellen Firmata-Versionen eine Fehlermeldung. Ältere Versionen (vor 2.3) schlucken Fehlkonfigurationen aber der betreffende Pin funktioniert dann nicht.

Vor dem Anlegen des FRM-Devices muss das Perl-Modul Device::Firmata installiert werden. Dies kann abhänig von den vorhandenen Voraussetzung und Vorlieben auf unterschiedliche Weise erfolgen, Details zur Installation und zum Update von Perl-Modulen finden sich im Artikel über CPAN. Eine mögliche Installationsvariante auf einem Raspberry Pi ist:

  sudo cpan install Device::Firmata

Beispiele für das Anlegen eines FRM-Devices:


 # 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 öffnet bei Netzwerkverbindungen FHEM-seitig einen Serverport (dieser wird in der define-Zeile angegeben). 'global' muss zusätzlich angegeben werden, damit der Serversocket an alle IP-Adressen gebunden wird. Ohne 'global' sind nur Verbindungen für 'localhost' möglich. Das Firmata-Device verbindet sich aktiv zu diesem Port, sonst gilt im Prinzip alles was auch für den über USB angebunden Firmata-Device gilt.

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

siehe auch: commandref/FRM FRM

Hat man mehrere FRM-Devices definiert, muss man nach dem Anlegen eines FRM-Client-Devices dessen Attribut IODev überprüfen und ggf. ändern, wenn das gewünschte FRM-Device nicht automatisch erkannt wurde.

Es folgt eine Auflistung der generischen FRM-Client-Devices. Darüber hinaus gibe es noch mehrere spezialisierte FRM-Client-Devices, vor allem für I2C-Bus-Devices (siehe commandref):


20_FRM_IN.pm

Macht einen Pin als digitalen Eingang nutzbar.

 define Firmata_IN FRM_IN 12 # definiert Pin 12 als digitalen Eingang

siehe auch: commandref/FRM_IN FRM_IN

20_FRM_OUT.pm

Macht einen Pin als digitalen Ausgang nutzbar.

 define Firmata_OUT FRM_OUT 11 # definiert Pin 11 als digitalen Ausgang

siehe auch: commandref/FRM_OUT FRM_OUT

20_FRM_AD.pm

Macht einen Pin als analogen Eingang nutzbar.

 define Firmata_ANALOG FRM_AD 17 # definiert Pin 17 als analogen Eingang

siehe auch: commandref/FRM_AD FRM_AD

20_FRM_PWM.pm

Macht einen Pin als analogen Ausgang nutzbar. Es wird ein pulsweitenmoduliertes Signal ausgegeben.

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

siehe auch: commandref/FRM_PWM FRM_PWM

20_FRM_SERVO.pm

Erlaubt die Ansteuerung eines analogen Modelbauservos über einen Pin per PWM.

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

siehe auch: commandref/FRM_SERVO FRM_SERVO

20_FRM_I2C.pm

Erlaubt das Lesen und Schreiben über den I2C-Bus am Firmata-Device.

siehe auch: commandref/FRM_I2CFRM_I2C

20_FRM_RGB.pm

Erlaubt das Ansteuern eines RGB-LED-Controller per PWM.

siehe auch: commandref/FRM_RGBFRM_RGB

20_FRM_ROTENC.pm

Erlaubt das Auswerten eines Drehgebers.

siehe auch: commandref/FRM_ROTENCFRM_ROTENC

20_FRM_STEPPER.pm

Erlaubt das Ansteuern eines Schrittmotors.

siehe auch: commandref/FRM_STEPPERFRM_STEPPER

OneWire-Firmata

Der Artikel Arduino mit OneWireFirmata beschreibt, wie man am Firmata-Device angeschlossene 1-Wire Devices in FHEM einzubindet.

siehe auch: commandref/OWX OWX