Montag, 23. März 2015

Raspberry Pi 1-wire mit Device Tree Overlay

Am vergangenen Wochenende hatte ich wieder einmal Zeit mich mit meinem Raspberry Pi zu beschäftigen. Dabei wollte ich endlich die 1-wire Temperatursensoren DS18S20 in Betrieb nehmen. Da es hierfür schon eine unendliche Anzahl an Tutorials zu finden gibt, habe ich nicht damit gerechnet, dass es dabei Probleme gibt.

Also das erst beste Suchergebnis ausgewählt und die empfohlene Beschaltung umgesetzt.
Vom Raspberry Pi GPIO Header Pin1 für die 3,3V Stromversorgung und Pin 6 für die Masse verwendet. Die Datenleitung des DS18S20 wird an Pin7 GPIO4 angeschlossen. Wichtig ist ein Pull Up Widerstand zwischen 3,3V und der Datenleitung DQ des DS18S20. Da ich keine 4.7k zur Verfügung hatte, gehen auch 2 parallel geschaltete  9.76k Widerstände. 

Hier zwei Bilder zur Verdeutlichung:


Anschließend die beiden Kernel Module geladen:

sudo modprobe w1-gpio     
sudo modprobe w1-therm   

und hoffnungsvoll das Verzeichnis mit den "erkannten" Devices ausgelesen:

ls /sys/bus/w1/devices        

Aber das Ergebnis zeigte nicht den erhofften Temperatursensor, sondern das keiner erkannt wurde. Also alles von vorn und einen neunen Sensor angeschlossen. Aber wieder das selbe Ergebnis.

Jetzt doch noch einmal die Suchergebnisse nach ähnlichen Problemen durchsucht und schließlich die Ursache gefunden. Der aktuelle Raspberry Pi Kernel (3.18.17) und die Firmware verwendet jetzt zur Konfiguration und Verwendung der Module device tree (dt). Die entsprechende Dokumentation auf der Raspberry Pi Homepage findet man hier: device-tree.

Um die entsprechende Konfiguration umzusetzen muss die config.txt mit folgendem Kommando angepasst werden:

sudo nano /boot/config.txt  

Um das 1-wire Modul am GPIO Pin 4 zu aktivieren, muss folgendes am Ende in die config.txt eingetragen werden:

#device tree config 
dtoverlay=w1-gpio,gpiopin=4 

Anschließend das Board rebooten und ein neuen Versuch starten die "erkannten" Devices aufzulisten:

ls /sys/bus/w1/devices 
10-000802abebeb  10-000802ac2e82  w1_bus_master1 

Und siehe da, alles funktioniert wie gewünscht. Es werden jetzt zwei 1-wire Temperatursensoren angezeigt.

Um jetzt die Temperatur eines Sensors auszulesen, wechseln wir in das entsprechende Verzeichnis und lesen die w1_slave Datei aus.

cd /sys/bus/w1/devices/10-000802abebeb 
cat w1_slave 
2f 00 4b 46 ff ff 03 10 5b : crc=5b YES    
2f 00 4b 46 ff ff 03 10 5b t=23562            

Die erste Zeile enthält die CRC Summe und das positive Ergebnis der Prüfung. In der zweiten Zeile steht die Temperatur in 1/1000 °C.

Die hier ausgelesene Temperatur beträgt also 23,562°C.