Arduino: Unterschied zwischen den Versionen
K (Formatierung geändert) |
(→FTDI-Resets: add important references to test pin problem) |
||
Zeile 44: | 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("arduino:80","/?cmd=set_D5_ON")} | define arduinoswitchon notify FS20_55d100:on { GetHttpFile("arduino:80","/?cmd=set_D5_ON")} | ||
attr arduinoswitchon room Arduino | attr arduinoswitchon room Arduino | ||
define arduinoswitchoff notify FS20_55d100:off { GetHttpFile("arduino:80","/?cmd=set_D5_OFF")} | define arduinoswitchoff notify FS20_55d100:off { GetHttpFile("arduino:80","/?cmd=set_D5_OFF")} | ||
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 "arduinobutton Min $data{min1}, Max $data{max1}, Last $data{currval1}" | attr weblink_arduinobutton label "arduinobutton Min $data{min1}, Max $data{max1}, Last $data{currval1}" | ||
attr weblink_arduinobutton room Arduino</nowiki> | attr weblink_arduinobutton room Arduino</nowiki> | ||
Zeile 60: | 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');;\ | |||
fhem("trigger arduinogetsensorvalues $val");;\ | |||
} | } | ||
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 "Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}" | attr weblink_getsensorvalues label "Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}" | ||
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');;\ | |||
fhem("trigger arduinogetsensorvaluesD $val");;\ | |||
} | } | ||
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 "Arduino Digital Values Min $data{min1}, Max $data{max1}, Last $data{currval1}" | attr weblink_getsensorvaluesD label "Arduino Digital Values Min $data{min1}, Max $data{max1}, Last $data{currval1}" | ||
attr weblink_getsensorvaluesD room Arduino</nowiki> | attr weblink_getsensorvaluesD room Arduino</nowiki> | ||
Zeile 90: | Zeile 90: | ||
==== FTDI-Resets ==== | ==== FTDI-Resets ==== | ||
[[Bild:FTDI_PINS.png|100px|thumb|right|FTDI-Pinbelegung]] | [[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 diesesem 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. | Bei Arduinos Nanos mit FTDI-USB-seriell-Wandlern kann es vorkommen, dass diese immer wieder scheinbar grundlos rebooten und keine stabile Kommunikation entsteht. In diesesem 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: | ||
[https://ketturi.kapsi.fi/2014/04/how-to-fix-moody-arduino-nano/ How to fix moody Arduino nano] | |||
(via [https://forum.fhem.de/index.php/topic,88440.msg810659.html#msg810659 Antw:CUL -Device empfängt nach Neustart keine Daten]) | |||
[[Kategorie:Arduino]] | [[Kategorie:Arduino]] |
Version vom 11. September 2022, 22:58 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 Anbindnung 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 Idetifizierungsmö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
- panStamps über das SWAP Protokoll per RF
- HomeMatic_Asksin_Library
- MySensors per RF oder RS485
- ArduCounter
- KeyValueProtocol (siehe commandref/KeyValueProtocol)
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:
- Arduino (bzw. Klon) mit Ethernet-Shield (z.B. mit ENC28J60 Chip) und gewünschten Sensoren kaufen
- Arduino-IDE von der Arduino-Homepage (für Windows, Mac OS X und Linux vorhanden) herunterladen und installieren
- 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)
- Folgenden Beispiel-Sketch mit Arduino-IDE öffnen Arduino_FHEM.ino [2]
- IP Adresse im Sketch passend zum eigenen Netzwerk ändern (steht im Sketch auf 192.168.2.44)
- Sketch auf Arduino laden
- Arduino mit 5V-USB-Netzteil ans Netzwerk anschliessen
- 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.
- 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.
- 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
Bei Arduinos Nanos mit FTDI-USB-seriell-Wandlern kann es vorkommen, dass diese immer wieder scheinbar grundlos rebooten und keine stabile Kommunikation entsteht. In diesesem 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: