Arduino Firmata: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
(14 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Arduino mit Firmata ==
{{Hinweis|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|CPAN]]. Bei bestehenden Installationen sollte die vorhandene Kopie des Moduls gelöscht und auf die aktuelle Version umgestellt werden (siehe Punkt 1 dieses {{Link2Forum|Topic=114552|Message=1087982|Linktext=Beitrag}}s im Forum).
Für den Arduino gibt es ein StandardProtokoll Firmata.[[http://firmata.org]]. Mit der perl-firmata[https://github.com/ntruchsess/perl-firmata [6]] ist das Protokoll in perl einfach nutzbar und mit dem Modul [[FRM]] in FHEM eingebunden. Damit ist es möglich mit nur geringen Arduino-kenntnissen (Bedienung der Arduino-IDE ist und elektronische Kenntnisse zum Anschluss von Sensoren sind natürlich erforderlich) Messwerte aus eigenen Schaltungen über einen Arduino in FHEM einzulesen.
}}
Die in der Arduino-IDE enthaltene StandardFirmata kommuniziert über USB. Ihre Weiterentwicklung (die ConfigurableFirmata) muss man noch [https://github.com/firmata/arduino/archive/configurable.zip separat herunterladen] und damit die in der IDE enthaltene Firmata-library (komplett) ersetzen.
 
{{Infobox Modul
|ModPurpose=Schnittstelle für Firmata-Devices (USB, LAN, WiFi)
|ModType=d
|ModCmdRef=FRM
|ModForumArea=Sonstige Systeme
|ModTechName=10_FRM.pm
|ModOwner=JensB ({{Link2FU|14024|Forum}}/[[Benutzer Diskussion:JensB|Wiki]])
}}
 
== Firmata-Devices ==
 
Für Arduinos (und diverse kompatible Boards) gibt es eine Standardimplementierung des Kommunikationsprotokolls ''Firmata'' [https://github.com/firmata/protocol]. Mit Hilfe des Perl-Moduls ''Device::Firmata'', auch bekannt als perl-firmata [https://github.com/ntruchsess/perl-firmata], kann das Firmata-Protokoll in Perl genutzt werden und mit dem Modul [[#FRM|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 ===
=== Arduino IDE ===
Zur Installation auf den Arduino wird natürlich erst mal die Arduino-IDE benötigt ([http://arduino.cc/en/Guide/HomePage http://arduino.cc/en/Guide/HomePage]). Die aktuelle Version der IDE enthält auch die StandardFirmata Firmware fertig zum Flashen auf den Arduino.
Diese findet man unter 'Datei'->'Beispiele'->'Firmata'->'StandardFirmata'. Einfach öffnen, unter 'Tools'->'Board' den eigenen Arduino auswählen und mit dem Upload-knopf (der Rechtspfeil im Kreis oben links) den geladenen Sketch compilieren und auf das Board hochladen. Falls man unter Windows Probleme hat, den Arduino über USB zu connecten, findet sich hier weitere Informatation: [http://arduino.cc/en/Guide/Windows#toc2 http://arduino.cc/en/Guide/Windows#toc2]
Wenn man die ConfigurableFirmata installiert hat, findet sich diese genauso bei den Beispielen für Firmata.


=== Installation ConfigurableFirmata ===
Zur Installation von Firmware auf dem Firmata-Device wird natürlich erst mal die Arduino-IDE (Version 1.8 oder höher) benötigt [https://www.arduino.cc/en/main/software]. Die gibt es für die Betriebssysteme Windows, Mac OS X und Linux.
Die ConfigurableFirmata <b>ersetzt</b> die vorhandene Firmata-library <b>komplett</b>. Die mitgelieferte Firmata befindet sich typischerweise:


<nowiki>
Über die Bibliotheksverwaltung der Arduino-IDE (Menü 'Sketch'-&gt;'Bibliothek einbinden'-&gt;'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:
Arduino 1.0.x:
Mac OSX: /Applications/Arduino.app/Contents/Resources/Java/libraries/Firmata
Windows: c:/Program\ Files/arduino-1.x/libraries/Firmata
Linux: ~/arduino-1.x/libraries/Firmata


Arduino 1.5.x:
* Firmata: digitale und analoge I/Os, Servos, I2C
Mac OSX:
* ConfigurableFirmata: zusätzlich 1-Wire und Schrittmotoren
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/avr/libraries/Firmata
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/sam/libraries/Firmata


Windows:
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).
/Program\ Files/arduino-1.5.x/hardware/arduino/avr/libraries/Firmata
/Program\ Files/arduino-1.5.x/hardware/arduino/sam/libraries/Firmata


Linux:
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.
~/arduino-1.5.x/hardware/arduino/avr/libraries/Firmata
~/arduino-1.5.x/hardware/arduino/sam/libraries/Firmata</nowiki>


Dieses Verzeichniss 'Firmata' also <b>löschen oder umbenennen</b> und die Configurable-firmata aus der [https://github.com/firmata/arduino/archive/configurable.zip zip-Datei] an die gleiche Stelle (also in ein neues Verzeichniss 'Firmata') entpacken. Nachher muss sich alles wie vorher im Verzeichniss Firmata befinden. Also so:
Nach Installation der gewünschten Firmata-Firmware wählt man eines der funktionsfertigen Beispiele über das Arduino-IDE Menü 'Datei'-&gt;'Beispiele'-&gt;'Firmata' bzw. 'Datei'-&gt;'Beispiele'-&gt;'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).


<nowiki>
Über das Arduino-IDE Menü 'Werkzeuge'-&gt;'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'-&gt;'Bords'-&gt;'Boardverwalter...' nachinstalliert werden. Ansonsten hilft ein Blick auf die Hersteller-Webseiten des Boards.
<Arduino-Direktory>/libraries/Firmata/Firmata.h
<Arduino-Direktory>/libraries/Firmata/Firmata.cpp
<Arduino-Direktory>/libraries/Firmata/Boards.h
<Arduino-Direktory>/libraries/Firmata/utility/...usw...</nowiki>


alternativ zur Zip-datei kann man die Configurable-Firmata natürlich auch direkt aus Github heraus clonen. Dazu im Verzeichniss <Arduino-Direktory>/libraries/ folgendes eingeben:
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.
<nowiki>'git clone https://github.com/firmata/arduino.git Firmata'</nowiki>
anschließend ins von clone neu erstellte Verzeichnis wechseln und dort eingeben:
<nowiki>'git checkout configurable'</nowiki>


=== ConfigurableFirmata und Ethernet ===
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.


Die Unterstützung für Ethernet ist mittlerweile [https://github.com/firmata/arduino/blob/configurable/examples/ConfigurableFirmata/ConfigurableFirmata.ino in der Configurable-Firmata] enthalten.
=== Firmata mit Ethernet oder WiFi ===


Im Sketch muss man unbedingt die IP-konfiguration anpassen, d.h. die IP-addresse und Port des FHEM-servers eintragen (ggf. auch eine neue mac-addresse). Falls der Speicher des Arduinos nicht reicht (insbesonders bei Verwendung eines ENC28J60-shields passt die Configurable-firmata nicht mehr mit allen Features auf einen Uno oder Nano) einfach die includes der nicht benötigten Features im sketch auskommentieren. (Wenn man Servo oder I2C-unterstützung weglassen möchte bitte vorher einmalig den sketch mit allen Features compilieren, sonst treten Fehler beim compilieren der library-klassen wg. fehlendem Include von Servo.h oder Wire.h) auf. Das gleiche gilt, wenn man in der IDE irgendwas ändert, das einen kompletten Neubuild des sketches triggert (was z.B. beim Wechsel des gewählten Boards passiert).
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.


<p>Getestet ist das ganze mit UNO R3 bzw. Mega 2560 + EthernetShield und zusätzlich mit UNO+Mega+Nano in Verbindung mit ENC28J60. Andere Arduinos als der Uno benötigen ggf. Anpassungen in der Setup/Reset Funktion.</p>
Falls der Speicherbedarf der kompilierten Firmware die Möglichkeiten des Boards übersteigt (insbesondere bei Verwendung eines ENC28J60-Ethernet-Shields [https://github.com/ntruchsess/arduino_uip] 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.
<p>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 Ethernetlibrary gibt. Das ist im Configurable.ino-sketch [https://github.com/firmata/arduino/blob/configurable/examples/ConfigurableFirmata/ConfigurableFirmata.ino#L231 ab Zeile 231 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 welche einen anderen Pin als CS/SS benutzt.</p>
<p>Die für den ENC28J80 benötigte [https://github.com/ntruchsess/arduino_uip UIPEthernet-library findet sich hier].</p>


= FRM =
Als ersten Funktionstest für die Netzwerkverbindung empfiehlt sich ein Ping von FHEM zum Firmata-Device.
Der Arduino wird in FHEM über das Modul 10_FRM.pm angesprochen (dazu bitte die aktuelle Development-version herunterladen ([http://www.dhs-computertechnik.de/downloads/fhem-cvs.tgz http://www.dhs-computertechnik.de/downloads/fhem-cvs.tgz]) aus dem SVN auschecken oder per updatefhem aktualisieren).
10_FRM ist sozusagen die Basis (das IODev) für die anderen Module. 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 (2.3) direkt einen Fehler - ältere Versionen schlucken so eine Fehlkonfiguration einfach so, der betreffende Pin funktioniert dann einfach nicht.


define &lt;devicename&gt; FRM &lt;port&gt;
=== Sonderfälle ===


Hier mal ein kurzer Ausschnitt aus der fhem.cfg:
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 [https://github.com/firmata/arduino/blob/configurable/examples/ConfigurableFirmata/ConfigurableFirmata.ino] 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 [[#CPAN|Artikel über CPAN]]. Eine mögliche Installationsvariante auf einem Raspberry Pi ist:
 
<pre>
  sudo cpan install Device::Firmata
</pre>
 
Beispiele für das Anlegen eines FRM-Devices:


<hr />
<hr />
<nowiki># definiere FRM als IO-Device - Baudrate 57600 ist default in der Standardfirmata
define FIRMATA FRM /dev/ttyUSB0@57600
attr FIRMATA loglevel 6
attr FIRMATA sampling-interval 1000 # Wert ist in ms und 14Bit breit, also nur bis 16384 setzbar (Beschränkung des Firmata-protokolls) - gilt für alle Pins</nowiki>
Seit Anfang März 2013 unterstützt FRM auch über Ethernet angebundene Arduinos:


<nowiki>define FIRMATA FRM &lt;port&gt; [global]</nowiki>
  <nowiki># definiere FRM mit USB-Schnittstelle /dev/ttyUSB0, Baudrate 57600 ist Default für StandardFirmata
FRM macht fhem-seitig einen Serverport auf (dieser wird in der define-zeile angegeben). 'global' muss angegeben werden, damit der Serversocket an alle IP-addressen gebunden wird. (Sonst nur 'localhost', was hier wohl nicht funktionieren würde). Der Arduino verbindet aktiv zu diesem Port, sonst gilt im Prinzip alles was auch für den über USB angebunden Arduion gilt.
  define FIRMATA FRM /dev/ttyUSB0@57600</nowiki>
 
  <nowiki># definiere FRM mit TCP/IP-Schnittstelle auf Port 3030
  define FIRMATA FRM 3030 global</nowiki>
 
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.
 
  <nowiki># für alle analogen Eingangs-Pins
  attr FIRMATA sampling-interval 1000 # [ms] - maximal 16384 setzbar</nowiki>
 
siehe auch: {{Link2CmdRef|Anker=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 {{Link2CmdRef}}):
 
 
=== 20_FRM_IN.pm ===
=== 20_FRM_IN.pm ===
Macht einen Arduino-pin als digitalen Eingang nutzbar.


<nowiki>define Firmata_IN FRM_IN 12 # definiert Arduino Pin 12 als digitalen Eingang</nowiki>
Macht einen Pin als digitalen Eingang nutzbar.
 
  <nowiki>define Firmata_IN FRM_IN 12 # definiert Pin 12 als digitalen Eingang</nowiki>
siehe auch: {{Link2CmdRef|Anker=FRM_IN}} FRM_IN
 
=== 20_FRM_OUT.pm ===
=== 20_FRM_OUT.pm ===
Macht einen Arduino-pin als digitalen Ausgang nutzbar.


<nowiki>define Firmata_OUT FRM_OUT 11 # definiert Arduino Pin 11 als digitalen Ausgang</nowiki>
Macht einen Pin als digitalen Ausgang nutzbar.
 
  <nowiki>define Firmata_OUT FRM_OUT 11 # definiert Pin 11 als digitalen Ausgang</nowiki>
 
siehe auch: {{Link2CmdRef|Anker=FRM_OUT}} FRM_OUT
 
=== 20_FRM_AD.pm ===
=== 20_FRM_AD.pm ===
Macht einen Arduino-pin als analogen Eingang nutzbar.


<nowiki>define Firmata_ANALOG FRM_AD 17 # definiert Arduino Pin 17 als analogen Eingang</nowiki>
Macht einen Pin als analogen Eingang nutzbar.
 
  <nowiki>define Firmata_ANALOG FRM_AD 17 # definiert Pin 17 als analogen Eingang</nowiki>
 
siehe auch: {{Link2CmdRef|Anker=FRM_AD}} FRM_AD
 
=== 20_FRM_PWM.pm ===
=== 20_FRM_PWM.pm ===
Macht einen Arduino-pin als analogen Ausgang nutzbar. Es wird ein pulsweitenmoduliertes Signal ausgegeben.
 
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: {{Link2CmdRef|Anker=FRM_PWM}} FRM_PWM


=== 20_FRM_SERVO.pm ===
=== 20_FRM_SERVO.pm ===
Erlaubt die Ansteuerung von analogen Modelbauservos (Ansteuerung über PWM) am Arduino.
 
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: {{Link2CmdRef|Anker=FRM_SERVO}} FRM_SERVO


=== 20_FRM_I2C.pm ===
=== 20_FRM_I2C.pm ===
Erlaubt das Auslesen von über I2C angeschlossenen ICs


=== Arduino mit OneWireFirmata ===
<p>Erlaubt das Lesen und Schreiben über den I2C-Bus am Firmata-Device.</p>
die Seite [[Arduino mit OneWireFirmata]] beschreibt, wie es möglich ist, mit einer um OneWire erweiterten Version der StandartFirmata an den Arduino angeschlossene 1-Wire Devices in FHEM einzubinden.
siehe auch: {{Link2CmdRef|Anker=FRM_I2C}}FRM_I2C
 
=== 20_FRM_RGB.pm ===
 
<p>Erlaubt das Ansteuern eines RGB-LED-Controller per PWM.</p>
siehe auch: {{Link2CmdRef|Anker=FRM_RGB}}FRM_RGB
 
=== 20_FRM_ROTENC.pm ===
 
<p>Erlaubt das Auswerten eines Drehgebers.</p>
siehe auch: {{Link2CmdRef|Anker=FRM_ROTENC}}FRM_ROTENC
 
=== 20_FRM_STEPPER.pm ===
 
<p>Erlaubt das Ansteuern eines Schrittmotors.</p>
siehe auch: {{Link2CmdRef|Anker=FRM_STEPPER}}FRM_STEPPER
 
=== OneWire-Firmata ===
 
<p>Der Artikel [[Arduino mit OneWireFirmata]] beschreibt, wie man am Firmata-Device angeschlossene 1-Wire Devices in FHEM einzubindet.</p>
siehe auch: {{Link2CmdRef|Anker=OWX}} OWX


[[Kategorie:Other_Components]]
[[Kategorie:Arduino]]
[[Kategorie:Arduino]]
[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]

Aktuelle Version vom 8. Dezember 2022, 21:08 Uhr

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