Mit kostengünstigen Komponenten für die SPI-Schnittstelle rüsten Sie einen Raspberry Pi 4 im Handumdrehen zum Display-System für das kontaktlose Auslesen von Daten via RFID auf.
Die Idee ist schnell erklärt: In diesem Projekt möchten wir die Seriennummern aus RFID-Tags auslesen, die in 3D-gedruckten Kürbissen steckten – eine Detektivaufgabe der etwas anderen Art. Dazu schließen wir das RFID-Kit RC522 [1] und das 1,8 Zoll große SPI-TFT-Display ST7735 [2] an einem Raspberry Pi 4 an. Beide Module kosten im Online-Handel zusammen unter 15 Euro. In den Kürbissen stecken einfache RFID-Tags [3], die ebenfalls für kleines Geld zu bekommen sind. Das Projekt klingt erst einmal übersichtlich und so, als müsste es auf Anhieb klappen. Im Kasten “Pleiten, Pech und Pannen” lesen Sie, was trotzdem alles schiefgehen kann.
Der Schaltplan in Abbildung 1 zeigt, wie wir die Module mit dem Raspberry Pi verbunden haben. Zu Testzwecken sind noch je zwei Taster und LEDs vorgesehen. Das KiCad-Layout des Projekts finden Sie im Download-Bereich zu diesem Artikels enthalten. Falls Sie die Platine von einem Dienstleister fertigen lassen möchten, empfiehlt der Autor das Platinencenter [4]. Dort bekommen auch Privatpersonen eine professionelle Platine zu einem guten Preis – und das alles made in Germany.

Abbildung 1: Der Schaltplan für den Versuchsaufbau: rechts die Anschlüsse für das Display und den RFID-Reader.
Pleiten, Pech und Pannen
Nach einer kurzen Recherche hatte sich der Autor entschieden, welche Bibliotheken er zum Ansteuern der Module verwendet wollte. Nach einem Tag Grübeln und Programmieren stellte sich heraus, dass die Bibliothek für den RFID-Reader schon seit etlichen Jahren nicht mehr gepflegt wird. Daher ließ sie sich nur durch etliche Codeanpassungen dazu zu bewegen, unter Python 3 zu funktionieren. Werfen Sie bei Open-Source-Projekten also besser immer einen Blick auf das Datum des letzten Commits und die Issues. Daran erkennen Sie schnell, ob das Projekt noch von der Community weiterentwickelt wird.
Der Autor stolperte in letzter Zeit im Netz über etliche Softwareleichen, die auf den ersten Blick noch aktiv aussehen, aber schon seit Jahren vor sich hin gammeln. Beispielsweise wird das über Jahre hinweg sehr beliebte Tool WiringPi seit Längerem nicht mehr unterstützt. Das ist auch der Grund, warum es aus den Pi-OS-Paketquellen entfernt wurde. Das Internet vergisst allerdings nichts, und so stolpert man als Nutzer immer wieder über veraltete Anleitungen und How-to-Artikel.
In der Entwicklergemeinde gibt es viele Anhänger von Python, weil man damit schnell zu funktionierenden Programmen kommt. Gerade für Programmieranfänger soll der Einstieg in diese Sprache besonders leicht sein. Es kommt aber vor, dass hardwarenah arbeitende Python-Bibliotheken hastig geschrieben und nicht umfassend getestet wurden, wodurch Inkompatibilitäten entstehen. Daher mussten in diesem Projekt das Reader- und das Display-Programm getrennt werden.
Display und RFID-Reader
Jedes der Module ist an einer eigenen SPI-Schnittstelle angeschlossen. Abbildung 2 zeigt das komplett aufgebaute Projekt inklusive der in den Kürbissen versteckten RFID-Tags. Bitte beachten Sie, dass nur der Raspberry Pi 4 mehrere SPI-Schnittstellen an Bord hat. Wir gehen im nächsten Abschnitt noch ein wenig genauer darauf ein, wie Sie diese SPI-Schnittstellen im Detail ansprechen.

Abbildung 2: Der komplette Versuchsaufbau mit einer Armee von Kürbissen: vorne der Reader, hinten das Display.
Der RasPi 4 verfügt über insgesamt sieben SPI-Schnittstellen, die sich alle über den 40-poligen Header des GPIO erreichen lassen. Die Vorgängermodelle kamen lediglich mit drei SPI-Schnittstellen, von denen nur zwei auf den Header herausgeführt wurden. Die Tabelle “Default-Pins” zeigt, welche Pins standardmäßig den einzelnen Schnittstellen auf dem Header entsprechen.
|
SPI |
Header |
Pin |
|---|---|---|
|
SPI0 |
MOSI |
19 |
|
SPI0 |
MISO |
21 |
|
SPI0 |
SCLK |
23 |
|
SPI0 |
CE0 |
24 |
|
SPI0 |
CE1 |
26 |
|
SPI1 |
MOSI |
38 |
|
SPI1 |
MISO |
35 |
|
SPI1 |
SCLK |
40 |
|
SPI1 |
CE0 |
12 |
|
SPI1 |
CE1 |
11 |
|
SPI1 |
CE2 |
36 |
|
SPI3 |
MOSI |
3 |
|
SPI3 |
MISO |
28 |
|
SPI3 |
SCLK |
5 |
|
SPI3 |
CE0 |
27 |
|
SPI3 |
CE1 |
18 |
|
SPI4 |
MOSI |
31 |
|
SPI4 |
MISO |
29 |
|
SPI4 |
SCLK |
26 |
|
SPI4 |
CE0 |
7 |
|
SPI4 |
CE1 |
22 |
|
SPI5 |
MOSI |
8 |
|
SPI5 |
MISO |
33 |
|
SPI5 |
SCLK |
10 |
|
SPI5 |
CE0 |
32 |
|
SPI5 |
CE1 |
37 |
|
SPI6 |
MOSI |
38 |
|
SPI6 |
MISO |
35 |
|
SPI6 |
SCLK |
40 |
|
SPI6 |
CE0 |
12 |
|
SPI6 |
CE1 |
13 |
SPI-Schnittstelle auslesen
Beim Blick auf die Tabelle fällt auf, dass sich einige Anschlüsse überschneiden und die Schnittstelle SPI2 in der Standardkonfiguration nicht auf dem Header verfügbar ist. Das stellt aber kein Problem dar, da sich die Konfiguration der SPI-Schnittstellen mit dem Kommando dtoverlay anpassen lässt. Über dieses Tool erhalten Sie bei Bedarf auch eine Liste aller vordefinierten SPI-Geräte (Listing 1).
Listing 1
SPI-Schnittstellen
$ dtoverlay --all | grep spi.-
spi0-1cs
spi0-2cs
spi1-1cs
spi1-2cs
spi1-3cs
spi2-1cs
spi2-2cs
spi2-3cs
spi3-1cs
spi3-2cs
spi4-1cs
spi4-2cs
spi5-1cs
spi5-2cs
spi6-1cs
spi6-2cs
Für die einzelnen Schnittstellen gibt es jeweils mehrere Konfigurationen mit einer unterschiedlichen Anzahl von CS-Leitungen (Chip Select). Damit lassen sich die Schnittstellen sehr genau an die Anforderungen des Projekts anpassen. Um die konkrete Definition eines SPI-Geräts zu erhalten, verwenden Sie beim Aufruf von Dtoverlay die Option -h. Listing 2 zeigt ein Beispiel für die Ausgabe des Kommandos. Die Standard-Pins auf dem Header werden bei der Ausgabe mit angezeigt.
Listing 2
Ausgabe von Dtoverlay
$ dtoverlay -h spi1-3cs
Name: spi1-3cs
Info: Enables spi1 with three chip select (CS) lines and associated
spidev dev nodes. The gpio pin numbers for the CS lines and
spidev device node creation are configurable.
N.B.: spi1 is only accessible on devices with a 40pin header,
eg: A+, B+, Zero and PI2 B; as well as the Compute Module.
Usage: dtoverlay=spi1-3cs,<param>=<val>
Params: cs0_pin GPIO pin for CS0 (default 18 - BCM SPI1_CE0).
cs1_pin GPIO pin for CS1 (default 17 - BCM SPI1_CE1).
cs2_pin GPIO pin for CS2 (default 16 - BCM SPI1_CE2).
cs0_spidev Set to 'disabled' to stop the creation of a
userspace device node /dev/spidev1.0 (default
is 'okay' or enabled).
cs1_spidev Set to 'disabled' to stop the creation of a
userspace device node /dev/spidev1.1 (default
is 'okay' or enabled).
cs2_spidev Set to 'disabled' to stop the creation of a
userspace device node /dev/spidev1.2 (default
is 'okay' or enabled).
Um die aktuell geladenen Overlays zu erhalten, nutzen Sie die Option -l. Eine Liste der vorhanden SPI-Geräte erhalten Sie über das Kommando ls /dev/spi*. Vergessen Sie nicht, vorab die SPI-Unterstützung mit der Zeile dtparam=spi=on in der Datei /boot/config.txt zu aktivieren. Alternativ verwenden Sie dafür das Konfigurationswerkzeug von Pi OS. Die entsprechende Option finden Sie unter 3**Interface**Options | I4**SPI.
Falls Sie bestimmte Overlays direkt beim Booten aktivieren möchten, können Sie diese auch mit in die Datei /boot/config.txt eintragen (etwa dtoverlay=spi1-2cs). Es bestünde prinzipiell auch die Möglichkeit, die einzelnen Leitungen der SPI-Schnittstellen mit Dtoverlay per Software umzuverdrahten, das würde allerdings an dieser Stelle zu weit führen.
RasPi vorbereiten
Als Betriebssystem für den Raspberry Pi dient ein aktuelles Pi OS Lite in der 32-Bit-Version. Listing 3 fasst die Kommandos zusammen, um das System auf den neuesten Stand zu bringen und die nötigen Programme und Bibliotheken aus den Paketquellen zu installieren. Die für die Integration des Displays und des Readers nötigen Bibliotheken beziehen Sie aus dem Python Package Index PIP.






