Inhaltsverzeichnis

Raspberry Pi

Was man noch zum RPi dazu sagen sollte ist, das dieser nicht nur diesen ganzen Multimedia Schnick-schnack kann. Sondern viel mehr sind es die GPIO Pin's mit denen sich eben viele schöne Sachen realisieren lassen, wenn man kreativ ist.

Zur Hausautomatisierung oder zum einfachen auslesen von Sensoren und Motorsteuerung. Hier ist der Raspberry vielen anderen MiniPC's, die teilweise im USB-Stick Gehäuse daher kommen, überlegen.

Oft wird der RPi mit anderen MiniPC's verglichen und es kommt am Ende des Vergleichs raus, der mit den dicksten CPU ist der bessere. Aber der RPi hat eben ganz andere Qualitäten, mit viel Anschluss Potential und mittlerweile eine große Community welches nicht zu unterschätzen ist.

Infos über Hardware

Temperatur, Takt & Spannung

Die Temperatur lässt sich über die Shell ganz einfach und schnell über folgendes Kommando auslesen:

vcgencmd measure_temp

Zurückgegeben wird z.B. folgendes:

temp=47.6'C

Mit vcgencmd kann man übrigens nicht nur die Temperatur der CPU, sondern auch Spannung und Takt auslesen:

vcgencmd measure_volts

Bzw.

vcgencmd measure_clock arm

onboard WLAN Kernel Modul

Es wurde der WLAN Chip BCM43143 verbaut, welcher 2,4 GHz, b/g/n unterstützt.

~ $ modinfo brcmfmac
filename:       /lib/modules/4.14.50-v7+/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko
license:        Dual BSD/GPL
description:    Broadcom 802.11 wireless LAN fullmac driver.
author:         Broadcom Corporation
firmware:       brcm/brcmfmac4373-sdio.bin
firmware:       brcm/brcmfmac4356-sdio.bin
firmware:       brcm/brcmfmac4354-sdio.bin
firmware:       brcm/brcmfmac43455-sdio.bin
firmware:       brcm/brcmfmac43430-sdio.bin
firmware:       brcm/brcmfmac43430a0-sdio.bin
firmware:       brcm/brcmfmac4339-sdio.bin
firmware:       brcm/brcmfmac43362-sdio.bin
firmware:       brcm/brcmfmac4335-sdio.bin
firmware:       brcm/brcmfmac43341-sdio.bin
firmware:       brcm/brcmfmac43340-sdio.bin
firmware:       brcm/brcmfmac4334-sdio.bin
firmware:       brcm/brcmfmac4330-sdio.bin
firmware:       brcm/brcmfmac4329-sdio.bin
firmware:       brcm/brcmfmac43241b5-sdio.bin
firmware:       brcm/brcmfmac43241b4-sdio.bin
firmware:       brcm/brcmfmac43241b0-sdio.bin
firmware:       brcm/brcmfmac43143-sdio.bin
firmware:       brcm/brcmfmac4373.bin
firmware:       brcm/brcmfmac43569.bin
firmware:       brcm/brcmfmac43242a.bin
firmware:       brcm/brcmfmac43236b.bin
firmware:       brcm/brcmfmac43143.bin
srcversion:     80D355F77AD3A822E27B771
alias:          usb:v04B4p0BDCd*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0A5Cp0BDCd*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v043Ep3101d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v04B4pBD29d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v13B1p0039d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0A5CpBD27d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0A5CpBD1Fd*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0A5CpBD17d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0A5CpBD1Ed*dc*dsc*dp*ic*isc*ip*in*
alias:          sdio:c*v02D0d4373*
alias:          sdio:c*v02D0d4356*
alias:          sdio:c*v02D0d4354*
alias:          sdio:c*v02D0dA9BF*
alias:          sdio:c*v02D0d4345*
alias:          sdio:c*v02D0dA9A6*
alias:          sdio:c*v02D0d4339*
alias:          sdio:c*v02D0d4335*
alias:          sdio:c*v02D0dA962*
alias:          sdio:c*v02D0dA94D*
alias:          sdio:c*v02D0dA94C*
alias:          sdio:c*v02D0d4334*
alias:          sdio:c*v02D0d4330*
alias:          sdio:c*v02D0d4329*
alias:          sdio:c*v02D0d4324*
alias:          sdio:c*v02D0dA887*
depends:        brcmutil,cfg80211
intree:         Y
name:           brcmfmac
vermagic:       4.14.50-v7+ SMP mod_unload modversions ARMv7 p2v8 
parm:           txglomsz:Maximum tx packet chain size [SDIO] (int)
parm:           debug:Level of debug output (int)
parm:           p2pon:Enable legacy p2p management functionality (int)
parm:           feature_disable:Disable features (int)
parm:           alternative_fw_path:Alternative firmware path (string)
parm:           fcmode:Mode of firmware signalled flow control (int)
parm:           roamoff:Do not use internal roaming engine (int)
parm:           ignore_probe_fail:always succeed probe for debugging (int)

SD Karte für das Raspberry Pi vorbereiten

Download und entpacken

Die offiziellen Images können von der Raspberry Pi Webseite http://www.raspberrypi.org/downloads geladen werden. Die Images befinden sich in einer zip-Datei, welche optional mit

sha1sum archlinux-hf-2013-02-11.zip

überprüft werden kann, indem der vom Befehl zurück gegebene Hex-Wert mit dem Wert auf der Raspberry Pi Webseite verglichen wird. Die Werte sollten dabei exakt gleich sein. Die img-Datei kann entpackt werden mit

unzip archlinux-hf-2013-02-11.zip

nun erscheint die img-Datei im aktuellen Verzeichnis.

Das Image kommt auf die SD-Karte oder USB-Speicher

Um herauszufinden welches Device unsere SD-Karte ist kann man den Kommando

fdisk -l

anwenden. Fdisk zeigt mit der Option -l eine Auflistung aller verfügbaren Speichergeräte. Meine SD-Karte habe ich als /dev/sdd identifiziert.

Das Image wird mit dd auf die komplette Karte geschrieben, dazu wird unsere Karte entladen(unmount). Was gemountet ist kann man mit den Befehl mount oder df -h sehen. Da auf meiner Karte 2 Partitionen sind, werde ich beide Partitionen un-mounten.

umount /dev/sdd1
umount /dev/sdd2

Anschließend kann das schreiben des Images auf die Karte erfolgen.

dd bs=4M if=archlinux-hf-2013-02-11.img of=/dev/sdd

Oder gleichzeitiges entpacken und anschließendes schreiben:

unzip -p 2019-07-10-raspbian-buster.zip | sudo dd of=/dev/sdX bs=4M conv=fsync

bzw. falls es als xz komprimiert wurde:

xzcat 2023-12-05-raspios-bookworm-arm64.img.xz | dd of=/dev/sdb status=progress

mit folgenden ging es mit raspios-bookworm-arm64.img.xz nicht(Boot-Partition zeigte nur komische Zeichen als Dateinamen):

xzcat openSUSE-ARM-LXQT-raspberrypi4.aarch64.raw.xz | dd bs=4M of=/dev/sdX iflag=fullblock oflag=direct status=progress

Die Blockgröße von 4MB funktioniert in der Regel immer, wenn nicht, versuch es mit 1MB, auch wenn 1M erheblich länger dauern wird. Der dd Kommando gibt keine Status Informationen zurück, eine Möglichkeit Informationen über den Status von dd zu erhalten ist pkill -USR1 -n -x dd.

Zum Schluß kann mit dem ausführen des sync Kommando sichergestellt werden das alle Daten auf die Karte geschrieben worden sind.

Partition vergrößern

Die images sind immer in 2 GB Größe verfügbar, bei einer 8GB Karte werden nur 2 GB genutzt. Deshalb kann man nun die Partition auf der SD-Karte vergrößern um den vollen verfügbaren Platz zu bekommen. Dies kann man unter Raspbian später auch automatisch machen lassen, hier wird das manuelle vorgehen trotzdem noch einmal beschrieben.

Die 2. Partition /dev/sdd2 ist die Daten Partition auf der SD-Karte. Mit fdisk -l /dev/sdd lässt man sich vorher einene Überblick ausgeben.

root@iglu:/# fdisk -l /dev/sdd

Platte /dev/sdd: 7964 MByte, 7964983296 Byte
246 Köpfe, 62 Sektoren/Spur, 1019 Zylinder, zusammen 15556608 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x00014d34

   Gerät  boot.     Anfang        Ende     Blöcke   Id  System
/dev/sdd1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sdd2          122880    15556607     7716864   83  Linux

Gestartet wird nun mit

fdisk /dev/sdd

nun kann man sich unter fdisk mit m die Hilfe anzeigen lassen. Mit d kann die zweite Partition gelöscht werden - dabei wird nur die Partition entfernt nicht die Daten - und anschließend mit n eine neue erstellt werden. Als Anfangssektor ist es wichtig nun 122880 von der mit fdisk -l erstellten Liste auszuwählen, der Endsektor kann so als Standard bestehen bleiben. Mit w werden die Änderungen auf die SD-Karte geschrieben.

Die weiteren Schritte sind:

e2fsck -f /dev/sdd2
resize2fs /dev/sdd2

überprüfen mit:

fdisk -l
mount /dev/sdd2 /mnt/
df -h

WLAN SSH on first Boot

Möchte man WLAN beim ersten starten der neuen SD-Karte haben dann muss die Datei wpa_supplicant.conf direkt in die Boot-Partition abgelegt werden.

Mit dem Namen des WLANs und den Zugangs-PW, welches idealerweise mit wpa_passphrase verschlüsselt wurde. Die Datei sieht dann z.B. wie folgt aus:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE

network={
        ssid="homeWLAN"
        psk="verschlüsseltes-pw-erstellt-mit-wpa_passphrase"
        }

network={
        ssid="FRITZBox Fon WLAN 7660"
        psk="pw-funktioniert-auch-unverschlüsselt"
        key_mgmt=WPA-PSK
        }

Möchte man SSH beim ersten starten der neuen SD-Karte haben, dann muss die Datei ssh direkt in die Boot-Partition abgelegt werden. Die Datei kann einfach leer sein, das war es auch schon.

Firmware

Seit dem Raspberry Pi4 gibt es das neue Paket rpi-eeprom welches die Tools rpi-eeprom-config und rpi-eeprom-update bereit stellt. Damit lässt sich dann z.B. die Firmware aktualisieren.

~ $ sudo rpi-eeprom-update
*** UPDATE AVAILABLE ***
BOOTLOADER: update available
   CURRENT: Do 3. Sep 12:11:43 UTC 2020 (1599135103)
    LATEST: Do 29. Apr 16:11:25 UTC 2021 (1619712685)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader/default)
            Use raspi-config to change the release.

  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138a1
    LATEST: 000138a1

USB Boot

Zunächst auf dem RPi überprüfen ob USB Booten bereits aktiviert ist:

vcgencmd otp_dump | grep 17:
17:3020000a

Wird die obige Ausgabe zurück geliefert ist alles Okay und das Image kann genauso mit dd auf USB-Stick geschrieben werden wie es mit der SD-Karte gemacht wird.

Falls etwas anderes zurück geliefert wird, dann muss in der /boot/config.txt die Zeile program_usb_boot_mode=1 eingefügt und der RPi neu gestartet werden. Beim Booten wird dann der USB-Boot Modus fest in den OTP (one-time programmable) Speicher geschrieben. Nachdem dieser gestartet ist kann der RPi wieder ausgeschaltet, die SD-Karte entnommen und ein USB-Speicher zum Booten verwendet werden.

Die Datei config.txt

Bei HDMI-Kabel Verbindung (mit Audio) zum Bildschirm folgende Einstellung verwenden:

hdmi_drive=2

Bei DVI-Kabel Verbindung (ohne Audio) zum Bildschirm folgende Einstellung verwenden:

hdmi_drive=1

Die Onboard Soundkarte kann auch deaktiviert werden, evtl. kann damit Energie eingespart werden.

dtparam=audio=off
~ $ aplay -l
aplay: device_list:270: keine Soundkarten gefunden ...

Soundkarte aktivieren(ist der Standard):

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

Der Kommando aplay -l sollte nun wieder eine Soundkarte anzeigen.

Test Sound Datei .mp3

Multimedia Lizenz Key

Nur mit Raspbian Version vor 2018:

sudo su -
cd /boot
cp start.elf start.elf_backup
perl -pne 's/\x47\xE9362H\x3C\x18/\x47\xE9362H\x3C\x1F/g' < start.elf_backup > start.elf

Nachsehen ob auf dem Raspberry die Multimedia Lizenz aktiviert ist:

$ vcgencmd codec_enabled MPG2
MPG2=enabled
$ vcgencmd codec_enabled WVC1
WVC1=enabled

Swap Memory

Raspbian verwendet für den Auslagerungs-Speicher eine Swap-Datei, welche in den Standard Einstellungen 100MB groß ist. Einstellungen zu dieser Swap-Datei werden in der Konfig-Datei /etc/dphys-swapfile vorgenommen. Ausserdem gibt es einen Systemd Start-Jobs mit den sich der Swap ein oder ausschalten lässt.

Für die Kompilierung von größeren Programmen, wie z.B. den Spiel Wesnoth, muss genug Arbeitsspeicher zur Verfügung stehen.

Den Swap erweitern

Die Swap Konfig-Datei mit einen Editor öffnen:

sudo nano /etc/dphys-swapfile

Den Swap auf 1000MB vergrößern durch das anpassen folgender Zeile:

CONF_SWAPSIZE=1000

Im nano-Editor mit Strg + O die Änderung speichern. Anschließend folgenden Kommando aufrufen:

sudo /sbin/dphys-swapfile setup

Es wird als Ausgabe zurückgeliefert:

want /var/swap=1000MByte, checking existing: deleting wrong size file (104857600), generating swapfile ... of 
1000MBytes

Als letztes den swapon Kommando ausführen:

sudo swapon /var/swap

Neue Werte mit Kommando free überprüfen:

free -h
            total        used        free      shared  buff/cache   available
Mem:           748M        297M         76M         45M        375M        370M
Swap:          999M          0B        999M

Full Power

Um die Maximale Leistung aus den Raspberrys zu holen muss auf eine gute Kühlung geachtet werden, denn bei 80° Grad taktet er automatisch runter um Beschädigungen der Platine zu vermeiden. Ein passiver Alu Kühlkörper reicht aus - Die Temperatur im Auge behalten.

ungetestet!! FIXME

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
conservative ondemand userspace powersave performance schedutil
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand

In die Datei /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor den Wert performance eintragen.

Für höhere Grafik und Video Leistung den Grafikspeicher höher setzen:

gpu_mem=256

Das System übertakten:

arm_freq=1300
core_freq=500
gpu_freq=500
sdram_freq=500
over_voltage=4

Akku Energieversorgung

Es geht darum eine einfache Spannungsversorgung über 4xAA (Mingon) Akku-Stapel zu realisieren und das ganze per WLAN ins lokale Netz erreichbar zu machen.

Um die Laufzeit zu erhöhen werden insgesamt 2 Akku-Stapel, bestehend aus 4 Mignon Akkus eingesetzt. Parallel dazu ist eine Solarzelle geschaltet, welche aus mehreren zusammen-geschalteten Einzel-Zellen besteht. Diese Zellen stammten von billigen Solar-Leuchten die es oft in 5er Pack für 5€ gibt. Die zusammengeschaltete Solarzelle liefert ohne Last ca. 6,2 Volt. Ein Strom von nur 0,0186A wurde im Betrieb an der Solarzelle gemessen bei bedeckten Himmel. Eine Diode 1N4007 sorgt dafür das der Strom nur in Richtung zur Batterie hin fließt und nicht nachts von der Batterie zurück zur Solarzelle. An der GPIO-Leiste wird an den Pin 2(5V) und 6(GND) der RPi mit Energie versorgt. Zwei große Kondensatoren mit 4,7mF und 470µF sind parallel zu den Akkus und der Solarzelle geschaltet, diese sollen Spannungsschwankungen mildern.

vereinfachter Schaltplan:

Am Versuchs Aufbau liegt an einem leicht bedeckten Tag ein Spannung von 5,16 Volt. Diese wäre optimal für den RPi, welcher mit einer Spannung von 4,7 bis 5,6 Volt arbeitet.

Versuchs Aufbau:

Das folgende Bild zeigt den gestarteten Raspberry Pi mit aktivierten WLAN:

und Action

Der Raspberry 1 verfügt über 2 Messpunkte auf seiner Platine TP1 und TP2, hier sollte man die Versorgungsspg. messen können. In der ersten Minuten waren es immerhin noch 4,78V aber schon nach ca. 3 Minuten waren es nur noch 3,8 V dann wird der RPi instabil und schaltet sich ab. Der WLAN Stick war nach diesen max. 4 Minuten schon ordentlich warm, meiner Meinung nach ist das WLAN der größte Energiefresser.

Energie Sparen

Um die Laufzeit bei Akku Betrieb zu erhöhen gibt es verschiedene Möglichkeiten. Zum einen sollten die Optionen aus der /boot/config.txt genutzt werden. Nachfolgend findet man hier weitere Punkte zum Energie sparen.

Dienste abschalten

Falls das light-Image genutzt wird, sollten die meisten Dienste schon nicht installiert sein. Andernfalls sollte man sehe, das man noch weiter Dienste deaktivieren kann:

Der folgende Kommando sollte multi-user.target zurück liefern aber niemals graphial.target, da dies bedeuten würde, das die komplette graphische Oberfläche geladen wird.

systemctl get-default

Die folgenden Dienste jeweils mit sudo systemctl stop Dienstname stoppen und dann mit disable auch für den nächsten reboot dauerhaft deaktivieren:

sudo systemctl disable cups
sudo systemctl disable sound.target
sudo systemctl disable bluetooth.target

WLAN und Bluetooth

WLAN und Bluetooth abschalten, wenn es nicht benötigt wird und deaktiviere mit rfkill auch die zugehörigen Funk-Module um weitere Energie zu sparen.

WLAN ist in meinem Fall allerdings ein muss, aber ich kann die Tx-Power auf den niedrigsten Wert setzen:

iwconfig wlan0 txpower 0

Hier kann am besten in der config.txt folgender Eintrag gesetzt werden:

# turn wifi and bluetooth off
dtoverlay=disable-wifi
dtoverlay=disable-bt

Grafik HDMI

HDMI deaktivieren, aber keine Ahnung wie viel Einsparung es bringt

/opt/vc/bin/tvservice --off

Einschalten lässt sich HDMI wieder mit:

/opt/vc/bin/tvservice -p

Eine weitere Möglichkeit ist das Generieren des Videobildes und seine Ausgabe über HDMI zu deaktivieren. Da dies ansonsten ständig geschehen würde, auch wenn der Monitor abgeschaltet ist, spart dies zusätzliche Energie (wenn auch vermutlich nicht besonders viel).

/opt/vc/bin/vcgencmd display_power off

Damit die Einstellungen beim nächsten reboot überleben, muss die Zeile iwconfig wlan0 txpower 0 und die Zeile /opt/vc/bin/tvservice –off in die Datei /etc/rc.local vor dem exit0 eingetragen werden.

Power und ACT LED

Neben der Möglichkeit die Funktionen der Power und ACT LED fast beliebig über die Datei /sys/class/leds/led1/trigger zu definieren. Kann man diese LED's zum Energie sparen auch einfach ausschalten.

Die rote Power LED deaktivieren:

echo none | sudo tee /sys/class/leds/led0/trigger
echo 0 | sudo tee /sys/class/leds/led1/brightness

Die grüne ACT LED deaktivieren:

echo none | sudo tee /sys/class/leds/led1/trigger
echo 0 | sudo tee /sys/class/leds/led0/brightness

Zum dauerhaften deaktivieren muss das folgende in die /boot/config.txt eingetragen sein:

# Disable the ACT LED.
dtparam=act_led_trigger=none
dtparam=act_led_activelow=off

# Disable the PWR LED.
dtparam=pwr_led_trigger=none
dtparam=pwr_led_activelow=off

Falls die Original Pi Camera per Flachbandkabel angeschlossen sein sollte, lässt sich auch hier die rote LED an der Pi Camera deaktivieren. Hierzu muss die folgende Zeile in die /boot/config.txt eingetragen werden.

disable_camera_led=1

CPU Takt

CPU Takt verringern. Dies bringt wahrscheinlich den größtmöglichen Erfolg:

root@raspberryA1:~# cat /boot/config.txt
#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

gpu_mem=16

arm_freq_min=250
core_freq_min=100
sdram_freq_min=150
over_voltage_min=0

Er läuft nun mit 250MHz und braucht dadurch eine Minute länger zum hochfahren. Ohne Last läuft er mit 250MHz aber bei Last kann er automatisch wieder auf 700MHz zurück gehen.

USB deaktivieren

Achtung auch die LAN Schnittstelle wird dann deaktiviert, da diese per USB angebunden ist.

# disable USB at Raspberry Pi 2 und 3 on Raspbian Stretch
echo 0x0 > /sys/devices/platform/soc/3f980000.usb/buspower

# to enable USB use the same line as above with "echo 0x1"
echo 0x1 > /sys/devices/platform/soc/3f980000.usb/buspower

Um den System Pfad für die USB Energieversorgung in Raspbian Stretch zu finden:

find /sys/devices/ -name `dmesg -t | grep dwc_otg | grep "DWC OTG Controller" | awk '{print $2}' | cut -d ":" -f1`

LAN Abschalten

Nicht benutzte NIC´s deaktivieren.

sudo ip link set eth0 down
sudo ifconfig eth0 down

zweiter Anlauf

Nachdem der Energie verbrauch des WLANs, die CPU herunter getaktet und die 4 Mignon Zellen eines AkkuStapels mit einem Standard Akkuladegerät geladen wurden gab es einen zweiten Versuch. Dieses mal aber noch mit angeschlossenen Audio Verstärker und angeschlossenen Lautsprecher aus WakiTalki. Die Solarzelle wurde an diesen sonnigen Tag gut platziert.

Trotz zwei Wochen mit diesen harten Experimenten, unsauberes herunter fahren, große Spannungs-Schwankungen blieb das Dateisystem ext4 der SD-Karte immer voll funktionsfähig.

Raspberry Pi OS

Nach der Installation ist es sinnvoll raspi-config einmal aufzurufen. Dieses Programm findet sich auch in der grafischen Oberfläche oben links auf die Himbeere klicken, Einstellungen –> Raspberry-Pi-Konfiguration

12 Bookworm

Ab dieser Version hat sich die Ersteinrichtung für den Headless Betrieb geändert. Hierfür nutze ich das Lite Image. Auf der SD-Karte müss auf der Boot-Partition einige Dateien angelegt werden diese wären:

  1. SSH Aktivierung, eine leere Datei mit dem namen ssh
  2. Benutzer, eine Datei mit dem Namen userconf mit dem Inhalt: <username>:<password> Für password wird hier das verschlüsselt Passwort eingetragen, dieses holt man sich mit dem Komando openssl passwd -6
  3. WLAN, eine Datei im Pfad /etc/NetworkManager/system-connections/WLAN-Name.nmconnection anlegen mit den folgenden Inhalt:
[connection]
id=WLAN-Name
uuid=# random UUID in the format 11111111-1111-1111-1111-111111111111
type=wifi
autoconnect=true
interface-name=wlan0

[wifi]
mode=infrastructure
ssid=WLAN-Name

[wifi-security]
auth-alg=open
key-mgmt=wpa-psk
psk=WLAN-Passwort

[ipv4]
method=auto

[ipv6]
addr-gen-mode=default
method=auto
sudo chmod -R 600 <path-to-rootfs>/etc/NetworkManager/system-connections/SSID.nmconnection
sudo chown -R root:root <path-to-rootfs>/etc/NetworkManager/system-connections/SSID.nmconnection

Hier soll es eine einzige Datei geben, mit der man alle Punkte ab arbeiten kann:

With Raspberry Pi OS bookworm you can configure WiFi via a custom.toml that you place in the bootfs partition (first boot only).

Note that this feature is experimental and will be replaced by cloud-init in the future.

An example gist and blog explains some of the options:

I am copying the example from the aforementioned gist (not affiliated):

# Required:
config_version = 1

[system]
hostname = "raspberrypi"

[user]
# If present, the default "rpi" user gets renamed to this "name"
name = "rpi"
# The password can be encrypted or plain. To encrypt, we can use "openssl passwd -5 raspberry"
password = "$5$pN7oRnie.WDOHoJY$aWEYmKUytN/S/bxMza5ksBiurbSJmcvcysBKHSmYa45"
password_encrypted = true

[ssh]
# ssh_import_id = "gh:user" # import public keys from github
enabled = true
password_authentication = false
# We can also seed the ssh public keys configured for the default user:
# authorized_keys = [ "ssh-rsa ... user@host", ... ]

[wlan]
ssid = "mywifi"
password = "$5$pN7oRnie.WDOHoJY$aWEYmKUytN/S/bxMza5ksBiurbSJmcvcysBKHSmYa45"
password_encrypted = true
hidden = false
# The country is written to /etc/default/crda
# Reference: https://wireless.wiki.kernel.org/en/developers/Regulatory
country = "IE"

[locale]
keymap = "gb"
timezone = "Europe/London"

You could dig more into the firstboot or init_config scripts (the latter is what loads the config).

Entscheident ist dieses Verzeichnis auf der Wurzel-Partition wo die Einstellungen konfiguriert werden.

root@raspberrypi:~# ls -la /usr/lib/raspberrypi-sys-mods/
total 44
drwxr-xr-x  2 root root 4096 Mar 15 15:01 .
drwxr-xr-x 63 root root 4096 Mar 15 15:02 ..
-rwxr-xr-x  1 root root 3227 Nov  6 15:03 firstboot
-rwxr-xr-x  1 root root  445 Dec 18 10:51 get_fw_loc
-rwxr-xr-x  1 root root  419 Jan  6  2022 i2cprobe
-rwxr-xr-x  1 root root 5486 Nov  7 09:30 imager_custom
-rwxr-xr-x  1 root root 7319 Jul 25  2023 init_config
-rwxr-xr-x  1 root root  117 Aug 31  2023 regenerate_ssh_host_keys
-rwxr-xr-x  1 root root  339 Jul 25  2023 sshswitch

Audio Sound

Falls kein Sound über HDMI möglich scheint oder er nur mit omxplayer funktioniert aber WebBrowser, Audacity und mpv usw. keinen Sound liefern, hilft:

Beim RPi4 kann es helfen den anderen HDMI Port zu wechseln.

Ansonsten den folgenden Kommando ausführen:

amixer -q cset numid=3 3

Evtl. auch das(ungetestet):

amixer cset numd=1 1
amixer cset numd=1 100% 100% <- volume level

Weitere Möglichkeiten die helfen können:

apt update
apt remove --purge alsa-utils*
apt remove --purge alsamixer*
apt install alsa-utils
apt install alsamixer
reboot

Nach dem Neustarten wähle oben, im Lautsprecher Icon, HDMI output in der Taskbar.

Diese Lösung kann deshalb funktionieren, weil der omxplayer welcher ein sehr elementarer Musikspieler ist, nicht den alsa driver nutzt. Der omxplayer nutzt stattdessen seinen eigenen drivers namens openmax, daher kommt das Problem wahrscheinlich vom alsa drivers.

VLC Media Player

VLC ist in den Raspbian Software Repos ohne Hardwarebeschleunigung vorhanden, daher muss, wenn man VLC verwenden mag, es aus den Quellen kompiliert werden.

VLC mit Hardwarebeschleunigung unter Raspbian installieren:

wget http://steinerdatenbank.de/software/vlc-2.2.8-ffmpeg3-1.patch
wget https://download.videolan.org/vlc/2.2.8/vlc-2.2.8.tar.xz
sudo apt install autopoint pkg-config libtool build-essential autoconf
sudo apt install liba52-0.7.4 libasound2 libass5 libavahi-client3 libavahi-common3 libavc1394-0 libbasicusageenvironment1 libbluray1 libbz2-1.0 libc6 libcairo2 libcddb2 libcdio13 libchromaprint1 libdbus-1-3 libdc1394-22 libdca0 libdirectfb-1.2-9 libdvbpsi10 libdvdnav4 libdvdread4 libebml4v5 libfaad2 libflac8 libfontconfig1 libfreetype6 libfribidi0 libgcc1 libgcrypt20 libglib2.0-0 libgme0 libgnutls30 libgpg-error0 libgroupsock8 libgsm1 libjpeg62-turbo libkate1 liblirc-client0 liblivemedia57 liblua5.2-0 liblzma5 libmad0 libmatroska6v5 libmodplug1 libmp3lame0 libmpcdec6 libmpeg2-4 libmtp9 libncursesw5 libogg0 libopus0 libpng16-16 libpulse0 libraw1394-11 libresid-builder0c2a librsvg2-2 librtmp1 libsamplerate0 libsdl-image1.2 libsdl1.2debian libshine3 libshout3 libsidplay2 libsnappy1v5 libsndio6.1 libspeex1 libspeexdsp1 libssh-gcrypt-4 libssh2-1 libstdc++6 libtag1v5 libtheora0 libtinfo5 libtwolame0 libudev1 libupnp6 libusageenvironment3 libva-drm1 libva-x11-1 libva1 libvcdinfo0 libvorbis0a libvorbisenc2 libvpx4 libwavpack1 libwebp6 libwebpmux2 libx11-6 libx264-148 libx265-95 libxcb-keysyms1 libxcb1 libxml2 libxvidcore4 libzvbi0 zlib1g libgdk-pixbuf2.0-0 libgtk2.0-0 libnotify4 libqt5core5a libqt5gui5 libqt5widgets5 libqt5x11extras5 libxi6 libsmbclient libxext6 libxinerama1 libxpm4 fonts-freefont-ttf libaa1 libcaca0 libegl1-mesa libgl1-mesa-glx libgles1-mesa libgles2-mesa libxcb-shm0 libxcb-xv0 libxcb-randr0 libxcb-composite0
sudo apt install liba52-0.7.4-dev libasound2-dev libass-dev libavahi-client-dev libavc1394-dev libbluray-dev libbz2-dev libc6-dev libcairo2-dev libcddb2-dev libcdio-dev libchromaprint-dev libdbus-1-dev libdc1394-22-dev libdca-dev libdirectfb-dev libdvbpsi-dev libdvdnav-dev libdvdread-dev libebml-dev libfaad-dev libflac-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libgcc-6-dev libgcrypt20-dev libglib2.0-dev libgme-dev libgnutls28-dev libgpg-error-dev libgsm1-dev libjpeg62-turbo-dev libkate-dev liblircclient-dev liblivemedia-dev liblua5.2-dev liblzma-dev libmad0-dev libmatroska-dev libmodplug-dev libmp3lame-dev libmpcdec-dev libmpeg2-4-dev libmtp-dev libncursesw5-dev libogg-dev libopus-dev libpng-dev libpulse-dev libraw1394-dev libresid-builder-dev librsvg2-dev librtmp-dev libsamplerate0-dev libsdl-image1.2-dev libsdl1.2-dev libshine-dev libshout3-dev libsidplay2-dev libsnappy-dev libsndio-dev libspeex-dev libspeexdsp-dev libssh-gcrypt-dev libssh2-1-dev libstdc++-6-dev libtag1-dev libtheora-dev libtinfo-dev libtwolame-dev libudev-dev libupnp6-dev libva-dev libvcdinfo-dev libvorbis-dev libvpx-dev libwavpack-dev libwebp-dev libx11-dev libx264-dev libx265-dev libxcb-keysyms1-dev libxcb1-dev libxml2-dev libxvidcore-dev libzvbi-dev zlib1g-dev libgdk-pixbuf2.0-dev libgtk2.0-dev libnotify-dev libqt5x11extras5-dev libxi-dev libsmbclient-dev libxext-dev libxinerama-dev libxpm-dev libaa1-dev libcaca-dev libegl1-mesa-dev libgles1-mesa-dev libgles2-mesa-dev libxcb-shm0-dev libxcb-xv0-dev libxcb-randr0-dev libxcb-composite0-dev libavcodec-dev libavformat-dev libgstreamer1.0-dev libswscale-dev
tar -xf vlc-2.2.8.tar.xz 
cd vlc-2.2.8/
./bootstrap 
patch -Np1 -i ../vlc-2.2.8-ffmpeg3-1.patch 
sed -i 's/error-implicit-function-declaration//' configure
export CFLAGS="-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/mmal -I/opt/vc/include/interface/vchiq_arm -I/opt/vc/include/IL -I/opt/vc/include/GLES2 -I/opt/vc/include/EGL -mfloat-abi=hard -mcpu=cortex-a7 -mfpu=neon-vfpv4" CXXFLAGS="-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/mmal -I/opt/vc/include/interface/vchiq_arm -I/opt/vc/include/IL -mfloat-abi=hard -I/opt/vc/include/GLES2 -I/opt/vc/include/EGL -mcpu=cortex-a7 -mfpu=neon-vfpv4" LDFLAGS="-L/opt/vc/lib"
./configure --prefix=/usr --enable-omxil --enable-omxil-vout --enable-rpi-omxil --disable-mmal-codec --disable-mmal-vout --enable-gles2
make -j3
sudo make install

Starte den VLC Player im entpackten vlc Verzeichnis, bzw. von der Stelle aus wo auch obige Kommandos eingegeben wurden mit:

./vlc

Dies ist ein Link auf bin/vlc-static. Der komplette Pfad ist, wenn man das gepackte vlc Archiv unter Downloads entpackt hatte:

/home/pi/Downloads/vlc-2.2.8/bin/vlc-static

Die Installation legt die Datei /usr/bin/vlc an welche aber nur eine Konsolen Oberfläche bereit stellt. Daher verschiebe ich die vlc Datei, welche die grafischer Oberfläche bereit stellt, nach /usr/bin/vlc:

sudo mv bin/vlc-static /usr/bin/vlc

After starting VLC for the first time, change the following options:

VLC will remember these settings.

Deinstallation

sudo make uninstall

apt update

Weicht die Systemzeit sehr ab, kommt es vor das dass Software VerwaltungsTool apt einen Fehler liefert. Beim Raspberry kann es leicht vorkommen, da es die Zeit über einen NTP-Server holt und diese bei fehlender Internet Verbindung falsch läuft. Daher die Zeit mit date -s „2020-05-12 19:23:00“ richtig setzen und apt update erneut ausführen.

GPIO Test

An den entsprechenden GPIO Pins können zum testen LED angeschlossen werden. Sind die GPIOs aktiviert und auf high Signal gesetzt so leuchtet die LED.

aktivieren der GPIOs 17, 27, 22 und 23
for GPIO in 17 27 22 23; do echo $GPIO > /sys/class/gpio/export; done
for GPIO in 17 27 22 23; do echo out > /sys/class/gpio/gpio$GPIO/direction; done
aktivierte GPIOs auf high Signal setzen
for GPIO in 17 27 22 23; do sleep 4; echo 1 > /sys/class/gpio/gpio$GPIO/value; done
aktivierte GPIOs wieder auf low Signal setzen
for GPIO in 17 27 22 23; do sleep 4; echo 0 > /sys/class/gpio/gpio$GPIO/value; done

Tox VideoChat

Nachdem Download von qtox (Binär Paket) funktioniert bei USB-Webcams nur Video, aber nicht das integrierte Mikrofon. Auf der Konsole gestartet, gibt qtox Meldungen über Audio aus, in denen etwas von pulse steht. Nach der Installation von pulseaudio, lässt sich die USB-Webcam in den Einstellungen von qtox als Audio Eingabegerät auswählen.

apt install pulseaudio

Suse

Suse(SLES) gibt es rein als 64Bit für Raspberry Pi3 und neuer. OpenSuse gibt es für alle Raspberry Pi Modelle.

Suse GPIO

Im Pfad /sys/class/gpio gibt es eine Datei „gpiochip298“. Die bedeutet die GPIO's starten ab 298.

Das kann man anhand der folgenden Datei ersehen:

cat /sys/kernel/debug/gpio 
gpiochip0: GPIOs 298-351, parent: platform/20200000.gpio, pinctrl-bcm2835:
 gpio-298 (                    |sysfs               ) in  hi    
 gpio-314 (                    |led0                ) out hi  

Möchte man nun GPIO 23 steuern, so muss man 298 + 23 nehmen und das Ergebnis „321“ dann in die export Datei schreiben:

echo 321 > /sys/class/gpio/export

GPIO als Output definieren:

echo out > gpio321/direction

Dann z.B. eine LED zum leuchten bringen:

echo 1 > gpio321/value

Mehrere gleichzeitig aktivieren in einer praktischen for-Schleife. Aktivieren der GPIOs 17, 27, 22 und 23

for GPIO in 17 27 22 23; do echo $(expr 298 + $GPIO) > /sys/class/gpio/export; done
for GPIO in 17 27 22 23; do echo out > /sys/class/gpio/gpio$(expr 298 + $GPIO)/direction; done

Die GPIOs gleichzeitig einschalten und anschließend wieder deaktivieren:

for GPIO in 17 27 22 23; do echo 1 > /sys/class/gpio/gpio$(expr 298 + $GPIO)/value; sleep 3; done
for GPIO in 17 27 22 23; do echo 0 > /sys/class/gpio/gpio$(expr 298 + $GPIO)/value; sleep 3; done

RPi Vergleich

Hier Raspberry Pi 4 1GB Modell

pi@raspberrypi:~ $ lscpu 
Architecture:        armv7l
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           1
Vendor ID:           ARM
Model:               3
Model name:          Cortex-A72
Stepping:            r0p3
CPU max MHz:         1500.0000
CPU min MHz:         600.0000
BogoMIPS:            108.00
Flags:               half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
pi@raspberrypi:~ $ cat /proc/cpuinfo 
processor       : 0
model name      : ARMv7 Processor rev 3 (v7l)
BogoMIPS        : 108.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

processor       : 1
model name      : ARMv7 Processor rev 3 (v7l)
BogoMIPS        : 108.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

processor       : 2
model name      : ARMv7 Processor rev 3 (v7l)
BogoMIPS        : 108.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

processor       : 3
model name      : ARMv7 Processor rev 3 (v7l)
BogoMIPS        : 108.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 3

Hardware        : BCM2711
Revision        : a03111
Serial          : 10000000d8dbe01f
Model           : Raspberry Pi 4 Model B Rev 1.1
pi@raspberrypi:~ $ lspci 
00:00.0 PCI bridge: Broadcom Limited Device 2711 (rev 10)
01:00.0 USB controller: VIA Technologies, Inc. VL805 USB 3.0 Host Controller (rev 01)
pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Settings for eth0:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Half 1000baseT/Full 
        Supported pause frame use: Symmetric Receive-only
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Half 1000baseT/Full 
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Link partner advertised link modes:  10baseT/Full 
                                             100baseT/Full 
                                             1000baseT/Full 
        Link partner advertised pause frame use: Symmetric
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
Cannot get wake-on-lan settings: Operation not permitted
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes
pi@raspberrypi:~ $ vcgencmd measure_volts
volt=0.8350V