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.