Die hier verwendeten Bausteine PCF8574 zeigen ein interessantes Verhalten. Sie liefern maximal 0,1 mAh pro Ausgang, was nicht genügt, um eine LED zum Leuchten zu bringen. Glücklicherweise zeigt sich der Baustein bei der Stromaufnahme nicht so knauserig und verträgt 20 mAh pro Ausgang.
Für das vorliegende Projekt bedeutet das, dass Sie die LEDs mit deren Vorwiderstand an die positive Versorgungsspannung anschließen. Sobald die I/O-Ports auf logisch null schalten, beginnen die LEDs zu leuchten – genau anders herum als normalerweise üblich. Technisch stellt das kein Problem dar, Sie müssen nur beim Programmieren der Ports daran denken.
Der PCF8574 verfügt über drei Adresseingänge, über die Sie auswählen, unter welcher Adresse er sich am seriellen Bus meldet. Wie der Schaltplan Lauflicht.sch auf der Heft-DVD zeigt, belegen die vier Bausteine die Adressen 0x00 bis 0x03. Die acht I/O-Ports des PCF8574 sind direkt mit den LEDs verbunden.
Um den I2C-Bus halbwegs komfortabel mit dem Raspberry Pi zu verwenden, müssen Sie noch die I2C-Tools installieren:
$ sudo apt-get install i2c-tools
Das Kommando gpio load i2c lädt den Treiber für die I2C-Schnittstelle. Nachdem Sie die vier PCF8574-Bausteine aufgebaut und verdrahtet haben (Schaltplan Lauflicht.sch auf der Heft-DVD), prüfen Sie mittels des Befehl gpio i2cd, ob die Verbindung zum Bus steht (Listing 3).
Listing 3
$ gpio i2cd
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 21 22 23 -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Die Bausteine verwenden die Adressen 0x20 bis 0x23. Mit den Befehlen i2cset -y 1 0x20 0xff und i2cset -y 1 0x20 0x00 steuern Sie die Bausteine an. Der Parameter 0xff schaltet alle aus.
Im Unterordner kalender/led/ legen Sie für jeden Tag ein Perl-Skript an, also 01.pl bis 24.pl. Zusätzlich erstellen Sie die Datei led.pl, in der Sie die möglichen Schaltsequenzen für die LEDs ablegen. Die Datei config.pl enthält die Einstellungen. Die auf der Heft-DVD enthaltenen Beispiele erweitern oder verändern Sie nach Belieben. In den Dateien für die Tage stehen dann nur die Aufrufe der Muster samt Parametern.
Zum Testen starten Sie via perl test.pl ein Skript, das alle involvierten Unterprogramme aufruft (Listing 4). Im Ordner kalender/ legen Sie noch zwei symbolische Links an, die es ermöglichen, die Skripte auch von dort aus aufzurufen (Listing 5).
Listing 4
#!/usr/bin/perl -w require "./led.pl"; blink(5,200000); up2down(1,200000); diagonal2(1,200000); left2right(1,200000); diagonal3(1,200000); down2up(1,200000); diagonal1(1,200000); right2left(1,200000); diagonal4(1,200000); lauflicht(1,200000);
Listing 5
$ ln -s ./led/config.pl config.pl $ ln -s ./led/led.pl led.pl
Geschenke
Als kniffligste Aufgabe im Rahmen des Projekts erwies sich das Freigeben des jeweils in einem Beutel verpackten täglichen Geschenks. Die dazu vorgesehenen Servomotoren ließen sich bei Weitem nicht so gut steuern wie erhofft. Das führte schließlich dazu, dass an jedem Servomotor nur drei Beutel Platz fanden – der ursprüngliche Plan ging von sechs aus. Das heißt, dass Sie den Kalender einmal nachladen müssen, damit er alle 24 Geschenke verteilt.
Die Servos hängen, wie auch die LEDs, am zweiten Spannungsregler. Um die I/O-Ports des Raspberry von den Servomotoren zu entkoppeln, dienen Optokoppler zur Signalisierung. Der Schaltplan Servo.sch auf der Heft-DVD zeigt den Aufbau der Verstärkerstufen.
Zum Ansteuern der Servos kommt das Tool Servoblaster zum Einsatz. Es steht bei Github als Quellcode zum Download bereit, den Sie herunterladen und installieren (Listing 6, Zeile 1 bis 3). Anschließend starten Sie den Server, um den Userspace-Treiber für die vier Servomotoren zu laden (Zeile 4). Vorsicht: Vergessen Sie dabei den Schalter --pcm, zerstört der Servoblaster den Soundausgang des RasPi.
Listing 6
$ git clone git://github.com/richardghirst/PiBits.git $ cd PiBits/ServoBlaster/user $ make $ sudo ./servod --p1pins=7,11,12,15 --pcm $ echo 2=140 > /dev/servoblaster $ sudo killall servod





