Roboter

Aus m-wiki
Version vom 19. Juli 2022, 01:40 Uhr von Snoopy78 (Diskussion | Beiträge) (→‎Node-Red als Kontrollsoftware)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Einführung

Ein Roboter kann stationär sein oder sich bewegen. Wenn er sich bewegt, kann er entweder durch kabel an einen Ort gebunden sein oder er ist komplett unabhängig, wenn er über Funk gesteuert wird und mittels einer Powerbank oder eines Batteriepacks gespiesen wird. Solche Systeme sind zwar für eine gewisse Zeit autonom (z.B. Rasenmäher), doch müssen sie entsprechend ihrer Leistung immer wieder zurück an eine Ladestation, da unabhängige Systeme wie Solarzellen meist nur bei Laborsystemen wie etwa der Marsdrohne Ingenuity zum Einsatz kommen. Für die Bewegung werden verschiedene Fortbewegungsarten eingesetzt, welche entweder der Natur entstammen oder es sind Räderkonstrukte. Die Fortbewegungsart ist hierbei dem gewünschten Einsatzzweck angepasst, wobei der Gang des Menschen auf zwei Beinen, durch den entsprechend hohen Schwerpunkt, am schwierigsten nachzubauen ist. Für einfache Aufbauten werden meist zwei oder drei Räder eingesetzt, wobei hier vielfach die beiden Haupträder mit einem eigenen Motor angesteuert werden, so dass alle Richtungen relativ einfach implementiert werden können und keine komplizierte Lenkung eingebaut werden muss. Auf Grund der unterschiedlichen Motorgeschwindigkeiten muss aber die Abweichung von der Idealbahn entsprechend korrigiert werden, damit sich der Roboter nicht auf einer (grossen) Kreisbahn bewegt.

Hardware

Neben einem Chassis, Rädern, Motoren und Batterien und den entsprechenden Teilen zu deren Montage braucht es natürlich noch einen Print mit der CPU und dem Programmspeicher. Weitere Teile wie Sensoren zur eigenständigen Orientierung oder Rückmeldung an die Steuerzentrale sind optional, doch ein Gewinn, wobei deren Verarbeitung natürlich entsprechende Programmierung und Rechenzeit braucht.

Elektronik

Heutige Versuche, autonom fahrende Autos zu entwickeln zeigen, dass eine Elektronik, welche dem menschlichen Gehirn ebenbürdig ist, weder einfach zu entwickeln, noch einfach zu programmieren ist. Dies ist vor allem auf die notwendige Verarbeitung der Bilddaten zurückzuführen, welche eine grosse Datenmenge erzeugen und diverse Objekte enthalten, welche das System decodieren muss. Ist dies nicht notwendig, kann auf eine leistungsfähige Elektronik verzichtet werden, da dann nur Steuerbefehle verarbeitet und Sensoren abgefragt werden müssen. Diese Signale generieren nur geringe Datenströme und können dazu in vergleichsweise langer Abfragezeit abgearbeitet werden. Natürlich sinkt die Abfragezeit mit Erhöhung der Geschwindigkeit, da dann die Sensordaten häufiger abgefragt werden müssen, um eine Kollision vermeiden zu können. Normalerweise greift in solchen Szenarien aber der steuernde Mensch ein.

Für ein solches Szenario genügt daher ein kostengünstiger Einplatinen-Computer wie ein Arduino oder Raspberry Pi. Für die Ansteuerung der Motoren muss aber eine zusätzliche Elektronik eingesetzt werden, da solche Computer nicht für die notwendigen Leistungen ausgelegt sind. Solche Steuerplatinen können entweder als ganzes gekauft oder als günstiger Bausatz selbst erstellt werden.

Antrieb

Für den Antrieb kann entweder ein Motor für den Antrieb einer Achse und ein weiterer für die Lenkung oder je ein Motor pro Rad verbaut werden. Das erste Konzept ermöglicht bei korrekter Bauweise, dass das Gefährt automatisch geradeaus fährt, wobei die zweite Konstruktion eine Ansteuerung ohne Lenkung ermöglicht, wobei aber eine entsprechende Lenkkorrektion durch unterschiedliche Radgeschwindigkeiten berücksichtigt werden muss.

Für die Ansteuerung der Motoren kann der oben erwähnte Bausatz oder ein mitgeliefertes Bauteil verwendet werden. Dieses wird dann über die GPIO des Prozessors angesteuert. Wichtig ist hier, dass man die Anschlussspannungen beachtet, damit nicht eine Seite wegen zu hoher Spannung überlastet wird und das Zeitliche segnet. Für die Ansteuerung wird normalerweise ein Pin verwendet, um die Ansteuerung freizuschalten (Enable) und zwei, welche gegenversetzt (Low, High) die Richtung (vorwärts, rückwärts) steuern. Entsprechend dreht sich das Gefährt um die eine oder andere Achse oder fährt vorwärts oder rückwärts. Damit im Leerlauf kein Strom verbraucht wird, muss der Enable-Pin deaktiviert werden. Für ein Beispiel siehe den entsprechenden Abschnitt beim Raspi.

Sensoren

Sensoren sind bei einer Fremdsteuerung optional, doch bei zunehmender Automatisierung entsprechend notwendiger, damit der Roboter die gesteckten Ziele erreichen kann.

  • Vielfach werden analoge Distanzsensoren eingesetzt, damit der Roboter seine Position gegenüber Hindernissen einschätzen kann und erkennt, ob er sich darauf zubewegt und auch, ob diese sich selber bewegen.
  • Kameras werden meist nicht für den Roboter selbst eingesetzt, sondern nur, um deren Bilder zu übermitteln.
  • Radsensoren können helfen, um Blockaden der Räder zu erkennen.
  • Drehgeber an den Achsen helfen bei der Geschwindigkeitsbestimmung des Geräts, wenn dies gewünscht ist.
  • Helligkeitssensoren können eingesetzt werden, um den Roboter zu aktivieren oder deaktivieren. Dazu können dadurch zusätzliche Hilsmittel wie eine Infrarotkamera geschaltet werden.
  • Die Neigung kann je nach Sensor in allen 3 Richtungsachsen bestimmt werden.

Steuerung

Für die Steuerung eines autonomen Roboters werden entweder fix einprogrammierte Schaltungen verwendet oder es wird eine Funkfernsteurung eingesetzt, damit der Roboter nicht durch Kabel begrenzt wird. Die Remote-Steuerung kann durch verschiedene Technologien umgesetzt werden, wobei Funk meist die flexibelste Lösung darstellt und nicht auf Sichtkontakt beschränkt ist. Je nach eingesetztem Computer besitzt dieser ein eingebautes Funkmodul und wenn nicht, kann dieses meist kostengünstig nachgerüstet werden, wobei beachtet werden muss, ob für diese Platform ein geeigneter Treiber zur Verfügung steht.

Joystick mit Kabel

Diese Variante ist die einfachste, da man nur einen vorgefertigten Joystick oder im einfacheren Fall nur 4 Taster braucht für die entsprechende Richtung. Naben den 4 Tastern gibt es auch digitale oder analoge Joysticks, welche man einsetzen kann. Ein Beispiel zur Einbindung eines analogen Joysticks findet sich auf der deutschen Raspberry Pi-Seite. Für eine einfach Variante verbindet man einfach die vier Taster mit 4 freien Eingängen des Raspi und kann so jeweils die Richtung festlegen (die Motoren drehen entsprechend des Taster-Eingangs). Da damit auch gegenteilige Signale (vorwärts und rückwärts) möglich sind, sollte man dies in der Logik berücksichtigen und dann entweder das zweite Signal ignorieren oder das Gerät stoppen.

Steuerung über Webinterface

In diesem Fall werden die Befehle dem Webserver (etwa Node-Red) übermittelt und dieser führt die Befehle aus. Dies ermöglicht eine Remote-Kontrolle, bei welcher die Funksteuerung "implizit" gegeben ist, dadurch dass der Webserver im (lokalen) Netz erreichbar ist.

Steuerung über Fernbedienung

Hier gibt es fertige Steuerungen vom Pi-Shop auf IR-Basis, welche auf einen entsprechenden IR-Empfänger abgestimmt sind. Dazu gibt es Beispielprogramme etwa von Adafruit, welche eine Decodierung und entsprechende Reaktion erlauben oder man verwendet etwa 433 MHz Sender/Empfänger.

Chassis

Um alle Komponenten zusammenzubauen ist ein Chassis notwendig. Dieses kann je nach Anforderung aus Metall oder Kunststoff sein und selbst aus Teilen zusammengesetzt werden. Für leichte Konstruktionen oder Prototypen können je nachdem schon Legos genügen. Je nach Typ gibt es auch Bausätze oder Vorlagen, um diese an einem 3D-Drucker selbst herzustellen.

Stromversorgung

Damit die Spannung für die Elektronik stabil bleibt, selbst wenn die Antriebsmotoren beim Anfahren mehr Strom als im Betrieb brauchen, sollten 2 verschiedene Spannungsquellen eingesetzt werden. Je nach Implementation werden bei Bausätzen für die Motoren gewöhnliche oder aufladbare Batterien vorgeschlagen. Ich selber empfehle aber auch hier eine Powerbank, da diese einfach wieder aufladbar ist und genügend "Saft" für viele Experimente liefert. Für die Einspeisung kann einfach ein gewöhnliches USB-Kabel auf der Gegenseite abgeschnitten und an die Versorgungspins der Motoransteuerung montiert werden oder man befestigt dort einen USB-Stecker, um das Kabel einfach einzustecken.

Software

Um den Roboter zu steuern gibt es verschiedene Programme, welche man durch einen Dienst- oder Autostart-Eintrag auch automatisch starten kann. Dies ist notwendig, wenn man den Roboter autonom starten lassen möchte, ohne ihn jedes Mal nach dem Hochfahren wieder starten zu müssen.

Ein Programm ist Node-RED, das auf Python basiert und im Browser erstellt werden kann.

Verbindung mit autonomem Gerät herstellen

Je nach Konfiguration der IP-Adresse, muss man das Gerät zuerst finden, wenn man es autonom starten lässt, da man in diesem Fall keinen direkten Zugriff auf das Gerät hat. Für diese Aufgabe eignet sich ein IP-Scanner wie etwa der Angry IP Scanner. Findet dieser keine IP, welche sich dem Raspi zuordnen lässt, muss man sich mit dem Gerät physisch verbinden oder die SD-Karte an einem anderen Raspi testen und dort kontrollieren, ob das System wie gewünscht hochfährt und welche IP es zieht. Anschliessend kann der Remote-Zugriff über VNC oder Browser auf den Webserver des Raspi geschehen.

Automatischer Start

Damit die Konfigurationssoftware automatisch startet, muss man sie als Dienst oder Autostart eintragen. Für einen Dienst geschieht dies heutzutage normalerweise über systemctl.

sudo systemctl enable nodered.service

Hier muss die Software natürlich für diesen Betrieb vorbereitet sein, da sie sonst nicht als Dienst funktionieren kann. Die Vorgehensweise ist abhängig von der Software und kann im Internet nachgesehen werden. Möchte man einfach ein eigenes Python-Skript starten, so ist dazu ein Eintrag im Artikel Autostart vorhanden.

Node-Red als Kontrollsoftware

Wie oben erwähnt, kann für den Betrieb Node-Red eingesetzt werden. Nachdem die Software gestartet wurde, kann man sie über den Webbrowser des Geräts über den Port 1880 ansprechen.

http://192.168.1.100:1880
Funktion

Im Programm kann man nun die benötigen Funktionen zusammenklicken, so dass man über das Webinterface den Roboter steuern kann. Im Buch 20 easy Raspberry PiProjects ist im Projekt 20 ein Beispiel aufgeführt.

Es ist keine zusätzliche Logik wie eine Fernsteuerung notwendig. Möchte man dies, so muss man ein entsprechendes Modul einbinden, welches die Steuersignale nicht im Browser abfragt und in Motorbewegungen umsetzt, sondern diese von der Fernsteuerung einliest.

Zusätzlich kann man auch Abstandssensoren verbauen und abfragen, so dass das Gerät bei Hindernissen stoppt oder diese zu umfahren versucht.

Steuerung über Taster mit Python-Skript

Nach dem Erstellen muss man die Datei in der rc.local aufrufen, wenn man möchte, dass der Raspi die Taster direkt nach dem Aufstarten abfragt. Dies wird im Artikel Autostart aufgezeigt.

# Dieses Skript ist ungetestet
# M. Grob, 19.07.2022
# Für die Motorsteuerung wird der L293D eingesetzt, welcher 2 Motoren verarbeiten kann. Die Verdrahtung wird im Link aufgezeigt.

import RPi.GPIO as GPIO
import time
from gpiozero import Button

enable_motor_links = 11  # Aktiviert den Chip. Durch PWM auf diesem Pin kann auch die Geschwindigkeit festgelegt werden. Wird hier aber nicht verwendet.
enable_motor_rechts = 12 # Man sollte den Chip erst vor der Verwendung aktivieren, um Leckströme zu vermeiden.
motor_links_pinUZ = 13   # Drehrichtung Motor links Uhrzeigersinn
motor_links_pinGZ = 15   # Drehrichtung Motor links Gegenuhrzeigersinn
motor_rechts_pinUZ = 16  # Drehrichtung Motor rechts Uhrzeigersinn
motor_rechts_pinGZ = 18  # Drehrichtung Motor rechts Gegenuhrzeigersinn

button_links = Button(22)  # Taster für Drehung nach links
button_rechts = Button(29) # Taster für Drehung nach rechts
button_vor = Button(31)    # Taster für vorwärts fahren
button_rueck = Button(32)  # Taster für rückwärts fahren

GPIO.setmode(GPIO.BCM)
GPIO.setup(enable_motor_links, GPIO.OUT)
GPIO.setup(enable_motor_rechts, GPIO.OUT)
GPIO.setup(motor_links_pinUZ, GPIO.OUT)
GPIO.setup(motor_links_pinGZ, GPIO.OUT) 
GPIO.setup(motor_rechts_pinUZ, GPIO.OUT)
GPIO.setup(motor_rechts_pinGZ, GPIO.OUT) 

def links_UZ():
  GPIO.output(enable_motor_links, True)
  GPIO.output(motor_links_pinUZ, True)    
  GPIO.output(motor_links_pinGZ, False)

def links_GZ():
  GPIO.output(enable_motor_links, True)
  GPIO.output((motor_links_pinUZ, False)
  GPIO.output(motor_links_pinGZ, True)

def rechts_UZ():
  GPIO.output(enable_motor_rechts, True)
  GPIO.output(motor_rechts_pinUZ, True)    
  GPIO.output(motor_rechts_pinGZ, False)

def rechts_GZ():
  GPIO.output(enable_motor_rechts, True)
  GPIO.output((motor_rechts_pinUZ, False)
  GPIO.output(motor_rechts_pinGZ, True)

def stop():
  active = False
  GPIO.output(enable_motor_links, False)
  GPIO.output(enable_motor_rechts, False)
  
active = False # Steuert, dass nur jeweils ein Taster gleichzeitig ausgewertet wird.

while True:
  button_links.when_released or button_rechts.when_released or button_vor.when_released or button_rueck.when_released # Sobald ein Knopf losgelassen wird, die Ansteuerung stoppen. 
    stop()

  if active == False and button_links.when_pressed: # Das Gerät dreht sich um seine eigene Achse nach links
      links_UZ()
      rechts_GZ()
      active = True

  elif active == False and button_rechts.when_pressed: # Das Gerät dreht sich um seine eigene Achse nach rechts
      links_GZ()
      rechts_UZ()
      active = True

  elif active == False and button_vor.when_pressed: # Das Gerät fährt vorwärts
      links_GZ()
      rechts_GZ()
      active = True

  elif active == False and button_rueck.when_pressed: # Das Gerät fährt rückwärts
      links_UZ()
      rechts_UZ()
      active = True