Arduino mit OneWireFirmata: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Versionshinweis)
KKeine Bearbeitungszusammenfassung
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
''Hinweis: Dieser Artikel bezieht sich auf ältere Versionen der Arduino-IDE und von FHEM. Mit den aktuellen Version sind die hier beschriebenen versionsspezifischen Anpassungen nicht mehr erforderlich. Eine Überarbeitung dieses Artikels ist geplant.''
= 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.


= Einleitung zur OneWireFirmata (ConfigurableFirmata) =
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 [https://github.com/ntruchsess/arduino/tree/DS2482/examples/ConfigurableFirmata hier] bzw kann man sich [https://github.com/ntruchsess/arduino/archive/DS2482.zip hier als zip] herunterladen.
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 [https://github.com/firmata/ConfigurableFirmata im eigenen Fork]. Den kompletten Branch kann man sich auch bequem [https://github.com/firmata/ConfigurableFirmata/archive/master.zip als zip-Archiv herunterladen]
ConfigurableFirmata kann, abhängig von den Möglichkeiten des Boards, 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 [https://github.com/ntruchsess/arduino_uip UIPEthernet Library]) oder über WiFi kommunizieren.


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 [https://github.com/ntruchsess/arduino_uip UIPEthernet-library]).
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.
 
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 [https://github.com/ntruchsess/arduino/tree/DS2482/examples/ConfigurableFirmata findet sich hier] bzw kann man sich hier als [https://github.com/ntruchsess/arduino/archive/DS2482.zip zip] herunterladen.


= Allgemeine Funktionsweise =
= Allgemeine Funktionsweise =
Der Arduino ist in der Lage bestimmte 1-Wire-kommandoabfolgen selbstständig auszuführen. Der Firmata-client (OWX(_ASYNC)) fordert vom Arduino/Firmata entweder an: 'mache eine 1-Wire-Bussuche', dann läuft diese auf dem Arduino und 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 Addresse 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. Mehr Intelligenz steckt im OneWire-firmata feature nicht drin. Der Arduino merkt sich dabei nichts. Nach dem Abarbeiten einer 1-Wire-kommandfolge und dem Verschicken des Ergebnisses vergisst er alles, was er getan hat. Mehr Eingenintelligenz wäre bei der Speicherknappheit auch nicht stabil unterzubringen, als Alternaive müsste man die Anzahl der Devices auf dem 1-Wire Bus (stark) einschränken. Das ist aber schon deutlich mehr Eigenintelligenz als die anderen Busmasterchips (DS2480 oder DS2482) mitbringen. Denen muss man jeden Einzelschritt vorgenannter Abfolgen einzeln sagen (und dabei noch auf das korrekte Timing achten). Beim Arduino bedeutet das Starten einer Bussuche, dass OWX gerade einmal 4 Bytes in einem Rutsch abschickt und dann auf das fertige Ergebnis wartet. OWX wartet dabei synchron und blockiert FHEM, OWX_ASYNC wartet in einem Protothread wärend FHEM weiterläuft und der Arduino parallel dazu den 1-Wire-bus durchsucht.
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.
 
Der FirmataScheduler wird zur Zeit von den FRM-Modulen noch nicht unterstützt. Geplant ist damit iButtons über OWID mit einer schnellen, arduinoseitig getriggerten Bussuche zu versorgen. Der Scheduler ist in der Lage Firmata-kommando-abfolgen zu speichern und zeitversetzt (auch zyklisch) abzuspielen, damit kann man sich das Senden der genannten 4 Bytes zum Starten der Bussuche sparen. Der Arduino schickt dann die Ergebnisse selbstständig im vorgegebenen Interval. Leider kann man (wg. des begrenzten Speichers) keine komplexeren Aufgaben im FirmataScheduler unterbringen, insbesonders kann man nicht einfach mal alle Device-abfragen da rein programmieren, da wäre schon nach einer Handvoll Devices der Speicher des Arduinos voll. (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.


Wenn man einen DS2482 am Arduino hat, dann ändert sich nichts prinzipielles an oben gesagtem. Mit dem DS2482 hat der Arduino ggf. ein physikalisch besser an 1-Wire angepasstes Interface und muss weniger Timing selber in Software machen. Damit sollten mehr Devices bei längerem 1-Wire-bus funktionieren, als mit der reinen Softwarelösung. Alle anderen Einschränkungen und/oder Möglichkeiten sind aber praktisch identisch.
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.


= Vorbereitungen in der Arduino IDE =
= Mögliche Funktionserweiterung =
Zur Installation auf den Arduino wird natürlich erst mal die Arduino-IDE benötigt ([http://arduino.cc/en/Guide/Libraries http://arduino.cc/en/Guide/Libraries]))
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.


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 Verzeichnis 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 gesamten Inhalt des Ordners 'arduino-configurable' in das 'libraries/Firmata'-Verzeichnis (mitsamt des Unterordners 'examples').  
= 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.


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.
Will man den DS2482 als Busmaster einsetzen, verwendet man statt eines der Standardbeispiele von ConfigurableFirmata die oben aufgeführte DS2482-ConfigurableFirmata als Sketch.  
Macht man das so, dann findet man nach einem Neustart der IDE den ConfigurableFirmata-sketch unter 'Datei'->'Sketchbook'->'sketches'->'ConfigurableFirmata'.


===== Stand 2017-12-29: =====
'''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.
Laut https://forum.fhem.de/index.php/topic,44525.msg380238.html#msg380238


verwende einen Git-Client und checke eine Version vor dem 22.11.2015 aus, also z.B. den Commit "55b4e352b5647072805adc5b82798b78788018af". Es gibt leider keine Tags vor 2.8.0.
= 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.  


= Kompilierung =
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.  
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.  
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.


Um 1wire zu nutzen muss neben OneWireFirmata auch FirmataExt aktiviert werden. FirmataExt ist für SysEx-basierte Features (wie 1-Wire) unverzichtbar. Ohne FirmataExt geht nur Digital+Analog-I/O
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.


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.
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.
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.  
= 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 connecten findet sich hier weitere Information: [http://arduino.cc/en/Guide/Windows#toc2 http://arduino.cc/en/Guide/Windows#toc2]
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 http://arduino.cc/en/Guide/Windows#toc2]


= Einbindung des Arduino in FHEM =
= Einbinden eines Arduinos mit Firmata 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 http://www.dhs-computertechnik.de/downloads/fhem-cvs.tgz]) aus dem SVN auschecken oder per updatefhem aktualisieren).
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).


  <nowiki># definiere FRM als IO-Device - Baudrate 57600 ist default in der Standardfirmata
  <nowiki># definiere FRM mit USB-Schnittstelle /dev/ttyUSB0, Baudrate 57600 ist Default für StandardFirmata
define Arduino FRM /dev/ttyUSB0@57600
define FIRMATA FRM /dev/ttyUSB0@57600</nowiki>


# definiere FRM als IO-Device über Ethernet ('global' bindet an alle IP-Addressen des Servers)
<nowiki># definiere FRM mit TCP/IP-Schnittstelle auf Port 3030
define Arduino FRM <port> global</nowiki>
define FIRMATA FRM 3030 global</nowiki>
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 {{Link2CmdRef|Anker=FRM}}.
Siehe dazu auch die {{Link2CmdRef|Anker=FRM}}.


===== Stand 2017-12-29: =====
= 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:
Da die Firmata 2_10 nicht von FHEM erkannt wird (es werden z.B. keine Pins angezeigt) (TODO: WARUM?), muss in der Datei /opt/fhem/FHEM/lib/Device/Firmata/Constants.pm eine Anpassung durchgeführt werden.
Wenn man nur ein einziges Device hat, reicht es, in Zeile 301 den Variablennamen "V_2_06" in "V_2_10" umzubenennen. Anderenfalls ist es sicherer, den gesamten Inhalt zu kopieren und unten drunter als "V_2_10" einzufügen.
 
= Einbindung der 1WireDevices in FHEM =
Ein im Anschluss daran definiertes 1-Wire Device kann dann einfach einen der Arduino-Pins als 1-Wire Busmaster 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 1-Wire unterstützen. Damit kann dann das OWX-Device angelegt werden:


  <nowiki>define &lt;device-name&gt; OWX <Firmata-Device>:&lt;arduino-pin&gt;</nowiki>
  <nowiki>define &lt;device-name&gt; OWX <Firmata-Device>:&lt;arduino-pin&gt;</nowiki>


Zb. ist beim Arduino Mini Pro der D9 = Pin9 gut geeignet.
Z.B. ist beim Arduino Mini Pro der D9 = Pin 9 gut geeignet.


  <nowiki>define OWio1 OWX Arduino:9</nowiki>
  <nowiki>define OWio1 OWX Arduino:9</nowiki>


Nach dem Definieren des 1-Wire Devices fängt dieses selbsttätig an über den Arduino-Pin nach 1-Wire Devices zu suchen und im Raum 'OWX' automatisch anzulegen.
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 [https://github.com/ntruchsess/arduino/tree/DS2482/examples/ConfigurableFirmata 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:
Wenn man die [https://github.com/ntruchsess/arduino/tree/DS2482/examples/ConfigurableFirmata 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:
  <nowiki>define &lt;device-name&gt; OWX 18</nowiki>
  <nowiki>define &lt;device-name&gt; OWX 18</nowiki>
[[Kategorie:1-Wire]]
[[Kategorie:1-Wire]]

Aktuelle Version vom 3. März 2018, 20:03 Uhr

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 Boards, 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