Arduino: Unterschied zwischen den Versionen

Aus FHEMWiki
KKeine Bearbeitungszusammenfassung
K (Typos)
 
(15 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Arduino zur Anbindung eigener Sensoren und Aktoren an FHEM nutzen ==
=== Generelles zu Arduino ===
Mit [http://www.arduino.cc/ Arduino]-Boards lassen sich einfach und recht preisgünstig (ab ca. 15€ Stand Juli 2012) eigene Sensoren/Aktoren an FHEM anbinden.


Das Board lässt sich recht einfach programmieren um Sensorwerte zu verarbeiten und diese z.B. per Ethernet an FHEM zu senden oder abfragen zu lassen. Über zahlreiche Schnittstellen (Standard: RS232, TWI/1-Wire, SPI, PWM, analog/digital-I/O, I2C) mit den entsprechenden Software-Libraries kann auf viele gängige Sensoren zugegriffen werden. Über Erweiterungsboards ("Shields") können die Anschlussmöglichkeiten ausgebaut werden. Zudem ist der Anschluss von Parallel-/Seriell-/I2C-LCD-Displays und SD-Karten möglich.
====Die Arduino-Initiative====


Die Boards und eine Vielfalt an Sensoren/Aktoren sind über Online-Auktionen bzw. -Anbieter einfach zu bekommen. Kommunikation mit dem Arduino ist z.B. per Netzwerk/Ethernet, WLAN, 433/868MHz/2,4GHz-RF, Bluetooth, 1-Wire etc. möglich.
Das [http://www.arduino.cc/ Arduino]-Projekt ist eine open-source-Initiative, die "easy-to-use" Hardware und Software bereitstellt. Als Hardware stehen unterschiedliche Platinen zur Verfügung, auf denen ein Microcontroller sowie grundlegende Schnittstellen, z.B. ein USB-Port bereits "ready-to-use" vorhanden sind. An diese Boards (ab ca. 20€ Stand Nov. 2016, China-Klone ab 2€) lassen sich einfach und recht preisgünstig eigene Sensoren/Aktoren an FHEM anbinden.
 
Das Board lässt sich u.A. mit Hilfe der Projekt-Software Arduino-IDE relativ einfach programmieren, um Sensorwerte zu verarbeiten und diese z.B. per Ethernet an FHEM zu senden oder abfragen zu lassen. Über zahlreiche Schnittstellen (Standard: RS232, TWI/1-Wire, SPI, PWM, analog/digital-I/O, I2C) mit den entsprechenden Software-Libraries kann auf viele gängige Sensoren zugegriffen werden. Über Erweiterungsboards ("Shields") können die Anschlussmöglichkeiten ausgebaut werden. Zudem ist der Anschluss von Parallel-/Seriell-/I2C-LCD-Displays und SD-Karten möglich. Die IDE läßt sich auch für andere Enwicklerboards nutzen, insbesondere den ESP8266 (für WLAN) oder Boards auf STM32-Basis.
 
Die Arduino-Boards bzw. Klone und eine Vielfalt an Sensoren/Aktoren sind über Online-Auktionen bzw. -Anbieter einfach zu bekommen. Kommunikation mit dem Arduino ist z.B. per Netzwerk/Ethernet, WLAN, 433/868MHz/2,4GHz-RF, Bluetooth, 1-Wire etc. möglich.
 
Bei der Anbindung der Arduinos über USB ist zu beachten, dass auf China-Klonen in der Regel ein einfacher USB-Seriell-Wandler verbaut ist, der eine eindeutige Zuordnung der Schnittstellen innerhalb des Linux-Dateisystems erschwert. Daher sind Boards mit eindeutiger Identifizierungsmöglichkeit (in der Regel auf FTDI-Basis) für derartige Anwendungsfälle besser geeignet.
 
 
====Arduino-Projekte mit Anbindung an FHEM====
 
Folgende Projekte basieren (u.A.) auf Arduino:
*[[Selbstbau_CUL]]
*[[Arduino_Firmata]] bzw. [[Arduino_mit_OneWireFirmata]]
*[[FHEMduino]]
*[[SIGNALduino]]
*[[panStamp]]s über das [[SWAP]] Protokoll per RF
*[[HomeMatic_Asksin_Library]]
*[[MySensors]] per RF oder RS485
*[[ArduCounter]]
*KeyValueProtocol (siehe {{Link2CmdRef|Anker=KeyValueProtocol}})
 
=== Beispiel: Arduino mit Ethernet ===


'''Arduino mit Ethernet'''
Eine einfache und sehr kompakte Lösung ist der Arduino Nano mit Ethernet-Shield. Der Nano hat je 8 nutzbare Analog- und Digital Ein-/Ausgänge über die sich beispielsweise Temperatursensoren, Relais etc. ansprechen lassen.
Eine einfache und sehr kompakte Lösung ist der Arduino Nano mit Ethernet-Shield. Der Nano hat je 8 nutzbare Analog- und Digital Ein-/Ausgänge über die sich beispielsweise Temperatursensoren, Relais etc. ansprechen lassen.


Zeile 17: Zeile 37:
# IP Adresse im Sketch passend zum eigenen Netzwerk ändern (steht im Sketch auf 192.168.2.44)
# IP Adresse im Sketch passend zum eigenen Netzwerk ändern (steht im Sketch auf 192.168.2.44)
# Sketch auf Arduino laden
# Sketch auf Arduino laden
# Arduino mit 5V-USB-Netzteil ans Netzwerk anschliessen
# Arduino mit 5V-USB-Netzteil ans Netzwerk anschließen
# Verbindung testen indem in einem Webbrowser <arduino_ip_adresse>/?cmd=set_D5_ON [http://192.168.2.44/?cmd=set_D5_ON] eingegeben wird (natürlich hier die im Sketch verwendete IP-Adresse angeben). Falls an Ausgang D5 eine Leuchtdiode o.ä. angeschlossen wurde sollte diese nun leuchten.
# Verbindung testen indem in einem Webbrowser <arduino_ip_adresse>/?cmd=set_D5_ON [http://192.168.2.44/?cmd=set_D5_ON] eingegeben wird (natürlich hier die im Sketch verwendete IP-Adresse angeben). Falls an Ausgang D5 eine Leuchtdiode o.ä. angeschlossen wurde sollte diese nun leuchten.
# Wenn das geklappt hat sollte sich der Ausgang auch aus der FHEM-Kommandozeile ausschalten lassen mit { GetHttpFile('192.168.2.44:80', '/?cmd=set_D5_OFF');; } -> natürlich wieder die im Sketch verwendete IP-Adresse verwenden.
# Wenn das geklappt hat sollte sich der Ausgang auch aus der FHEM-Kommandozeile ausschalten lassen mit { GetHttpFile('192.168.2.44:80', '/?cmd=set_D5_OFF');; } -> natürlich wieder die im Sketch verwendete IP-Adresse verwenden.
Zeile 24: Zeile 44:
Auszug aus der ''fhem.cfg''
Auszug aus der ''fhem.cfg''
  <nowiki>define arduinobutton FS20 55d1 00
  <nowiki>define arduinobutton FS20 55d1 00
attr arduinobutton room Arduino
  attr arduinobutton room Arduino
define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton
  define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton
attr FileLog_arduinobutton room Arduino
  attr FileLog_arduinobutton room Arduino
define arduinoswitchon notify FS20_55d100:on { GetHttpFile(&quot;arduino:80&quot;,&quot;/?cmd=set_D5_ON&quot;)}
  define arduinoswitchon notify FS20_55d100:on { GetHttpFile(&quot;arduino:80&quot;,&quot;/?cmd=set_D5_ON&quot;)}
attr arduinoswitchon room Arduino
  attr arduinoswitchon room Arduino
define arduinoswitchoff notify FS20_55d100:off { GetHttpFile(&quot;arduino:80&quot;,&quot;/?cmd=set_D5_OFF&quot;)}
  define arduinoswitchoff notify FS20_55d100:off { GetHttpFile(&quot;arduino:80&quot;,&quot;/?cmd=set_D5_OFF&quot;)}
attr arduinoswitchoff room Arduino
  attr arduinoswitchoff room Arduino
define weblink_arduinobutton weblink fileplot FileLog_arduinobutton:fs20:CURRENT
  define weblink_arduinobutton weblink fileplot FileLog_arduinobutton:fs20:CURRENT
attr weblink_arduinobutton label &quot;arduinobutton Min $data{min1}, Max $data{max1}, Last $data{currval1}&quot;
  attr weblink_arduinobutton label &quot;arduinobutton Min $data{min1}, Max $data{max1}, Last $data{currval1}&quot;
attr weblink_arduinobutton room Arduino</nowiki>
  attr weblink_arduinobutton room Arduino</nowiki>




Zeile 40: Zeile 60:
Auszug aus der ''fhem.cfg''
Auszug aus der ''fhem.cfg''
  <nowiki>define arduinogetsensorvalues at +*00:05:00 {\  
  <nowiki>define arduinogetsensorvalues at +*00:05:00 {\  
my $val = GetHttpFile('arduino:80', '/?cmd=get_analog_values');;\  
  my $val = GetHttpFile('arduino:80', '/?cmd=get_analog_values');;\  
fhem(&quot;trigger arduinogetsensorvalues $val&quot;);;\  
  fhem(&quot;trigger arduinogetsensorvalues $val&quot;);;\  
}
  }
attr arduinogetsensorvalues room Arduino
  attr arduinogetsensorvalues room Arduino
define FileLog_arduinogetsensorvalues FileLog /opt/fhem/log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:.*
  define FileLog_arduinogetsensorvalues FileLog /opt/fhem/log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:.*
attr FileLog_arduinogetsensorvalues room Arduino
  attr FileLog_arduinogetsensorvalues room Arduino
define weblink_getsensorvalues weblink fileplot FileLog_arduinogetsensorvalues:arduino:CURRENT
  define weblink_getsensorvalues weblink fileplot FileLog_arduinogetsensorvalues:arduino:CURRENT
attr weblink_getsensorvalues label &quot;Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}&quot;
  attr weblink_getsensorvalues label &quot;Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}&quot;
attr weblink_getsensorvalues room Arduino
  attr weblink_getsensorvalues room Arduino
define arduinogetsensorvaluesD at +*00:05:35 {\  
  define arduinogetsensorvaluesD at +*00:05:35 {\  
my $val = GetHttpFile('arduino:80', '/?cmd=get_digital_values');;\  
  my $val = GetHttpFile('arduino:80', '/?cmd=get_digital_values');;\  
fhem(&quot;trigger arduinogetsensorvaluesD $val&quot;);;\  
  fhem(&quot;trigger arduinogetsensorvaluesD $val&quot;);;\  
}
  }
attr arduinogetsensorvaluesD room Arduino
  attr arduinogetsensorvaluesD room Arduino
define FileLog_arduinogetsensorvaluesD FileLog /opt/fhem/log/arduinogetsensorvaluesD-%Y.log arduinogetsensorvaluesD:.*
  define FileLog_arduinogetsensorvaluesD FileLog /opt/fhem/log/arduinogetsensorvaluesD-%Y.log arduinogetsensorvaluesD:.*
attr FileLog_arduinogetsensorvaluesD room Arduino
  attr FileLog_arduinogetsensorvaluesD room Arduino
define weblink_getsensorvaluesD weblink fileplot FileLog_arduinogetsensorvaluesD:arduino:CURRENT
  define weblink_getsensorvaluesD weblink fileplot FileLog_arduinogetsensorvaluesD:arduino:CURRENT
attr weblink_getsensorvaluesD label &quot;Arduino Digital Values Min $data{min1}, Max $data{max1}, Last $data{currval1}&quot;
  attr weblink_getsensorvaluesD label &quot;Arduino Digital Values Min $data{min1}, Max $data{max1}, Last $data{currval1}&quot;
attr weblink_getsensorvaluesD room Arduino</nowiki>
  attr weblink_getsensorvaluesD room Arduino</nowiki>
 
 
 
TODO: Kommunikation via RF + Bluetooth + WLAN
 
Fragen zum Thema bitte in das FHEM-Forum [http://forum.fhem.de/] posten.
 
 
Neben der hier beschriebenen Methode Arduinos an FHEM anzubinden gibt es noch die möglichkeit [[PanStamp]]s über das SWAP Protokoll per RF an FHEM anzubinden. Eine Firmata über SWAP Implementierung ist gerade in Arbeit.
 
== Arduino mit Firmata ==
Für den Arduino gibt es ein StandardProtokoll Firmata[https://github.com/ntruchsess/perl-firmata [6]] ist das Protokoll in perl einfach nutzbar und mit dem Modul 10_FRM.pm an FHEM adaptiert. 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.
 
=== 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'-&gt;'Beispiele'-&gt;'Firmata'-&gt;'StandardFirmata'. Einfach öffnen, unter 'Tools'-&gt;'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 ===
Die ConfigurableFirmata <b>ersetzt</b> die vorhandene Firmata-library <b>komplett</b>. Die mitgelieferte Firmata befindet sich typischerweise:
 
<nowiki>
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</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:
 
<nowiki>
<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:
<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 ===
 
Die Unterstützung für Ethernet ist mittlerweile [https://github.com/firmata/arduino/blob/configurable/examples/ConfigurableFirmata/ConfigurableFirmata.ino 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).
 
<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>
<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 ===
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;
 
Hier mal ein kurzer Ausschnitt aus der fhem.cfg:
 
<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>
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.
=== FRM-Devices ===
==== 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>
==== 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>
=== WLAN ===
==== 20_FRM_AD.pm ====
Die Anbindung von Arduinos über WLAN ist möglich, indem z.B. ein [[ESP8266]] mit dem Arduino verbunden wird. In der Regel ist es aber zielführender, direkt den Microcontroller auf dem ESP-Board auch für die Auswertung der anzuschließenden Sensoren zu nutzen und so auf den Arduino zu verzichten. Die entsprechenden Sketche für Arduino laufen in der Regel mit geringen Überarbeitungen auch auf diesen Boards.
Macht einen Arduino-pin als analogen Eingang nutzbar.


<nowiki>define Firmata_ANALOG FRM_AD 17 # definiert Arduino Pin 17 als analogen Eingang</nowiki>
=== ToDo ===
==== 20_FRM_PWM.pm ====
Kommunikation via Bluetooth
Macht einen Arduino-pin als analogen Ausgang nutzbar. Es wird ein pulsweitenmoduliertes Signal ausgegeben.


==== 20_FRM_SERVO.pm ====
=== Bekannte Probleme ===
Erlaubt die Ansteuerung von analogen Modelbauservos (Ansteuerung über PWM) am Arduino.
==== FTDI-Resets ====
[[Bild:FTDI_PINS.png|100px|thumb|right|FTDI-Pinbelegung]]
Bei Arduinos Nanos mit FTDI-USB-Seriell-Wandlern kann es vorkommen, dass diese immer wieder scheinbar grundlos rebooten und keine stabile Kommunikation entsteht. In diesem Fall sollte geprüft werden, ob der TEST-Pin (26) auf Ground liegt. Ist dies nicht der Fall, kann der Fehler dadurch behoben werden, dass der TEST-Pin mit AGND (25) zusammengelötet wird:


==== 20_FRM_I2C.pm ====
[https://ketturi.kapsi.fi/2014/04/how-to-fix-moody-arduino-nano/ How to fix moody Arduino nano]
Erlaubt das Auslesen von über I2C angeschlossenen ICs


=== Arduino mit OneWireFirmata ===
(via [https://forum.fhem.de/index.php/topic,88440.msg810659.html#msg810659 Antw:CUL -Device empfängt nach Neustart keine Daten])
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.


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

Aktuelle Version vom 13. September 2022, 22:39 Uhr

Generelles zu Arduino

Die Arduino-Initiative

Das Arduino-Projekt ist eine open-source-Initiative, die "easy-to-use" Hardware und Software bereitstellt. Als Hardware stehen unterschiedliche Platinen zur Verfügung, auf denen ein Microcontroller sowie grundlegende Schnittstellen, z.B. ein USB-Port bereits "ready-to-use" vorhanden sind. An diese Boards (ab ca. 20€ Stand Nov. 2016, China-Klone ab 2€) lassen sich einfach und recht preisgünstig eigene Sensoren/Aktoren an FHEM anbinden.

Das Board lässt sich u.A. mit Hilfe der Projekt-Software Arduino-IDE relativ einfach programmieren, um Sensorwerte zu verarbeiten und diese z.B. per Ethernet an FHEM zu senden oder abfragen zu lassen. Über zahlreiche Schnittstellen (Standard: RS232, TWI/1-Wire, SPI, PWM, analog/digital-I/O, I2C) mit den entsprechenden Software-Libraries kann auf viele gängige Sensoren zugegriffen werden. Über Erweiterungsboards ("Shields") können die Anschlussmöglichkeiten ausgebaut werden. Zudem ist der Anschluss von Parallel-/Seriell-/I2C-LCD-Displays und SD-Karten möglich. Die IDE läßt sich auch für andere Enwicklerboards nutzen, insbesondere den ESP8266 (für WLAN) oder Boards auf STM32-Basis.

Die Arduino-Boards bzw. Klone und eine Vielfalt an Sensoren/Aktoren sind über Online-Auktionen bzw. -Anbieter einfach zu bekommen. Kommunikation mit dem Arduino ist z.B. per Netzwerk/Ethernet, WLAN, 433/868MHz/2,4GHz-RF, Bluetooth, 1-Wire etc. möglich.

Bei der Anbindung der Arduinos über USB ist zu beachten, dass auf China-Klonen in der Regel ein einfacher USB-Seriell-Wandler verbaut ist, der eine eindeutige Zuordnung der Schnittstellen innerhalb des Linux-Dateisystems erschwert. Daher sind Boards mit eindeutiger Identifizierungsmöglichkeit (in der Regel auf FTDI-Basis) für derartige Anwendungsfälle besser geeignet.


Arduino-Projekte mit Anbindung an FHEM

Folgende Projekte basieren (u.A.) auf Arduino:

Beispiel: Arduino mit Ethernet

Eine einfache und sehr kompakte Lösung ist der Arduino Nano mit Ethernet-Shield. Der Nano hat je 8 nutzbare Analog- und Digital Ein-/Ausgänge über die sich beispielsweise Temperatursensoren, Relais etc. ansprechen lassen.

Folgende Schritte sind zur Vorbereitung zu tun:

  1. Arduino (bzw. Klon) mit Ethernet-Shield (z.B. mit ENC28J60 Chip) und gewünschten Sensoren kaufen
  2. Arduino-IDE von der Arduino-Homepage (für Windows, Mac OS X und Linux vorhanden) herunterladen und installieren
  3. Falls ENC28J60-Ethernet-Shield verwendet wird: Ethernet-Library für ENC28J60 herunterladen und in Arduino-IDE-Installation hineinkopieren (z.B. von hier: [1], alternativ nach arduino+ENC28J60+library googeln). Eine Arduino-library für den ENC28J60, die richtige (persistente) TCP/IP-Verbindungen unterstützt und von der API her vollständig kompatibel zur original-Ethernetlibrary ist findet sich hier: UIPEthernet (arduino_uip)
  4. Folgenden Beispiel-Sketch mit Arduino-IDE öffnen Arduino_FHEM.ino [2]
  5. IP Adresse im Sketch passend zum eigenen Netzwerk ändern (steht im Sketch auf 192.168.2.44)
  6. Sketch auf Arduino laden
  7. Arduino mit 5V-USB-Netzteil ans Netzwerk anschließen
  8. Verbindung testen indem in einem Webbrowser <arduino_ip_adresse>/?cmd=set_D5_ON [3] eingegeben wird (natürlich hier die im Sketch verwendete IP-Adresse angeben). Falls an Ausgang D5 eine Leuchtdiode o.ä. angeschlossen wurde sollte diese nun leuchten.
  9. Wenn das geklappt hat sollte sich der Ausgang auch aus der FHEM-Kommandozeile ausschalten lassen mit { GetHttpFile('192.168.2.44:80', '/?cmd=set_D5_OFF');; } -> natürlich wieder die im Sketch verwendete IP-Adresse verwenden.
  10. Letzter Schritt wäre eine Definition in die fhem.cfg einzutragen um auch entsprechende Buttons in der FHEM-Oberfläche zu haben, ggf. wieder die verwendete IP-Adresse statt arduino:80 verwenden (für die Buttons wurde das FS20-Modul verwendet):

Auszug aus der fhem.cfg

define arduinobutton FS20 55d1 00
  attr arduinobutton room Arduino
  define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton
  attr FileLog_arduinobutton room Arduino
  define arduinoswitchon notify FS20_55d100:on { GetHttpFile("arduino:80","/?cmd=set_D5_ON")}
  attr arduinoswitchon room Arduino
  define arduinoswitchoff notify FS20_55d100:off { GetHttpFile("arduino:80","/?cmd=set_D5_OFF")}
  attr arduinoswitchoff room Arduino
  define weblink_arduinobutton weblink fileplot FileLog_arduinobutton:fs20:CURRENT
  attr weblink_arduinobutton label "arduinobutton Min $data{min1}, Max $data{max1}, Last $data{currval1}"
  attr weblink_arduinobutton room Arduino


Abfragen von Sensorwerten sind natürlich auch möglich, z.B. mit folgender Definition (Analog- und Digital-PINs werden alle fünf Minuten abgefragt und in Plots visualisiert):

Auszug aus der fhem.cfg

define arduinogetsensorvalues at +*00:05:00 {\ 
   my $val = GetHttpFile('arduino:80', '/?cmd=get_analog_values');;\ 
   fhem("trigger arduinogetsensorvalues $val");;\ 
  }
  attr arduinogetsensorvalues room Arduino
  define FileLog_arduinogetsensorvalues FileLog /opt/fhem/log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:.*
  attr FileLog_arduinogetsensorvalues room Arduino
  define weblink_getsensorvalues weblink fileplot FileLog_arduinogetsensorvalues:arduino:CURRENT
  attr weblink_getsensorvalues label "Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}"
  attr weblink_getsensorvalues room Arduino
  define arduinogetsensorvaluesD at +*00:05:35 {\ 
   my $val = GetHttpFile('arduino:80', '/?cmd=get_digital_values');;\ 
   fhem("trigger arduinogetsensorvaluesD $val");;\ 
  }
  attr arduinogetsensorvaluesD room Arduino
  define FileLog_arduinogetsensorvaluesD FileLog /opt/fhem/log/arduinogetsensorvaluesD-%Y.log arduinogetsensorvaluesD:.*
  attr FileLog_arduinogetsensorvaluesD room Arduino
  define weblink_getsensorvaluesD weblink fileplot FileLog_arduinogetsensorvaluesD:arduino:CURRENT
  attr weblink_getsensorvaluesD label "Arduino Digital Values Min $data{min1}, Max $data{max1}, Last $data{currval1}"
  attr weblink_getsensorvaluesD room Arduino


WLAN

Die Anbindung von Arduinos über WLAN ist möglich, indem z.B. ein ESP8266 mit dem Arduino verbunden wird. In der Regel ist es aber zielführender, direkt den Microcontroller auf dem ESP-Board auch für die Auswertung der anzuschließenden Sensoren zu nutzen und so auf den Arduino zu verzichten. Die entsprechenden Sketche für Arduino laufen in der Regel mit geringen Überarbeitungen auch auf diesen Boards.

ToDo

Kommunikation via Bluetooth

Bekannte Probleme

FTDI-Resets

FTDI-Pinbelegung

Bei Arduinos Nanos mit FTDI-USB-Seriell-Wandlern kann es vorkommen, dass diese immer wieder scheinbar grundlos rebooten und keine stabile Kommunikation entsteht. In diesem Fall sollte geprüft werden, ob der TEST-Pin (26) auf Ground liegt. Ist dies nicht der Fall, kann der Fehler dadurch behoben werden, dass der TEST-Pin mit AGND (25) zusammengelötet wird:

How to fix moody Arduino nano

(via Antw:CUL -Device empfängt nach Neustart keine Daten)