Flashing Raspberry

Der Raspberry PI Imager ist die einfachste Möglichkeit, eine SD-Karte für einen Raspberry vorzubereiten.

Headless Setup

Für ein Headless Setup sollten während des Flash-Vorgangs die wichtigsten Informationen vor-eingestellt werden. Hierzu gehören die WiFi-Verbindung (falls benötigt), das Passwort und die Aktivierung von SSH.

Updates durchführen

sudo apt-get dist-upgrade
sudo apt-get update
sudo apt-get upgrade

Allgemeine Packages

Folgende Pakete werden meistens benötigt und werden bei Bedarf OS-weit installiert:

sudo apt-get install build-essential
sudo apt-get install python3-full
sudo apt-get install python3-dev
sudo apt-get install python3-setuptools
sudo apt-get install python3-pil
sudo apt-get install git
sudo apt-get install swig
sudo apt-get install i2c-tools

Virtual Environment Setup

Gerade bei neueren Versionen des Raspberry PI muss zuerst eine virtuelle Umgebung erstellt werden.

Als erstes wird dazu eine virtuelle Umgebung definiert und erstellt:

python3 -m venv --system-site-packages VENVNAME

Die Option --system-site-packages gibt an, dass Module, die auf System-Ebene installiert sind, ebenfalls in der VENV erreichbar sind. Der Name für die virtuelle Umgebung kann frei gewählt werden. Als Beispiel wird hier venvtp verwendet. Die Installation der virtuellen Umgebung kann im User-Verzeichnis /home/pi/ durchgeführt werden.

Danach wird die virtuelle Umgebung “aktiviert”:

source /home/pi/venvtp/bin/activate

Damit nicht bei jedem Start einer Applikation der gesamte Befehl sudo /home/pi/venvtp/bin/python3 script.py eingegeben werden muss, kann ein Alias erstellt werden, welcher das abkürzt:

alias supy='sudo /home/pi/venvtp/bin/python3'

Danach können Scripts ganz einfach über den Befehl supy start.py aufgerufen werden. Allerdings muss dieser Alias zusätzlich in die Datei .bashrc gespeichert werden, damit er dauerhaft bestehen bleibt. Ausserdem wird ein Eintrag für die Aktivierung der VENV hinzugefügt. Dazu wird die Datei ~/.bashrc mittels nano geöffnet und am Ende der Datei folgende Zeilen eingesetzt:

  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

alias supy='sudo /home/pi/venvtp/bin/python3'
alias venv='source /home/pi/venvtp/bin/activate'

Webserver Setup

Apache deinstallieren

Zuerst soll die Apache-Installation deaktiviert und deinstalliert werden, falls vorhanden und aktiv:

sudo systemctl stop apache2
sudo systemctl disable apache2
sudo apt remove apache2
sudo apt autoremove
sudo apt clean all && sudo apt update && sudo apt dist-upgrade
sudo apt purge apache2

NGINX installieren

NGINX ist eine Webserver-Applikation, welche die Grundfunktionalitäten für den Webserver bereitstellt. Diese wird über folgende Befehle installiert und dann gestartet.

sudo apt-get install nginx

Nach der Installation von nginx sollte die IP-Adresse des Raspberry pi über einen Webserver aufrufbar sein und die nginx Welcome-Seite dargestellt werden.

PHP installieren

Um PHP zu installieren wird folgender Befehl ausgeführt:

sudo apt-get install php-fpm

Die fpm-Version wird benötigt, falls der Webserver auf NGINX und nicht Apache2 basiert.

MySQL Server installieren

MySQL (mariadb) wird mit folgendem Befehl installiert:

sudo apt-get install default-mysql-server

NGINX Konfiguration

Als erstes wird die Konfigurations-Datei aufgerufen:

sudo nano /etc/nginx/sites-enabled/default

Hier werden einige Konfigurationen benötigt. Das folgende Beispiel zeigt eine Möglichkeit, den Server zu konfigurieren. Hierbei werden folgende Einstellungen vorgenommen:

  • Das Root-Verzeichnis der Website (/home/pi/…./web)
  • Das reagieren auf die index.php als Eingangspunkt
  • Der Server-Name xyz.pi
  • Das Reagieren und Auslesen auf URL-Argumente wie z.B. index.php?page=settings
  • Zugriff auf .htaccess verhindern

Am Ende sollte die Config-Datei ungefähr wie folgt aussehen:

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        
        # define the website root
        root /home/pi/wClock/web;
        
        #define to listen to index.php first
        index index.php index.html index.htm index.nginx-debian.html;

        # define the server name
        server_name puzzle.pi;
        
        # define to process arguments within the urls
        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        # pass PHP scripts to FastCGI server
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

Berechtigungen für das Web-Verzeichnis setzen. Der gesamte Pfad benötigt read und execute Permissions:

# sudo chown -R www-data:www-data /home/pi/testipi/web
# sudo chown -R www-data:www-data /home /home/pi /home/pi/testipi/ /home/pi/testipi/web
# sudo chmod 755 /home/pi/testipi/web

sudo chmod +rx /home /home/pi /home/pi/testipi/ /home/pi/testipi/web/

Nach diesen Anpassungen muss der NGINX-Service neu gestartet werden:

sudo systemctl reload nginx

Nun sollte der Webserver und eine index.php im Verzeichnis /web per Browser aufrufbar sein.

PHP Error Reporting & Display

Wenn beim Aufruf einer PHP-Seite Fehler passieren, werden Sie aktuell noch nicht im Browser sondern nur im Error-Log von nginx ausgegeben. Um das zu ändern, müssen noch ein paar Schritte unternommen werden. Zuerst wird die entsprechende php.ini geöffnet.

sudo nano /etc/php/8.2/fpm/php.ini

Der Wert display_errors (relativ weit unten im File) wird von Off zu On geändert und die Datei gespeichert.

PHP Short Tags

Ausserdem können in der PHP.ini die PHP Shorttags (also <? anstatt <?php) aktiviert werden:

short_open_tag = On

Nach dem Update der Datei, wird der PHP service neu gestartet:

sudo /etc/init.d/php8.2-fpm restart

Nun werden die Errors sowohl im nginx Log gespeichert wie auch im Browser direkt ausgegeben.

MySQL Konfiguration

Nach der Installation von MySQL (MariaDB) wird die Konfiguration gestartet. Das Basis-Setup ist durch folgenden Befehl zu erreichen:

sudo mysql_secure_installation

Die Passwort-Abfrage kann mit Enter bestätigt werden, da noch keines gesetzt wurde. Dann soll mit Y zur unix_socket_authentification gewechselt werden. Abermals Y führt zur neuen Passwort-Vergabe für den root user. Danach wird für anonymous_users, disalow_rootlogin, remove_testdatabase und reload_configuration ebenfalls jeweils mit Y geantwortet. Damit ist das Setup grundsätzlich abgeschlossen und mittels folgendem Befehl kann auf mysql zugegriffen werden:

sudo mysql -uroot -p

Danach wird das root Passwort abgefragt, welches vorher gesetzt wurde. Die Installation kann zum Beispiel mittels SHOW DATABASES; getestet werden, welches die bereits vorhandenen Datenbanken ausgeben sollte.

Datenbank und User definieren

Mittels folgender Befehle wird eine neue Datenbank und ein dazugehöriger User erstellt, ihm alle Rechte gegeben und die Konfiguration reloaded:

CREATE DATABASE db_test;

CREATE OR REPLACE USER 'usr_test'@'%' IDENTIFIED BY 'test77';
GRANT ALL PRIVILEGES ON db_test.* TO 'usr_test'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Um diesen Schritt zu testen, kann eine Verbindung mit dem neuen User zu MySQL hergestellt werden:

sudo mysql -u usr_test -p

Nach Eingabe des vorher vergebenen Passwortes, gelangt man wieder in die MySQL-Umgebung, diesmal mit dem neuen User.

Damit die Datenbank auch von extern zu erreichen ist, muss in der Konfiguration noch ein sogenanntes Bind eingetragen werden:

sudo nano /etc/mysql/my.cnf

Folgende beiden Zeilen werden am Ende der Konfiguration eingetragen:

[mysqld]
bind-address = 0.0.0.0

Danach wird der Server über folgenden Befehl neu gestartet. Danach sollte eine Verbindung von ausserhalb (z.B. PyCharm, etc.) möglich sein.

sudo systemctl restart mysql.service

MySQL für PHP installieren

sudo apt-get install php-mysql

MySQL für Python installieren

pip3 install pymysql

Install Adafruit Blinka

Adafruit Blinka ist ein Framework, welches es erleichtert, auf Hardware-Komponenten des Raspberry PI zuzugreifen. Es kann ganz einfach mittels folgendem Script installiert werden, nachdem eine virtuelle Umgebung erstellt und aktiviert wurde:

cd ~
pip3 install --upgrade adafruit-python-shell
wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/raspi-blinka.py
sudo -E env PATH=$PATH python3 raspi-blinka.py

Das Script aktiviert die benötigten Hardware-Schnittstellen (I2C, SPI, etc.) installiert blinka und die Dependencies. Der Prozess wird durch einen Neustart beendet.

Adafruit SPI Display Setup

Zuerst wird die entsprechende Library via pip in die venv installiert:

pip3 install adafruit-circuitpython-rgb-display

Danach wird die Font “Dejavu” installiert, falls sie nicht bereits im System vorhanden ist:

sudo apt-get install fonts-dejavu

asdf

I2C Port Expander (MCP23017)

Um einen (oder mehrere) I2C Port-Expander zu verwenden, muss das entsprechende Package installiert werden:

pip3 install adafruit-circuitpython-mcp230xx

Adafruit 16×2 LCD Display (I2C)

Um die benötigten Daten zu installieren wird folgender Befehl innerhalb der venv ausgeführt:

pip3 install adafruit-circuitpython-charlcd

Danach kann das Display bereits über die I2C-Schnittstelle angesprochen werden.

1.3″ OLED (I2C) Display

Das Display hat die fixe I2C Adresse 0x3C, es können somit nicht mehrere desselben Displays gleichzeitig angesteuert werden. Für die Ansteuerung des Displays wird das folgende Modul über die venv installiert:

pip3 install luma.oled

text

1.3* LCD SPI Display

pip3 install numpy

Servo Hat Setup

Um den Waveshare Servo Hat zu installieren, wird zuerst das Modul smbus installiert:

pip3 install smbus

Da

LUX Sensor (I2C) – Adafruit TSL2561

Der LUX-Sensor hat standardmässig die Adresse 0x39. Das dazugehörige Modul wird mittels folgendem Befehl installiert:

pip3 install adafruit-circuitpython-tsl2561

Rotary Knobs Breakout – Adafruit NeoRotary 4

Das Breakout Board hat standardmässig die Adresse 0x49. Das dazugehörige Modul wird mittels folgendem Befehl installiert:

pip3 install adafruit-circuitpython-seesaw

Sparkfun Audio Hat (MAX38957a)

In raspi-config wird zuerst das entsprechende Gerät als Audio-Gerät ausgewählt. Danach muss folgendes Script aus der venv ausgeführt werden. Die Installation wird mit einem Reboot abgeschlossen.

sudo apt install -y wget
wget https://github.com/adafruit/Raspberry-Pi-Installer-Scripts/raw/main/i2samp.py
sudo -E env PATH=$PATH python3 i2samp.py

Das selbe Script wird danach nochmal ausgeführt und erneut mit einem Reboot beendet. Danach sollte der alsamixer verfügbar sein.

Um die Sound-Ausgabe zu testen, kann folgender Befehl ausgeführt werden, welcher ein Test-File ausgibt:

speaker-test -c2 --test=wav -w /usr/share/sounds/alsa/Front_Center.wav

Neopixel (rpi_ws281x) Setup

Um die Neopixel Library zu installieren wird folgender Befehl innerhalb der venv ausgeführt:

pip3 install rpi_ws281x

asdf