Raspberry Pi und 1-Wire
ACHTUNG, DIESE SEITE IST NOCH IN DER ENTWICKLUNG Der Raspberry Pi, abgekürzt RPi ist ein Einplatinencomputer der Raspberry Pi Foundation, der unter Linux läuft und über eine Vielzahl von Anschlüssen verfügt.
FHEM läuft auf allen Modell des Raspberry Pi. Während hier die Installation von FHEM beschrieben wird, soll sich diese Seite nur mit dem Anschluss von 1-Wire Devices an den RPi befassen.
Hardware
Bereits von der Hardware her bietet der RPi verschiedene Möglichkeiten zum Anschluss von 1-Wire-Devices
USB-Port
Über einen der USB-Ports des RPi mit entsprechendem Adapter. Hierbei sollte, wenn es sich nicht nur um wenige 1-Wire-Devices handelt, ein USB-Hub mit eigener Stromversorgung zwischengeschaltet werden. Mit USB-Extendern lässt sich dies bequem auch bis zu 20m entfernt vom RPi bewerkstelligen.
Alle bekannten USB/1-Wire Adapter arbeiten mit dem RPi. Allerdings ist es möglicherweise (nur, wenn Fehler auftreten !) nötig, dafür ein Kernel-Update durchzuführen, da in manchen älteren Versionen des Linux-Kernels für den RPi Fehler im USB-Stack enthalten sind.
COC-Modul
Anschluss über ein COC-Modul des Herstellers busware.de. Siehe hierzu im Detail COC und 1-wire].
RPI2-Modul
Anschluss über ein RPI2-Modul des Herstellers Sheepwalk Electronics. Dieses Modul wird direkt auf den internen I2C-Bus des RPi aufgesteckt. Im Kaufzustand bietet es für den 1-Wire-Bus sowohl eine RJ45-Buchse, als auch einen Schraubklemmenanschluss. Diese sind leider beide so hoch, dass das Modul nicht mehr in das RPi-Gehäuse passt. Hier kann aber leicht abgeholfen werden (to be continued).
Zur Ansteuerung ist auf dem RPi zunächst das Starten zweier Kernelmodule nötig, dazu als root ausführen
modprobe i2c-bcm2708 modprobe i2c-dev
Der automatische Start dieser beiden Module kann in der Datei /etc/modules eingetragen werden. Bei Vorhandensein des Paketes i2c-tools wird dann die korrekte Erkennung des Adapters mit dem Befehl
i2cdetect -y 1
überprüft, der 1-Wire-Busmaster DS2482-100 sollte als I2C-Device mit der ID 0x18 gefunden werden.
GPIO4-Port
ACHTUNG, Klären: Welche 1-Wire Devices, und wie viele davon werden mit diesem Modul unterstützt
Anschluss direkt am GPIO-Port des RPi.
Elektrische Installation
Dazu wird im ersten Schritt der 1-Wire Bus (bzw. zum Test nur ein einzelner Sensor) mit dem GPIO-Port des RPi verbunden, und zwar
- 1-Wire GND an GND vom Pi (Pin 6)
- 1-Wire Datenleitung an GPIO04 (Pin 7)
- 1-Wire VDD an +3,3V vom Pi (Pin 1)
- Ausserdem ist noch ein Pullup-Widerstand von z.B. 4,7kOhm zwischen Pin1 und Pin7 zu schalten.
Obwohl die nominale Spannung für 1-Wire Devices 5V beträgt, ist hier die verringerte Spannung nötig, weil die GPIO-Ports des RPi nur 3,3, V vertragen und durch höhere Spannungen zerstört werden. Als Alternative kann man den 1-Wire Bus auch 5V (Pin 2) anschließen, dann muss aber zwingend das Signal der 1-Wire Datenleitung durch einen Spannungsteiler (z.B. 10 kOhm und 6.8 kOhm) auf 3,3 V begrenzt werden. Besser man verwendet einen aktiven Pegelwandler der sich mit einem einfachen MOS-FET realisieren lässt : 1-Wire Pegelwandler
Software-Installation vor 2015 bzw. Kernelversion 3.18.3
Zur Ansteuerung ist auf dem RPi zunächst das Starten zweier Kernelmodule nötig, dazu als root ausführen
modprobe w1-gpio pullup=1 modprobe w1-therm
Waren die Schritte erfolgreich, gibt es jetzt im Verzeichnis /sys/bus/w1/devices/ für jeden Sensor ein Unterverzeichnis mit seiner Kennung, z.B. 28-000004e147d6. Die dort stehende Datei w1_slave enthält das Ergebnis der Datenübertragung vom Sensor. Um die Module dauerhaft zu laden, sind sie noch in die Datei /etc/modules einzutragen.
Um den 1-Wire Bus in FHEM einzubinden, muss noch das Modul 58_GPIO4.pm aus dem Verzeichnis /opt/fhem/contrib in das Hauptverzeichnis /opt/fhem/FHEM/ kopiert werden und mit
define RPi GPIO4 BUSMASTER
bekannt gemacht werden. Nach einem Neustart von FHEM werden die Sensoren automatisch erkannt (FHEM-Forum-Beitrag [1]).
Das beschriebene Kernelmodul unterstützt momentan die IDs 10- (DS1820 u. DS18S20) sowie 28- (DS18B20). Im "Auslieferungszustand" können maximal 10 Sensoren angeschlossen werden. Unter [2] ist beschrieben, wie man die Anzahl erhöhen kann. Anschließend ist nur noch ein Neustart des RPi nötig.
Software-Installation ab 2015 bzw. Kernelversion 3.18.3
Da sich mit Kernelversion 3.18.3 die Handhabung der Module geändert hat (vgl. #1-wire am GPIO4-Port funktioniert nicht mehr nach Systemupdate - die Datei /etc/modules
wird im Prinzip garnicht mehr benötigt (Details s. #Links). Somit ist hier eine andere (einfachere) Konfiguration nötig:
- Am besten erst einmal ein ordentliches System-Update durchführen:
sudo apt-get update sudo apt-get dist-upgrade -f sudo rpi-update sudo reboot
- Kernelversion kontrollieren (muss jetzt mind. v3.18.3 sein):
uname -r
- Dann fügt man den folgende Zeile in
/boot/config.txt
ein:
# activating 1-wire with pullup dtoverlay=w1-gpio-pullup
- Und startet das System neu
sudo reboot
Zusätzlich kann man gleich eine Debugging-Funktion aktivieren:
- Dazu fügt man den folgende Zeile in
/boot/config.txt
ein:
# activating device tree debugging (use: sudo vcdbg log msg) dtdebug=on
- Abrufen kann man die Debug-Informationen dann mit:
sudo vcdbg log msg
UART-Schnittstelle
Der RPi verfügt auch über eine UART-Schnittstelle, an diese kann direkt ein Serielles 1-Wire Interface angeschlossen werden (IN VORBEREITUNG)
Software
Die Ansteuerung des 1-Wire Bus auf dem RPi kann durch unterschiedliche Software-Systeme erfolgen. Verbreitet mit FHEM sind
- OWX sowie die zugehörigen Frontendmodule OWAD, OWCOUNT, OWID, OWLCD, OWMULTI, OWSWITCH und OWTHERM. Das OWX-Modul operiert direkt auf der jeweiligen Hardware (USB bzw. Seriell) oder liest die Daten über Netzwerk (COC/CUNO/Arduino) und reicht sie an spezialisierte Frontendmodule weiter.
- OWServer, ein Modul, welches die vorhergehende Installation des Softwarepaketes OWFS erfordert. OWFS startet einen speziellen Server, der die Kommunikation mit der Hardware übernimmt und die Daten dann an OWServer weiterleitet. Die Installtion bzw Kompilierung vom OWServer auf dem Rasperry ist unter owfs Pakete installieren beschrieben. Zu OWServer passt ein generisches Frontendmodul OWDevice, siehe OWServer & OWDevice.
Nachfolgend ist die Kompatibilität dieser Softwaresysteme mit den einzelnen Hardware-Möglichkeiten aufgeführt.
Anschluss | Gerät | Unterstützte 1-Wire Devices | Besonderheit | Stromversorgung 1-Wire Bus |
---|---|---|---|---|
Direkt an USB | DS9490 Adapter | funktioniert nicht, weil der enthaltene Chip DS2490 derzeit nur über libusb ansteuerbar ist. Abhilfe ist in Arbeit. |
?? | |
Direkt an USB | USB9097 Adapter | Alle von OWX unterstützten Devices, d.h. DS18x20, DS1822 Temperatursensor |
funktioniert auf der FB7390, das Kernelmodul ch341.ko findet man hier | Ja, 5V |
Direkt an USB | Eigenbau, mit FT232RL und DS2480 Bus-Master |
funktioniert, Fertiggeräte eventuell bei EBay erhältlich, siehe auch Interfaces für 1-Wire |
Ja, 5V | |
Direkt an USB | LinkUSBi Adapter | funktioniert, verwendet das FTDI Kernelmodul. Achtung: Es kann zu Timing-Problemem kommen. Erhältlich z.B. hier |
Ja, 5V an Pin2 (limited to 50mA) | |
Über USB-zu-Seriell-Konverter 9- oder 25-polig mit Winchiphead CH341-Chip |
Konverter + DS9097U-(009/S09, E25) | funktioniert auf der FB7390, das Kernelmodul ch341.ko findet man hier | Nur bei den 25-poligen Modellen als Standard, bei den 9-poligen Modellen externe Versorgung oder Modifikation des DS9097 nötig | |
Über USB-zu-Seriell-Konverter 9- oder 25-polig mit Prolific PL2303-Chip |
Konverter + DS9097U-(009/S09, E25) | funktioniert auf der FB7390, das Kernelmodul pl2303.ko findet man hier | Nur bei den 25-poligen Modellen als Standard, bei den 9-poligen Modellen externe Versorgung oder Modifikation des DS9097 nötig | |
Über USB-zu-Seriell-Konverter 9- oder 25-polig mit FTDI RL232-Chip |
Konverter + DS9097U-(009/S09, E25) | funktioniert auf der FB7390, das Kernelmodul ftdi_sio.ko ist auf der FritzBox vorhanden |
Nur bei den 25-poligen Modellen als Standard, bei den 9-poligen Modellen externe Versorgung oder Modifikation des DS9097 nötig | |
Direct an USB | Arduino mit USB-Anschluss (UNO, Mega, Nano...) | 1-Wire Bus direkt am Arduino (reine Softwarelösung) oder (stabiler im Betrieb) in Verbindung mit DS2482-Busmaster (am I2C des Arduinos). Mit DS2482-100 ist 1 1-Wire-Bus (optional mit Strong-pullup über externen MosFET), mit DS2482-800 sind 8 busse (nur mit internem Strong-pullup) an 1 Arduino gleichzeitig möglich. | Ja, 3,3V oder 5V je nach Arduino-modell. | |
Über Netzwerk | Arduino mit Ethernetshield, Arduino mit ENC28J60-shield, Arduino Ethernet | |||
Über Netzwerk und CUNO | CUNO | Mit OWX: Alle von OWX unterstützten Devices Ohne OWX: Nur DS18x20, DS1822 Temperatursensor |
funktioniert mit gewissen Einschränkungen, siehe CUNO und 1-wire | Ja, aber nur 3,3 V. Kann allerdings zu 5V modifiziert werden |
Über Netzwerk und Ethersex-Gerät |
AVR-Net-IO oder ähnliches | DS18x20, DS1822 Temperatursensor DS2502 EEPROM DS2450 4 Kanal ADC |
funktioniert, siehe FHEM und 1-Wireund AVR-NET-IO |
?? |
Problembehebung
1-wire am GPIO4-Port funktioniert nicht mehr nach Systemupdate
Problem
Es kann passieren, dass nach einem Systemupdate (apt-get update oder apt-get dist-upgrade) die 1-wire-Geräte am GPIO4-Port plötzlich nicht mehr funktionieren. Dies hat dann aller Wahrscheinlichkeit die Ursache, dass ein Kernel-Upgrade von "vor 3.18.3" auf "danach" gemacht wurde. Mit Kernelversion 3.18.3 ist die Handhabung der Kernelmodule umgestellt worden (vgl. auch #GPIO4-Port):
- vor v3.18.3: hier wurden Module in die /etc/modules eingetragen. Dieses Vorgehen ist fast überall beschrieben.
- ab v3.18.3: jetzt wurde das sog. Device-Tree-Verfahren eingeführt, das anders arbeitet - und erst einmal die alte Konfiguration blockiert (!). (Details s. unter #Links)
Auch ein Aufruf von sudo rpi-update
hilft allein nicht weiter (ist aber immer sinnvoll).
Lösung
Die "korrekte" Lösung wäre die Umstellung auf Device-Tree-Konfiguration:
- Dazu fügt man den folgende Zeile in
/boot/config.txt
ein:
# activating 1-wire with pullup dtoverlay=w1-gpio-pullup
- Entfernt die Module
w1-gpio
undw1-therm
aus das/etc/modules
(oder kommentiert sie aus) - Und startet das System neu
Zusätzlich kann man gleich eine Debugging-Funktion aktivieren:
- Dazu fügt man den folgende Zeile in
/boot/config.txt
ein:
# activating device tree debugging (use: sudo vcdbg log msg) dtdebug=on
- Abrufen kann man die Debug-Informationen dann mit:
sudo vcdbg log msg
Alternativer Workaround
Alternativ zur "korrekten" Lösung kann man die Device-Tree-Funktionalität auch einfach deaktivieren - dann bleibt alles wie bisher.
- Dazu fügt man den folgende Zeile in
/boot/config.txt
ein:
# disabling device tree functionality: device_tree=
- Und startet das System neu.
Links
Zu Device-Tree: