Arduino mit OneWireFirmata
Einleitung
Ein Adruino mit der Firmware ConfigurableFirmata kann als 1-Wire-Busmaster eingesetzt werden. Dafür kommen fast alle Arduino-Boards in Frage. Bei Boards mit wenig Speicher (z.B. MEGA168P) bzw. beim Einbinden großer Programmbibliotheken (z.B. für den ENC28J60) muss man jedoch einige Features von ConfigurableFirmata deaktivieren, um die Firmware installieren zu können.
Alternativ kann man auch einen DS2482 als 1-Wire-Busmaster an den I2C-Bus eines Arduinos anschließen. Ein ConfigurableFirmata-Sketch mit DS2482-Unterstützung findet sich hier bzw kann man sich hier als zip herunterladen.
ConfigurableFirmata kann, abhängig von den Möglichkeiten des Board, mit FHEM wahlweise seriell (z.B. über den USB-Anschluss), über Ethernet (sowohl über Ethernet Shields mit W5100 oder ENC28J60 Chip, letztere unter Verwendung der UIPEthernet Library) oder über WiFi kommunizieren.
In FHEM ist ein Firmata-Device vom Typ FRM anzulegen, das dann als IODev für ein Device vom Typ OWX oder OWX_ASYNC dient.
Allgemeine Funktionsweise
ConfigurableFirmata führt auf dem Arduino bestimmte 1-Wire-Kommandofolgen selbstständig aus. Der Firmata-Client OWX(_ASYNC) fordert z.B. von Firmata an: 'mache eine 1-Wire-Bussuche'. Die wird auf dem Arduino ausgeführt und der schickt das Ergebniss (alle gefundenen Devices) an den Firmata-Client zurück. Oder es wird angefordert: 'mache einen Bus-Reset, sprich ein bestimmtest Device mit der Adresse XXX an, schicke folgende Bytes dorthin und lese anschließend YY Bytes'. Der Arduino tut das und wenn er fertig ist, schickt er die YY Bytes an den Firmata-Client zurück. Nach dem Abarbeiten einer 1-Wire-Kommandfolge und dem Verschicken des Ergebnisses vergisst er, was er getan hat, weiß also z.B. nicht, welche 1-Wire Devices am Bus gefunden wurden. Solche Funktionen wären bei der Speicherknappheit einiger Arduinos auch nicht realisierbar. Dieser Funktionsumfang ist aber schon deutlich höher als der von anderen Busmasterchips (wie z.B. DS2480 oder DS2482). Denen muss man jedes Kommando in der Abfolge einzeln vorgeben und dabei noch auf das korrekte Timing achten. Bei ConfigurableFirmata bedeutet das Starten einer Bussuche, dass OWX nur 4 Bytes versendet und dann auf das Ergebnis wartet. Das FHEM Modul OWX wartet dabei und blockiert solange FHEM, das Modul OWX_ASYNC wartet dagegen in einem Protothread während FHEM weiter arbeitet und der Arduino parallel dazu über den 1-Wire Bus kommuniziert.
Wenn man zusätzlich einen DS2482 als Busmaster an den Arduino anschließt, dann ändert sich am oben Gesagtem nichts. Mit dem DS2482 hat der Arduino ein elektrisch etwas besser an 1-Wire angepasstes Interface und muss weniger Timing per Software machen. Dies erlaubt z.T. mehr Devices bei längerem 1-Wire Bus als es ohne zusätzlichen Busmaster möglich ist.
Mögliche Funktionserweiterung
Die Funktion "FirmataScheduler" von ConfigurableFirmata wird zur Zeit von den FHEM-Modulen FRM und OWX nicht unterstützt. Damit könnte man z.B. iButtons über OWID mit einer schnellen, arduinoseitig getriggerten Bussuche versorgen. Der Scheduler ist in der Lage Firmata-Kommandoabfolgen zu speichern und zeitversetzt (auch zyklisch) abzuspielen. Damit könnte man sich auch das Senden der genannten 4 Bytes zum Starten der Bussuche ersparen. Der Arduino würde die Ergebnisse selbstständig im vorgegebenen Interval verschicken. Je nach Arduino kann man wegen des begrenzten Speichers jedoch keine komplexeren Aufgaben im FirmataScheduler unterbringen, insbesondere kann man nicht die Kommandofolgen für mehrere Devices unterbringen (eine DS18B20 Abfrage braucht z.B. ca. 30 Bytes pro Device. Das klingt nach wenig, ist aber eine ganze Menge, wenn nur wenige 100kb verfügbar sind). Ist der Speicher zu Ende stürzt der Arduino einfach ab bzw. resettet sich.
Arduino IDE und ConfigurableFirmata
Die Installation der Arduino-IDE sowie das Auswählen und das prinzipielle Kompilieren von ConfigurableFirmata wird auf der Seite Arduino Firmata beschrieben.
Will man den DS2482 als Busmaster einsetzen, verwendet man statt eines der Standardbeispiele von ConfigurableFirmata die oben aufgeführte DS2482-ConfigurableFirmata als Sketch.
Hinweis: Dieser Sketch basiert auf einer älteren Version von ConfigurableFirmata. Sollte er mit der aktuellen Version von ConfigurableFirmata nicht mehr kompatibel sein, müsste man die relevanten Teile für den DS2482 manuell in die neue Version übertragen.
ConfigurableFirmata Features
Wenn man die Features von ConfigurableFirmata reduzieren möchte (z.B. weil man einen MEGA168P verwenden will und gar keine Servos ansteuern möchte), muss man im ConfigurableFirmata-Sketch die entsprechenden includes mit zwei vorgestellen Schrägstrichen auskommentieren.
Kommt es nach dem Auskommentiert zu Fehlern bei der ersten Kompilierung, sollte man den Sketch zunächst mit allen Features kompilieren und anschließend schrittweise wieder reduzieren.
Für 1-Wire muss neben OneWireFirmata auf jeden Fall auch FirmataExt aktiviert werden, denn ohne FirmataExt ist nur Digital- und Analog-I/O möglich.
Es wird empfohlen nur die erforderlichen Features zu aktivieren. Beispielsweise passen I2C und 1Wire nicht gleichzeitig mit UIPEthernet ins RAM eines ATMega328. Das lässt sich zwar flashen, es stürzt aber mangels ausreichend Heap-Speichers sofort ab.
Außerdem sollte man eine feste IP-Adresse vergeben statt DHCP zu verwenden. Bei UIPEthernet kann man dann UDP in der uipethernet-conf.h abstellen und das spart ca. 5kb Flash und einige 100 Bytes RAM.
Arduino Firmware Flashen
Ist das Kompilieren erfolgreich, muss man noch unter 'Tools'->'Programmer' den verwendeten Programmieradapter sowie unter 'Tools'->'serieller Port' den korrekten Port auswählen und mit dem 'Upload'-Knopf (der mit dem Rechspfeil oben link in der Arduino IDE) den geladenen Sketch auf das Board hochladen. Je nach Arduino Board sind andere Einstellungen als die hier aufgeführten und ggf. auch zusätzliche Aktionen erforderlich (z.B. zu einem bestimmten Zeitpunkt bestimmte Buttons auf dem Board drücken oder bestimmte Pins verbinden).
Falls man unter Windows Probleme hat, den Arduino über USB zu verbinden, finden sich z.B. hier weitere Informationen: http://arduino.cc/en/Guide/Windows#toc2
Einbinden eines Arduinos mit Firmata in FHEM
Ein Arduino mit Firmata wird in FHEM über das Modul 10_FRM.pm angesprochen. Dazu sollte mindestens die FRM Modul in der Version 15941 vom 20.01.2018 verwendet werden (ggf. FHEM update durchführen).
# 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.
Siehe dazu auch die commandref/FRM.
Einbinden der 1-Wire Devices in FHEM
Nachdem das FRM Device angelegt wurde, kann ein danach definiertes OWX Device einen der Arduino-Pins als 1-Wire-Busmaster nutzen. Das funktioniert bei den meisten Boards an allen Pins, die Digital-IO unterstützen. Wenn sich das Firmata Device schon verbunden hat, findet man im laufenden FHEM bei den Internals des FRM Devices den Eintrag: 'onewire-pins'. Dieser listet alle Pins auf, die 1-Wire unterstützen. Damit kann das OWX-Device angelegt werden:
define <device-name> OWX <Firmata-Device>:<arduino-pin>
Z.B. ist beim Arduino Mini Pro der D9 = Pin 9 gut geeignet.
define OWio1 OWX Arduino:9
Nach dem Definieren des OWX Devices fängt dieses selbsttätig an über den Arduino-Pin nach 1-Wire Devices zu suchen und im Raum 'OWX' automatisch anzulegen.
Wenn man die DS2482-ConfigurableFirmata benutzt, dann findet man beim FRM-Device unter 'onewire-pins' nur die I2C-Pins. Das sind z.B. bei einem Uno bzw. 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 <device-name> OWX 18