Teil 3: Hardware mit dem Raspi steuern

Raspberry Pi 2 – Dachfenstersteuerung mit Java programmieren
Kommentare

In den ersten Teilen dieser Artikelserie haben wir uns intensiv mit den Grundlagen der GPIO beschäftigt. Jetzt beginnen wir direkt mit einem ersten Raspberry Pi Projekt: dem Bau einer Dachfenstersteuerung. In Teil 3 geht es um die Programmierung von Taster und Temperatursensor.

Nachdem wir im ersten Teil die Details der GPIO beleuchtet und Java auf dem Raspberry Pi 2 installiert haben, ging es in Teil 2 an das Programmieren des Raspi mit Java. In Teil 3 beginnen wir ein echtes Projekt und bauen eine Dachfenstersteuerung. Dazu blicken wir zunächst auf die Programmierung benötigter Hardware wie Taster und Thermometer. Im vierten Teil erläutern wir die Programmierung von Servomotor und Display.

Bei unserer Dachfenstersteuerung kann man die Solltemperatur direkt über ein Display einstellen. Die Isttemperatur und die Luftfeuchtigkeit werden dabei ebenfalls direkt auf dem Display angezeigt. Außerdem soll sich das Dachfenster öffnen, wenn der am Display eingestellte Wert überschritten wird. Das klingt erst einmal gar nicht so schwer. Sehen wir uns die einzelnen Punkte im Detail an.

Artikelreihe

Hardware

Alle Einzelteile lassen sich, wie in Abbildung 1 zu sehen ist, leicht auf eine kleine Lochrasterplatine auflöten. Der Schaltplan (Abb. 2) zeigt Ihnen genau, wie alle Teile zusammen gehören. Er ist als gEDA- und .eps-Datei auf der Heft-DVD und auf der Website zur Ausgabe vorhanden. Das einzige kniffelige Bauteil ist der Temperatursensor, da er nur das halbe Rastermaß hat. Es gibt viele Möglichkeiten, ihn zu verbauen; eine der eleganteren Methoden ist es, ihn auf eine Adapterplatine für SOP8 nach DIL8 zu löten.

Abb. 1: Die komplett aufgebaute Platine

Abb. 1: Die komplett aufgebaute Platine

Abb. 2: Der Schaltplan zeigt, wie alles zusammengebaut werden muss

Abb. 2: Der Schaltplan zeigt, wie alles zusammengebaut werden muss

Im Handel sind unterschiedliche Versionen des Nokia-5110-Displays zu bekommen, die sich durch die Pinbelegung unterscheiden. Die Taster für die Temperatureinstellung sind verdrahtet, wie in unserem Beispiel aus dem ersten Teil des Artikels.

Generell sollte man bei elektrischen Antrieben (z. B. Servomotor) darauf achten, sie über eine getrennte Spannungsquelle zu versorgen, da sie Störungen verursachen können, die den Raspberry Pi zum Absturz bringen. Wir gehen hier noch einen Schritt weiter und trennen die Signalleitung zwischen Raspberry Pi und Servomotor galvanisch. Dieser spezielle Aufbau hat zusätzlich den Vorteil, dass das Signal nicht um 180 Grad gedreht wird, wie es eine normale Transistorverstärkerstufe machen würde. Das Display und der Sensor sind zur Betriebsspannung des Raspberry Pi (3,3 Volt) kompatibel und benötigen daher keine Pegelanpassungen.

Taster

Um die Taster zu testen, verwenden wir die gleiche Methode wie im ersten Teil:

pi@raspberrypi ~ $ gpio mode 1 in 
pi@raspberrypi ~ $ gpio mode 2 in
pi@raspberrypi ~ $ watch -n 0.5 'gpio read 1 ; gpio read 2' 

Wenn sich beim Löten kein Fehler eingeschlichen hat, sollten Sie den Status der Schalter auf dem Bildschirm sehen.

Temperatur messen

Zum Messen der Temperatur kommt ein handelsüblicher I2C-Temperatur-/-Luftfeuchtigkeitssensor zum Einsatz. Der AM2321 kann unter hier bestellt werden. Im Datenblatt zum Sensor AM2321 finden sich viele wichtige Informationen. Um den Sensor testen zu können, müssen wir uns zuerst den I2C-Treiber installieren. Das klappt leider nicht so reibungslos, wie man es erwarten würde. Fangen wir erst einmal damit an, die Raspi-Config (sudo raspi-config) zu starten. Unter den „8 Advanced Options“ findet sich der Unterpunkt „A7 I2C“; dort sind einfach alle Fragen mit ja zu beantworten. Das raspi-config-Tool bootet beim Verlassen den Raspberry Pi automatisch neu. Nach dem Neustart sollten die nötigen Treiber vorhanden sein. Unschönerweise funktioniert es so nicht richtig – es sind noch einige manuelle Eingriffe nötig, bis alles so klappt, wie es soll.

Falls die Datei /etc/modprobe.d/raspi-blacklist.conf auf Ihrem System vorhanden ist, müssen Sie dort die Zeile blacklist i2c-bcm2708 mit einem # auskommentieren. Danach überprüfen Sie, ob in der Datei /etc/modules die folgenden Einträge vorhanden sind:

i2c-bcm2708
i2c-dev

Falls sie nicht vorhanden sind, tragen Sie diese bitte mit ein. Zu guter Letzt müssen Sie auch noch die /boot/config.txt anpassen und folgende Zeile hinzufügen, falls diese nicht vorhanden ist: dtparam=i2c_arm=on

Damit wir die Möglichkeit haben, unseren I2C-Hardwareaufbau zu testen, benötigen wir noch die i2c-Tools, die sich mit folgendem Befehl installieren lassen: sudo apt-get install i2c-tools.

Damit wir später nicht immer als Superuser arbeiten müssen, nehmen wir den User pi mithilfe von sudo adduser pi i2c mit in die Gruppe i2c auf.

Um alle Änderung zu aktivieren, müssen wir jetzt einen Reboot durchführen: sudo reboot. Wir dürfen natürlich nicht vergessen, den I2C-Treiber mittels gpio load i2c auch zu laden, bevor wir mit den Tests beginnen können. Das Warning, das hier auftritt, ist nicht weiter tragisch, da wir den I2C-Bus-0 nicht verwenden.

Als Erstes überprüfen wir, ob sich unser IO-Baustein auch am I2C-Bus meldet. Das bewerkstelligen wir mit dem Befehl aus Listing 1.

pi@raspberrypi ~ $ i2cdetect -y 1 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
pi@raspberrypi ~ $ i2cdetect -y 1 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f 
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- 5c -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
pi@raspberrypi ~ $ 

Dem aufmerksamen Leser wird sicherlich aufgefallen sein, dass sich der AM2321 beim zweiten Aufruf von i2cdetect unter der Adresse 0x5c meldet. Das liegt daran, dass dieser Sensor eine ausgeklügelte Energiesparfunktion hat: Beim ersten Zugriff wird der Baustein aus seinem Schlafmodus geweckt. Ist der AM2321 wach, kann man mit dem zweiten Zugriff die Werte des Sensors lesen. Das zweite Lesen legt ihn dann auch gleich wieder schlafen.

Warum wird hier so ein Aufwand betrieben? Zum einen, um Energie zu sparen, da der Sensor in mobilen Geräten verbaut werden soll. Der zweite wichtige Grund ist, dass der Sensor durch seine eigene Wärmeentwicklung die Messwerte verfälschen würde. Im Datenblatt ist diese Funktion sehr genau beschrieben.

Tipp: Der richtige Editor

Falls Sie Ihre Java-Programme nicht mit vi direkt auf dem Raspberry Pi editieren möchten, zeige ich Ihnen einen kleinen Trick, mit dem Sie Ihren Lieblingseditor zum Programmieren verwenden können. NFS – Network File System – heißt die Lösung. Mit NFS kann man Filesysteme ins Netzwerk exportieren, die sich dann auf dem Linux-PC wieder bequem einbinden lassen.

Um den NFS-Server auf dem Raspberry Pi zu installieren, verwenden wir folgenden Befehl:

sudo apt-get install nfs-server

Nach erfolgreicher Installation können wir in der Datei /etc/exports festlegen, welche Dateisysteme an andere Rechner exportiert werden sollen. Die folgende Zeile gewährt jedem Client Zugriff auf das Homeverzeichnis des Users pi auf unseren Raspberry. Das sollte man daher nur so machen, wenn es sich um ein lokales (sicheres) Netzwerk handelt …:

sudo nano /etc/exports
/home/pi *(rw,no_subtree_check)

Jetzt müssen wir dafür sorgen, dass der Portmap Deamon gestartet ist. Danach kann der NFS-Server gestartet werden:

sudo /etc/init.d/rpcbind restart 
sudo /etc/init.d/nfs-kernel-server restart

Der Kernel des Raspberry kennt kein IP v6, daher können wir die Fehler, die beim Starten des NFS-Servers auftreten, ignorieren. Um nun von einem Client (Linux-PC) aus auf das NFS-Verzeichnis zugreifen zu können, müssen wir das Filesystem mounten. Das kann man mit folgendem Befehl unter Linux bewerkstelligen:

sudo mount -t nfs 192.168.2.6:/home/pi /mnt

Falls es nicht funktionieren sollte, ist vermutlich die NFS-Clientsoftware nicht auf Ihrem PC installiert. Abhängig von der Distribution gibt es dafür unterschiedliche Wege. Unter Ubuntu z. B. kann man Software bequem über das Softwarecenter installieren. Schauen Sie bitte in die Hilfe Ihrer Distribution, wie zusätzliche Software installiert werden muss.

Unter /mnt ist nun das Homeverzeichnis des Users pi auf unserem Raspberry eingebunden. Die dort befindlichen Dateien können nun frei editiert werden. Kommt es dabei zu Problemen, hilft oft ein Blick mit ls -lisa auf die Berechtigungen der Dateien und Verzeichnisse.

Im vierten und letzten Teil der Artikelserie geht es um die Programmierung von Servomotor und Display.


Entwickler Magazin

Entwickler Magazin abonnierenDieser Artikel ist im Entwickler Magazin erschienen.

Natürlich können Sie das Entwickler Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -