Skip to content
On this page

Raspberry Pi Headless

In diesem Versuch werden Sie Linux auf ein Raspberry Pi – kurz "Raspi" installieren und danach GPIOZugriffe per Shell Script und Python Script tätigen und dann auch einen einfachen Music Player realisieren.

Raspberry Pi OS Grundinstallation

Auf https://www.raspberrypi.com/software/operating-systems/ finden Sie verschiedene Raspberry Pi OS Installations-Images, der „Raspberry Pi Foundation“, also jener Organisation, welche die Raspi-Hardware entwickelten.

Früher wurde das Raspberry Pi OS Raspbian benannt, weil es (wie Ubuntu) auf die LinuxDistribution Debian basiert und auf den jeweils aktuellen Debian „stable“ zugrunde liegt (vgl. https://www.debian.org/releases/).

Nebst dem Raspberry Pi OS der „Raspberry Pi Foundation“ gäbe es fürs Raspi auch ein angepasstes Ubuntu oder das sehr schlanke Arch Linux - oder sogar Windows (jedoch ohne graphische Oberfläche [1]) sowie spezialisierte Linux-basierte Images wie Media-Server Images (z.B. das LibreELEC) oder auch eine Anleitung, wie man das Raspi Betriebssystemlos direkt in Assembler programmieren kann!

Da wir im Linux-Labor ohnehin keine Monitore haben, verwenden wir das „Raspberry Pi OS (32-bit) Lite" welches keine graphische Desktop-Umgebung (und auch weder X-Server noch Wayland) beinhaltet, wodurch sich die Download- und SD-Karten Kopierzeit verkürzt. (Sie können aber auch die Desktop-Version verwenden).

  • Downloaden Sie also des neuesten „Raspberry Pi OS Lite" in der 32-bit Version von deer Download Page auf https://www.raspberrypi.com/software/operating-systems/ auf Ihr natives Hostsystem(Windows, OS-X, …). (Anmerkung: die 32-bit Version läuft auch auf älteren Raspis.)
  • Auf welchen Debian Release basiert das aktuelle Raspberry Pi OS ? Release Nr: …. Release Name: ……
  • Entpacken Sie nach Download die darin enthaltene .img Datei. (Unter Windows z.B. per 7-Zip http://www.7-zip.org/, unter OS-X z.B. per "The Unarchiver" https://theunarchiver.com/ )
  • Stecken Sie dann die SD-Micro Karte in den USB-Cardreader und diesen wiederum in einen USB-Port des Notebooks. Eine ev. Formatierungsaufforderung brechen Sie ab (auf OS-X z.B. mit „irgnorieren“).

Die Image-Datei soll nun mit einem geeigneten Programm „Byte-für-Byte“ auf die Disk-Sektoren der SDKarte kopiert werden (also nicht einfach als Datei via Dateisystem auf die vorformatierte SD-Karte).

Unter Linux könnte die Image Datei entweder mittels einem kompfortablen GUI-Tool oder alternativ mit dem Linux-Console Command dd auf die SD geschrieben werden[2].

Der Einfachheit halber und um Zeit zu sparen, führen Sie dies jedoch direkt auf Ihrem Hosts-OS durch.

Eine Image-Datei unter Windows oder OS-X auf die SD-Karte schreiben

Windows hat keine „Boardmittel“ um ein Disk-Imagedatei auf die SD-Karte zu schreiben und unter OS-X ist es mit den vorinstallierten Console Commands auch nicht einfach, weswegen Sie am bequemsten das Programm "Raspberry Pi Imager" verwenden.

Installieren Raspberry Pi Imager gemäss Anleitung hier: https://www.raspberrypi.com/software/.

Sobald Sie das Programm starten, werden Sie feststellen, dass Sie bequem ein Image auswählen können. Wir verwenden allerdings unser eben heruntergeladenes Disk Image.

  • Wählen Sie das Passende Raspberry Pi Board
  • Unter "Choose OS" wählen Sie dazu einfach die Option ganz am Ende "Use Custom" (Select a custom .img ....).
  • Legen Sie nun Ihre SD-Karte im Hostsystem ein und wählen Sie die ganze Karte.

Aufpassen, richtiges Speichermedium auswählen

Verfügen Sie beim Hostsystem über mehrere Speichermedien, ist hier äusserste Vorsicht geboten, da alle Daten auf der ausgewählten Disk gelöscht werden.

Im nächsten Schritt können Sie zusätzliche Einstellungen vornehmen ("Edit Settings"). So zum Beispiel gerade einen usernamen und ein passwort, sowie einen WiFi Access Point (z.B. Ihren eigenen Hotspot). Wählen Sie folgende Optionen:

  • Set Hostname: Geben Sie ihrem Raspi einen eindeutigen Namen
  • Username / Password: Setzen Sie bereits einen Usernamen und Passwort
  • Wifi: Geben Sie SSID und Passwort Ihres persönlichen Hotspots ein. Dies erleichtert die weiteren Schritte, welche das nachladen von Software erfordern. Setzen Sie auch gleich den Ländercode.
  • Unter Services wählen Sie "Enable SSH" und "Use password authentication."

Als nächstes können Sie den Flashvorgang starten.

Das Raspberry Pi

Bevor wir das Raspberry Pi in Betrieb nehmen, schauen wir uns das Board etwas genauer an.

Ein Raspberry Pi (s. Bild rechts) oder kurz „Raspi“ ist ein kreditkartengrosser Einplatinencomputer mit der Leistungsfähigkeit in etwa eines schwach- bis mittelleistungsfähigen Smartphones, zwar ohne Display, dafür mit gängigen PC-Schnittstellen wie Ethernet, USB, Analog-Audio, HDMI, Kamera- und LCDGrafik-Interface. Über USB und HDMI wären PCKeyboard, Maus und Monitor anschliessbar, sodass ein Raspi wie ein leistungsschwacher PC verwendet werden kann.

Gebootet wird das Raspi über eine geeignet präparierte SD-Karte.

Oft wird das Raspi auch „Headless“ verwendet, also ohne Tastatur und Monitor um kleine Server oder ein Internet-of-Things (IoT) zu realisieren.

Um weitere Hardware anzusteuern sind auf einer GPIO-Stiftleiste (engl. „GPIO Header“) nebst 3.3V und 5V auch so genannte GPIOs (General Purpose Input/Output also digitale Ein-/Ausgänge) vorhanden. Einige GPIOs lassen sich auch als I2C/SPI/I2S/UART Schnittstelle konfigurieren (s. Bild unter den GPIOxx grau angegeben).

Pinout beim Raspberry Pi:

Frage: Welche der zuvor aufgeführten Schnittstellen würden Sie verwenden um folgende Hardware an ein Raspi anschliessen: Taster: LED: RTC :



AD-Wandler: asynchron serielles „Terminal“:



Audio D-Verstärker-Chip mit digitalem Audio-Eingang:



Die CPU, die GPU (Grafik Prozessor) und fast alle Schnittstellen befinden sich auf einem "System-on-Chip" (abgekürzt SoC) der Firma Broadcom mit Bezeichnungen wie BCM2835 (Raspi 1), BCM2836 (Raspi 2), BCM2837 (Raspi 3), BCM2711 (Raspi 4) und BCM2712 (Raspi 5). BCM ist folglich die Abkürzung des Herstellers "Broadcom".

Signalpegel

Achtung! Alle Signale und Schnittstellen auf der GPIO-Stiftleiste führen ungeschützt auf den SoC und haben 3.3V CMOS Logikpegel. Daran angelegte Signale müssen deshalb zwingend im Bereich 0V...3.3V liegen, andernfalls nimmt der SoC schaden!!

Generell gilt: Zwecks Potenzialausgleich allfällig vorhandener statischer Ladung sollten GPIO- und Bauteilpins nie mit den Fingern berührt werden sonder zuerst immer die Print-Kanten sowie ein leitendendes Stecker-Gehäuse!

Das Raspberry Pi gibt es verschiedene Generationen und Varianten: (s.a https://de.wikipedia.org/wiki/Raspberry_Pi)

  • Raspberry Pi 1 (aus dem Jahre 2012: sehr leistungsschwach und nur mit 26 pol. GPIO Stiftleiste)
  • Raspberry Pi 2 Model B (mit 40 statt 28 pol. GPIO-Stiftleiste, 4 USB-Ports, mehr DRAM und Quad-Core CPU)
  • Raspberry Pi 3 Model B (schnellere 64-bit CPU und zusätzlich 2.4GHz WLAN + Bluetooth 4.1)
  • Raspberry Pi 3 Model B+ (zusätzlich 5GHz WLAN und Bluetooth 4.2)
  • Raspberry Pi 4 Model B (leistungsfähigere CPU/GPU/Schnittstellen; Bluetooth 5; 1GB, 2GB oder 4GB DRAM 4)
  • Raspberry Pi 5 (noch leistungsfähiger, PCIe 2.0x1 Connector herausgeführt, Power Button, RTC, dedizierte UART Schnittstelle, bis 16GB RAM)
  • daneben gibt es noch die leistungsschwachen aber günstigen Raspberry Pi Zero und Raspberry Pi Zero W (mit WLAN) sowie die "Compute Module" CM3 und CM4 welche zu den Raspi 3 resp. 4 kompatibel sind.

Frage: Welche Version Raspberry Pi wird in diesem Unterricht verwendet?



Die 5V Stromversorgung erfolgt über einen USB-C Anschluss, welcher ansonsten keine USB-Funktion hat. Da Spitzenströme bis über 3A vorkommen können, ist die Speisung ab einer USB-Buchse eines PCs oder Notebooks meist zu schwach! Hingegen eigenen sich genügend starke Smartphone-Netzteil.

Entwickelt wurden die Raspberry Pi wie erwähnt von der englischen Raspberry Pi Foundation, einer NonProfit Organisation mit Wurzeln n der Cambridge University und Homepage auf https://www.raspberrypi.org.

Unter https://www.raspberrypi.org/documentation/hardware/raspberrypi/ findet man nebst Teil-Schema auch eine (ziemlich magere) Beschreibungen der Broadcom SoCs.

Weitere Info betr. GPIO Stiftleiste findet man auf http://elinux.org/Rpi_Low-level_peripherals.

Soll an ein Raspi eine Harddisk angeschlossen werden, so war dies lange nur via USB realisierbar, denn Raspis führer Generationen haben weder SATA, PCIe noch m.2 Anschlüsse. Das Raspberry Pi 5 verfügt über eine PCIe Lane, welche über einen Flachbandstecker herausgeführt wird.

Im Vergleich zu anderen Linux Bastelboards ist die Raspberry Pi Community aber sehr gross und die Entwicklung seriös.

Boards aus Fernost sind teils mit SATA-Anschluss erhältlich, z.B. das Banana Pi Pro, CubieBoards oder die Orange Pi Boards. vgl.https://en.wikipedia.org/wiki/Comparison_of_single-board_computers

Fürs Raspi 5 existiert ein M2 HAT, entweder von Drittanbietern oder als offizielles Accessory von der Raspberry Pi Foundation: https://www.raspberrypi.com/products/m2-hat-plus/.

Post Installation

Sobald das Image vollständig auf die Disk geschrieben wurde, entfernen Sie die SD-Karte und stecken sie wieder ein.

In Ihrem Hostsystem erscheint die SD-Karte nun als Laufwerk. Hierbei handelt es sich aber lediglich um die Boot Partition der SD-Karte. Verwenden Sie als Host MAC OS oder Windows, so ist die eigentliche Root File System Partition (dort wo der ganze Linux User Space, Programme, etc. abgelegt worden sind) gar nicht sichtbar.

Weitere Schritte für manuelles aufsetzen (ohne Raspberry Pi Imager)

Falls Sie die Settings mit dem Raspberry Pi Imager bereits angepasst haben (username, password, ssh, ...) können Sie diesen Teil überspringen.

Navigieren Sie zur Boot Parition der SD-Karte im File Explorer.

  • Erstellen Sie ein File ssh ohne File-Endung (dies aktiviert den SSH Service beim Booten des Raspis).
  • Erstellen Sie ein File userconf.txt mit folgendem Inhalt:
    txt
    pi:$6$ZijJFXcGAX6d6ZlT$zNyWttQn8uB.SwS2/HWE1POB7Tdxlkxi6gssnB0le6v7KjAI7iQaw1Ekt2jvIX1JhxMAHBD2jTSO.FlaP8HcJ0
    
    Achten Sie darauf, dass das File keine neue Zeile am Schluss erhält. Es handelt sich hierbei um den Usernamen pi und das gehashte Passwort raspberry. Sie können via echo 'meinpasswort' | openssl passwd -6 -stdin auch selber einen Passwordhash generieren und den obigen ersetzen, falls gewünscht.

Asynchrone Serielle Console zum Target einrichten

Ab Raspberry Pi 3 muss die serielle Console zuerst aktiviert werden, wozu auf der SD-Karten Partition boot in der Datei config.txt editiert werden muss. Damit auf den GPIOs die serielle Konsole verfügbar ist, müssen wir dem Bootloader noch ein paar Optionen mitgeben.

Erweitern Sie das File config.txt unter der Sektion [all] um noch folgende Zeilen:

txt
enable_uart=1
dtparam=uart0
dtparam=uart0_console

Um mit der Console des Raspis sprechen zu können, schliessen wir einen USB-UART Adapter an den entsprechenden Pins des Raspis an. Übers Terminal (Putty, picocom, screen, ...) können wir dann mit einer BASH Befehle ans Raspberry Pi übermitteln, ohne dass wir eine Tastatur und ein Display anschliessen (also headless).

Logikpegel 3.3V

Der zu verwendende USB-Serial Adapter muss hierfür 3.3V Logikpegel und nicht RS232 Normpegel oder 5V Pegel haben!

  • Verbinden Sie das USB-Serial Cable „gekreuzt“ aufs Raspi. RX auf TX und TX auf RX. Die Kabelfarbe stimmt nicht mit folgender Illustration überein. Stecken Sie den UART Adapter noch nicht ins Notebook ein.

Kurzschlussgefahr!

Achten Sie sehr genau darauf, wo Sie GND vom UART adapter anschliessen. Auf dem benachparten Pin liegen 5V (und mehrere A vom Netzteil an).

Falls Sie diesen falschen Pin mit GND erwischen, kann dies neben einem Kurzschluss auch zur Beschädigung des USB an Ihrem Hostsystem führen.

ESD Gefahr

Achtung! Beim direkten berühren des Boards jeweils zuerst eine Massefläche des Boards berühren (z.B. die metallene Ethernet- oder USB-Buchse wodurch das Board elektrostatisch auf das eigene elektrostatische Potenzial gebracht wird). Erst dann Pins stecken und/oder berühren!!!

UART

  • Kontrollieren Sie nochmals genau, ob Sie den Adapter an den richtigen Pins angeschlossen haben.
  • Stecken Sie erst jetzt den USB-Stecker des USB-Serial Cables an den Notebook an.

Serial Terminal Emulation

Sie haben nun die Wahl, entweder ein „Serial Terminal Emulation“ Programm auf dem Hostsystem oder dem Gastsystem zu verwenden. Der Einfachheit halber verwenden Sie eines auf Ihrem nativen Hostsystem:

Windows

Installieren Sie das Programm 'putty.exe' (vom AD unter FOSS oder von https://www.putty.org/)

Kontrollieren dann im Windows Gerätemanager unter „Anschlüsse (COM&LPT)“ unter welcher COM Nr. das "USB-Serial" Cable angezeigt wird. Falls kein COMx-Interface angezeigt wird, lassen Sie Windows nach einem Treiber suchen oder installieren den FTDI VCP Treiber von https://ftdichip.com/drivers/.

In putty wählen Sie links die Category: Session sowie rechts unter Connection Type: Serial, dann die COMx-Schnittstelle des USB-Serial Kabels gem. Gerätemanager angeben und die Baudrate auf 115200 Baud setzen.

Diese Einstellungen können Sie dann mittels [Save] speichern und per [Open] die Session starten...

OS X

Verwenden Sie das vorinstallierte Console-Programm screen.

Das USB-Serial Interface sollte unter Devicenode /dev/tty.usbserial* u/o unter /dev/cu.usbserial* erscheinen (vgl ls /dev/{tty,cu}.usb*). Starten Sie in einem OS-X "Terminal" das Programm screen entsprechend mit: screen /dev/tty.usbserial* 115200 oder screen /dev/cu.usbserial* 115200.

Beenden können Sie übrigens später das Screen Programm per: Ctrl-A, K.

Linux

Sollten Sie Linux als Hostsystem haben oder möchten Sie unter dem Linux Gastsystem arbeiten…

So installieren Sie bevorzugt via apt install das Serial Terminal-Emulationsprogramme picocom[3].

Nur sofern Sie Linux als Gastsystem verwenden, akquirieren Sie via das USB-Serial Interface Cable wie folgtüber Gastsystem-Menu für das Gastsystem: Geräte → USB-Geräte → [x] FTDI ....

Erkannte USB-Serial Devices werden abhängig vom USB-Serial Chip entweder als /dev/ttyUSB* (für FTDIChips) oder /dev/ttyACM* (für USB-CTC Class Devices) registriert (einsehbar mit ls /dev/ttyUSB* resp. ls /dev/ttyACM*).

Da unser Kabel ein FTDI-Chip verwendet, starten Sie picocom per: sudo picocom -b 115200 /dev/ttyUSB0 (vgl. picocom –help resp. man picocom). Das Beenden von picocom erfolgt dann später per: Ctrl-A, Ctrl-X

Statt picocom jeweils umständlich über sudo zu starten, kann entsprechend Versuch 1 die auf dem Devicenode bei ls -l /dev/ttyUSB* angezeigte Sicherheitsgruppe der eigenen User-Id zugefügt werden per:

bash
sudo usermod -a -G dialout $USER

Erst nach erneutem Einloggen ist die zugefügte Gruppenmitgliedschaft aktiv.

Raspi starten

Stecken Sie die präparierte SD-Karte ins Raspi ein und starten Sie das Terminal Emulationsprogramm (putty.exe, screen, picocom, …).

Danach verbinden Sie den USB-Micro Anschluss des Raspi mit einem USB-Netzteil (Meist liefern die USB-Ports der Notebooks zuwenig Strom).

Nach einer Weile sollten Sie den Bootlog über die serielle Console „durchhuschen“ sehen. Ist dieser zum Stillstand gekommen, sollte nach Betätigen der „Enter“ Taste ein „login:“ Prompt sichtbar sein[4].

Sofern Sie jedoch das Raspi schon eingeschaltet hatten bevor die Terminal Emulation verbunden war, sehen Sie auf dem Terminal Screen überhaupt nichts. In diesem Fall sollten Sie aber einen Login Prompt sehen, wenn Sie die <enter> Taste betätigen.

Erstes Einloggen ins Raspi via Serielle Console

Wenn Sie in die Serielle Console (per putty, picocom oder screen) die Enter-Taste betätigen, sollten Sie den „login:“ Prompt des Raspi sehen. Loggen Sie sich ein mit login: pi und password: raspberry.

Zur Sicherheit (insbesondere weil später alle Raspis über das gleiche WLAN erreichbar sind) ändern Sie mittels Command passwd das Passwort dieses Benutzers pi.

Ein Login unter Benutzer root ist defaultmässig aufgrund der vorhandenen sudo-Rechte auf User „pi“ gesperrt.

Loggen Sie zur Kontrolle mittels exit aus und gleich wieder unter login pi und dem neuem Passwort ein[5].

Vor dem Ausschalten sollten Sie das Raspi übrigens jeweils per Command sudo halt herunterfahren (trotz ext4 Journalling Filesystem!). Einen Reboot wäre hingegen mit sudo reboot möglich.

Beim Raspberry Pi 5 befindet sich ein Push Button auf der Seite der SD-Karte. Haben Sie keinen Zugriff auf eine Console, können Sie diesen betätigen um das Raspi sauber herunterzufahren. Hat das Geklappt, dann leuchtet die LED rot und die SD-Karte kann sicher entfernt werden.

Da die SD-Karte nun offensichtlich funktioniert, können Sie die Image-Datei auf dem Hostsystem löschen, fall Sie den Speicherplatz auf dem Hostsystem andersweitig einsetzen möchten.

WLAN einrichten

Wenn Sie in der seriellen Console zum Raspi 'ifconfig' eingeben, sollte das WLAN-Interface namens wlan0 sichtbar werden. Selbiges ist jedoch noch nicht konfiguriert[6], weshalb keine IPv4 Adresse angezeigt wird.

Bei Rasberry Pi OS erfolgt die Systeminitialisierung wie bei Ubuntu oder Debian über das Init-System systemd.

Dieses konfiguriert bei der Config offene unverschlüsselte WLANs und Ethernet-LANs automatischohne weitere Angabe über DHCP.

Für WPA2 geschützte WLANs (oder 802.1x gesicherte LANs) ist jedoch ein Hilfsprogramm namens wpa_supplicant für die Netzwerk-Authentifikation und -Verschlüsselung zuständig.

Bei älteren Versionen und Systemen ohne NetworkManager sind SSID und Passwort in /etc/wpa_supplicant/wpa_supplicant.conf einzutragen...

Neuere Versionen von Raspberry Pi OS haben defaultmässig bereits NetworkManager aktiv. Neu werden Credentials im Verzeichnis /etc/NetworkManager/system-connections als File gespeichert.

Um sich überhaupt mit einem WiFi verbinden zu können, muss allerdings erst der Country Code gesetzt werden.

  • Starten Sie hierfür das Konfigurationsprogramm sudo raspi-config.
  • Unter System Options können Sie das WiFi konfigurieren, den Country Code setzen und bereits mit einem WiFi verbinden.
  • Starten Sie dannach nmtui und wählen Sie Activate a connection. Hier sehen Sie erreichbare WiFi APs mit denen Sie einen Link herstellen können.

Falls Sie eine fixe IP konfigurieren möchten, bietet sich in diesem Fall auch die Konfiguration via nmtui an.

Auf klassischen Linux Systemen ohne NetworkManager verwenden Sie das File /etc/network/interfaces um den Link sowie IP Adressen zu konfigurieren (vgl. man interfaces). Dies funktioniert theoretisch auch mit NetworkManager als Fallback.

Login per SSH

Im folgenden soll auf die Console des Raspberry Pi via Netzwerk zugegriffen werden – und zwar sicher!

Hierzu müssen Sie zuerst auf dem Hostsystem (Windows oder OS-X) dem gleichen WLAN wie auf dem Raspi beitreten, also ihrem Hotspot.

Nach Wechsel des Hostsystem Netzwerks muss auch auf dem Ubuntu-Gastsystem das virtuelle Netzwerkinterface neu verbunden werden! (per „Netzwerkmanager“ oben rechts im Gastsystem „Ethernet“ trennen und verbinden.)

Jetzt sollte das Raspi ping-bar sein, die IP-Adresse haben Sie ja bereits ermittelt: ping 192.168.x.y.

Klappt dies, sollte theoretisch ein Login per SSH (Secure Shell) möglich sein, auf einem OS-X oder LinuxHostsystem per per ssh pi@192.168.x.y oder unter Windows per SSH-Session in putty.exe!

… sofern auf dem Raspi der SSH-Deamon laufen würde! Um diesen automatisch beim Boot zu starten, kann entweder via Serielle Console per Programm sudo raspi-config unter Interfacing Options -> SSH selbiges aktiviert werden (danach das Raspi per sudo reboot booten) oder (insbes. wenn man keine Serielle Console hat).

Alternativ können Sie auch ohne raspi-config via sudo systemctl enable --now ssh den service aktivieren (ohne Neustart!).

systemctl ist der Command, mit welchem Sie Services im Hintergrund steuern.

Nun sollte der SSH-Login klappen! Bequemer als jedes mal zuerst per USB-Serial-Verbindung die IPAdresse des Raspi zu ermitteln wäre natürlich ein individueller Hostname für „Ihr“ Raspi.

Ändern Sie hierzu den „Hostname“ in der Datei /etc/hostname auf raspberrypi-xx, wobei Sie für xx die Nummer auf der SD-Karte resp. der Karton-Box angeben! (möglicherweise haben Sie bereits einen eindeutigen Hostnamen mit Raspberry Pi Imager vergeben).

Nach Neustart sollte es dann per ssh pi@raspberrypi-xx resp. via putty klappen!

SSH

Bei Secure Shell (SSH) wird im Gegensatz zu Telnet sowohl die Passwort-Authentifikation als auch der nachfolgende Datenverkehr immer verschlüsselt über das Netzwerk übertragen – ein abhorchen der Verbindung ist also selbst dann unproblematisch, wenn der WLAN-Schlüssels kompromittiert würde!

Sicherheitshalber muss beim allerersten SSH Login auf einem neuen System der „Fingerprint“ (eine digitale Unterschrift des Public Keys des Remotesystems) bestätigen werden, wodurch spätere „man-in-the-middle Attacken“ erkannt werden können[7].

SSH würde nebst obiger Passwort-Authentifikation auch eine Authentifikation mittels Public-Key Verfahren zulassen.

Bei dieser Variante installiert man einmalig den "eigenen" Public Key auf dem "entfernten" Raspi, wonach es sich erübrigen, bei jedem ssh-Login das Passwort manuell anzugeben.

Bei Authentifikation mittels Public-Key Verfahren ist die Sicherheit sogar noch besser als mit der PasswortVariante - zumindest solange der eigene Private Key auf dem eigenen Hostsystem geheim bleibt[8]...

System aktualisieren

Da das Raspberry Pi OS ja wie Ubuntu auf Debian basiert, könnten Sie nun eine Systemaktualisierung mittels Programm apt durchführen (also per apt update gefolgt von apt upgrade - natürlich via sudo also mit root-Recht).

Da dies aber recht lange dauert, sparen Sie es sich besser auf, bis Sie eine Pause machen! Sie können dies dann entweder von der seriellen Console oder in einer SSH-Console durchführen.

Falls die Systemzeit falsch ist, kann es gut sein, dass eine Fehlermeldung ausgegeben wird. Überprüfen Sie mit date ob das Raspi sich via NTP bereits das Datum synchronisiert hat. Falls nicht, können Sie dieses auch von Hand setzten.

bash
sudo date -s "YYYY-MM-DD hh:mm"

Zugriff auf GPIOs via Console-Command

Der auf früheren Raspberry Pi OS resp. Raspbian vorhandene Command gpio welcher mit gpio readall auch direkt die Pinleiste zeigte gibt es leider aktuell nicht mehr: das betr. Package wiringpi wurde aufgrund von Meinungsverschiedenheiten mit dem Entwicker entfernt.

Als alternative gibt es nun den Command raspi-gpio.

Geben Sie auf der Console den Command raspi-gpio help ein (ausnahmsweise ohne -- vor help). Frage: Mit welchem gpio Argument lesen Sie alle GPIO-Zustände?



GPIO Nummern und Pin Nummern

Achtung! Die GPIO-Nummerierung entspricht nicht den Pinnummern sondern der Nummerierung von Broadcom gemäss den GPIO-Angaben auf der Pinleisten-Darstellung oben im Versuch.

Und nur die GPIOs der "Bank 0" liegen auf der GPIO-Pinleiste und dürfen verändert werden! Beachten Sie bei obiger Ausgabe auch die Pins der Seriellen Schnittstelle!

Frage: Mit welchem Command lesen Sie nur den GPIO auf Pin 40 der Stiftleiste aus?



Frage: Wie aktivieren Sie auf diesem GPIO den Pullup-Widerstand?



  • Lesen Sie nochmals den Zustand dieses GPIOs und vergewissern Sie sich, dass der Pullup nun aktiv ist!

Pin 39 (neben Pin 40) ist gemäss der Pinleisten-Darstellung ein Ground Pin. Stecken Sie den vorhandenen Taster auf Pin 39 und Pin 40 und kontrollieren Sie, ob die Taste korrekt eingelesen wird!

Wie lässt sich der Zustand des Tasters (nur 0/1) in eine Umgebungsvariable val einlesen? Tipp: Pipen Sie den Output von raspi-gpio in den Command cut unter Anwendung geeigneter cut Optionen...

Der raspi-gpio Command liesse sich folglich auch einfach in Shell-Scripts einbauen, um GPIO-Zustände einzulesen. Leistungsfähiger als Shell-Scripts sind jedoch Python Scripts, weshalb wir diesen Weg verfolgen.

Music Streaming auf Console-Ebene via mplayer

Raspberry Pi 5

Das Raspberry Pi 5 hat leider keinen 3.5mm Audio Jack mehr. Die einfachste Lösung für Audio ist daher entweder HDMI, Bluetooth oder eine USB Sound Card.

mplayer ist ein „Multimedia Player“ ohne viel „Schnickschnack“, sodass er aus Scripts verwendet werden kann. Nebst Videos und Audio-Dateien unterstützt mplayer auch Streams und Playlists s. https://de.wikipedia.org/wiki/M3U

  • Installieren Sie das package mplayer via:




  • Tipp: Falls sich mplayer nicht installieren lässt, liegt es ev. an einer veralteten Paketliste, d.h. es ist zuerst ein apt update nötig (natürlich mit root Recht (d.h. sudo) sowie wie allenfalls orgängigem Setzen des Datums).
  • Auf https://wiki.ubuntuusers.de/Internetradio/Stationen/ finden Sie Links zu vielen m3u Playlists...
  • Copy/Pasten Sie einen dieser Links ins Console-Window und spielen Sie diesen mit mplayer ab.
    • Tipp: *.m3u Links sind Playlists. Ggf ist die mplayer Option -playlist nötig.
    • Die Lautstärke lässt sich per Command alsamixer interaktiv einstellen (oder aus einem Shell- oder Python Script z.B. per Command amixer). Sofern mplayer im vordergrund läuft und gichzeitig die Lautstärker verwendet werden soll, muss alsamixer in einer separaten ssh Console gestartet werden...
  • Wenn alles funktioniert können Sie mplayer jederzeit wieder beenden per Ctrl+C oder aus einer anderen Shell per killall mplayer.

Python

Python ist eine populäre Scriptsprache deren Möglichkeiten weit über jene der Shell-Sprache hinausgeht.

Der Python Sprachumfang ist trotz einer einfachen und klaren Syntax äusserst mächtig und unterstützt auch objektorientierte Programmierung sowie Zugriff auf ein immenses Angebot freier Python Modules für „fast alle Problemstellungen“...

An dieser Stelle soll bloss ein erster oberflächlicher Einstieg ins Python Scripting gegeben werden….

Studieren Sie nachfolgendes einfache Python-Programm:

python
#!/usr/bin/python3

from gpiozero import LED, Button
from time import sleep

button = Button(21)

while True:
    if button.is_pressed:
        print("click")
    else:
        print("waiting")

    sleep(0.1)

Das Kommentarzeichen in Python ist aus bekannten Gründen gleich wie bei der Shell das Hash-Zeichen #.

Da der python Interpreter unter /usr/bin liegt, muss die „Shebang“ Zeile folglich #!/usr/bin/python3 lauten.

Derzeit ist Python 2 noch „quasi-standard“, d.h. bei Aufruf von python starten die meisten Linux-Distribution (noch) den älteren Python Release 2.7. Der neuere Release Python 3 ist zum älteren nicht vollständig kompatibel.

Die Python Standard Library umfasst die gängigsten Python-Modules (vgl. https://docs.python.org/3/library/index.html).

Diese und einige weitere Python Modules sind bereits vorinstalliert, viele weitere können per apt Packetmanager nachinstalliert werden[9].

Mit apt search … findet man schnell den Packagenamen für das python (oder python3) Modul python3-gpiozero (alle Python Modul-Installationspakete beginnen unter Ubuntu mit python- resp. python3- ) ….

Versuchen Sie den Paketnamen des fehlenden Python-Moduls gpiozero zu eruieren und dann zu installieren.

Python hat nicht wie C oder Java eine statische Typisierung, weswegen Variablen in Python nicht mit DatentypAngabe (vor-)deklariert werden müssen (die Typenzuweisung erfolgt also automatisch mit der ersten Zuweisung).

Nach Angabe einer Bedingung (if, for, while …) folgt ein Doppelpunkt. Für eine Endlosschleife also while True: Programmblöcke (nach Bedingungen oder nach Class- oder Methodendeklaration) werden nicht wie in anderen Programmiersprachen in geschwungene Klammern { … } gesetzt sondern bloss eingerückt (s. oben unterhalb des while-Statements).

Nur jene Zeilen, welche untereinander die exakt gleiche Einrückung haben, gehören zum gleichen Block!

Optisch sehen Tab-Zeichen und Leerschläge zwar gleich aus,für Python ist dies aber unterschiedlicher „Whitespace“, weswegen man am besten auf Tab-Zeichen ganz verzichtet und Leeschläge verwendet.

Python kann nicht nur via Scripts sondern auch interaktiv (per Aufruf von python ohne Argument) verwendet werden. Aussteigen kann man aus einer solchen Python-Shell mittels Ctrl-D.

Über eine derartige interaktive Python-Shell kann man nach Import eines beliebigen Python Modules auch dessen Hilfetext betrachten per help (modulname).

Zwecks Erstellung von Python Scripts verwendet man entweder einen einfach Texteditor wie nano oder bei Systemen mit graphischer Oberfläche bequemer VS Code, oder ähnliches.

Weitergehende Tutorials für Python gibt es viele auf dem Internet, ein recht kurzes und viel versprechendes ist z.B. „Learn Python in 10 minutes“ auf https://www.stavros.io/tutorials/python/ . Arbeiten Sie dieses durch.

Machen Sie sich mit der Button API von gpiozero vertraut: https://gpiozero.readthedocs.io/en/latest/api_input.html#button

  • Hat der Button bereits einen Pullup aktiv?

Music Streaming per Knopfdruck à la Python

Modifizieren Sie das Programm, sodass per Knopfdruck eine Playlist startet resp. bei nochmaligen drücken wieder stoppt ...

  • Um einen Console-Command (wie mplayer) in Python auszuführen importieren Sie das Module os per und führen den Command mittels os.system('beliebige shell commandozeile') aus.
  • Damit dieser im Hintergrund startet Hängen Sie (bekanntlich) ein & an die Commandozeile an.
  • mplayer benötigt dann noch die Option -noconsolecontrols (da im Hintergrund das Input-Device fehlt) (Beachten Sie: Bei mplayer erfolgt die Angabe der Optionen nicht POSIX-konform...)

JavaScript mit NodeJS

NodeJS erlaubt das ausführen von JavaScript Code auf der Command line. Die Sprache unterscheidet sich von Python, da sie sich an Java, C, C++ von der Syntax her anlehnt.

Wie auch Python bietet JavaScript mit NodeJS eine riesige Menge an Libraries an. NodeJS bietet hierfür integriertes Package Management, was das installieren und einbinden von Bibliotheken erleichtert.

Da wir im Web-Teil auch mit JavaScript arbeiten werden, lohnt es sich bereits jetzt NodeJS zu installieren.

Installation von NodeJS

  • Installieren Sie als erstes mit apt das Paket git.

NodeJS wäre via apt installierbar, aber in diesem Fall werden wir auch nvm den Version Manager von Node mitinstallieren, weshalb wir der Anleitung der offiziellen Webseite https://nodejs.org/en/download direkt folgen.

Unbekannte Scripts ausführen

Achtung! Auf der Webseite wird Ihnen die Zeile curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash vorgeschlagen.

Der Output von curl wird also direkt einer bash gefüttert! Das kann zu einer Installation von ungewünschter Software führen, oder im schlimmsten Fall sogar das System mit Malware infizieren. Kontrollieren Sie daher immer, was genau der bash gefüttert wird, bevor Sie ein Script ausführen.

  • Wählen Sie auf der Webseite den aktuellsten LTS node Release, Linux, nvm und Yarn.
  • Folgen Sie den Installationsanweisungen auf der Webseite und installieren Sie node und nvm und yarn.

yarn

yarn ist ein Tool, welches mit package management bei Node Projekten hilft.

NodeJS Projekt erstellen

  • Erstellen Sie nun in Ihrem Home Verzeichnis einen neuen Ordner z.B. node-blink
  • navigieren Sie mit cd node-blink in das Verzeichnis.
  • kontrollieren Sie mit pwd, dass Sie am richtigen Ort sind.
  • erstellen Sie im Ordner ein node Projekt mit dem Befehl yarn init.

Schauen Sie sich die Ordnerstruktur mit ls -l an:

txt
-rw-r--r-- 1 pi pi  82 Feb 21 12:45 package.json
-rw-r--r-- 1 pi pi  13 Feb 21 12:42 README.md
-rw-r--r-- 1 pi pi 304 Feb 21 12:42 yarn.lock

Frage: Gibt es auch versteckte Files im Verzeichnis?

Die Files sind alle zur Hilfe des Package-Managers yarn und npm, das Einzige wichtige File für uns ist package.json.

Öffnen Sie dieses mit nano und fügen Sie folgendes JSON Attribut hinzu:

json
{
  "name": "node-blink",
  "packageManager": "yarn@4.6.0",
  "type" : "module"
}

NodeJS bietet bereits zahlreiche Funktionen in der Standardlibrary, vgl. https://nodejs.org/docs/latest/api/. Darunter ...

  • File System Zugriff
  • HTTP / HTTPS
  • Prozesse
  • SQLite

Weitere Packages lassen sich via yarn hinzufügen (im Hintergrund wird npm verwendet.)

Wir verwenden für das ansteueren von GPIO die Library onoff, vgl. https://github.com/fivdi/onoff.

bash
yarn add onoff

Erstellen Sie das File blink.js mit folgendem Inhalt:

js
import { Gpio } from "onoff";

const led = new Gpio(13 + 571, "out");

const delay = async (ms) => {
  return new Promise((resolve) => setTimeout(resolve, ms));
};


const main = async () => {
  for (;;) {
    led.writeSync(1);
    await delay(1000);
    led.writeSync(0);
    await delay(1000);
  }
};

main();
  • Verbinden Sie das LED mit dem Raspberry Pi:
    • GND auf GND
    • Vcc auf 5V
    • In auf GPIO 13 (Pin 33)

Starten Sie das Programm mit folgendem Command:

js
yarn node blink.js

Falls Sie einen error erhalten, fügen Sie Ihren user zur GPIO Gruppe hinzu:

bash
sudo usermod -aG gpio $(whoami)
  • Loggen Sie sich nun aus, und wieder ein. Starten Sie das Programm erneut.

Gratulation! Die LED sollte nun blinken!

Auf die Keywords async und await werden wir im Teil Webapplikationen noch tiefer eingehen. Sie dienen dazu, asynchrone operationen via blockierende calls zu erlauben um den Code gegenüber Callbacks einfacher zu gestalten.

Gpio Nummer 13 + 571

Auf dem Raspberry Pi 5 beginnen die GPIOs an einem Offset 571.

Schauen Sie sich den Output an von: ls -al /sys/class/gpio


  1. Das „Windows für Raspberry Pi“ ist sehr eingeschränkt und in keiner Weise mit einem normalen Windows zu vergleichen! ↩︎

  2. Unter Linux kann ein Disk-Image wie folgt mit dd auf eine SD-Karte geschrieben werden:

    • zuerst in einem „Terminal“ per lsblk den Devicenamen der SD-Karten «Disk» anhand der SD-Karten Grösse bestimmen. (wenn Sie einen USB/SD-Card Reader verwenden, wird die SD als sdX als "disk" angezeigt mit X = a, b, c, …, andernfalls wenn Sie einen fix am Notebook eingebauten Card-Reader verwenden, meldet sich dieser als mmcblk0)
    • Werden mit lsblk unter der betreffenden SD-Karten «disk» auch noch Partitionen als eingebunden angezeigt, so „unmounten“ Sie diese z.B. per: sudo umount /dev/sdX* (sdX wie vorher gem. der SD-Karte «disk» ; * matched gleich alle Partitionen!)
    • Das Schreiben der Image-Datei „Sektor-für-Sektor“ auf eine „Raw-Disk“, also auf die Disk ab Sektor 0, erfolgt mit Linux per:
      dd if=<inputfile> of=<outputfile> bs=1M status=progress oflag=sync (Bei if=... geben Sie die Image-Datei (*.img) an, bei of=... er Devicenode der zuvor ermittelten „Raw-Disk“, also das ermittelte /dev/sdX oder /dev/mmcblkX. Mittels Option bs=1M erfolgt zudem das Schreiben mit einer Blockgrösse von 1MB, ansonsten der Schreibvorgang sehr langsam statt sektorweise von statten geht. Mit status=progress und oflag=sync erfolgt eine Fortschrittsanzeige (~10MB/s). Achtung: wenn Sie den falschen Devicenode angeben (also ein falsches X) zerstören Sie womöglich die Linux-Systemdisk oder Sie kopieren das Image bloss auf eine normale Datei, erkennbar daran, dass der Schreibvorgang viel Schneller geht (>>10MB/s)
    ↩︎
  3. Nebst picocom gäbe es noch weitere Terminal-Emulationsprogramme für Linux, sowohl Console-Programme (minicom, cu, screen) als auch solche für die graphische Oberfläche (gtkterm, sayon,…). Letztere bieten aber keinen Vorteil gegenüber putty. ↩︎

  4. Andernfalls wurde vielleicht die SD nicht eingesteckt oder das Raspbian Image nicht korrekt auf die SD geschrieben. Bei einigen früheren raspian Releases musste zwecks Aktivierung der Serielle Console zudem noch auf dem Hostsystem (mit eingesteckter SD) unter /media/$USER/boot/cmdline.txt der Eintrag console=ttyS0 zugefügt werden und sofern das Zielsystem ein Raspi 3 ist,zuunterst in der Datei Datei /media/$USER/boot/config.txt die Zeile enable_uart=1 zugefügt werden! ↩︎

  5. Falls Sie das Passwort mal nicht mehr wissen, stecken Sie die SD-Karte in den Notebook und entfernen unter der Raspi-Rootpartition in der Datei /etc/shadow auf der Zeile pi:…. den Passwort-Hash zwischen dem 1. und 2. Doppelpunkt. Danach unmounten ... ↩︎

  6. ... ausser Sie haben beim raspberry pi imager das WLAN bereits konfiguriert ↩︎

  7. Nach Bestätigung wird der „Public Key“ des Remotesystems auf dem lokalen System in der Datei .ssh/known_hosts zugefügt. SSH prüft dies fortan bei jedem Login und reklamiert wenn das Remotesystem ändert, wodurch „man-in-the-middle“ Attacken erkannt werden. Möchte man eine „man-in-the-middle Attacke“ auch beim ersten Verbinden sicher ausschliessen, müsste man vor dem Bestätigen den angezeigten „Fingerprint“ mit dem Fingerprint des Public-Keys auf dem Remotesystem vergleichen (eruierbar per ssh-keygen -lf ~/.ssh/id_rsa.pub). ↩︎

  8. Zwecks einfachem Erstellen des Public Key Paares gibt es für Windows das PuTTY-Zusatzprogramm puttygen. Unter OS-X resp. Linux kann das RSA-Schlüsselpaar hingegen per ssh-keygen -t rsa -b 2048 erstellt werden, wonach das Schlüsselpaar unter dem Homeverzeichnis im (versteckten) Ordner .ssh/ liegt. Der Public-Key kann dann mittels ssh-copy-id pi@adresse.ihres.raspi auf's Raspi kopiert werden (unter das Homeverzeichnis von pi auf .ssh/authorized_keys ) ↩︎

  9. Zwecks Installation von Python Libraries, welche nicht in der Linux-Distribution enthalten sind, gäbe es noch den PythonPacketmanager pip resp. pip3 . Beide könnten bei Bedarf per apt Packetmanager installiert werden. ↩︎