Temperatur messen mit Cubietruck und DS18B20 Sensor

Hinweis: Wenn die generelle Vorgehensweise bekannt ist, der Sensor allerdings nicht zuverlässig funktioniert bitte die Stromsparfunktion der CPU prüfen.

Im Vergleich zum Raspberry Pi ist der Cubietruck leider nicht allzu weit verbreitet, weshalb es nur wenige Anleitungen für die Nutzung der GPIO Pins gibt. Ziel des Artikels ist die Temperatur mit einem DS18B20 Sensor zu messen. Als erstes muss man sich natürlich den Sensor besorgen (z.B. bei Amazon oder ebay). Der Sensor besitzt 3 Leitungen: Masse (GND), 3,3 Volt (VDD) und das Singal (DQ).

DS18B20

Zwischen VDD und DQ wird ein 4,7 K Ohm Widerstand geschaltet (siehe auch Datenblatt). Zum Testen baut man die Schaltung am besten mit einem Breadboard auf. Ich habe den Sensor und den Widerstand direkt verlötet.

DS18B20 mit angelöteten Widerstand

Der Kernel benötigt die Module gpio_sunxi, w1_therm, w1_sunxi und w1_gpio. Als Betriebssystem kann ich armbian empfehlen. In der Variante Legacy Jessie sind die Module schon integriert. Um sie automatisch zu laden kann man sie in die Datei /etc/modules aufnehmen.

hostname:~# cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

brcmfmac
rfcomm
hidp
bonding

gpio_sunxi
w1_therm
w1_sunxi
w1_gpio
hostname:~#

Danach sucht man sich passende GPIO Pins auf dem Cubietruck aus. Ich habe mich für PB18 für DQ entschieden. Die Leitungen für Masse (GND) und Spannung (VDD) müssen an entsprechende Pins angeschlossen werden (z.B. Pin 1 und 2 auf CN8). Der gewählte DQ Pin muss aktiviert werden. Die Konfiguration läuft über eine bin-Datei. Die genaue Vorgehensweise wird hier beschrieben. Bei armbian lautet die Datei /boot/script.bin und ist ein Link auf /boot/bin/cubietruck.bin. Am besten kopiert man sich die Datei erst mal in sein Home-Verzeichnis und wandelt sie dort in eine editierbare fex-Datei um.

hostname:~# cp /boot/bin/cubietruck.bin ~
hostname:~# bin2fex cubietruck.bin cubietruck.fex
hostname:~# cp cubietruck.fex cubietruck_own.fex

Die Datei cubietruck_own.fex kann jetzt editiert werden. Es muss der Bereich [gpio_para] angepasst und der Bereich [w1_para] hinzugefügt werden. Bei mir sieht das dann so aus:

[gpio_para]
gpio_used = 1
gpio_num = 4
gpio_pin_1 = port:PH20<1><1>
gpio_pin_2 = port:PH10<0><0>
gpio_pin_3 = port:PG08<1><1>
gpio_pin_4 = port:PB18<0><0>

[w1_para]
gpio = 4

Es werden 4 GPIO Pins genutzt (gpio_num=4). GPIO Pin 4 wird der Pin PB18 zugewiesen (gpio_pin_4 = …) und 1-wire auf Pin 4 konfiguriert (gpio=4 im Bereich [w1_para]). Nach dem Editieren der Datei erstellt man daraus wieder die bin-Datei und tauscht die usprüngliche mit der angepassten aus.

hostname:~# fex2bin cubietruck_own.fex cubietruck.bin
hostname:~# cp cubietruck.bin /boot/bin/cubietruck.bin

Die Änderung wird nach einem Reboot aktiv. Sind die Module geladen, der Sensor richtig verbunden und die GPIO Pins richtig konfiguriert erscheint der Sensor unter /sys/bus/w1/devices/. Für jeden Sensor (es könnten auch mehrere gleichzeitig angeschlossen werden) gibt es dort ein Verzeichnis nach dem Muster 28-XXXXXXXXXXXX. Bei mir war der Sensor nur direkt nach dem Booten vorhanden und verschwand nach kurzer Zeit wieder. Die CPU taktet sich je nach Anforderung herunter und ab einem bestimmten Wert funktioniert dann der Sensor nicht mehr. Ich habe den minimalen Wert auf 700 MHz gesetzt.

hostname:~# sudo cpufreq-set -d 700000

Ist der Sensor unter /sys/bus/w1/devices/ vorhanden, lässt sich die Temperatur leicht auslesen.

hostname:~# cat /sys/bus/w1/devices/28-000003ca3e36/w1_slave
e7 00 4b 46 7f ff 09 10 94 : crc=94 YES
e7 00 4b 46 7f ff 09 10 94 t=14437

Das YES in der 1. Zeile besagt, dass die Checksumme stimmt und damit der Temperaturwert gültig ist. Die Temperatur von 14437 entspricht 14,437 °C. Der Wert kann also einfach durch 1000 geteilt werden. Mit einem einfache Shellscript (basiert auf Code aus dem Wiki der “linux-sunxi community”) oder Python Script (basiert auf my-pi-scripts) kann der Wert richtig formatiert ausgegeben werden.

Die Vorgehensweise wird auch auf www.cubieforums.com erklärt.