Quelle:
https://www.raspiprojekt.de/anleitungen/9-1wire.html
Eine Stärke des Raspberry Pi ist die Möglichkeit der freien Programmierung der GPIOs. So ist es ein Leichtes verschiedene Schnittstellen und Bussysteme zu nutzen. Ein einfaches Bussystem ist der 1wire-Bus (Eindrahtbus). Dieser Bus hat nichts mit dem Bus auf der Straße zu tun. Im Sinne der Elektrotechnik bezeichnet man ein Leitungssystem, welches in der Lage ist mehrere Geräte mit Schaltbefehlen oder Abfragen zu bedienen als Bus. Wir werden als Beispiel den 1wire-Bus dazu benutzen Temperaturen von mehreren 1wire-Sensoren zu erfassen. Der Name 1wire ist etwas irritierend. In Wirklichkeit benötigen wir 3 Leitungen. Das ist einmal die Masse, richtiger die 0V-Leitung, zum Zweiten die eigentliche Signalleitung und drittens eine Spannungsversorgung, schließlich ist jeder Sensor beim 1wire-Bus ein selbstständiges Gerät. Die Signale werden bereits vom Sensor digitalisiert.
Sensor anschließen
Nun sind wir schon bereit unseren ersten Temperatursensor anzuschließen. Ein weit verbreiteter und einfach zu beschaltender digitaler Temperatursensor ist der DS18B20. Den werden wir nun benutzen. Sehen wir uns dazu kurz die Beschaltung an. Den Sensor gibt es in verschiedenen Bauformen. Für unsere Schaltung nehmen wir den mit den “Beinen”.
Im Datenblatt ist die Schaltung wie folgt dargestellt:
Theorethisch würde die Sache schon so funktionieren. Der Sensor ist auf der digitalen Leitung als open-drain ausgelegt und sollte auch am 3,3V GPIO des Raspberry keinen Schaden anrichten. Wir gehen auf Sicherheit und nutzen als Versorgungsspannung (Vdd) die 3,5 Volt vom Pin 1 des Raspberry Pi. Schauen wir uns mal die Varianten der Schaltung an und besprechen diese im Anschluss.
Bild 1 ist die Umsetzung des Schaltbildes mit 3,3V als Betriebsspannung für den Sensor. Denken wir an die Praxis, kann es jedoch auch schon mal zu sehr langen Kabelleitungen (über 100 Meter sind möglich) zum Sensor kommen. Schnell kann die Betriebsspannung durch die Dämpfung des Kabels unter das für den Betrieb des Sensors notwendige Minimum sinken. Hier hilft uns Bild 2 weiter. Die Datenleitung zieht mit dem Widerstand auf 3,3 V, der Sensor wird mit 5V betrieben.
Der Testaufbau für Bild 1 kann nun so aussehen:
Für Bild 2 dann so:
Beide Schaltungen funktionieren ohne Einschränkungen.
1wire aktivieren
Das von uns verwendete Raspbian hat die für den 1wire-Bus notwendigen Treiber bereits an Bord. GPIO 4 ist für den Einsatz als 1wire-Bus vorgesehen. Wie bei allen GPIOs werden auch hier die Daten über virtuelle Dateien verarbeitet. In allen neuen Images von Raspian (Kernel 3.18) wird der device tree (DT) genutzt.
Aktivierung durch DT
Um den 1wire-Bus mit DT zu aktivieren gibt man folgende Zeile in den /boot/config.txt ein:
dtoverlay=w1-gpio
Damit wäre standardmäßig der GPIO4 (Pin7 der Stiftleiste) für 1wire zuständig. Die Verwendung des Parameters gpiopin erlaubt jedoch auch einen anderen Pin zu nutzen.
dtoverlay=w1-gpio,gpiopin=18
Würde den GPIO18 (Pin12) zum 1wire-Bus machen.
Daten abrufen
Mit dem 1wire-Bus kann man mehrere Sensoren abfragen. Das ist möglich, weil jeder Sensor eine eigene digitale Kennung hat. Versuchen wir es mal.
In unserem Dateimanager gehn wir in das Verzeichnis /sys/bus (wo auch sonst, wenn wir einen bus suchen) und finden dort den Ordner w1:
Den öffnen wir natürlich …
… und finden den Ordner devices. Da liegen unsere Sensoren in Ordnern, die den Namen ihrer digitalen Kennung haben.
Öffnen wir nun den Ordner mit der eher kryptischen Kennung. Die kann nicht gleich wie die hier angezeigte sein, weil ja jeder Sensor seine eigene hat, aber wir finden eine ähnliche.
Später können wir noch viel mehr mit den Dateien in den Verzeichnissen anfangen, aber erst mal öffnen wir die Datei w1_slave mit einem Doppelklick.
Wir sehen, dass uns der Sensor etwas meldet. Und zwar eimal, dass die Datenübertragung vernünftig gelaufen ist mit dem Eintrag crc = 5e YES und zum zweiten die Temperatur t=24375. Das sind natürlich nicht 24375 °C sondern 24,375 °C. Wie man auf den richtigen Wert kommt steht im Datenblatt des Sensors. In unserem Fall einfach den Wert durch 1000 teilen.
Mehrere Sensoren
Da jeder Sensor eine unverwechselbare Kennung hat, ist es auch möglich mehrere Sensoren am Bus zu betreiben. Bei der Schaltung ist zu beachten, dass wir den 4,7 kOhm Widerstand nur einmal benötigen. Es ist möglich Sensoren in Linie, als Baum oder Sternförmig anzuschließen. Hier als Beispiel nur eine Möglichkeit:
Wir schließen die Sensoren in Linie an, dabeigehen wir genau wie bei unserm ersten Aufbau vor. Zur Zeit läßt der Treiber bis zu 10 Sensoren am Bus zu. Es gibt die Möglichkeit die Datei etc/modprobe.d/1-wire.conf zu erstellen und mit folgender Zeile die Anzahl der möglichen Sensoren (im Beispiel auf 20) zu erhöhen:
options wire max_slave_count=20
Unser Testaufbau (zwei Sensoren hätten gereicht, aber so wird der Zweck deutlicher) könnte nun so aussehen:
Nun können wir die Sensoren auch wieder im Verzeichnis /sys/bus/w1/devices/ finden:
Der Abruf der Daten erfolgt, wie bei unserem einzelnen Sensor im Verzeichnis mit der jeweiligen Kennung. Für praktische Anwendungen müssen wir also dafür Sorgen, dass die Kennungen entweder vom Programm ermittelt oder manuell eingegeben werden.