Arduino mit OneWireFirmata
Einleitung zur OneWireFirmata (ConfigurableFirmata)
mit dem Modul 10_FRM.pm kann man einen Arduino als OneWire-Busmaster für das Modul 00_OWX.pm benutzen. Auf dem Arduino muss dazu eine erweiterte Version der Firmata-Firmware geladen werden. Unterstützt werden im prinzip alle Arduino-Versionen. Auf Arduinos mit nur 16kb RAM (MEGA168P) muss man die Zahl der eingebauten Features reduzieren, auf allen Arduinos mit mehr als 16kb Ram (MEGA328P aufwärts) läuft die Firmware unverändert.
Die aktuelle Arduino-IDE bringt zwar schon eine Version der StandardFirmata mit, diese enthält aber noch keine Unterstützung für OneWire. Diese findet man im 'configurable'-branch des Firmata repositories. Den kompletten Branch kann man sich auch bequem als zip-Archiv herunterladen
Die ConfigurableFirmata kommuniziert mit FHEM über den USB-anschluss oder Ethernet (sowohl original EthernetShield, 'Arduino Ethernet' als auch ENC28J60 basierte Boards werden unterstützt, letztere unter Verwendung der UIPEthernet-library).
Alternativ kann man einen DS2482 als 1-Wire-Busmaster an den I2C-Bus des Arduino anschließen. Die nötige ConfigurableFirmata mit DS2482-Unterstützung findet sich hier bzw kann man sich hier als zip herunterladen.
Vorbereitungen in der Arduino IDE
Zur Installation auf den Arduino wird natürlich erst mal die Arduino-IDE benötigt (http://arduino.cc/en/Guide/Libraries))
Hat man das 'libraries' Verzeichnis seiner Arduino-ide-installation gefunden (unter Ubuntu z.B. unter /usr/share/arduino/libraries/), gibt es dort normalerweise schon ein Verzeichnis 'Firmata'. Falls nicht, muss dieses angelegt werden. Die in dem Verzeichniss befindlichen Dateien 'Firmata.h', 'Firmata.cpp' und 'Boards.h' müssen durch die im arduino-configurable.zip-file enthaltenen Versionen ersetzt werden. Am besten kopiert man einfach den gesammten Inhalt des Ordners 'arduino-configurable' in das 'libraries/Firmata'-Verzeichnis (mitsammt des Unterordners 'examples').
Anschließend sollte man noch den Unterordner 'ConfigurableFirmata' aus den soeben kopierten Examples in sein Sketchbook kopieren. Wichtig: der Ordnername darf nicht umbenannt werden ansonsten erkennt die Arduino-IDE das Verzeichnis nicht als korrekten Sketch. Macht man das so, dann findet man nach einem Neustart der IDE den ConfigurableFirmata-sketch unter 'Datei'->'Sketchbook'->'sketches'->'ConfigurableFirmata'.
Kompilierung
Wenn man die in dieser neuen Firmataversion eingebauten Features reduzieren möchte (weil man nur eine MEGA168P verwenden will und z.B. gar keine Servos ansteuern möchte), muss man nur im 'ConfigurableFirmata'-sketch die entsprechenden includes auskommentieren.
Werden aufgrund der Sketchgröße einige Features auskommentiert und gibt es bei der ersten Kompilierung Fehler, so muss der Sketch erstmalig mit allen Features kompiliert werden. Erst anschließend kann auf das notwendige Maß der Umfang reduziert werden.
Grundsätzlich ist empfohlen nur die wirklich benutzten Features zu aktivieren. Beispielsweise passen I2C und 1Wire nicht gleichzeitig mit UIPEthernet ins RAM eines ATMega328. Kann man zwar noch flashen, stürzt dann aber mangels ausreichend Heap sofort ab. Also erst mal sparsam anfangen und nur die Dinge, die wirklich genutzt werden gleichzeitig aktivieren. Wenn es geht, dann eine fixe IP verwenden (kein DHCP), dann kann man UDP in der uipethernet-conf.h abstellen - das spart ca. 5kb Flash und ein paar 100 Bytes RAM.
Naja - hat man es erst mal geschafft, dann muss man nur noch unter 'Tools'->'Board' den eigenen Arduino, 'Tools'->'Programmer' den verwendeten Programmieradapter sowie unter 'Tools'->'serieller Port' den korrekten Port 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
Einbindung des Arduino in FHEM
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) aus dem SVN auschecken oder per updatefhem aktualisieren).
# definiere FRM als IO-Device - Baudrate 57600 ist default in der Standardfirmata define Arduino FRM /dev/ttyUSB0@57600 # definiere FRM als IO-Device über Ethernet ('global' bindet an alle IP-Addressen des Servers) define Arduino FRM <port> global
siehe dazu auch die commendref
Einbindung der 1WireDevices in FHEM
Ein im Anschluss daran definiertes FHEM und 1-Wire-device kann dann einfach einen der Arduino-pins als OneWireBusmaster nutzen. Das funktioniert an allen Pins, die digital-io unterstützen. Wenn man das FRM device schon definiert hat, findet man im laufenden FHEM unter den FRM-attributen einen Eintrag: 'onewire-pins', dieser listet alle Pins auf, die OneWire unterstützen:
define OWX <arduino-pin>
Nach dem definieren des OWX-Moduls fängt dieses selbsttätig an über den Arduino-pin nach OneWire-devices zu suchen und im Raum 'OWX' automatisch anzulegen.
Wenn man die DS2482-Firmata benutzt, dann findet man beim FRM-device unter 'onewire-pins' nur die I2C-Pins. Das sind z.B. bei einem Uno/Nano die Pins 18 und 19 (das entspricht den Analogpins 4 und 5). Einen der beiden muss man dann bei der Definition des OWX-Moduls angeben um die DS2482-Unterstützung zu aktivieren:
define OWX 18