Arduino Firmata

Aus FHEMWiki

Arduino mit Firmata

Für den Arduino gibt es ein StandardProtokoll Firmata.[[1]]. Mit der 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 Messwerte aus eigenen Schaltungen über einen Arduino in FHEM einzulesen. Ein Verständnis der Bedienung der Arduino-IDE ist und elektronische Kenntnisse zum Anschluss von Sensoren sind natürlich erforderlich.

Die in der Arduino-IDE enthaltene StandardFirmata kommuniziert über USB. Ihre Weiterentwicklung (die ConfigurableFirmata) muss man noch separat herunterladen und damit die in der IDE enthaltene Firmata-Library (komplett) ersetzen.

Arduino IDE

Zur Installation auf den Arduino wird natürlich erst mal die Arduino-IDE benötigt (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 Wenn man die ConfigurableFirmata installiert hat, findet sich diese genauso bei den Beispielen für Firmata.

Installation ConfigurableFirmata

Die ConfigurableFirmata ersetzt die vorhandene Firmata-library komplett. Die mitgelieferte Firmata befindet sich typischerweise:

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:
Mac OSX:
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/avr/libraries/Firmata
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/sam/libraries/Firmata

Windows:
/Program\ Files/arduino-1.5.x/hardware/arduino/avr/libraries/Firmata
/Program\ Files/arduino-1.5.x/hardware/arduino/sam/libraries/Firmata

Linux:
~/arduino-1.5.x/hardware/arduino/avr/libraries/Firmata
~/arduino-1.5.x/hardware/arduino/sam/libraries/Firmata

Dieses Verzeichniss 'Firmata' also löschen oder umbenennen und die Configurable-firmata aus der 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:

<Arduino-Direktory>/libraries/Firmata/Firmata.h
<Arduino-Direktory>/libraries/Firmata/Firmata.cpp
<Arduino-Direktory>/libraries/Firmata/Boards.h
<Arduino-Direktory>/libraries/Firmata/utility/...usw...

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:

'git clone https://github.com/firmata/arduino.git Firmata'

anschließend ins von clone neu erstellte Verzeichnis wechseln und dort eingeben:

'git checkout configurable'

ConfigurableFirmata und Ethernet

Die Unterstützung für Ethernet ist mittlerweile in der Configurable-Firmata enthalten.

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).

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.

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 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, die einen anderen Pin als CS/SS benutzt.

Die für den ENC28J80 benötigte UIPEthernet-library findet sich hier.

FRM

Der Arduino wird in FHEM über das Modul 10_FRM.pm angesprochen. 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 <devicename> FRM <port>

Hier mal ein kurzer Ausschnitt aus der fhem.cfg:


# 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

Seit Anfang März 2013 unterstützt FRM auch über Ethernet angebundene Arduinos:

define FIRMATA FRM <port> [global]

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.

siehe auch: CommandRef 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

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

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

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 analogen Ausgang

siehe auch: CommandRef FRM_PWM

20_FRM_SERVO.pm

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

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

siehe auch: CommandRef FRM_SERVO

20_FRM_I2C.pm

Erlaubt das Auslesen von über I2C angeschlossenen ICs

siehe auch: CommandRef FRM_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