Edison Robotik: Lektion 7
In dieser Lektion erfährst du mehr über Infrarotlicht
(IR) und wie Edison mit IR Hindernisse erkennen kann.
Was
ist Infrarotlicht?
Es gibt eine Vielzahl von
Lichtquellen, von denen einige für das menschliche Auge
sichtbar sind und einige nicht. Infrarot, auch IR genannt,
ist für den Menschen nicht sichtbar.
Hast Du es gewusst?
Auch wenn die Leute es nicht sehen können, ist Infrarot eine
Art Licht. Daher funktioniert es im Dunkeln. Aus diesem
Grund kannst du ein Fernsehgerät mit einer Fernbedienung
einschalten, auch wenn im Raum kein Licht leuchtet!
Edison und Infrarot
Der Edison-Roboter ist mit einem
Infrarotsystem ausgestattet, das dem Roboter eine Art
„Vision“ verleiht. Mit diesem Infrarotsystem kann Edison
Hindernisse um den Roboter herum erkennen.
Edisons
Infrarotsystem besteht aus zwei IR-Leuchtdioden (oder LEDs)
auf der Vorderseite. Einer ist links und einer ist rechts.
Edison hat auch einen IR-Sensor an der Vorderseite, direkt
in der Mitte.
Damit Edison Hindernisse erkennen kann,
wird Infrarotlicht von der linken und rechten IR-LED nach
vorne ausgestrahlt. Wenn das IR-Licht auf ein Hindernis wie
eine Wand trifft, wird es zurück in Richtung Edison
reflektiert. Der IR-Sensor von Edison erkennt dann das
reflektierte Licht.
Schaue dir die folgende
Abbildung an:
Edison sendet IR-Licht (in Rot dargestellt)
sowohl von der linken als auch von der rechten IR-LED des
Roboters aus. Reflektiertes IR-Licht (blau dargestellt)
prallt von Hindernissen ab und wird vom IR-Sensor von Edison
erfasst.
In diesem Bild befindet sich ein Hindernis vor
Edisons linker Seite, aber nicht auf der rechten Seite.
Deshalb wird nur IR-Licht vom linken Emitter reflektiert.
Anhand des empfangenen Signals kann Edison feststellen, dass
sich links ein Hindernis befindet, rechts jedoch kein
Hindernis.
Du bist dran:
1. Zeichne das
ausgesendete und das reflektierte IR-Licht für dieses
Hindernis.
Arbeitsblatt 7.2 - Erkenne ein Hindernis
und halte an
In dieser Lektion musst du
ein Programm schreiben, mit dem dein Edison-Roboter auf ein
Hindernis stößt, und dann anhält.
Schau dir folgendes
Programm an:
Dieses Programm weist Edison an, so lange zu
fahren, bis er auf ein Hindernis stößt.
Es gibt ein paar
wichtige Dinge, die du bei diesem Programm beachten
sollten.
Schaue dir Zeile 13 des Programms an. Diese
Linie schaltet Edisons Hinderniserkennungsstrahl auf "Ein". Wenn du Edisons Hinderniserkennungsstrahl in einem
EdPy-Programm verwenden möchtest, musst du den Strahl immer
auf "Ein" schalten, bevor der Strahl im Programm verwendet
wird.
Schaue dir nun Zeile 15 des Programms an. Diese
Zeile setzt die Geschwindigkeit in diesem Programm auf 5. Wenn du die Hinderniserkennung verwendest,
musst du die
Geschwindigkeit etwas verringern, damit der Roboter ein
Hindernis erkennen kann, bevor er mit ihm kollidiert. Wenn
die Geschwindigkeit zu hoch ist, stößt der Roboter gegen
Hindernisse, bevor er diese erkennen kann.
Du bist
dran:
Aufgabe 1:
Wähle deie Hindernisse aus
DU musst gute Hindernisse für Edison
auswählen. Wenn ein Hindernis zu klein ist oder nicht genügend
Infrarotlicht reflektiert, kann Edison es nicht erkennen. Wähle ein
Objekt aus, das undurchsichtig, aber nicht zu dunkel (z. B.
nicht schwarz) und mindestens so groß wie Edison ist.
Für
dieses Programm wäre die Raumwand ein gutes Hindernis.
Aufgabe 2: Bereite
deinen Edison vor
Wenn du ein
Programm mit Hinderniserkennung ausführen möchtest, solltest
du überprüfen, ob die Hinderniserkennung deines Edison-Roboters auf die
gewünschte Entfernung kalibriert ist. Verwende Übungsblatt 7.1, um deine
Edison zu kalibrieren. Möglicherweise musst du deinen Roboter mit einer
benutzerdefinierten Empfindlichkeit kalibrieren, um sicherzustellen,
dass dein Roboter Ihr Hindernis erkennen und
anhalten kann.
Aufgabe 3: Schreibe
das Programm und führe es aus
Schreibe das Programm mit der
EdPy-App und lade es auf deinen Edison-Roboter herunter.
Führe dann das Programm aus, um zu sehen, wie es
funktioniert.
Experimentiere mit verschiedenen
Hindernissen, um zu sehen, was Edison erkennen kann und was nicht. Du
kannst auch versuchen, Edisons
Hinderniserkennungskalibrierung auf unterschiedliche
Entfernungen einzustellen, um zu sehen, was passiert.
1. Lösche die Zeile "Ed.ObstacleDetectionBeam (Ed.ON)"
aus deinem Programm. Versuche, das angepasste
Programm herunterzuladen und auszuführen. Was ist passiert?
Warum passiert das?
2. Überlege, wo du diese Art der
unsichtbaren Erkennung schon einmal in der realen Welt gesehen haben.
Beschreibe ein Beispiel.
3. Wo sonst könnte diese Art der Erkennungstechnologie
eingesetzt werden? Schreibe mindestens eine Idee auf,
wie du diese Technologie einsetzen könntest.
Arbeitsblatt 7.3 - Hindernisvermeidung
In dieser Lektion schreibst duein Programm,
mit dem du deinen Edison-Roboter so lange fahren lässt, bis er auf ein
Hindernis stößt, sich umdreht und davonfährt.
Schau dir
folgendes Programm an:
Dieses Programm weist Edison an,
vorwärts zu fahren, bis ein Hindernis erkannt wird. Sobald
Edison ein Hindernis entdeckt, weist das Programm Edison an,
sich um 180 ° zu drehen und 10 cm weiterzufahren.
Du bist
dran:
Aufgabe 1: Schreibe das Programm und führe es aus
Schreibe das Programm mit der EdPy-App
und lade es auf deinen Edison-Roboter herunter. Führe dann das Programm aus, um zu sehen, wie es funktioniert.
Nachdem du das Programm ausgeführt hast, schaue es
sich noch einmal an und überlege, wie du das Programm
ändern könnst. Versuche, den Code so zu ändern, dass
sich der Roboter anders verhält, wenn er ein Hindernis
erkennt. (Hinweis: Versuche es mit Ton und Licht.)
1. Überlege, wie du das ursprüngliche Programm
verbessern könnst. Was kannst du ändern, damit das Programm
mehr kann als nur zu wenden und loszufahren, nachdem du auf ein
Hindernis gestoßen bist?
Aufgabe 2: Syntaxfehler und logische Fehler
Programmierer machen häufig Tippfehler, sogenannte Syntaxfehler. Es ist
wichtig, dass du deine eigenen Syntaxfehler gut erkennst, damit du
deinen Code korrigieren kannst.
Du kannst beim
Programmieren auch eine andere Art von Fehler erhalten, die
als logischer Fehler bezeichnet wird. Bei der Codierung ist
jeder Fehler, der kein Syntaxfehler ist, ein logischer
Fehler.
Wenn in einem Programm ein logischer Fehler
auftritt, verhält sich der Code nicht so, wie es der Programmierer
erwartet. Wenn du in EdPy einen logischen
Fehler in Ihrem Programm hast, wird das Programm
normalerweise weiterhin in Edison heruntergeladen. Wenn du
das Programm ausfühst, verhält es sich jedoch nicht so, wie
du es sich vorgestellt hast.
Ein logischer Fehler kann
so einfach sein wie die Verwendung der falschen Funktion
oder das Weglassen einer Funktion. Ein Beispiel für einen
logischen Fehler wäre das Schreiben eines Programms, das die
Hinderniserkennung verwendet, aber den
Hinderniserkennungsstrahl nicht einschaltet.
Schau
dir folgendes Programm an:
Das Programm soll den
Edison-Roboter so lange fahren lassen, bis er auf ein
Hindernis trifft, dann um 135 ° drehen und 20 cm vom
Hindernis wegfahren.
Das Programm enthält fünf
Fehler. Kannst du alle fünf Fehler im Programm identifizieren und
feststellen, ob es sich um Syntaxfehler oder logische Fehler handelt?
Trage deine Antworten in
die Tabelle auf der nächsten Seite ein.
Tipp: Du kannst
dieses Programm in EdPy schreiben und die Schaltfläche "Code
überprüfen" verwenden, um die Syntaxfehler zu ermitteln.
Fehler | Linie | Fehlertyp | Fehlerbeschreibung |
---|---|---|---|
1 | |||
2 | |||
3 | |||
4 | |||
5 |
Arbeitsblatt 7.4 - Ein Hindernis als Ereignis erkennen
In dieser Lektion schreibst du ein ereignisgesteuertes Programm, mit dem dein Edison-Roboter kontinuierlich vorwärts fährt und dabei Hindernissen aus dem Weg geht.
Ereignisgesteuerte Programmierung
Bei der Programmierung tritt ein Ereignis außerhalb des Programmcodes auf und beeinflusst die Programmausführung. Ein Ereignis kann ein Knopf sein, der gedrückt wird, oder Informationen, die von einem Sensor weitergeleitet werden.
In vielen Programmiersprachen, einschließlich Python, können Programmierer Code erstellen, der auf bestimmte Ereignisse reagieren kann. Diese Art der Programmierung wird als ereignisgesteuerte Programmierung bezeichnet.
Wenn du ein ereignisgesteuertes Programm schreibst, musst du auch Code schreiben, der diese Ereignisse verarbeitet. Es gibt zwei Möglichkeiten, dies zu tun, entweder indem das Programm in einer Schleife wartet oder Interrupts verwendet werden.
Wir unterbrechen diese Lektion, um über ... Interrupts zu sprechen
Wie du bereits weißt, bewegen sich Programme in der Regel zeilenweise nacheinander durch den Code. Es gibt Möglichkeiten, den Code anders zu bewegen, z. B. mithilfe von Schleifen.
Du kannst auch die Art und Weise beeinflussen, in der ein Programm ausgeführt wird, indem du einen Interrupt verwendest.
Ein Interrupt ist ein Codeabschnitt, der das Hauptprogramm anhält und sich selbst ausführt. Sobald der Interrupt-Code vollständig ist, kehrt das Programm an die Stelle zurück, an der es im Hauptprogramm aufgehört hat.
Interrupts sind immer Funktionen, die irgendwo im Programm definiert sind. Es handelt sich in der Regel um kurze Codeabschnitte, die zum Ausführen einer bestimmten Aufgabe entwickelt wurden, ohne den Fluss des Hauptprogramms wesentlich zu stören.
Programmierer verwenden Interrupts, da ein Programm mit Interrupts jederzeit auf ein Ereignis reagieren kann, während das Programm ausgeführt wird. Mit anderen Worten, durch die Verwendung von Interrupts muss ein Programmierer nicht genau vorhersagen, wann das Ereignis während eines Programms auftreten wird.
Eventhandler und Interrupts
Wenn du Interrupts in der ereignisgesteuerten Programmierung verwendest, musst du Ereignisbehandlungsroutinen verwenden.
Ein Event-Handler ist eine Möglichkeit, einen Interrupt an ein bestimmtes Ereignis zu binden.
Um einen Ereignishandler zu verwenden, musst du zuerst den Ereignishandler in deinem Code einrichten oder registrieren. Einmal registriert, überwacht der Ereignishandler ständig das jeweilige Ereignis. Immer wenn dieses Ereignis eintritt, löst die Ereignisbehandlungsroutine den Interrupt aus, der die Funktion aufruft und ausführt, und kehrt dann zum Hauptprogramm zurück.
Schau dir folgendes Programm an:
In EdPy verwenden wir die
Funktion "Ed.RegisterEventHandler", um einen Ereignishandler zu
registrieren.
Die Funktion "Ed.RegisterEventHandler" verfügt über
zwei Parameter. Der erste Parameter ist das Ereignis, das auftreten
wird, und der zweite Parameter ist die Funktion, die bei jedem Auftreten
dieses Ereignisses aufgerufen wird.
Schaue dirZeile 13 des Programms
an. Diese Zeile registriert eine Ereignisbehandlungsroutine, sodass bei
jedem Auftreten von "EVENT_OBSTACLE_AHEAD" die Funktion "avoidObstacle"
aufgerufen wird.
Du bist dran:
Schreibe das Programm mit der
EdPy-App und lade es auf deinen Edison-Roboter herunter. Führe dann das
Programm aus, um zu sehen, wie es funktioniert.
1. Beschreibe, was
der Roboter tut.
2. Wenn der Roboter in diesem Programm ein Hindernis
erkennt, welche Codezeilen werden ausgeführt? Warum führt das Programm
diese Zeilen aus?
3. Warum ist Ed.ReadObstacleDetection in diesem
Programm enthalten? Mit anderen Worten, was macht Zeile 20? Tipp: Sieh
dir das Arbeitsblatt 2.5 noch einmal an, um einen Hinweis zu erhalten,
oder versuche, Zeile 20 zu entfernen und das Programm auszuführen.
Versuch es!
Was könnte Edison
noch tun, wenn er ein Hindernis erkennt? Versuche, den Code so zu
ändern, dass Edison ein anderes Verhalten ausführt, wenn er ein
Hindernis erkennt. Experimentiere mit dem Programm, um zu sehen, was
funktioniert und was nicht.
Arbeitsblatt 7.5 - Hinderniserkennung rechts
und links
In dieser Lektion schreibst du ein Programm,
mit dem Edison auf Hindernisse links oder rechts vom Roboter
reagieren kann. Dazu verwenden wir if-Anweisungen.
If-Anweisungen
Ein wichtiger Teil der Codierung ist das
Treffen von Entscheidungen. Die gebräuchlichste Methode
hierfür ist die Verwendung einer if-Anweisung.
Eine
if-Anweisung fragt, ob eine Bedingung wahr oder falsch ist.
Wenn das Ergebnis wahr ist, führt das Programm den
Anweisungsblock aus, der auf die if-Anweisung folgt. Wenn
das Ergebnis falsch ist, ignoriert das Programm die
Anweisungen in der if-Anweisung und wechselt zur nächsten
Codezeile außerhalb der if-Anweisung.
Schau dir folgendes
Programm an:
Dieses Programm verwendet eine if-Anweisung,
um dem Roboter die Möglichkeit zu geben, Entscheidungen ohne
menschliche Führung zu treffen. Wenn ein Roboter auf diese
Weise eigenständig Entscheidungen treffen kann, spricht man
von einem autonomen Roboter.
Du bist dran:
Aufgabe
1: Piepton, wenn ein Hindernis vorhanden ist
Schreibe das obige Programm mit der EdPy-App, lade es auf deinen
Edison-Roboter herunter und führe das Programm
aus. Versuche dann, ein Hindernis wie deine Hand in
Edisons Hinderniserkennungsstrahl hinein und heraus zu
bewegen, um zu sehen, was passiert.
1. Edison
kann jetzt auf verschiedene Reize unterschiedlich reagieren und eine
Entscheidung treffen, was zu tun ist. Bedeutet das, dass Edison
Intelligenz hat? Tipp: Möglicherweise möchtest du etwas über künstliche Intelligenz recherchieren, um sich
zu entscheiden.
Aufgabe 2: Lass es
piepen, wenn sich ein Hindernis befindet, oder schalte das Licht ein
Du kannst einem Programm
nicht nur mitteilen, was zu tun ist, wenn eine if-Anweisung
erfüllt ist, sondern auch mitteilen, was zu tun ist, wenn
diese Bedingung nicht erfüllt ist.
if, else
Wenn du if-Anweisungen mit
„else“ verwenden, kannst du Programme
schreiben, die kompliziertere Entscheidungen treffen. If /
else-Anweisungen sind im Grunde eine Möglichkeit, eine
Entscheidung zwischen zwei Dingen zu treffen.
In
Python lautet die Syntax für if / else:
if Ausdruck:
aussage (n)
else:
aussage (n)
Das Programm
bewegt sich sequentiell von oben nach unten, beginnend mit
der if-Bedingung. Wenn die if-Anweisung true ist, führt das
Programm den eingerückten Code für den if-Ausdruck aus und
überspringt das else. Wenn die if-Anweisung jedoch falsch
ist, überspringt das Programm diesen Abschnitt des
eingerückten Codes und führt stattdessen den eingerückten
Code "else" aus.
Schreibe folgendes Programm:
Lade das Programm herunter und führe es aus.
Versuche, ein Hindernis in Edisons
Hinderniserkennungsstrahl hinein und heraus zu bewegen, um
zu sehen, was passiert.
Dieses Programm verfügt über zwei
Pfade: einen für das Erkennen eines Hindernisses und einen
für das Erkennen eines Hindernisses.
if,
elif, else
Du kannst auch ein Programm erstellen, das eine Entscheidung
unter Verwendung von mehr als zwei Bedingungen trifft. Dazu verwendest
du eine andere
Python-Syntaxstruktur:
if Ausdruck:
aussage (n)
elif Ausdruck:
aussage (n)
else:
aussage
(n)
Mit "Elif" kannst du in Python "else if" sagen.
Du kannst elif verwenden, um ein Programm mit mehreren
if-Bedingungen zu schreiben.
Ein Programm, das if / elif
/ else verwendet, bewegt sich weiterhin sequentiell von oben
nach unten. Sobald das Programm eingerückten Code in einem
Teil der if-Anweisungsstruktur ausführt, überspringt es den
Rest der Struktur und wechselt zur nächsten Codezeile
außerhalb der Struktur.
Das heißt, wenn die if-Anweisung
oben true ist, führt das Programm den eingerückten Code für
den if-Ausdruck aus und überspringt alle elif-Abschnitte
sowie den else-Abschnitt, falls vorhanden. Wenn die
if-Anweisung jedoch falsch ist, überspringt das Programm
diesen Abschnitt des eingerückten Codes und wechselt zum
ersten elif-Abschnitt.
Wenn die erste elif-Bedingung wahr
ist, führt das Programm den eingerückten Code aus und
überspringt alles darunter in der if-Anweisungsstruktur
(alle anderen elifs und die else-Bedingung, falls es eine
gibt). Wenn diese elif-Bedingung falsch ist, springt das
Programm zum nächsten Teil der if-Anweisungsstruktur und so
weiter.
Aufgabe 3: Erkenne ein Hindernis links
oder rechts
Schau dir folgendes Programm an:
Dieses
Programm verfügt über drei verschiedene Pfade, die beim
Erkennen eines Hindernisses verwendet werden können, je
nachdem, wo sich das erkannte Hindernis in Bezug auf Edison
befindet.
Schreibe das Programm mit der EdPy-App und lade
es auf deinen Edison-Roboter herunter. Führe dann das Programm aus, um zu sehen, wie es funktioniert.
2. Erkläre beim Ausführen dieses Programms mit
eigenen Worten, was der Roboter tut, wenn:
Voran
erkanntes Hindernis:
___________________________________________________
Hindernis rechts erkannt:
__________________________________________________
Hindernis links erkannt:
___________________________________________________