RasPi-Erweiterung: Hardware-Uhr und serielle Konsole
Überblick
Der Raspberry Pi verbraucht zwar relativ viel Energie und ist daher
nicht für Batteriebetrieb geeignet, macht aber eine preiswerte
Realisierung stationär betriebener Geräte möglich, die ohne Tastatur
und Monitor unauffällig im Hintergrund Aufgaben verrichten sollen.
Ohne Tastatur und Monitor ("headless") bieten sich folgende Zugänge an:
- der übliche per SSH (secure Shell) über die Netzwerkbuchse,
WLAN oder per virtueller USB-Netzwerkverbindung (steckt man den
Raspberry Pi an den USB-Anschluss einiger Modem-Router (z.B. einer
Fritzbox), erkennt das Raspberry Linux den Modem-Router als
USB-Netzwerkgerät).
- die serielle Schnittstelle des Raspberry Pi, die sich als
Bedienkonsole einrichten läßt. Auch der gesamte Bootvorgang kann auf
diese Konsole umgelenkt werden. Der Raspberry Pi kann dann völlig ohne
Netzwerkverbindung betrieben werden; die Bedienung erfolgt von einem PC
aus über ein Terminalprogramm und die serielle Verbindung. Das schien
mir "spannender".
Verwendet man einen Raspberry A bzw. A+ oder den neuen
Raspbery Pi Zero, entfällt auch der beträchtliche Stromverbrauch des
Raspberry-Netzwerkchips.
Für die serielle Anbindung ist jedoch ein Pegelwandler von 3,3V-Pegel auf RS232-Pegel erforderlich.
Schließlich nervte mich noch die Tatsache, dass der Raspberry
Pi keine Hardwareuhr hat. Es verwirrt nicht nur den Nutzer, sondern
auch das Betriebssystem, wenn es sich im Jahre 1970 wähnt und auf
Dateien mit einem Zeitstempel aus dem Jahr 2015 trifft (gegen letzteres
hat Raspbian aber Vorkehrungen getroffen; das Paket "fake hardware
clock" sichert die Systemzeit beim Herunterfahren in eine Datei und
stellt sie aus dieser beim Hochfahren wieder her. Die Zeit ist so zwar
nicht korrekt, aber es kann dann keine Datei-Zeitstempel geben, die
scheinbar in der Zukunft liegen).
Hardware
Der RS232-Pegelwandler arbeitet mit 2 Transistoren. Der BC558
wird nicht mit 3,3V, sondern mit 5V versorgt, weil manche
USB-Seriell-Wandler 3,3V-Pegel nicht mehr korrekt auswerten. Man könnte
anstelle der 2-Transistor-Schaltung auch einen "halben" MAX 3232
verwenden (ein billigerer MAX 232 läuft übrigens nicht mit 3,3V).
Die Hardwareuhr erfordert nur 3 Bauteile plus Batterie. Der
betagte DS 1307 wird vom Betriebssystem problemlos erkannt und
eingebunden. Er hat (im Gegensatz zum neueren DS 1337) einen separaten
Anschluss für die Knopfzelle, was die Beschaltung vereinfacht, muß
jedoch mit 5V betrieben werden. Der I²C-Bus des Raspberry Pi verträgt
nur 3,3 V und hat bereits interne Pullup-Widerstände; man darf daher
keine separaten Pullup-Widerstände verwenden, die mit 5V gespeist
werden!
Schaltplan
Platinenlayout der ersten Variante
Der Aufbau erfolgt auf einer Streifenraster-Platine. Sie ist
für direktes Stecken ausgelegt, wird also mit der Lötseite nach oben
auf die 26- bw. 40- poligen Raspberry-Stiftleiste aufgesteckt.
Beim Entwurf des Lochraster-Layouts war zu beachten, daß die 10-polige
Steckbuchse gespiegelt werden muß, damit Pin 1 der Buchse auf Pin 1 der
Raspberry-Steckleiste liegt.
Sie muß auf die ersten 10 Pins gesteckt sein, leider ist es
etwas "fummelig", sie anzubringen, und wegen der
"Lochraster-unfreundlichen Randlage" der Raspberry-Stiftleiste hängt
die Platine auf zwei Seiten über. Wenn man die Platine falsch
aufsteckt, besteht die Gefahr, daß man Unheil anrichtet. Im praktischen
Betrieb hat mir die Lösung daher nicht mehr gefallen.
Mechanisch solider und elektrisch sicherer ist es, die Platine
nicht direkt zu stecken, sondern die üblichen Wannenstecker und
Flachbandkabel zu benutzen. Ich habe mir daher ein Y-Kabel hergestellt;
es verbindet die ersten 10 Pins des Raspberry-Steckleiste mit einem
10-poligen Stecker, auf dem 5V, 3,3V, Masse, RxD,TxD und I²C-Bus
liegen. Die freien 16 bzw. 30 Pins kann man über ein oder mehrere
weitere Flachbandkabel auf weitere Stecker legen. Die rot markierte
Ader des Flachbandkabels muß auf Pin 1 (er ist mit einer kleinen
Pfeilspitze gekennzeichnet) bzw. auf dem niedrigstmöglichen Pin liegen.
Die Stecker sollte man vorsichtig im Schraubstock verpressen; nimmt man
eine Zange oder dergleichen, verkantet der obere Steckerteil und
zerbricht.
Die Schaltung ist identisch, jedoch darf die 10-polige
Wannenbuchse nicht gespiegelt werden, da das Flachbandkabel 1:1
verbindet, und daher sieht das Platinenlayout anders aus:
Platinenlayout der zweiten Variante
Das passende Betriebssystem herunterladen
Vor einigen Monaten mußte ich noch das reguläre Raspbian-Image
mühsam um die vielen grafischen Anwendungen, die auf einem
Kommandozeilensystem eh keinen Sinn machen, bereinigen.
Seit kurzer Zeit gibt es jedoch ein kompaktes Raspbian-Image
ohne grafische Oberfläche. Es paßt auf eine 2GB-SD-Karte und hat zudem
den Vorteil, daß die unvermeidlichen Sicherheits-Updates wesentlich
kompakter ausfallen. Es basiert auf der neuesten stabilen
Debian-8-Version ("Jessie"):
https://downloads.raspberrypi.org/raspbian_lite/images/
Wer kein Fan der Kommandozeile ist, aber noch den Norton
Commander aus MS-DOS-Zeiten kennt, kann sich mit "apt-get install mc"
das Linux-Pendant, den Midnight Commander installieren.
Anpassung des Betriebssystems
Die folgenden Änderungen bewirken die Ausgabe der
Systemmeldungen und der Programmeldungen auf die serielle
Schnittstelle, das Laden der Module (Hardware-Treiber) für den
Uhrenchip, den automatischen Login und ggf. das automatische Starten
eines Programms. Sie werden der Einfachheit halber mit angeschlossenem
Monitor und Tastatur direkt auf dem Raspberry durchgeführt.
Es sind root-Reche erforderlich; das meiste läßt sich
komfortabel in einem Menüprogramm erledigen (auf der Kommandozeile
"sudo raspi-config" eingeben):
Hardwareuhr aktivieren:
Menüpunkt 3 Enable Boot to Desktop/Scratch: Console auswählen
Unter Menüpunkt Advanced Options:
A5 Device Tree: aktivieren
A7 I2C: automatisches Laden des I2C-Kernelmodules aktivieren
A8 Serial Login Shell over Serial aktivieren
A9 Audio: Menüpunkt "Force 3,5mm ('headphone') jack auswählen
Da ein Menüpunkt für die Hardware-Uhr in raspi-config fehlt,
muß man folgende Zeile von Hand (der Editor heißt "nano") an die Datei
/boot/config.txt anfügen:
dtoverlay=i2c-rtc,ds1307
Automatischer Login:
Unter Raspbian 7 ließ sich der automatische Login des Users "pi" sehr einfach einrichten::
Die Datei /etc/inittab editieren; die Zeile
T0:12345:respawn:/sbin/getty -L ttyAMA0 115200 vt100
mußte in
T0:12345:respawn:/sbin/getty -a pi -L ttyAMA0 115200 vt220
geändert werden.
Unter Raspian 8 (Jessie) wird es etwas komplizierter, da Raspbian 8 vom traditionellen Init-System zu Systemd gewechselt ist:
- den Ordner /etc/systemd/system/serial-getty@ttyAMA0.service.d anlegen
- in diesem Ordner die Datei autologin.conf anlegen, Inhalt:
[Service]
[ExecStart]=
[ExecStart]=-/sbin/agetty --autologin pi -s %I 115200,38400,9600 vt220
Anwendung automatisch starten:
Soll eine Anwendung im Kontext des Users "pi" automatisch
starten, muß man den Dateinamen als letzte Zeile in die versteckte
Datei ".profile" im Ordner /home/pi anfügen. Mit der Tastenkombination
"Control-C" kann man die meisten Anwendungen beenden, falls man mal
etwas auf der Kommandozeile erledigen möchte.
Der Test:
Nun sollte man die serielle Schnittstelle mit einem PC
verbinden, dort ein Terminalprogramm starten (Parameter: 115200 bit/s,
8N1), den Raspberry Pi rebooten und schauen, ob im PC-Terminalprogramm
die Systemmeldungen durchlaufen, die automatische Anmeldung erfolgt und
ggf. das automatisch zu startende Programm tatsächlich startet.
Nicht vergessen sollte man, ab und zu Betriebssystem-Updates herunterzuladen, damit keine Sicherheitslücken offenbleiben:
sudo apt-get update && sudo apt-get dist-upgrade
Das kann man auch automatisieren, aber ich habe mich noch nicht damit beschäftigt.
Raspberry herunterfahren
Statt mit "sudo halt" sollte man den raspberry mit "sudo
systemctl poweroff" herunterfahren. Er verbraucht dann weniger
Ruhestrom.
Update (11.3.1016):
Auf dem brandneuen Raspberry Pi 3 funktioniert die oben beschriebene
Lösung erst nach einigen Eingriffen. Grund ist, dass die Funktion der
seriellen Schnittstelle /dev/ttyAMA0 geändern wurde. Sie liegt nicht
mehr auf den GPIO-Pins 14 und 15, sondern ist standardmäßig mit dem
neuen bo(a)rdeigenen Bluetooth-Chip verbunden.
Die Zuordnung der internen Peripheriefunktionen zu den
GPIO-Pins lässt sich über dtoverlay-Files verändern. Da die herkömmliche
Funktion der seriellen Schnittstelle /dev/ttyAMA0 von einigen Nutzern
vermisst wurde, gibt es zwei neue dtoverlay-Files, die entweder
Bluetooth deaktivieren oder serielles Bluetooth auf eine weitere,
weniger leistungsfähige Schnittstelle /dev/ttyS0 verlegen. Da ich
Bluetooth im Moment nicht benötige, habe ich es abgeschaltet.
Um den neuesten Kernel und die neuesten dtoverlay-Files zu
erhalten, muss man sie mit "sudo rpi-update" installieren (notgedrungen
an der normalen Linux-Paketverwaltung vorbei, was man nur aus gutem
Grund machen sollte).
Danach ist die Datei /boot/cmdline.txt zu editieren, sie muss so aussehen:
dwc_otg.lpm_enable=0 kgdboc=serial0,115200
console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4
elevator=deadline fsck.repair=yes rootwait
Auch die Datei /boot/config.txt muss geändert werden. Das neue
dtoverlay-File muss geladen werden und die Syntax für die DS1307-RTC hat
sich geändert. Die folgende Zeile ist zu löschen:
dtoverlay=i2c-rtc,ds1307
Die folgenden Zeilen müssen angehängt werden:
dtoverlay=pi3-disable-bt
dtoverlay=i2c-rtc
dtparam=ds1307
Schließlich
sollte man noch den seriellen Bluetooth-Dienst durch die Eingabe von
"sudo systemctl disable hciuart" deaktivieren, damit er nicht mehr auf
die serielle Schnittstelle zugreift.
Wer die serielle Bluetooth-Funktion nicht deaktivieren,
sondern auf den zweiten UART /dev/ttyS0 verlegen will: in der Datei
/boot/overlays/README ist das Vorgehen näher beschrieben.