RTC-Modul für Raspberry Pi

Der Raspberry Pi hat ja bekanntlich kein RTC-Modul. Wird der Raspberry Pi ohne funktionierende Netzwerkverbindung gestartet, so passt die Uhrzeit nicht, da er sich die im Betrieb erst per NTP abholt. Abhilfe schafft ein RTC (RealTimeClock)-Modul. Solche findet man bei EBay, Amazon & Co massenweise für wenige Euros.

Ich kaufte mir für 7,99 EUR das „Baoblaze DS1307 Echtzeituhr-Speichermodul“. Neben dem Modul benötigt man noch eine Knopfzelle. Hat man die eingesetzt, kommt der spannende Teil: es gibt keine brauchbare Anleitung für das Teil. In der Packung war auch nichts.

Beginnen wir erstmal mit der Montage des Moduls. Wie es auf den Raspberry Pi aufgesteckt werden muss, kann man anhand des Produktfotos erahnen:

Daraufhin passierte aber erstmal nichts. Logisch – man muss das Modul im Raspberry Pi auch erstmal konfigurieren. Da ich mir die Anleitungen aus vielen Bruchstücken im Netz zusammengesucht habe, hier die komplette Fassung:

  1. Modul einbauen
  2. I2C-Interface aktivieren -> sudo raspi-config aufrufen, dann auf Punkt 5 „Interfacing Options“ gehen und dort das I2C-Interface auf enabled stellen, Raspberry dann neu starten
  3. Zwei weitere Pakete müssen instaliert werden, was der Befehl erledigt: sudo apt-get install python-smbus i2c-tools
  4. Nun kann man prüfen, ob das Modul erkannt wird. Die ID 68 muss angezeigt werden, wenn man diesen Befehl eingibt: sudo i2cdetect -y 1
    Wird stattdessen UU angezeigt, ist das entsprechende Kernel-Modul bereits aktiv.
  5. Jetzt müssen wir das Kernel-Modul aktivieren. Hierzu editiert man die Datei /boot/config.txt (z.B. per sudo nano /boot/config.txt). Je nach verwendeten Modul muss man nun folgende Zeile hinzufügen:
    DS1307: dtoverlay=i2c-rtc,ds1307
    PCF8523: dtoverlay=i2c-rtc,pcf8523
    DS3231: dtoverlay=i2c-rtc,ds3231
    Ist das erledigt, wird der Raspberry nochmal neu gestartet.
  6. Nun wiederholen wir Schritt 4. Diesmal muss im Feld 68 der Wert UU angezeigt werden.
  7. Um den Kernel-Treiber richtig zu aktivieren, muss man das Paket fake-hwclock entfernen. Wichtig ist, das vorher der Schritt 6 erfolgreich war! Das Entfernen erfolgt mit diesen beiden Befehlen:
    sudo apt-get -y remove fake-hwclock
    sudo update-rc.d -f fake-hwclock remove
  8. Nun müssen wir noch das Skript, welches die HWClock setzt anpassen. Dies erfolgt mit dem Befehl:
    sudo nano /lib/udev/hwclock-set
    Ziemlich am Anfang der Datei stehen diese 3 Zeilen:
    if [ -e /run/systemd/system ] ; then
    exit 0
    fi
    Diese Zeilen kommentiert man aus, in dem man in jede dieser 3 Zeilen direkt an den Anfang ein # schreibt. Datei dann abspeichern.
  9. Nun lesen wir mal die Zeit aus dem RTC-Modul aus – dies geht mit
    sudo hwclock -D r
  10. Nun prüfen wir, ob Datum und Uhrzeit vom Raspberry richtig gesetzt sind. Hierzu einfach date eintippen.
  11. Passt die Zeit vom Raspberry, können wir die aktuell Raspberry-Zeit zum RTC schreiben mit:
    sudo hwclock -w
    So lange die Batterie im Modul nicht leer wird, wird dieser Befehl auch nicht mehr benötigt.
  12. Mit sudo hwclock -r können wir die Zeit nun aus dem Modul lesen.

So – das wars. Schon wird die Zeit vom Raspberry Pi immer korrekt sein.

 

Per VNC auf den Raspberry Pi schalten

Manchmal ist es nicht schlecht, wenn man sich mal kurz auf den Raspberry Pi per VNC draufschalten kann. Nun kann man zwar einfach einen VNC-Server wie TightVNC installieren, allerdings stellt dieser einen zusätzlichen virtuellen Bildschirm bereit. Ich möchte aber genau das sehen, was auch wirklich auf dem angeschlossenen Bildschirm dargestellt wird. Hierzu benötigt man das Paket x11vnc

Also:

sudo apt-get updatesudo apt-get install x11vnc

Und danach startet man das ganze einfach aus einer SSH-Sitzung heraus mit

x11vnc -usepw -forever -display :0

Die Option „-forever“ besagt, das der VNC-Server auch nach der Verbindungstrennung weiterläuft. Mit „-usepw“ wird man beim ersten Aufruf nach einem VNC-Kennwort gefragt. Das sollte man nun festlegen. Es hat mit dem Linux-Benutzerpasswort nichts zu tun. Hier geht es um das Passwort, das man beim Verbindungsaufbau in seinem VNC-Client eingeben muss. Ein Readonly-Kennwort muss man nicht vergeben.

Der Verbindungsaufbau zum VNC-Server ist nun so lange möglich, wie die aktuelle SSH-Session läuft bzw. so lange bis man mit Strg + C den Server beendet hat.

Um eine Verbindung aufzubauen benötigt man einen beliebigen VNC-Client, den es für fast alle Betriebssysteme gibt. Der Verbindungsaufbau erfolgt dann zur IP vom Raspberry Pi gefolgt von der Portnummer 5900. Also z.B. zu 192.168.178.25:5900

Manchmal wäre es schön, wenn der VNC-Server automatisch nach der User-Anmeldung gestartet werden würde. Hierzu erstellt man eine Autostart-Datei namens /home/pi/.config/autostart/X11VNC.desktop

mit folgendem Inhalt:

[Desktop Entry]
Type=Application
Name=X11VNC
Exec=x11vnc -usepw -forever -display :0
StartupNotify=false

Und nach einem Neustart vom Raspberry Pi wird nun nachdem sich der Benutzer angemeldet hat, automatisch der VNC-Server gestartet.

Nun kann es aber auch sinnvoll sein, das der VNC-Server noch vor der Benutzeranmeldung gestartet wird. Auch das geht. Zunächst muss man das VNC-Passwort an zentraler Stelle ablegen:

sudo x11vnc -storepasswd /etc/x11vnc.pass

Dann legen wir eine systemd-Unit an,

sudo nano /lib/systemd/system/x11vnc.service

mit folgendem Inhalt:

[Unit]
Description=Start X11VNC
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display :0 -auth guess -forever -loop -noxdamage -repeat -rfbauth /etc/x11vnc.pass -rfbport 5900 -shared

[Install]
WantedBy=multi-user.target

Und last-but-not least wird nun noch der autostart eingerichtet:

sudo systemctl enable x11vnc.service

 

 

SSH auf dem Raspberry Pi aktivieren (Headless-Installation)

Will man einen Raspberry Pi mit Raspian in Betrieb nehmen, ist es eigentlich ganz einfach: Raspian Image auf die SD-Karte schreiben und dann Maus, Tastatur und Bildschirm anschließen und das ganze konfigurieren.

Früher konnte man auch direkt per SSH zugreifen, d.h. man konnte sich den Weg sparen, erst eine Maus und Tastatur sowie einen Bildschirm anzuschließen. Aus Sicherheitsgründen geht das in den neueren Raspbian-Versionen nicht mehr, da hier der SSH-Server standardmäßig erstmal deaktiviert ist. Jetzt gibt es aber durchaus Situationen, in denen man einen Raspberry headless (also ohne Peripherigeräte) in Betrieb nehmen will und dann per SSH konfiguriert.

Auch das geht noch, wenn auch mit einem kleinen Trick: man legt einfach eine leere Datei Namens „ssh“ auf der SD-Karte an. Wird der Raspberry nun damit gestartet, löscht er diese leere Datei wieder und aktiviert SSH dauerhaft.

WICHTIG: Da man nun mit Standardpasswörtern auf den Raspberry kommt, sollte das erste sein, das man mit „passwd“ sofort das Passwort des Benutzers „pi“ ändert. So lange das nicht erfolgt ist, stellt SSH auf dem Raspberry durchaus ein Sicherheitsproblem dar.

 

Raspberry Pi 3 – WLAN und Bluetooth deaktivieren

Die große Neuerung am Raspberry Pi 3 ist das integrierte WLAN und Bluetooth-Modul. Einerseits ist das ja super, auf der anderen Seite ist es aber manchmal nicht gewünscht. Jetzt könnte man natürlich einen älteren Raspberry Pi 2 nehmen, aber wenn man den gerade nicht zur Hand hat, oder das mehr an Rechenleistung benötigt wird, dann kann man auch am Raspberry Pi 3 das WLAN und Bluetooth deaktivieren.

Am zuverlässigsten erledigt man das, indem man die Kernel-Module deaktiviert.

Das geht über die Datei /etc/modprobe.d/raspi-blacklist.conf

Hier fügt man folgende Zeilen hinzu:

#WiFi
blacklist brcmfmac
blacklist brcmutil
blacklist cfg80211
blacklist rfkill
#Bluetooth
blacklist btbcm
blacklist hci_uart

Für Bluetooth muss man noch einen Dienst deaktivieren, da sonst Fehlermeldungen auftreten können, da der versucht auf die Kernelmodule zuzugreifen. Das geht mit:

sudo systemctl disable hciuart

Nach einem Neustart ist Bluetooth und WLAN nicht mehr verfügbar. In einem Forum habe ich aber gelesen, das die Funkmodule trotzdem noch aktiv sind und auch munter vor sich hin funken. Aber zumindest vom Betriebssystem her können sie so nicht mehr angesprochen werden.

Zugriff auf die Raspberry-Kamera über ein Webinterface

Über den vorher installierten nginx-Webserver und PHP wollte ich das Kameramodul vom Raspberry ansprechen. Dabei sollte das ganze als Dokumentenkamera dienen, die nur bei Aufruf einer Webseite jeweils ein stehendes Bild überträgt. Zunächst dachte ich: kein Problem. Aber im folgenden zeigte sich, das man doch einige Dinge beachten muss, damit das ganze optimal zusammenspielt.

An der Kommendozeile des Raspberrys kann man über den Befehl „raspistill -o dateiname.jpg“ ein einzelnes Foto machen und als Datei ablegen. Genau damit wollte ich das auch in PHP machen.

Hier nun die Lösung:

Datei bild.php:

<?PHP
 shell_exec("/usr/bin/raspistill -q 60 -br 50 -ex auto -co 20 -sa 20 -mm average -sh 10 -w 1920 -h 1440 -n -o /var/www/html/out/image.jpg");
 $filename = "out/image.jpg";
 $handle = fopen($filename, "rb");
 $contents = fread($handle, filesize($filename));
 fclose($handle);
 echo $contents;
 unlink($filename);
 ?>

Im Webserververzeichnis muss man noch das Verzeichnis „out“ anlegen, in dem dann die Bilder abgelegt werden und dem Schreibrechte für alle geben – also sudo chmod 555 /var/www/html/out/image.jpg

Nun baut man sich eine kleine HTML-Datei, die das PHP als Bild einfügt. Es muss also sowas in der Art im Body-Bereich drinnen stehen:

<img src="bild.php" width="1920" height="1440">

Und natürlich kann man das ganze noch in hübsch machen und vielleicht noch einen JavaScript-Reload-Button anbringen.

Wenn man die HTML-Datei nun so aufruft, wird es aber noch immer nicht funktionieren, da der User des Webservers keinen Zugriff auf das Video-Device des Raspberrys hat. Das löst man nun einmalig mit

sudo chmod 777 /dev/vchiq

Nun kann man es mal testen. Nach einem Neustart vom Raspberry werden aber die Zugriffsrechte von /dev/vchiq wieder zurückgesetzt.

Dauerhaft bekommt man das so hin:

echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0777"' > /etc/udev/rules.d/10-vchiq-permissions.rules

 

nginx Webserver auf Raspberry Pi mit PHP installieren

Für den Apache-Webserver gibt es genug Anleitungen, wie man den am Raspberry installiert und PHP aktiviert. Ich war aber auf der Suche nach einer Lösung mit dem ressourcenschonenden nginx-Server. Wie so oft habe ich hier einige falsche Anleitungen gefunden. Hier nun eine „richtige“, die ich mit dem aktuellen Raspian getestet habe.

Zunächst installieren wir den nginx-Webserver:

sudo apt-get install nginx

Als nächstes können wir PHP und die wichtigsten Zusatzmodule installieren. Die Zusatzmodule sind nicht unbedingt erforderlich – hier kann man bei Bedarf auch einzelne weglassen.

sudo apt-get install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd

Jetzt öffnen wir mit einem Editor wie z.B. nano die Datei /etc/nginx/sites-enabled/default – also z.B. sudo nano /etc/nginx/sites-enabled/default

Damit der Server nicht standardmäßig nur die index.html sondern auch noch die index.php aufruft, suchen wir nun nach einer Zeile die so aussieht und ergänzen Sie um den fett geschriebenen Teil:

index index.php index.html index.htm;

Etwas weiter unten in dieser Datei gibt es dann einen Abschnitt, in dem die PHP-Einbindung konfiguriert wird. Hier müssen wir lediglich vor einigen wenigen Zeilen das Kommentarzeichen # entfernen. Das ganze muss am Ende so aussehen:

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                # With php5-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
        }

Das wars dann auch schon. Mit sudo /etc/init.d/nginx reload wird nun noch die geänderte Konfiguration geladen und schon sollte alles funktionieren.

Um zu testen, ob PHP nun auch vom Webserver unterstützt wird, legt man sich am besten eine Datei mit dem Namen test.php im Serververzeichnis an und trägt dort folgenden Inhalt ein:

<?php echo phpinfo(); ?>

Wenn man nun die test.php im Browser aufruft, sieht man, ob alles geklappt hat.

Raspberry Pi – Netzwerkplatte automatisch einbinden

Bisher war es im Raspberry relativ einfach, eine Netzwerkfestplatte automatisch beim Start des Raspberrys einzubinden. In der aktuellen Raspian-Version funktionierte das mit meinem Western Digital NAS leider nicht mehr. Die Lösung war nicht ganz so trivial, aber dank meines Kollegen wurde sie gefunden:

Zunächst trägt man in der Datei /etc/fstab diese Zeile ein (Wert natürlich anpassen):

//ip.vom.nas/Freigabename /media/nas cifs username=user,passwd=passwort,dir_mode=0777,file_mode=0777 0 0

Das Verzeichnis /media/nas muss natürlich angelegt sein und entsprechende Berechtigungen besitzen. Bei mir war das Problem, das die Freigabe den Namen „Eigene Bilder“ hatte. Mit einem Leerzeichen klappte es nicht. Auch nicht wenn ich es wie unter Windows üblich in Anführungszeichen setzte. Hier half dann ein /Eigene\040Bilder  weiter. Mit \040 kann man also ein Leerzeichen im Freigabe- oder Verzeichnisname ausdrücken.

Danach konnte ich die Platte mit  sudo mount -a   mounten.

Der automatische Mount beim Start klappte aber erst nachdem ich in der Raspberry-Konfig den Eintrag „Wait for network“ aktiviert hatte.

raspi-wait-for-network

Raspberry Pi: Neue Schriftarten hinzufügen

Eine Präsentation auf einem Flachbildschirm sollte mit einem günstigen Raspberry Pi gezeigt werden. Die Präsentation wurde unter LibreOffice auf einem Windows-Rechner erstellt und als sie am Raspberry geöffnet wurde, waren die Textumbrüche ziemlich kaputt.

Die weitere Analyse ergab, das hier eine spezielle TTF-Schriftart verwendet wurde. Nun hätten wir natürlich die Präsentation auf eine Standard-Schrift ändern können, aber die andere Lösung erschien sinnvoller: Die Schriftart muss auf den Raspberry.

Das ganze ist relativ simpel: TTF-Datei in den Ordner  /usr/share/fonts  (für alle Benutzer) oder  /home/pi/.fonts  (nur für den Pi-Nutzer) kopieren. Falls erforderlich den Ordner vorher anlegen.

Das nächste Problem waren dann fehlende Standard-Schriftaren wie z.B. Arial. Aber auch hierfür gibts eine einfache Lösung:

apt-get install ms-corefonts-installer

Mit diesem Befehl werden die MS-Windows Standard-Schritarten heruntergeladen und installiert.

Mit fc-list kann man sich an der Kommandozeile alle installierten Schriftarten ausgeben lassen.

Raspberry Pi: Bildschirm-Auflösung ändern

Meistens ist es ganz einfach: Raspberry Pi anschließen, Strom anstecken und schon wird ein Bild am angeschlossenen Bildschirm angezeigt. Meistens erkennt der Raspberry den angeschlossenen Bildschirm und stellt sich auf eine sinnvolle Auflösung ein. Manchmal funktioniert diese Automatik aber nicht richtig, oder der Bildschirm wird erst nach dem Start angeschlossen. Dann macht es Sinn, die Auflösung manuell einzustellen.

Zunächst ermittelt man, welche Auflösungen der Bildschirm unterstützt. Hier helfen diese beiden Befehle weiter:

tvservice -m CEA

tvservice -m DMT

CEA und DMT sind verschiedene Betriebsmodis von HDMI. Meistens ist es eher egal, welchen von beiden man verwendet.

Mit

tvservice -s

kann man sich die aktuelle Auflösung anzeigen lassen.

In der Datei /boot/config.txt kann man nun den Betriebsmodi und die Auflösung fest vorbelegen. Der Eintrag hdmi_group=1 ist für CEA, der Eintrag hdmi_group=2 für DMT. Hier einfach das #-Zeichen vorne in der Zeile entfernen und den Eintrag selbst entsprechend Ändern.

Im Eintrag hdmi_mode=  legt man dann noch die Auflösung fest. Hier sollte man unbedingt sicherstellen, das man etwas einträgt, was der Bildschirm auch kann. Ansonsten kann man das nur per SSH wieder „reparieren“.

Nach einem Neustart wird dann die eben eingestellte Auflösung verwendet.

raspberry-aufl1

SD-Karte vom Raspberry wieder am PC verwenden

Heute nahm ich eine SD-Karte von einem Raspberry (vorher war Raspian drauf installiert) und wollte am PC Daten darauf speichern. Leider wurde nicht viel daraus, da mir nur noch ca. 76 MB der ursprünglichen 16 GB angezeigt wurden. Auch ein Formatieren der Karte änderte daran nichts und auch die Datenträgerverwaltung von Windows löste das Problem nicht.

Nach einigem probieren hier die Anleitung, wie man die Speicherkarte so löscht, das der volle Speicherplatz wieder verfügbar ist.

Zunächst benötigt man eine Eingabeaufforderung. Hier wird Diskpart gestartet. Der Befehl list disks zeigt alle Festplatten, Speicherkarten und Wechselmedien an. Wichtig ist es nun, den richtigen Datenträger zu erwischen. Im Zweifelsfall den Befehl erst ohne SD-Karte, dann mit ausführen.

Mit select disk + vorher ermittelte Nummer wählt man das passende Laufwer aus und mit clean löscht man alles darauf. Mit exit beendet man dann DiskPart wieder.

Warnung: Die Befehle bitte sorgsam und richtig eingeben und vorher 2x nachdenken! Ein clean auf das falsche Laufwerk wird sehr zuverlässig zu Datenverlust führen.

raspi-partdelete