Lichtsensor und Line Follower
In diesem Abschnitt geht es um Regelungstechnik. Typische Probleme sind:
- im Haushalt: Temperatur von Heizung bzw. Kühlschrank bzw. Bügeleisen so regeln, dass die gewünschte Temperatur möglichst konstant bleibt.
- Tempomat beim Auto: Halte die Geschwindigkeit konstant (auch bei Steigungen, Wind etc.).
- Autopiloten in der Luftfahrt, Schiffahrt, Raumfahrt.
- Wie muss ich den Abfluss eines Stausees regeln, damit die gewünschte Strommenge erzeugt wird.
Der Roboter soll der äusseren schwarzen Linie auf der Plane folgen!
Aufgabe 1: Licht-Sensor kalibrieren
Erstelle per “Create a new project” ein neues Projekt und kopiere ans Ende des Programms main.py
den folgenden Code.
Ersetze die Nullen wie in den Kommmentaren im Programm beschrieben.
# Bitte sicherstellen, dass dein Computer im tech-lab-Netz ist und nicht in Schule SG o.ä.. ############### # AUFGABE 1 # ############### ev3.speaker.say(text="Hello, I'll follow the line.") links = Motor(Port.A) rechts = Motor(Port.B) licht = ColorSensor(Port.S1) # Sind die Motoren und Sensoren richtig verkabelt? while True: r = licht.reflection() print(r) wait(100) # Ermittle mit Hilfe der obigen Schleife die Werte # für Weiss und Schwarz auf der Plane und trage sie # unten ansstelle der Nullen ein. schwarz = 0 weiss = 0 # Idealwert, wenn der Sensor mittig auf der Kante ist. idealwert = (schwarz + weiss) / 2
Aufgabe 2: Drivebase kennenlernen
Im bisher erstellten Programm: Lösche die while True
-Schleife (oder kommentiere sie aus).
Dann kopiere den folgenden Code-Block ans Ende des Programms und lerne damit den drive
-Befehl kennen.
############### # AUFGABE 2 # ############### fahrwerk = DriveBase(links, rechts, wheel_diameter=55.5, axle_track=125) # Raddurchmesser und Achsenabstand (in Millimeter) sind hier die beiden letzten Parameter. # Lerne den "drive"-Befehl kennen: # - erster Parameter: Robotergeschwindigkeit in mm/s # - zweiter Parameter: Rotationsgeschwindigkeit der Roboters in Grad/s # Die entsprechende Bewegung wird solange ausgeführt, bis ein anderer Befehl oder ein Stopp-Befehl kommt. # Du darfst gerne die Parameter ändern! fahrwerk.drive(100, 0) wait(3000) # Wartezeit in Millisekunden fahrwerk.drive(100, -20) wait(3000) fahrwerk.drive(100, 20) wait(3000) ev3.speaker.say(text="Now I stop.") fahrwerk.stop()
Genaueres über die “Drivebase” steht hier: https://pybricks.com/ev3-micropython/robotics.html
Aufgabe 3: Einfacher Line Follower
Idee: Der Helligkeitssensor des Roboters soll sich immer genau über der Kante der schwarzen Linie befinden: Lass dazu den Roboter nach links bzw. rechts abbiegen, wenn der Grauwert zu klein bzw. zu gross ist.
Im bisher erstellten Programm: Lösche die letzten acht Zeilen mit den drive
-Befehlen (oder kommentiere sie aus).
Dann kopiere den folgenden Code-Block ans Ende des Programms.
############### # AUFGABE 3 # ############### geschwindigkeit = 50 while True: abweichung = licht.reflection() - idealwert if abweichung < 0: fahrwerk.drive(geschwindigkeit, -20) elif abweichung > 0: fahrwerk.drive(geschwindigkeit, 20) else: fahrwerk.drive(geschwindigkeit, 0)
Aufgabe 4: Proportionaler Line Follower
Im bisher erstellten Programm: Ersetze den Inhalt der while True
-Schleife durch die folgenden Zeilen.
Die Idee ist, dass die Abbiegedrehgeschwindigkeit proportional mit der Abweichung steigt.
############### # AUFGABE 4 # ############### abweichung = licht.reflection() - idealwert # Ersetze ''??'' durch Ausprobieren durch eine geeignete Zahl (zwischen 0 und 2)! fahrwerk.drive(geschwindigkeit, ?? * abweichung)
Aufgabe 5: PID Line Follower
Modifiziere das bisher erstellten Programm wie folgt; Ziel ist danach, die drei Konstanten gut zu wählen.
Idee dahinter: Die Abbiegedrehgeschwindigkeit soll nicht nur proportional zur Abweichung sein, sondern auch die Summe aller bisherigen Abweichungen berücksichtigen und auch die aktuelle Änderung. Dies nennt sich PID-Steuerung (wegen P=proportional, I=Integral (in etwa die Summe) und D=Differential).
Füge vor der while True
-Schleife die folgende Definition von Konstanten ein:
############### # AUFGABE 5 # ############### # Finde durch Ausprobieren (= Testfahrten) gute Werte! # Am besten erst die letzten beiden Werte auf Null setzen und den ersten Wert gut wählen. # Dann den zweiten Wert gut wählen. # Dann den dritten. proportional_faktor = ?? # zwischen 0 und 2 integral_faktor = ?? # kleiner als 0.1 differential_faktor = ?? # zwischen 0 und 4 letzte_abweichung = 0 integral = 0 zaehler = 0
Ersetze den Inhalt der while True
-Schleife durch die folgenden Zeilen und finde dann gute Werte für die obigen Konstanten.
abweichung = licht.reflection() - idealwert zaehler = zaehler + 1 proportional_fix = proportional_faktor * abweichung integral += abweichung integral_fix = integral_faktor * integral veraenderung = abweichung - letzte_abweichung differential_fix = differential_faktor * veraenderung letzte_abweichung = abweichung if zaehler % 250 == 0: print(10 * '-' + str(zaehler) + 10 * '-') print('proportional_fix=' + str(proportional_fix)) print('integral_fix=' + str(integral_fix)) print('differential_fix=' + str(differential_fix)) fahrwerk.drive(geschwindigkeit, proportional_fix + integral_fix + differential_fix) wait(5)
In diesem Abschnitt ging es um Regelungstechnik, siehe etwa
Für nächstes Mal: Aktuelle Werte von abweichung
, integral
, veraenderung
graphisch ausgeben!