Raspberry Pi als Gehirn für ein Roboter-Auto mit "Künstlicher Intelligenz"
Ist es möglich, ein Spielzeugauto mit einem Raspberry PI "künstliche Intelligenz" (KI) einzuhauchen? Vielleicht kann man dem Raspi ja auch in Bezug auf künstliche Intelligenz irgendwie auf die Sprünge helfen?
Konzept
Ein Roboter-Auto hatte bisher eine mehr oder weniger große Anzahl Sensoren und eine fest definierte Aufgabe. Je aufwendiger die Steuerung programmiert war, desto 'intelligenter' sind diese Maschinen.
Aktuell wird das Schwein 'Künstliche Intelligenz' durch das Dorf getrieben. Eine Anwendung ist dabei das autonome Fahren, wie es von der KFZ-Industrie propagiert wird.
Der Raspi hat genug Leistung, um die Informationen aller angeschlossenen Sensoren zu verarbeiten und so eine Art 'autonomes Fahren' zu realisieren. Dies wird im Buch 'Roboter-Autos mit dem Raspberry Pi' ausführlich beschrieben.
Spendiert man dem Roboter-Auto noch eine Kamera, steht eigentlich der KI nur noch fehlende Rechenleistung im Weg. Um dieses Problem zu lösen, hat Google mit Coral einen 'Rechenknecht' für KI-Aufgaben entwickelt. Diesen kann man über USB an den Raspi stecken und so die KI-Fähigkeiten deutlich erweitern.
Und jetzt noch ein Bild:
Am Anfang war das Buch 'Roboter-Autos mit dem Raspberry Pi' von Ingmar Stapel.
Ziel des Buches ist es, einen eigenen Roboter zu basteln und zum laufen zu bringen. Ganz ohne Vorkentnisse. Etwas handwerkliches Geschick und einige Vorkenntnisse mit Elektronik und Linux sind sicher nicht verkehrt.
Viele weitere Informationen und Projekte stellt der Autor auf seiner Web-Seite zur Verfügung: https://custom-build-robots.com/
Da das Buch aus dem Jahr 2019 ist, hat sich die Raspberry Pi Welt natürlich weitergedreht. Das Betriebssystem des Raspberry Pi ist auf eine neue Version gehoben worden und Python3 ist jetzt Stand der Technik. Ich habe mein Projekt mit dem aktuelle Stand (Mitte 2023) von Betriessystem (32 bit) und Python3 gestartet. Mal sehen wie weit ich komme, da sich doch einigen geändert hat.
Desktop/Laptop Betriebssystem
Ein Roboter-Auto soll natürlich ungebunden herumfahren können. Dabei ist eine Verbinung zu Tastatur und Monitor eher hinderlich. Der Raspberry Pi wird also ohne beides auskommen müssen und als sogenanntes 'headless system' unterwegs sein. Es wird also auch noch ein Desktop/Laptop benötigt, von dem aus wir über WLAN auf unseren Raspberry Pi zugreifen
Auch ist für die Vorbereitung des ersten Starts des Rapberry Pi ein Computer notwendig, mit dem die SD-Karte mit dem Betriebssystem beschrieben wird.
Wenn man sich mit dem Raspberry Pi beschäftigt, kommt man um Raspberry OS nicht herum. Bei Raspberry OS handelt es sich um ein speziell an die Raspberry Pi Hardware angepasstes Linux. Und je besser die Linux-Kenntnisse, um so einfacher lassen sich eventuell auftretende Probleme lösen.
Da liegt es natürlich nahe, Linux auch für den Desktop/Laptop zu verwenden.
Welche Distribution ...
Xxx
Xxx.
Xxx.
Für den Anfang soll es erst mal ein einfaches Fahrzeug mit 4 Rädern werden, die alle einzeln angetrieben werden. Um das Fahrzeug zu lenken, gibt es verschiedene Möglichkeiten:
- Einfach die linken oder rechten Räder schneller drehen lassen. Das ist dann eine Art von Panzerlenkung, die einfach programmiert werden kann.
- Lenkbare Vorder- oder Hinterräder. Nicht mehr ganz so einfach, da noch eine zusätzlicher Mechanik mit Antrieb benötigt wird, um zu lenken. Der Antrieb aller vier Räder wird dann meschanisch auch deutlich aufwändiger.
- Mecanum Räder verwenden. Das sind spezielle Räder, bei denen man dur unterschiedliche Drehrichting der einzelnen vier Räder verschiedene Bewegungsrichtungen des Fahrzeuges erreicht. Diese Lenkung benötigt keine zusätzliche Mechanik und kann vollständig programmiert werden. Und die Fahrmanöver sind ungewöhnlich spektakulär.
Meine Entscheidung fiel auf die Mecanum Räder.
Hinter den Bildern findet sich immer ein Link zum Händlern, der mir die Teile verkauft hat. Diese sitzen alle irgendwo in Deutschland zur Minimierung des internationalen Paketverkehrs.
Roboter-Auto Bausatz
Entschieden habe ich mich für einen einfachen Bausatz bestehend aus vier Motoren, vier Mecanum Rädern, zwei Acryl Platinen und diverses Befestigungsmaterial. Das EMOZNY Smart Motor Roboter Auto Mecanum-Rad Chassis Kit.
Es sind schon diverse Löcher zum befestigen von Baugruppen vorhanden, und so kann das Experimentieren sofort losgehen. Hat man dann die finale Position für jede Baugruppen gefunden, können die benötigten zusätzlichen Löcher mit wenig Aufwand in das Acryl gebohrt werden.
Raspberry Pi 4B
Da es schnell gehen muss, verwende ich den Raspbrry Pi 4B, den ich eigentlich für den StopMotionPi vorgesehen hatte. Bei diesem Projekt stecke ich sowieso gerade in einer Warteschleife.
Weiteres benötigtes Zubehör:
- Standard-Netzteil für Raspberry Pi 4B
- Mini-SDHC Speicherkarte mit mindestens 8 GB Speicherplatz (aktuell 32 GB)
Strom weg - Daten weg (Optional)
Der Raspberry Pi ist etwas empfindlich, wenn man ihm unverhofft den Strom entzieht. Da kann es schon mal passieren, dass er nicht mehr bootet, wenn der Strom wiederkommt.
Deshalb ist eine Unterbrechingsfreie Stromversorgung immer eine gute Idee. Die kann dann gleich noch ein paar andere Aufgaben mit erledigen:
- Bereitstellung der Raspberry Pi Stromversorgung aus der Fahrzeug-Batterie
- Ordnungsgemäßes herunterfahren des Rasperry Pi bei Stromausfall
- Kleine Puffer-Batterie zum überbrücken von kurzen Stromausfällen (kleiner 1 Minute)
- Ein- und Ausschalter für das Fahrzeug
- ...
Stromversorgung
Wenn das Fahrzeug auf dem Schreibtisch steht, kann man natürlich die normale Raspberry Pi Stromversorgung für den Raspberry verwenden. Das würde dann alle Baugruppen versorgen, die irgendwie mit dem Raspberry Pi verbunden sind und diesen als Stromquelle nutzen. Dazu zählen dann Aufsteckmodule (HATs), USB-Geräte und anderes.
Für die Motoren (3V bis 6V, 12V oder 24V) und ggf. andere Baugruppen benötigt man noch eine zweite Stromversorgung. Wenn das Fahrzeug dann unterwegs ist, sollte diese dann auch den Raspberry Pi und alle an diesen angeschalteten Baugruppen und Geräte mit versorgen können.
Um genügend Leistungsreserven zu haben, verwende ich einen 11,7V LiPo-Akku aus dem Modellbau, den ich noch rumliegen hatte. Zum Laden dieses Akkus wird dann noch ein spezieles Ladegerät benötigt.
Motor-Treiber
Für die Ansteuerung der Motoren werden noch spezielle Treiber-Module benötigt, da dies vom Raspberry Pi nicht selbst erledigt werden kann. Die Motorsteuerung legt nur fest, ob sich die Motoren vorwärts oder rückwärts drehen sollen und wie schnell. Den Rest macht der Motor-Treiber.
Da man die vier Motoren mit dem Mecanum Rädern einzeln ansteuern müssen, benötigen wir also vier dieser Treiber. Zum Glück gibt es Baugruppen mit zwei dieser Treiber, so dass zwei Baugruppen ausreichend sind.
Entschieden habe ich mich für das DollaTek Mini Stepper Motor Drive Controller Board. Diese Baugruppe verwendet einen L298N Chip, der eine doppelten H-Brücken DC-Stepper enthält.
USB Spannungsregler
Für den Raspberry Pi muss aus den 11,7V des Akkus eine Stromversorgung realisiert werden. Schließlich soll das Roboter-Auto ohne eine Verbindung zum Stromnetz durch die Gegend fahren.
1.Versuch
Der Motor-Treiber kann neben der Ansteuerung der Motoren auch 5V für weitere Baugruppen bereitstellen. Es wäre natürlich schön einfach, wenn diese 5V für den Raspberry Pi verwendet werden könnten. Also schnell mal ausprobiert und ... es funktioniert leider nicht. Der Raspberry Pi ist so Stromhungrig, dass die Spannung am 5V Ausgang des Motorreglers auf unter 4.7V zusammenbricht, was der Raspberry Pi mit einem Absturz und Neustart quitiert.
2. Versuch
Ein spezieller Spannungsreglers soll es nun richten. Der Step-Down Regler Pololu D36V28F5 macht aus 6-24V Eingangsspannung eine 5V Ausgangsspannung mit maximal 3A Stromstärke. Die 5V können auch über die GPIO-Leiste eingespeist werden, aber immer nur 1A pro Pin. Also werden mindestens 2 Pins sowohl für die 5V als auch Masse benötigt werden. Leider ist der Raspberry Pi etwas sehr empfindlich und so zeigt er bei 5V schon ein Symbol an, dass die Stromversorgung nicht ausreichend ist. Das Raspberry Pi Netzteil liefert am USB-Port 5.1V und alles darunter wird 'angemeckert'.
3.Versuch
Der nächste Spannungsregler liefert 5.1V an einem USB-A Port und das mit maximal 2.5A. Von QSKJ gibt es einen 'DC-DC 6V-24V to 5v 3A Step-down' Konverter. Dieser wird mit einem passenden Adapterkabel mit dem USB-C Port des Raspberry Pi verbunden und alles ist super.
Servomotor-Kontroller
Für die Ansteuerung der Motoren wird eine zuverlässige Quelle für ein PWM-Signal benötigt. Mit diesem Signal wird die Geschwindigkeit der einzelnen Motoren gesteuert. Für die vier Motoren benötigt man also vier unabhängige PWM-Signale.
1. Version
Eigentlich kann der Raspberry Pi PWM-Signale bereitstellen, aber er hat nur zwei Hardware-PWM-Quellen. Die alternative, Software-PWM-Quellen, ist nicht zuverlässig genug. Es kommt immer wieder zu Zeitverzögerungen beim ansteuern der einzelnen Motoren.
2. Versuch
Also muss eine externe Quelle für PWM-Signale her. Im Buch wird dafür ein Servomotor-Kontroller empfohlen, von dem wir nur das PWM-Signal erzeugen lassen. Zusätzlich haben wir so die Möglichkeit, weitere Funktionen mit Servo-Motoren auf unserem Roboter zu realisieren. Denkbar wäre z.B. eine Bewegung der Kamera nach links und rechts, oder ein Greifarm.
Ich verwende das 'Keyestudio 16 Channel Servo Driver Board with 12Bit PWM 12C Interface'. Dieses ist voll kompatiebel zum Original von Adafruit, in Deutschland aber einfacher zu bekommen.
Abstandssensor
Damit unser Roboter-Auto beim fahren in der Wohnung nicht ständig gegen Hindernisse stößt, sollte es erkennen, wenn ein Hindernis in Fahrtrichtung auftaucht. Es gibt verschiedene technische Möglichkeiten, eine Abstandsmessung zu realisieren. Ich habe mich für einen 'Time-of-Flight'-Sensor entschieden, der mit Radar-Wellen arbeitet. Dieser ist unabhängig von der Umgebungshelligkeit und arbeitet zuverlässig bei Tag und Nacht.
Ich verwende den 'Pololu VL53L1X Time-of-Flight Sensor'.
Die Motoren und der Modellbau-Akku sind auf der unteren Platine befestigt. Alle anderen Komponenten sind auf der oberen Platine befestigt. Nun müssen alle Komponenten 'nur' noch miteinander verbunden werden.
In diesem Abschnitt gehe ich auf die Verbindung der einzelnen Komponenten etwas näher ein.
Strom für alle
Xxx ...
Motoren und Motoren-Treiber
Die Verkabelung der Motoren ist keine große Aktion. Für die beiden hinteren Motoren wird der erste Motortreiber verwendet und für die beiden vorderen Motoren der Zweite. Sollte sich ein Motor in die falsche Richtung drehen, muss man die beiden Drähte am Motortreiber vertauschen.
Raspberry Pi
Für die Verkabelung aller Baugruppen mit dem Raspberry Pi ist die Belegung der GPIO-Leiste von entscheidender Bedeutung. Deshal habe ich noch einmal ein Bild dieser Leiste und der Bedeutung der einzelnen Pins eingefügt. In den folgenden Tabellen habe ich dann auch immer zwei Angaben für den Raspberry Pi angegeben: Die Funktion des zu verwendenden Pins un die Nummer auf der Leiste.
Variante 1
Als erstes werden die Motortreiber vollständig über die GPIO-Leiste des Raspberry Pi angesteuert. Dazu werden insgesamt 12 GPIO-Ports benötigt. Das PWM-Signal für die Geschwindigkeitssteuerung der Motoren wird vom Raspberry Pi bereitgestellt.
Das Bild zeigt die vollständige Verdrahtung.
Anschlüsse | Treiber 1 (Hinterräder) | Treiber 2 (Vorderräder) | |||
---|---|---|---|---|---|
Pin | Kabel-Farbe | GPIO | Raspberry Pin | GPIO | Raspberry Pin |
ENA | braun | 12 | 32 | 18 | 12 |
IN1 | rot | 16 | 36 | 27 | 13 |
IN2 | orange | 26 | 37 | 22 | 15 |
IN3 | gelb | 5 | 29 | 23 | 16 |
IN4 | grün | 6 | 31 | 24 | 18 |
ENB | blau | 20 | 38 | 21 | 15 |
Variante 2
Bei den Testfahrten zeigt sich eine mehr oder weniger große Zeitverzögerung bei der Geschwindigkeitsänderung der einzelnen Motoren. Diese ist auch unterschiedlich für die vier Motoren. Das deutet auf Probleme bei der Bereitstellung des PWM-Signals durch den Raspberry Pi hin.
Aus diesem Grund wird die Bereitstellung des PWM-Signals an eine extra Baugruppe deligiert. Verwendet wird dafür der 16-Kanal-Servo-Controller. Dieser ist eigentlich für die Ansteuerung von Servos gedacht, also kleinen Stellmotoren. Wir verwenden aber erst mal nur das PWM-Signal, dass zur Ansteuerung der Servos gedacht ist.
Das Bild zeigt die vollständige Verdrahtung.
Die GPIO-Ports des Raspberry Pi werden nur noch für die Steuerung der Drehrichtung der Motoren verwendet. So werden auch nur noch 8 Ports benötigt.
Anschlüsse | Treiber 1 (Hinterräder) | Treiber 2 (Vorderräder) | |||
---|---|---|---|---|---|
Pin | Kabel-Farbe | GPIO | Raspberry Pin | GPIO | Raspberry Pin |
IN1 | braun | 16 | 36 | 27 | 13 |
IN2 | rot | 26 | 37 | 22 | 15 |
IN3 | orange | 5 | 29 | 23 | 16 |
IN4 | gelb | 6 | 31 | 24 | 18 |
Die Geschwindigkeit wird mit den PWM-Ports des Servo-Controllers gesteuert. Der Servo-Kontroller selbst wird über den I2C-Bus des Raspberry Pi angesteuert. Den Strom für den Servo-Kontroller liefert praktischerweise einer der Motor-Treiber.
Pin | Kabel-Farbe | Kanal | Anschluss Pin |
---|---|---|---|
ENA | braun | 1 | PWM |
ENB | blau | 2 | PWM |
ENA | braun | 3 | PWM |
ENB | blau | 4 | PWM |
Variante 3
Damit des Roboter-Auto nicht bei jedem Steuerfehler gegen das nächste Hindernis stößt, soll es automatisch vor dem Hindernis anhalten. Dazu werden erst mal zwei ToF-Sensoren verwendet, die permanent den Abstand nach vorn und hinten messen. Ist der Abstand zum Hindernis kleiner als 10 cm, wird das Auto angehalten.
Die Sensoren werden über den I2C-Bus vom Raspberry Pi abgefragt. Da dieser aber immer nur einen Sensor abfragen kann, werden die Sensoren noch über einen GPIO-Port ein und ausgeschaltet.
Das Bild zeigt die vollständige Verdrahtung.
Für das Roboter-Auto verwende ich ein "RaspberryPi OS" in der 32bit-Standard-Version. Alle zusätzlich benötigte Software wird nachinstalliert.
Vorbereiten der SD Karte
Am einfachsten geht dies mit dem Raspberry Pi Imager. Im Paketmanager von Desktop-Linux den Raspberry Pi Imager installieren. Wenn er nicht in den Standard-Repositories enthalten ist findert sich bestimmt in Internet eine Quelle.
Die Micro-SC Karte in den zu verwendenden Kartenleser (eventuell mit Adapter) stecken und den Imager starten.
Neuerdings muss man als erstes das Gerät auswählen, für welches die SD karte vorbereitet werden soll. Danach noch Betriebssystem und SD Karten Leser auswählen und schon kann es losgehen. Wie es scheint wird die 64bit Version des Betriebssystems immer noch als nicht ganz fertig angesehen, deshalb habe ich nich für die 32bit Version entschieden. Manche internen SD Kartenleser von Desktops/Laptops funktionieren nicht zuverlässig zusammen mit Linux (z.B. in meinem Laptop), dann muss man einen externen Leser an den USB-Port anschließen.
An den Einstellungen ändern wir erst einmal nicht und so können wir mit 'JA' fortfahren. Es erscheint noch eine finale Afrage, ob man wirklich die alten Daten auf der SD-Karte überschreiben will.
Mit dem betätigen des 'JA'-Buttons wird das Betriebssystem auf die SD Karte geschrieben. Ist das beendet kann man die SD Karte aus dem Kartenleser nehmen und in den Raspberry Pi stecken.
Raspberry Pi OS konfigurieren
Startet man den Raspberry Pi mit der vorbereiteten SD Karte...
Steckt man ein LAN-Kabel in die Netzwerk-Buchse des Raspberry Pi, sollte sofort eine Verbindung ins Internet aufgebaut werden.
1. Schritt - Zusätzliche Software installieren
Zuerst das Raspberry OS aktualisieren ...
Braucht man gelegentlich ...
- DoubleCommander - Suchen, kopieren, verschieben, vergleichen, editieren und löschen von Dateien
- ...
2. Schritt - Verwaltung der Netzwerk-Schnittstellen auswählen
Prinzipiell bestehen mehrere Möglichkeiten, die Netzwerk-Schnittstellen zu verwalten. Vorinstalliert sind auf dem Raspberry OS drei Möglichkeiten:
- dhcpc-Daemon
- NetworkManager
- Manuelle Konfiguration
Sicher gibt es noch weitere Möglichkeiten, mit denen habe ich mich aber nicht beschäftigt. Per default verwendet das Raspberry OS den dhcpc-Daemon, um die Netzwerk-Schnittstellen zu verwalten. Die komfortable Variante ist der NetworkManager. Diese wollte ich eigentlich verwenden, habe sie aber auch mit 14 Tagen probieren nicht zum fliegen bekommen. Eine manuelle Konfiguration setzt ziehmlich viele Detailkenntnisse vorraus, solle also nur in Ausnahmefällen verwendet werden. Für die Standardaufgaben (Kabelanschluss und WLAN) verwende ich die Defaulteinstellung dhcpcd-Daemon. Nur für die geplante Steuerung des Roboter-Autos über einen eigenen HotSpot bleibt die manuelle Konfiguration übrig, da die dhcpc-Deamon-Konfiguration dafür nicht ausreicht.
3. Schritt - Predictable Netzwerk-Schnittstellen-Namen aktivieren
Standardmäßig verwendet Raspberry OS die klassischen Netzwerk-Schnittstellennamen (eth0, wlan0, wlan1). So lange es immer nur eine Netzwerk-Schnittstelle pro Typ gibt, funktioniert das auch. Hat man aber mehr als eine Schnitstelle eines Types, ist die Zuordnung der klassischen Namen zu den einzelnen Schnittstellen zufällig und ändert sich, wenn man Pech hat, mit jedem Neustart. Deshalb sollte man gleich zu Anfang auf die Verwendung der 'Predictable Interface Names' an Stelle der klassischen Schnittstellennamen wechseln. Dabei wird die eindeutige Hardware-MAC-Adresse der Schnittstelle im Namen der Schnittstelle verwendet (z.B.: eth0 ==> enx[MAC-Adresse ohne ':']). Das macht das Handling der Netwerk-Einstellungen um vieles einfacher.
Diese Konfiguration ist noch nicht bis in die Raspberry Konfiguration des Menüs gelangt und so muss man sich auf der Kommandozeile behelfen:
raspi-config
Im Konfigurationstool versteckt sich die Netzwerkkonfiguration in den 'Advanced Options'.
Dann die 'Network Interface Names' auswählen und ...
die Frage nach den 'Predictable Inerface Names' mit 'Ja' beantworten.
Nach dem bestätigen mit 'OK' sind die Namen aktiviert.
Dann die 'Network Config' auswählen und ...
überprüfen, ob der 'dhcpcd' auswählen.
Nach dem bestätigen mit 'OK' wird der dhcpc-Deamon aktiviert.
Die Erfolgsmeldung dann auch noch mit 'OK' bestätigen.
Und das Konfigurationstool mit 'Finish' beenden. Es wird dann noch gefragt, ob der Raspberry Pi neu gestartet werden soll, da diese Änderung erst nach einem Neustart wirksam wird.
Nach dem Neustart sollte alles wieder so aussehen wie davor, nur das jetzt intern Predictable Network Names verwendet werden. Aber leider noch nicht für alle Netzwerk-Schnittstellen, sondern erst mal nur für die, die über den internen USB-Bus angeschlossen sind (z.B. über eine der USB-Schnisstellen). Somit bleibt das Problem für die Schnittstellen, die auf dem Raspberry Pi fest verlötet sind, erhalten. Schlimmer noch: Wird ein zweiter WLAN-Adapter an einen USB-Port gesteckt, erhält dei interne WLAN-Schnittstelle zufällig 'wlan0' oder 'wlan1' als Namen zugeordnet.
Um die 'Predictable Inerface Names' auch für die Schnittstellen auf dem Raspberry Pi zu verwenden muss man als Administrator die Datei '/lib/systemd/network/99-default.link' in das Verzeichnis '/etc/systemd/network' kopieren. Im Verzeichnis '/etc/systemd/' sind die aktuell verwenden Konfigurationsdateien enthalten und im Verzeichnis /lib/systemd/network sind die Standard-Konfigurationsdateien, die verwendet werden, wenn in /etc nichts gefunden wird. Das kopieren kann man mit dem DoubleCommander erledigen, den man aber als Administrator starten muss. Dazu ein Terminal öffnen und mit dem foldenden Kommando den DoubleCommander starten:
sudo doublecmd &
Und das sieht dann so aus:
Jetzt kann man links ins Verzeichnis '/etc/systemd/network' und rechts ins Verzeichnis '/lib/systemd/network' navigieren. Auf der rechten Seite die Datei '99-defaulkt.link' markieren und dan mit F5 auf die linke Seite kopieren.
Kopiert wird die Datei, da eine Zeile angepasst werden muss. Dazu die Datei auf der linken Seite markieren und mit F4 im Editor öffnen. Jetzt die folgende Zeile suchen:
NamePolicy=keep kernel database onboard slot path
An diese Zeile wird am Ende noch das Profil 'mac' hinzugefügt werden. Danach sollte die Zeile so aussehen:
NamePolicy=keep kernel database onboard slot path mac
Nach der Änderung die Datei mit Strg-S speichern und schließen. Danach ist noch ein Neustart des Raspberry Pi notwendig und dann sollte dieses Problem vom Tisch sein. Überprüfen lässte es sich im Terminal mit dem Kommando
ip add
Im Ergebnis sollte auch nach wiederholtem Neustart für jedes Gerät ein konstanter Schnittstellenname angezeigt werden.
Hinweis: Diese kopierte und geänderte Konfigurationsdatei im Verzeichnis /etc/systemd wird jedesmal, wenn man raspi-config mit 'Finish' beendet, gelöscht! Also am besten raspi-config ab jetzt nur noch in dringenden Notfällen noch einmal aufrufen.
4. Schritt - Netzwerke konfigurieren
Steckt ein Netzwerkkabel im Ethernet-Port des Raspberry Pi, verbindet er sich sofort mit dem Heimnetzwerk und erhält von diesem eine IP-Adresse zugewiesen. Ist nur ein Heim-WLAN verfügbar, muss man auf das Netzwerk-Symbol gehen und ein WLAN auswählen, mit dem man sich verbinden will. Nach der Eingabe des WLAN-Passworts wird die Verbindung zum WLAN aufgebaut und der Raspberry Pi bekommt eine IP-Adresse zugewiesen.
Damit wir uns einfach über das Heimnetzwerk mit dem Raspberry Pi verbinden können, ist eine feste IP-Adressen sowohl für den LAN-Port als auch für alle WLAN von großem Vorteil. Eine zufällig vom Heimnetzwerk vergebene IP-Adresse ist im Netzwerk nur schwer herauszubekommen. Die aktuellen IP-Adressen kann man sich in der Konsole mit dem folgenden Befehl anzeigen lassen:
ip add
Alternativ kann man die Maus auf das Netzwerk-Symbol schieben, dann erscheint ein Tooltip mit den Adressen.
Um den internen Netzwerk-Schnittstellen mit einer festen IP-Adresse zu versorgen, muss die Datei '/etc/dhcpcd.conf' als Administrator angepasst werden. Wieder den DoubleCommander als Administrator starten und zur Datei '/etc/dhcpcd.conf' navigieren. Mit F4 im Editor öffnen. Bei den Ergänzungen ist die Reihenfolge wichtig!
Als erstes müssen wir vor allen anderen Änderungen festlegen, für welche Netzwerkschnittstellen der dhcpcd-Dienst auf gar keinen Fall verwendet werden soll. Für den Hotspot zum Steuern des Roboter-Autos soll der USB-WLAN-Adapter verwendet werden. Dessen Schnittstellennamen erhält man im Terminal mit dem Kommando 'ip add'. Die MAC-Adressen der internen WLAN-Schnittstelle beginnt mit 'wlxdca632...', also 'wlx' und dem Hersteller-Hardware-Code der Raspberry Trading Ltd. Und so ist die andere 'wlx...' Adresse die gesuchte.
Vor der ersten Zeile, die mit 'interface' anfängt, fügen wir die folgenden Zeilen ein.
# Ignore the following interfaces
denyinterfaces wlx08beac15a3xx
Der Schnittstellenname muss durch den aus dem 'ip app' Kommando ersetzt werden.
Und jetzt die festen IP-Adressen einrichten. Als erstes die für den LAN-Port:
# First LAN port
interface eth0
static ip_address=192.168.1.84/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
interface enxdca63250b2xx
static ip_address=192.168.1.84/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
Es ist immer eine Einstellung für den klassischen Schnittstellennamen und als zweites für den predictive Schnittstellennamen. Der 'enxdca632...' Namen muss wieder durch den aus dem 'ip app' Kommando ersetzt werden.
Und als zweites die für den internen WLAN-Port:
# First WLAN port
interface wlan0
static ip_address=192.168.1.85/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
interface wlxdca63250b2xx
static ip_address=192.168.1.85/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
Der 'wlxdca632...' Namen muss wieder durch den aus dem 'ip app' Kommando ersetzt werden.
Dann wieder mit 'Strg-S' die Datei speichern und dann schließen. Nach einem Neustart des Raspberry Pi sollten die festen IP-Adressen verwendet werden. Überprüfen kann man das mit dem Befehl
ip add
Das Ergebnis sollte ungefähr so aussehen:
Raspberry Pi Display Konfigurieren
Als ersten einmal feststellen, welche Auflösungen der Monitor im Betriebsmodus DMT so unterstützt:
/usr/bin/tvservice -m DMT
Und dann noch festellen, was den die aktuelle Auflösung ist:
/usr/bin/tvservice -s
Die nächsten Änderungen sind nicht über einen Eintrag im Menü möglich. Deshalb ein Terminal-Fenster öffnen und als Administrator die Datei /boot/config.txt anpassen. Hat man den DoubleCommander installiert, kann man diesen im Terminal-Fenster mit dem folgenden Befehl mit Administrator-Rechten als eigenen Prozess starten:
sudo doublecmd &
Dann navigiert man zum Verzeichnis 'boot' und selektiert die Datei 'config.txt'. Mit der Funktionstaste 'F4' öffnet man die Datei zum Editieren.
# Automatically load overlays for detected DSI displays
display_auto_detect=1
# Aktivieren des DRM VC4 V3D Display Treiber des Kernels
dtoverlay=vc4-kms-v3d
# HDMI auch ohne Monitor in Betrieb nehmen
hdmi_force_hotplug=1
# Composite video output abschalten, wenn kein HDMI Monitor gefunden wird
enable_tvout=0
Ein Teil der Einstellungen sind sicher schon gesetzt. Wichtig ist die Einstellung 'hdmi_force_hotplug' auf 1 zu setzen. Dies bewirkt, dass auch wenn man keinen Monitor an den Raspberry Pi angeschlossen hat, trotzden der Display Treiber initialisiert wird. Dieser wird benötigt, wenn man sich mit dem Laptop über das Heimnetz mit dem Raspberry Pi verbinden will und eine graphische Oberflächen nutzen möchte.
Als nächstes kann dann noch der Betriebs-Modus, die Audio-Ausgabe und die Auflösung für die einzelnen HDMI Ports festgelegt werden. Der Filter '[HDMI:0]' funktioniert natürlich nur bei Raspberry Pi mit mehr als einem HDMI-Port. Lässt man ihn weg, gelten die Angaben pauschal für alle HDMI-Ports.
[HDMI:0] # Raspberry Pi 4 only
# DMT-Betriebsmodus aktivieren
hdmi_group=2
# Ausgabemodus (DVI/HDMI aka ohne/mit Sound)
# hdmi_drive=2
# Auflösung: 640x350 / 60 Hz
# hdmi_mode=1
# Auflösung: 1024x768 / 60 Hz
hdmi_mode=16
# Auflösung: 1280x720 / 60 Hz (720p)
# hdmi_mode=85
# Auflösung: 1280x768 / 60 Hz
# hdmi_mode=23
# Auflösung: 1440x900 / 60 Hz
# hdmi_mode=47
# Auflösung: 1920x1080 / 60 Hz (1080p)
# hdmi_mode=82
[HDMI:1] # Raspberry Pi 4 only
# DMT-Betriebsmodus aktivieren
hdmi_group=2
# Ausgabemodus (DVI/HDMI aka ohne/mit Sound)
# hdmi_drive=2
# Auflösung: 1024x768 / 60 Hz
hdmi_mode=16
Die gewählte Auflösung sollte zur empfohlenen Auflösung des verwendeten Monitors passen. Nach der Änderung ist wieder ein Neustart des Raspberry Pi notwendig.
Verbindung zwischen Raspberry Pi und Laptop
Vom Raspberry OS wird der RealVNC Server für den Zugriff aus der Ferne vorgesehen. Mehrere Versuche, eine andere Software zu verwenden, sind bisher gescheitert. Eigentlich ist VNC ein offenes Protokoll, aber Real-Software ist ein kommerzielles Produkt.
Doch auch hier ist nicht alles das gelbe vom Ei. Eigentlich ist unter Linux Remmina das Tool der Wahl für den Fernzugriff, aber die Verbindung zum RealVNC Server eines aktuelle Raspberry OS gelingt nich ohne Anpassung der Konfiguration. Was auf Anhieb funktioniert, ist der RealVNC Viewer, den es für die verschiedenen Plattformen gibt.
Die erste Verbindung zwischen dem Player und dem Server erfolgt mit einer Auflösung von 640x350 Pixel. Ist auf einem modernen Laptop nicht so sehr viel und auch der Raspberry Pi Desktop ist eigentlich eine größere Auflösung gewohnt.
Eine höhere Auflösung ist aber nicht ganz trivial zu erreichen. Die Einstellungen müssen zusammenpassen, sonst fällt die Verbindung auf eine Auflösung von 640x350 Pixel zurück.
1. Schritt - RealVNC Server Zugang konfigurieren
Mit dem Betätigen des RealVNC Symbols in der Taskleiste öffnet sich das Nutzer-Interface des Servers. Rechts oben gibt es einen Button hinter dem sich ein Menü mit weiteren Funktionen befindet, unter anderem den Optionen. Im Optionen-Dialog wählt man als erstes die Seite Sicherheit.
Mit dem Wechsel auf Version 7.0.x des RealVNCServers wurde das verwendete Anmeldeverfahren noch 'sichere' gemacht und damit der Zugang für Tools wie Remmina gesperrt. Um den Zugang wieder zu ermöglichen, muss die Einstellung für 'Verschlüsselung' auf 'Vorzugsweise aktiviert' gesetzt werden und die Einstellung 'Authentifizierung' auf 'VNC-Kennwort'. Dann wechselt man zur Seite 'Benutzer und Berechtigungen'.
Hier muss für den 'Standardbenutzer (user)' ein Kennwort gesetzt werden und, ganz wichtig, die Checkbox 'Verbindung von älteren VNC Viewer-Benutzern zulassen' muss gesetzt werden. Mit dem Button 'Übernehmen' werden die vorgenommenen Änderungen gespeichert.
2. Schritt - Auflösung konfigurieren
Damit beim Zugriff vom Desktop auf den Raspberry Pi eine höhere Auflösung verwendet werden kann, muss man diese dem RealVNCServer erst einmal bekanntgeben. Dazu wechselt man in den Optionen auf die Seite 'Experte'.
Hier sucht man sich den Parameter 'RandR' und setzt als Wert eine Liste der möglichen Auflösungen. Das Bild zeigt die Liste mit mit vier gängigen Auflösungen. Beim Verbinden versucht der RealVNCServer zuerst mit der ersten Auflösung zu verbinden und wenn dies nicht klappt mit der nächsten und so weiter. Jetzt den Optionen-Dialog mit der 'OK'-Taste beenden.
Damit dann auch wirklich die gewünschte Auflösung kommt, benötigt man noch eine Datei. Dazu am besten der DoubleCommander starten (nicht als Administrator!) und in das Verzeichnis '/home/pi/.config/autostart' wechseln. Dort dann mit dem Menü hinter der rechten Maustaste eine neue Datei mit dem Namen 'xrandr.desktop' erzeugen. Diese Datei dann mit F4 zum Editieren öffnen.
[Desktop Entry]
Name=Resolution Autoset
Comment=Automatically set resolution
Exec=bash -c "xrandr -s 1024x768"
Terminal=false
Type=Application
Datei schließen und den Raspberry Pi neu starten. Dann ist alles bereit für den ersten Zugriff vom Desktop auf den Raspberry Pi.
3. Schritt - Remmina verwenden
Dazu als erstes Remmina installieren. Dazu noch die Plugins 'remmina-plugins-rdp' und 'remmina-plugins-vnc'.
Wenn man Remmina zum ersten mal startet, ist die Liste der Verbindungen noch leer. Mit dem '+'-Button in der linken oberen Ecke kann man ein neues Verbindungs-Profil hinzufügen.
Als Praktisch hat sich herausgestellt, wenn man die verschiedenen Verbindungen in Gruppen zusammenfasst. Ich definiere für jeden Raspberry Pi, den ich habe, eine Gruppen. Der Name beschreibt die Anwendung die auf dem Raspberry Pi läuft und Bezeichnung ist der Port, über den zugegriffen wird (Ethernet, WLAN).
Rechts oben findet sich auch noch ein Button, mit dem zwischen einer gruppierten und einer Listenansicht umschalten.
Mit einem Doppelklick auf den entsprechenden Eintrag wird die Verbindung aufgebaut.
Sieht man die folgende Fehlermeldung, hat die Konfiguration der Security des RealVNCServer nich geklappt und muss noch einmal überprüft werden.
4. Schritt - Alternative: RealVNC Viewer verwenden
Alternativ kann für die Verbindung vom Desktop zum Raspberry Pi auch der von RealVNC angebotene Viewer verwendet werden. Dies ist auch die empfohlene Software, wenn man unbedingt mit einem Windows-Desktop arbeiten will.
Herunterladen kann man sich die zu seinem Desktop-Betriebssystem passende Version von der Seite des Herstellers RealVNC Download.
Die Bedienung ist simpel. RealVNC Viewer starten und in der Eingabezeile für die Adresse die IP-Adresse des Raspberry Pi eingeben. Mit ENTER wird die Verbindung zum Raspberry Pi aufgebaut.
Wurde einmal erfolgreich eine Verbindung zum Raspberry Pi aufgebaut, merkt sich der RealVNC Viewer die IP-Adresse und man kann mit einem einfachen Doppel-Klick auf die Grafik die Verbindung erneut aufbauen.
Dateiaustausch zwische Raspberry Pi und Laptop
Es kommt doch hin und wieder vor, dass man eine Datei vom Raspberry Pi auf dem Laptop benötigt bzw. auf dem Laptop eine Datei vorhanden ist, die auf dem Raspberry Pi gebraucht wird. Von den verschiedenen Möglichkeiten habe ich mich für den Netzwerkspeicher (NAS) entschieden.
Als Internet-Router fungiert bei mir im Keller eine FRITZ!Box. Diese kann auch als 'NAS' verwendet werden. Da die FRITZ!Box intern nur relativ wenig Speicher zur Verfügung stellt, habe ich einen Mini-USB-Stick 128 GB in die USB-Buchse gesteckt. Dieser NAS ist für alle Computer im Netzwerk erreichbar, so auch vom Raspberry Pi.
Damit man das NAS immer zur Verfügung hat, sollte man ihn schon beim booten in das Dateisystem einbinden. Dazu als Administrator ein Verzeichnis /mnt/nas anlegen und Zugriffsrechte für alle setzen.
cd /
sudo mkdir mnt
sudo chmod 777 mnt
cd mnt
sudo mkdir nas
sudo chmod 777 nas
Jetzt fehlt nur noch der Eintrag zu mounten des NAS. Dazu öffnet man die Datei /etc/fstab und fügt am Ende die folgenden Zeilen hinzu:
#
# Fritz!Box NAS
//192.168.1.1/fritz.nas/'usbname' /mnt/nas cifs username='nasuser',password='naspasswort',uid=1000,gid=1000,vers=3.0,nolinux,noserverino 0 0
Die Platzhalter 'usbname', 'nasuser' und 'naspassword' müsssen dabei durch die der lokalen FRITZ!Box ersetzt werden.
Die Verwendung von Mecanum-Rädern soll die zusätzlichen Mechanik für eine Lenkung einsparen. Trotzdem kann man mit diesen Rädern alle gewünschten Lenkmanöver durchführen. Zusätzlich stehen noch einige sehr spezielle Manöver zur Verfügung:
- Seitliches fahren nach Links und Rechts
- Drehen um die eigene Achse nach Links und Rechts
- Gleichzeitiges fahren nach Vorn und Links sowie nach Vorn und Rechts
- Gleichzeitiges fahren nach Hinten und Links sowie nach Hinten und Rechts
Wo viel Licht ist, ist natürlich auch viel Schatten.
Jedes der vier Räder muss einen eigenen Motor haben und jeder Motor benötigt eine eigene Steuerung. Das macht die Programmierung etwas aufwendigen.
Ein weiteres Problem zeigt sich, wenn man das Roboter-Auto dann testet. Steuert man alle vier Motoren mit der gleichen Spannung und der gleichen Steuerfrequenz an, fährt es selten gerade aus. Dies liegt an der unterschiedlichen Qualität der sehr, sehr, preiswerten Motoren, die verbaut sind. Diese ungleichheiten können sicher durch leicht abweichende Steuerfrequenzen ausgeglichen werden. Die passenden Werte zu ermitteln, ist aber etwas mühselig.
Zusätzliche Python 3 Module
Xxx.
sudo pip3 install readchar
sudo pip3 install Adafruit_PCA9685
sudo pip3 install vl53l1x
Dabei werden ggf. noch weitere Module installiert, die für das Modul zwingend benötigt werden.
Steuerung auf der Kommandozeile
Raspberry Pi Sense HAT
Um die Familie abzuholen, muss das Roboter-Auto auch optisch etwas hermachen, also 'bunt leuchten und blinken und Töne von sich geben'. Da reichen die kleinen LED auf den einzelnen Baugruppen nicht aus. Diese sind außerdem fast alle rot und nur die grüne SD-Karten-Zugriffs-LED des Raspberry Pi blinken hin und wieder etwas.
Da bietet sich der Raspberry Pi Sense HAT an, der bei Gelegenheit sowieso zur Anwendung kommen soll. Neben den Sensoren hat dieser auch noch eine 8x8 RGB-LED-Matrix und einen Joy-Stick.
Um den Sense HAT aufstecken zu können, müssen die GPIO-Anschlüsse des Raspberry Pi frei sein. Da diese aber mit der Verdahtung der Baugruppen belegt sind, benötigen wir eine andere Möglichkeit, um diese anzuschließen. Dazu bietet sich der Port Doubler von JOY-IT an, der die GPIO-Anschlüsse gleich vier mal zur Verfügung stellt. Eine Leiste ist waagerecht ausgefüht, was für unsere Anforderung sehr praktisch ist. Damit wird die Höhe des Roboter-Autos begrenzt und es ist Platz für weitere Baugruppen.
Den Port Doubler stecken wir auf den Raspberry Pi (ggf. mit einer Verlängerung für die Anschlüsse) und darauf dann den Sense HAT.
Nach dem Einschalten des Raspberry Pi kann es passieren, dass die LED-Matrix dauerhaft einen 'Regenbogen' anzeigt. Dies ist ein sicheres Zeichen dafür, dass im Betriebssystem das Modul für die Ansteuerung des Sense HAT noch nicht aktiviert ist. Dazu muss man wieder des DoubleCommander als Administrator starten und die Konfigurationsdatei '/boot/config.txt' öffnen. Falls die folgende Zeilen in der Datei noch nicht existieren, fügt man sie am Ende hinzu:
# ==========================================================
# Configuration Sense HAT
# ==========================================================
dtoverlay=rpi-sense
Nach dem Speichern der Datei muss der Rasberry Pi neu gestartet werden. Gehen jetzt nach dem Start die LED wieder aus, ist erst mal alles in Ordnung.
- Yyyy
- ...
Xxxx
Zzz
Xxx.
/boot/config.txt
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_ct 1024 600 60 6 0 0 0
dtoverlay=ads7846,cs=1
hdmi_drive=1
hdmi_force_hotplug=1
Bis jetzt funktioniert der Zugriff auf das Web-Interface immer über das heimische WLAN. Steht dieses WLAN aber nicht zur Verfügung, z.B. in fremden Räumen oder auf einer Messe, ist die Steuerung nicht mehr möglich. Um dieses Problem soll das Roboter-Auto sein eigenes WLAN, einen sogenannten Access Point, bereitstellen.
Zusätzliche Hardware
Um einen Access Point bereitzustellen, benötigt man einen zweiten WiFi-Netzwerk-Adapter, da der auf dem Raspberry Pi vorhandene WiFi-Netzwerk-Adapter ja schon für den zugriff auf das heimische WLAN verwendet wird. Die einfachste Variante ist, einen WiFi-Netzwerk-Adapter in einen der USB-Ports des Raspberry Pi zu stecken. Soweit zumindest die Theorie.
In der Praxis lauern dann doch einige Fallstricke, die mich jetzt schon einige Abende beschäftigt haben.
Als erstes muss man sich einen USB-WiFi-Adapter besorgen, der von Rasperry OS möglichts gut unterstützt wird. Zweite Anforderung ist, dass der Adapter den sogenannten 'AP Mode' beherrscht, also als Access Point arbeiten kann. Dabei gibt es wieder zwei Varianten: die Hardware kann den AP Mode nicht unterstützen oder der in Raspberry Pi enthaltene Treiber kann den AP Mode nicht unterstützen. Für die Auswahl gibt es im Internet eine Support-Seite, die kompatible Adapter auflistet.
Ich habe mich für einen EDIMAX N150 WiFi 4 Nano USB Adapter entschieden, da dieser schön klein ist und angeblich gut unterstützt wird. Was ich nicht beachtet habe, dass es zwei Versionen dieses Adapters gibt. Version 1 wir von Raspberry OS sehr gut unterstützt, gibt es aber nur noch als Gebrauchtgerät. Neu gibt es nur noch Version 2. Dieser Adapter hat einen neuen WiFi-Chip bekommen und bei diesem hakt es noch mächtig mit der Unterstützung durch Raspberry OS.
Exkurs: EDIMAX N150 V2 zum fliegen bekommen
Dieser Abschnitt ist nur notwendig, wenn V2 des USB Adapters verwendet wird. Es wird ein Kernel-Modul erstellt und in das System eingebunden. Hilfreich sind diese Tips eventuell, wenn ein anderer USB Adapter verwendet werden soll, für den ein Treiber vom Hersteller separat bereitgestellt wird.
Der im Raspberry OS enthaltene Treiber (Stand Ende 2023) soll eigentlich den USB Adapter V2 unterstützen. Meine Tests führten aber bisher zu keinem Erfolg. Eine Support-Antwort von EDIMAX verweist auf einen externen Treiber. Dieser soll mittlerweile in den Linux-Kernel gewandert sein, aber wie es scheint nicht in Raspberry OS Kernel. Ich verwende einen Fork dieses Treibers, der wie es scheint besser gepflegt ist und sicher den AP Mode unterstützt.
Das Raspberry OS gibt es ja nun seit einiger Zeit neben der 32bit-Version auch in einer 64bit-Version, wobei die 64bit-Version noch als experimentell gekennzeichnet wird. Ich verwende derzeit noch die 32bit-Version, für die auch diese Anleitung geschrieben ist.
Seit einiger Zeit verwendet aber auch die 32bit-Version des Raspberry OS als Standard einen 64bit-Kernel. Das führt dann beim Erzeugen des Kernel-Moduls zu unerwarteten Problemen. Mann kann aber das Raspberry OS so konfigurieren, dass es diesen 'Unsinn' bleiben lassen soll.
Um herauszufinden, ob ein 64bit-Kernel verwendete wird, einfach eine Konsole öffnen und folgendes Kommando eingeben:
uname -a
Steht in der Antwort des Kommandos irgend etwas mit arm64, dann werkelt ein 64bit-Kernel. Dann einfach die Datei '/boot/config.txt' öffnen und ganz oben die folgenden Zeilen einfügen:
# Prevent the usage of the 64bit kernel for the 32bit userland
arm_64bit=0
Nach einem Neustart des Raspberry OS sollte das gleiche Kommando in der Antwort etwas mit 'arm7l' stehen haben.
Nun kann es endlich mit dem erzeugen des Kernel-Modules losgehen. Eine Konsole öffnen und folgende Kommandos abarbeiten:
sudo apt-get install bc build-essential
sudo apt-get install linux-headers
mkdir Temp
cd Temp
git clone https://github.com/ivanovborislav/rtl8188eu.git
cd rtl8188eu
make
sudo make install
Das erste Kommando installiert die benötigten Tools um Kernel-Module zu erzeugen. Danach folgt die Installation der Header-Dateien der aktuellen Kernel-Version. Ist noch kein temporäres Verzeichnis vorhanden, wird dieses erzeugt und dann betreten. Jetzt die Quellen des Moduls herunterladen und in das neue Verzeichnis wechseln. Und jetzt wird das Modul erzeugt und dann installiert.
Es kann natürlich immer irgend etwas unerwartetes passieren. Hier mal die Ereignisse die bei mir aufgetreten sind:
-
Beim Aufruf von 'make' wird das Erzeugen mit einer Fehlermeldung abgebrochen, die den Text 'Verzeichnis build nicht vorhanden'.
Dafür kann es zwei Ursachen geben:
- Es sind die Kernel-Header für den aktuellen Kernel nicht installiert. Also die Paketverwaltung befragen.
- Aktuell wird ein 64bit-Kernel auf einem 32bit Raspberry OS ausgeführt. Hier hilft die zwangsweise Abschaltung des 64bit-Kernels.
- ...
Jetzt kann man probeweise versuchen, das neu erzeuget Kernel-Modul zu laden.
sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/wireless/8188eu.ko rtw_ips_mode=1 rtw_drv_log_level=4 rtw_power_mgnt=2 rtw_led_ctr=1
Das Ergebnis dieses Aufrufes sagt uns, ob es geklappt hat. An sonnsten beginnt die Suchen nach den Ursachen.
Bevor ein Neustart das neue Kernel-Modul automatisch laden soll, müssen wir noch das alte Kernel-Modul für diesen USB Adapter deaktivieren. Dazu öffnet man als Administrator die Datei '/etc/modprobe.d/blacklist-rtl8xxxu.conf' und ergänzt die folgenden Zeile:
blacklist r8188eu
Nach dem Neustart des Raspberry OS soll das Kommando
journalctl -xe NM_DEVICE=wlan1
ungefähr eine solche Ausschrift erzeugen:
Einrichten des Access Points
Wie schon erwähnt, ist der NetzwerkManager nicht so das Gelbe vom Ei. Also verwenden wir jetzt zum Einrichten des Access Points die händische Methode.
Da verschiedene Konfigurationsdateien angepasst werden müssen, also wieder als Administrator den DoubleCommander starten. Die erste anzupassende Datei ist '/etc/network/interfaces'. Hier ergänzt man einen Eintrag für den USB-WLAN-Adapter, der die Hardware für den Access Point sein soll.
# USB WLAN stick (EDIMAX)
# Raspberry Pi access point
auto wlx08beac15a3yy
iface wlx08beac15a3yy inet static
address 192.168.2.1/24
# gateway 192.168.1.1
up /sbin/iptables -A POSTROUTING -t nat -o wlxdca63250b2xx -j MASQUERADE
down /sbin/iptables -D POSTROUTING -t nat -o wlxdca63250b2xx -j MASQUERADE
Für den Access Point verwenden wir IP-Adressen aus einem separatem Subnetz (192.168.2.x). Der die erste IP-Adresse des Subnetzes verwendet man für den Access Point. Mit den 'iptables'-Zeilen werden die Internet-Anfragen, die von Nutzern des Access Point kommen, an die interne WLAN Schnittstelle des Raspberry Pi weitergeleitet.
Standardmäßig leitet das Raspberry OS aus Sichrheitsgründen nicht die IP-Anfragen von einer Netzwerkschnittstelle zur anderen. Dazu muss man es erst überreden. Das macht man in der Datei '/etc/sysctl.conf'. Es ist genau eine Zeile zu ändern:
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
Das Doppelkreuz am Anfang der Zeile wird einfach entfernt. Dann wieder mit Strg-S speichern und schließen.
Für den Raspberry Pi Access Point kann man noch einen sprechenden Namen festlegen. In der Datei '/etc/hosts' wird dieser Name eingetragen:
192.168.2.1 RobotCarAI
Damit der Access Point mit einer minimalen Funktionalität funktioniert, auch wenn keine Verbindung zum Internet besteht, konfiguriert man noch einen eigenen DHCP- und Nameserver. Das Programm 'Dnsmasq' stellt diese Funktionalität bereit. Für die Konfiguration ändert man die Datei '/etc/dnsmasq.conf'.
# RobotCarAI access point configuration
domain-needed
bogus-priv
# USB-Wifi adapter
interface=wlx08beac15a3yy
dhcp-range=192.168.2.100,192.168.2.199,24h
local=/robotcarai/
domain=robotcarai
expand-hosts
In der Zeile 'interface=' muss der Schnittstellennamen des USB-WLAN-Adapters eingetragen werden.
Und dann fehlt noch die Funktionalität für den eigentlichen Access Point. Diese wird durch das Paket 'hostapd' bereitgestellt. Für die Konfiguration dieses Dienstes startet man wieder des DoubleCommand als Administrator und erzeugt die Datei '/etc/hostapd.conf'. Die minimale Konfiguration des Access Point für das Roboter-Auto sieht wie folgt aus:
# USB Wifi adapter
interface=wlx08beac15a3yy
driver=nl80211
ssid=RobotCarAI
wpa=2
wpa_passphrase=TopSecret
wpa_key_mgmt=WPA-PSK
hw_mode=g
channel=6
country_code=DE
Angepasst werden muss hier der Schnittstellenname in der Zeile 'interface=' und das Passwort in der Zeile 'wpa_passphrase='.
Damit beim Start des hostapd-Dienstes auch genau diese Konfiguration verwendet wird, muss man noch die Konfigurationsdatei in die Datei '/etc/defaults/hostapd' eintragen. Diese sollte schon existieren und kann mit dem DoubleCommander als Administrator geändert werden. Am Ende der Datei ergänzt man die folgenden Zeilen:
#
# Configuration file for RobotCarAI access point
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Damit ist die Konfiguration abgeschlossen und nach einem Neustart des Raspberry Pi sollte der Access Point zur verfügung stehen. Zum Test verbindet man sich mit dem WLAN 'RobotCarAI'. Nach der Eingabe des Passworts ist der Zugriff auf den Rapberry Pi freigegeben.
Um auf das Web-Interface des Roboter-Autos zuzugreigen öffnet man einen Browser und trägt als Adresse 'RobotCarAI:5000'. Damit sollte sich die Steuerung des Roboter-Auto öffnen.
Nachdem ich zum Geburtstag einen KI-USB-Stick von Google bekommen habe, können jetzt die Experimente mit der 'Künstlichen Intelligenz' für das Roboter-Auto beginnen.
Zzz
Xxx.
/boot/config.txt
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_ct 1024 600 60 6 0 0 0
dtoverlay=ads7846,cs=1
hdmi_drive=1
hdmi_force_hotplug=1