RasPi-Erweiterung: Hardware-Uhr und serielle Konsole        

von Ralf Beesner                  
Elektronik-Labor   Projekte   AVR 

 

Ü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.



Elektronik-Labor   Projekte   AVR