Raspberry PI Project Setup [2024]
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 16x2 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
Basic Raspberry Setup
Inhalt
In diesem Artikel wird beschrieben, wie ein Basic Setup für den Raspberry Pi vorzunehmen ist um eine Basis für die meisten Projekte zu schaffen. Von der Vorbereitung der SD-Karte bis zum Betreiben des NGINX Webservers oder der Neopixel-Library.
Basic Raspberry Setup
1. Raspbian Stretch
Raspbian Stretch herunterladen: Raspberry.org
2. SD-Karte flashen
SD-Karte mit der aktuellen Version von Raspbian Stretch flashen
3. Headless Setup
Die folgende Datei herunterladen und dessen Inhalte in das Root-Verzeichnis der Speicherkarte legen:
Datei Download (raspberry-headless.zip)
country=CH
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="Zeltfunk"
psk="D8317iegbTfuz!"
id_str="home"
}
4. SSH Connection
SD-Karte in Raspberry einlegen und booten. IP-Adresse ausfindig machen und per SSH auf den Raspberry connecten.
ssh pi@10.0.0.xxx
5. Raspi Config
Raspi-Config aufrufen und Einstellungen für Dateisystem, Hostname, Passwort, Netzwerk, Update vornehmen.
- Enlarge Filesystem
- Reboot
- Hostname setzen
- Passwort ändern
- "Wait for Network at boot"
- Update raspi-config
- Reboot
6. Allgemeine Updates
Um das System vorzubereiten sollten ein paar allgemeine Updates durchgeführt werden um alle Pakete auf den aktuellsten Stand zu bringen und nachfolgende Probleme zu vermeiden.
sudo apt-get dist-upgrade
sudo apt-get update
sudo apt-get upgrade
7. Allgemeine Paket-Installation
Als nächstes werden ein paar Pakete installiert, welche immer von Nutzen sein werden und in den meisten Projekten benötigt werden:
sudo apt-get install build-essential python-dev python-setuptools git swig i2c-tools
8. Python Version 3.x
Damit mit aktuellsten Voraussetzungen entwickelt wird, sollte der Default der Python-Version auf 3.x geändert werden. Hierzu müssen lediglich die beiden folgenden Befehle ausgeführt werden:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2
9. NGINX Installation
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
sudo /etc/init.de/nginx start
10. PHP 7 installieren
Um PHP (in Version 7.x) zu installieren wird folgender Befehl ausgeführt:
sudo apt-get install php-fpm
11. MySQL (Server) installieren
MySQL ist für die Datenbanken zuständig. MySQL Datenbanken können erst angelegt und verwendet werden, wenn der MySQL Server installiert ist. Dies wird über folgenden Befehl erreicht:
sudo apt-get install mysql-server
12. MySQL Konfiguration
Für MySQL wird als erstes eine dem Projekt entsprechende Datenbank erstellt, welche danach vom Web-Interface und von der Python-Applikation angesteuert wird. Hierfür wird MySQl im Terminal gestartet:
sudo mysql -u root
Um eine neue Datenbank zu erstellen, wird folgender Befehl genutzt. Als Datenbank-Name wird der Projektname in lowercase verwendet:
CREATE DATABASE aquapi;
Für die gerade erstellte Datenbank wird ein Benutzer mit Passwort erstellt und entsprechende Zugangsberechtigungen vergeben. Hierbei werden username, dbname und password entsprechend ersetzt.
CREATE OR REPLACE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON dbname.* TO 'username'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
Zuletzt muss in der Config noch die bind-address eingetragen werden:
sudo nano /etc/mysql/my.cnf
Hier werden dann am Ende der Datei die folgenden zwei Zeilen eingetragen:
[mysqld]
bind-address = 0.0.0.0
Danach: Neustarten des MySQL service via:
sudo systemctl restart mysql.service
13. Github-Projekt klonen
Als nächstes kann das Beispiel-Projekt von Github geklont werden um die wichtigsten und initialen Files für ein Projekt auf dem Raspberry zur Verfügung zu haben. Hierbei wird target durch das entsprechende Ziel-Verzeichnis ersetzt.
git clone https://github.com/Tetrikus/BasePi /home/pi/target
Da das Projekt auf Github als "privat" gelistet ist, wird für den Klon-Vorgang ein Benutzername und ein Passwort benötigt.
14. NGINX Konfiguration
Die NGINX-Config ist im Applikations-Verzeichnis des Base-Projekts enthalten (/web/nginx.conf). Dieses muss allerdings zuerst noch angepasst werden:
- Zeile 7: Korrekten Pfad zum /web Verzeichnis einfügen
- Zeile 11: Sinnvollen Servernamen verwenden
Im NGINX-Verzeichnis (/etc/nginx/sites-enabled/) gibt es bereits eine Default-Config, welche mit folgendem Befehl überschrieben wird – hierbei muss projectpath mit dem korrekten Namen des Verzeichnisses überschrieben werden:
sudo cp -r /home/pi/projectpath/web/nginx.conf /etc/nginx/sites-enabled/default
Die Ursprungsdatei im /web Verzeichnis sollte gelöscht werden, wenn sie nicht mehr weiter benötigt wird. Folgendes ist ein Backup der Default-Konfiguration:
# Default NGINX server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
root /home/pi/projectpath/web;
index index.php index.html index.htm index.nginx-debian.html;
server_name aqua.pi;
location / {
try_files $uri $uri/ /index.php?$args;
}
# pass PHP scripts to FastCGI server
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Nachdem die Konfiguration entsprechend überschrieben wurde, muss diese neu geladen werden, damit nginx mitbekommt, dass sich die Config geändert hat:
sudo /etc/init.d/nginx reload
15. MySQL für PHP (php-mysql)
Damit PHP mit MySQL kommunizieren kann, wird ein weiteres Package benötigt. Dieses kann mittels folgendem Befehl installiert werden:
sudo apt-get install php-mysql
16. MySQL für Python (PyMySQL)
Damit Python ebenfalls mit MySQL kommunizieren kann, wird folgendes Package benötigt:
pip install pymysql
17. Python Requests
Requests Package für Web-Requests von PHP und Python
sudo apt-get install python-requests requests
18. NeoPixel Installation
Die Neopixel Library wird über folgenden Befehl installiert:
sudo pip install rpi_ws281x
19. NeoPixel Konfiguration
Install Apache Webserver on Raspberry
Installing Web Server
Über das Terminal wird Apache wie folgt installiert. Die Installation dauert ungefähr 1-2 Minuten.
sudo apt-get install apache2 -y
Zugriff auf die Web-Oberfläche
Nachdem Apache installiert wurde, ist der Webserver via Browser im selben Netzwerk über die normale IP des Raspberry erreichbar.
Installation von PHP
Für die meisten Web-Oberflächen wird wohl PHP benötigt. Um das zu installieren, wird folgender Befehl verwendet. Dieser Prozess dauert 2-3 Minuten.
sudo apt-get install php libapache2-mod-php -y
Apache Config
Um Apache mitzuteilen, wo es nach den HTML-Dateien suchen soll, bzw. welches das Basis-Verzeichnis ist, wird die Datei 000-default.conf editiert.
sudo nano /etc/apache2/sites-enabled/000-default.conf
Der Eintrag DocumentRoot wird hier entsprechend auf den neuen Wert geändert - beispielsweise: /home/pi/soundmachine/web/
Zusätzlich dazu sind weitere Einstellungen für Apache nötig und die entsprechenden Berechtigungen zu setzen. Direkt unter dem DocumentRoot wird dafür folgendes hinzugefügt.
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/pi/soundmachine/web/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Require all granted
</Directory>
Sind die Änderungen vorgenommen, wird das File geschlossen und gespeichert und Apache mit folgendem Befehl neu gestartet:
sudo systemctl reload apache2
Der Neustart dauert lediglich 1-2 Sekunden. Direkt danach sollte über die selbe IP-Adresse das neue Verzeichnis erreicht werden können.
Configuration of mod-rewrite
Um modRewrite zu aktivieren, wird folgender Befehl ausgeführt:
sudo a2enmod rewrite
Danach muss Apache neu gestartet werden:
sudo service apache2 restart
Installing Neopixel Library
Upgrade des Systems
Als erstes sollte das System komplett updated werden, da sonst immer wieder Probleme bei der Installation auftreten können. Das Upgrade kann ein paar Minuten in Anspruch nehmen, abhängig davon, wie alt das Image ist, das sich auf der SD-Karte befindet.
sudo apt-get dist-upgrade
Installation von benötigten Paketen
Zuerst werden die benötigten Pakete auf dem Raspberry installiert:
sudo apt-get install build-essential python-dev git scons swig
Nachdem die wichtigsten Tools installiert wurden, kann das Repository von Github geklont werden.
cd /home/pi/soundmachine git clone https://github.com/jgarff/rpi_ws281x.git
Dann ins gerade kopierte Verzeichnis wechseln und scons ausführen
cd /home/pi/soundmachine/rpi_ws281x scons
Die Python Library (Wrapper) wird installiert, in dem der folgende Befehl ausegführt wird:
cd /home/pi/soundmachine/rpi_ws281x/python sudo python setup.py install
Resultat
Falls alles geklappt hat, sollte die letzte Zeile ungefähr "Finished processing dependencies for rpi-ws281x==1.0.0" heissen.
Weitere Infos
jgarff on Github: https://github.com/jgarff/rpi_ws281x
Neopixel Manual: https://learn.adafruit.com/neopixels-on-raspberry-pi?view=all
Headless Raspberry Setup
Headless Setup
Wenn ein Raspberry Pi neu installiert wird, jedoch keine Maus, keine Tastatur und kein Monitor verfügbar ist, ist es das einfachste, ein Linux-Image zu flashen und das Setup auf der SD-Karte vorzubereiten, damit der Raspberry nach der Initialisierung direkt per SSH erreichbar ist.
SSH Aktivierung
Um SSH zu aktivieren wird nach dem Flashen des Images auf die SD-karte lediglich ein (leeres) File namens ssd auf der Partition boot abgelegt. Die Datei benötigt keinen Inhalt und keine Datei-Endung. Dadurch wird beim ersten/nächsten Boot-Vorgang automatisch SSH aktiviert.
WiFi Setup
Auch das WiFi kann auf diese Weise aktiviert und konfiguriert werden. Hierzu wird eine weitere Datei erstellt, die sich wpa_supplicant.conf nennt. Diese Datei sieht wie folgt aus:
country=CH
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="bexio"
psk="IuBswdSv8R"
id_str="office"
}
network={
ssid="Zeltfunk"
psk="D8317iegbTfuz!"
id_str="home"
}
Wird diese Datei ebenfalls in der Boot-Partition abgelegt, sollte dich der Raspberry beim nächsten Boot-Vorgang automatisch mit dem WLAN-Netzwerk verbinden.
