4 – Mit Ultraschallsensor Hindernisse erkennen

4

Mit Ultraschallsensor Hindernisse erkennen

Das lernst du hier

Lasse einen Fahrroboter seine Umgebung mit einem Ultraschallsensor ausmessen und Hindernissen ausweichen.

4a

Den Ultraschallsensor einbauen

Wie geht das?

Für den Einbau des Ultraschallsensors und des optionalen Servos gehe auf diese Seite PGLU > BAU > ARDUINO ROBOTER oder schaue dieses Video

Verstehe auch hier, wie der Sensor angeschlossen wird:

Roboter Starter Kit Anschlussschema
4b

Zeige eine gemessene Distanz mit Neopixeln

Wie geht das?

Der Ultraschallsensor wird mit einem Unterprogramm programmiert, welches die Zeit misst, die ein gesendetes Signal benötigt, bis es vom Sensor wieder gehört wird. Messe mit dem Ultraschallsensor eine Distanz und zeige sie mit einem Neopixel Stripe/Matrix an.

Näheres findest du unter: workshop.pglu.ch > Sensor > Ultraschallsensor

Challenge:

Challenge: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="bLh6%Kus6UtXUDTn0)wO">Distanz in cm</variable><variable id="1JJcbjQvN7M}DrfgbJx]">Verstrichene Zeit</variable></variables><block type="basic_comment" id="?EFy^;$AARX~}$NQ@bj=" x="615" y="-590"><field name="COMMENT">Setze diese Blöcke in den Hauptloop ein&amp;#10;Steuere mit der gemessenen Distanz in cm die Pixel (oder die Anzahl Pixel) die leuchten sollen.&amp;#10;Mit der Multiplikation (x 0.16) kannst du den Messwert in cm auf die Anzahl möglicher Pixel skalieren (hier 16)! </field></block><block type="set_neo_pixel" id="cf+eTN?_I-9/UhwC99ND" x="614" y="-472"><value name="NUM_LEDS"><block type="math_number" id="c2,-Q-nU-s=r0@oG3|.+"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id=".7-288d1G/W$sM~kPnIC"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="?ZVZOY{x)=;%MXJY;YI`"><field name="LED">LED1</field></block></value></block><block type="basic_comment" id="Evw+oP?O(8dgr{Ovi@@K" x="-320" y="-341"><field name="COMMENT">Diese Funktion kannst du mit einem Rechtsklick zusammenfalten. Sie muss nie geändert werden</field></block><block type="basic_main_loop" id="yz(jk1ohuie3{eM082X7" deletable="false" x="615" y="-385"><value name="BLINK"><block type="basic_blinkcode" id="x4ome(KF{D]/gsL8l-}R"><field name="SHORT">1</field><field name="LONG">1</field></block></value></block><block type="procedures_defreturn" id="X*9Bbi%?J)yy1A0,eY)%" x="-321" y="-280"><field name="NAME">Gemessene Distanz in cm</field><statement name="STACK"><block type="led_write_state" id="_J7P+|7X.zF:*1O-/vF_"><value name="LED"><block type="led_pin" id="MaJ-Q:N:k6BNDwE;;Vjc"><field name="LED">LED3</field></block></value><value name="VALUE"><block type="code_pin" id=",VL$XuA9s?]~T-Wp^1~("><field name="CODE_PIN">LOW</field></block></value><next><block type="flow_delay_micro" id="[@TYcycsXOuDh/u2]c(w"><value name="DELAY_MICRO"><block type="math_number" id="!~IE3WZnYj|P)0hVjty?"><field name="NUM">2</field></block></value><next><block type="led_write_state" id="3c-^*^J^9KOl`|YmnyUo"><value name="LED"><block type="led_pin" id="-dbdeQ@J|r_r*Xx`5N6("><field name="LED">LED3</field></block></value><value name="VALUE"><block type="code_pin" id="o3LG4IN}96bI7qG/~u:q"><field name="CODE_PIN">HIGH</field></block></value><next><block type="flow_delay_micro" id="~8xP_rW89K[YJ]xMBVZB"><value name="DELAY_MICRO"><block type="math_number" id="k!5P/@3YbBNBOC/8RnPu"><field name="NUM">10</field></block></value><next><block type="led_write_state" id="2;84Lz]_MY(]*an6bbuX"><value name="LED"><block type="led_pin" id="yZ_38:LDC%`}-qs9!#HL"><field name="LED">LED3</field></block></value><value name="VALUE"><block type="code_pin" id="KB]d|ET7.-RKqeb=Ca;3"><field name="CODE_PIN">LOW</field></block></value><next><block type="variables_set" id="2Q?ih*Ca/!lmTjDok8[f"><field name="VAR" id="1JJcbjQvN7M}DrfgbJx]">Verstrichene Zeit</field><value name="VALUE"><block type="code_pin" id="*1EUi5Xb[HW!+J9a3N9C"><field name="CODE_PIN">pulseIn(16, HIGH)</field></block></value><next><block type="flow_delay" id="+%ceDPGCdsP1bmb4jPA1"><value name="DELAY"><block type="math_number" id="ppFVrF$;AHI:q1N9rH#N"><field name="NUM">5</field></block></value><next><block type="variables_set" id="^^#D3c@|tS(3]zxatnTI"><field name="VAR" id="bLh6%Kus6UtXUDTn0)wO">Distanz in cm</field><value name="VALUE"><block type="math_arithmetic" id="Zz]F0P,VWB(nt/;BX7Rw"><field name="OP">MULTIPLY</field><value name="A"><block type="variables_get" id="D_s2L~b-kTe3:D]#27[C"><field name="VAR" id="1JJcbjQvN7M}DrfgbJx]">Verstrichene Zeit</field></block></value><value name="B"><block type="math_number" id="0J@IlKj[fbutvl*ga7nl"><field name="NUM">0.0175</field></block></value></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement><value name="RETURN"><block type="variables_get" id="fuVfaNxXyPJ;#)b-Cfqc"><field name="VAR" id="bLh6%Kus6UtXUDTn0)wO">Distanz in cm</field></block></value></block><block type="basic_comment" id="UCxvT]EG9LDw`2lQqxOH" x="-29" y="-244"><field name="COMMENT">Ausschalten des Senders (Bereitschaftsmodus)</field></block><block type="procedures_callreturn" id="dQ%;i:TIiC.P]k`cE?QB" x="613" y="-268"><mutation name="Gemessene Distanz in cm"></mutation></block><block type="basic_comment" id="H0$!s{XUp~3IRKP?CRQ," x="-31" y="-162"><field name="COMMENT">Einschalten des Senders (Start Signalton)</field></block><block type="set_pixel_color" id="190)]UtP5bb7/Y{+D4.V" x="616" y="-192"><field name="MODE">MODE1</field><value name="FROM"><block type="math_number" id="!9b3d8v.Jv;Oi}hEK9E6"><field name="NUM">1</field></block></value><value name="TO"><block type="math_number" id="%3,9x~B7wX,B;:}zoc]["><field name="NUM">1</field></block></value><value name="H"><block type="math_number" id="`QP=,$*pun8h#^hfT4rA"><field name="NUM">120</field></block></value><value name="S"><block type="math_number" id="])2~e}krwuNe%EB##dxq"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="lxtrP@W2e7x;1i:KzN6g"><field name="NUM">100</field></block></value></block><block type="basic_comment" id="/)@{z45X^sStjoRF(^h2" x="-29" y="-83"><field name="COMMENT">Ausschalten des Senders (Ende Signalton)</field></block><block type="math_arithmetic" id="xCHE@YWl{g;9cT(sa`2N" x="614" y="-101"><field name="OP">MULTIPLY</field><value name="B"><block type="math_number" id="cVAqU_/Z17~hdNLNnM6]"><field name="NUM">0.16</field></block></value></block><block type="basic_comment" id="hGw1f[}U`Qd;_=KLUQez" x="96" y="-46"><field name="COMMENT">Messe Länge Antwort-Impuls</field></block><block type="basic_comment" id="9)sNUK(U+g`o^eXg]d0N" x="223" y="30"><field name="COMMENT">Berechne aus der Länge des Antwort-Impulses die Distanz in cm</field></block></xml>

Mögliche Lösung:

Lösung: XML-Code in Editor einfügen
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="bLh6%Kus6UtXUDTn0)wO">Distanz in cm</variable><variable id="1JJcbjQvN7M}DrfgbJx]">Verstrichene Zeit</variable></variables><block type="basic_comment" id="?EFy^;$AARX~}$NQ@bj=" x="615" y="-590"><field name="COMMENT">Setze diese Blöcke in den Hauptloop ein&amp;#10;Steuere mit der gemessenen Distanz in cm die Pixel (oder die Anzahl Pixel) die leuchten sollen.&amp;#10;Mit der Multiplikation (x 0.16) kannst du den Messwert in cm auf die Anzahl möglicher Pixel skalieren (hier 16)! </field></block><block type="set_neo_pixel" id="cf+eTN?_I-9/UhwC99ND" x="614" y="-472"><value name="NUM_LEDS"><block type="math_number" id="c2,-Q-nU-s=r0@oG3|.+"><field name="NUM">16</field></block></value><value name="BRIGHTNESS"><block type="math_number" id=".7-288d1G/W$sM~kPnIC"><field name="NUM">50</field></block></value><value name="OUTTURN"><block type="led_pin" id="9Us*O3,Bin~4CzAmKQd9"><field name="LED">LED1</field></block></value></block><block type="basic_comment" id="Evw+oP?O(8dgr{Ovi@@K" x="-320" y="-341"><field name="COMMENT">Diese Funktion kannst du mit einem Rechtsklick zusammenfalten. Sie muss nie geändert werden</field></block><block type="basic_main_loop" id="yz(jk1ohuie3{eM082X7" deletable="false" x="615" y="-385"><value name="BLINK"><block type="basic_blinkcode" id="x4ome(KF{D]/gsL8l-}R"><field name="SHORT">1</field><field name="LONG">1</field></block></value><statement name="CODE"><block type="set_pixel_color" id="190)]UtP5bb7/Y{+D4.V"><field name="MODE">MODE1</field><value name="FROM"><block type="math_arithmetic" id="xCHE@YWl{g;9cT(sa`2N"><field name="OP">MULTIPLY</field><value name="A"><block type="procedures_callreturn" id="dQ%;i:TIiC.P]k`cE?QB"><mutation name="Gemessene Distanz in cm"></mutation></block></value><value name="B"><block type="math_number" id="cVAqU_/Z17~hdNLNnM6]"><field name="NUM">0.16</field></block></value></block></value><value name="TO"><block type="math_number" id="%3,9x~B7wX,B;:}zoc]["><field name="NUM">1</field></block></value><value name="H"><block type="math_number" id="`QP=,$*pun8h#^hfT4rA"><field name="NUM">120</field></block></value><value name="S"><block type="math_number" id="])2~e}krwuNe%EB##dxq"><field name="NUM">100</field></block></value><value name="B"><block type="math_number" id="lxtrP@W2e7x;1i:KzN6g"><field name="NUM">100</field></block></value></block></statement></block><block type="procedures_defreturn" id="X*9Bbi%?J)yy1A0,eY)%" x="-321" y="-280"><field name="NAME">Gemessene Distanz in cm</field><statement name="STACK"><block type="led_write_state" id="_J7P+|7X.zF:*1O-/vF_"><value name="LED"><block type="led_pin" id="MaJ-Q:N:k6BNDwE;;Vjc"><field name="LED">LED3</field></block></value><value name="VALUE"><block type="code_pin" id=",VL$XuA9s?]~T-Wp^1~("><field name="CODE_PIN">LOW</field></block></value><next><block type="flow_delay_micro" id="[@TYcycsXOuDh/u2]c(w"><value name="DELAY_MICRO"><block type="math_number" id="!~IE3WZnYj|P)0hVjty?"><field name="NUM">2</field></block></value><next><block type="led_write_state" id="3c-^*^J^9KOl`|YmnyUo"><value name="LED"><block type="led_pin" id="-dbdeQ@J|r_r*Xx`5N6("><field name="LED">LED3</field></block></value><value name="VALUE"><block type="code_pin" id="o3LG4IN}96bI7qG/~u:q"><field name="CODE_PIN">HIGH</field></block></value><next><block type="flow_delay_micro" id="~8xP_rW89K[YJ]xMBVZB"><value name="DELAY_MICRO"><block type="math_number" id="k!5P/@3YbBNBOC/8RnPu"><field name="NUM">10</field></block></value><next><block type="led_write_state" id="2;84Lz]_MY(]*an6bbuX"><value name="LED"><block type="led_pin" id="yZ_38:LDC%`}-qs9!#HL"><field name="LED">LED3</field></block></value><value name="VALUE"><block type="code_pin" id="KB]d|ET7.-RKqeb=Ca;3"><field name="CODE_PIN">LOW</field></block></value><next><block type="variables_set" id="2Q?ih*Ca/!lmTjDok8[f"><field name="VAR" id="1JJcbjQvN7M}DrfgbJx]">Verstrichene Zeit</field><value name="VALUE"><block type="code_pin" id="*1EUi5Xb[HW!+J9a3N9C"><field name="CODE_PIN">pulseIn(16, HIGH)</field></block></value><next><block type="flow_delay" id="+%ceDPGCdsP1bmb4jPA1"><value name="DELAY"><block type="math_number" id="ppFVrF$;AHI:q1N9rH#N"><field name="NUM">5</field></block></value><next><block type="variables_set" id="^^#D3c@|tS(3]zxatnTI"><field name="VAR" id="bLh6%Kus6UtXUDTn0)wO">Distanz in cm</field><value name="VALUE"><block type="math_arithmetic" id="Zz]F0P,VWB(nt/;BX7Rw"><field name="OP">MULTIPLY</field><value name="A"><block type="variables_get" id="D_s2L~b-kTe3:D]#27[C"><field name="VAR" id="1JJcbjQvN7M}DrfgbJx]">Verstrichene Zeit</field></block></value><value name="B"><block type="math_number" id="0J@IlKj[fbutvl*ga7nl"><field name="NUM">0.0175</field></block></value></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement><value name="RETURN"><block type="variables_get" id="fuVfaNxXyPJ;#)b-Cfqc"><field name="VAR" id="bLh6%Kus6UtXUDTn0)wO">Distanz in cm</field></block></value></block><block type="basic_comment" id="UCxvT]EG9LDw`2lQqxOH" x="-29" y="-244"><field name="COMMENT">Ausschalten des Senders (Bereitschaftsmodus)</field></block><block type="basic_comment" id="H0$!s{XUp~3IRKP?CRQ," x="-31" y="-162"><field name="COMMENT">Einschalten des Senders (Start Signalton)</field></block><block type="basic_comment" id="/)@{z45X^sStjoRF(^h2" x="-29" y="-83"><field name="COMMENT">Ausschalten des Senders (Ende Signalton)</field></block><block type="basic_comment" id="hGw1f[}U`Qd;_=KLUQez" x="96" y="-46"><field name="COMMENT">Messe Länge Antwort-Impuls</field></block><block type="basic_comment" id="9)sNUK(U+g`o^eXg]d0N" x="223" y="30"><field name="COMMENT">Berechne aus der Länge des Antwort-Impulses die Distanz in cm</field></block></xml>
4c

Fahrroboter mit Ultraschallsensor steuern

Wie geht das?

Das Steuern eines Fahrroboters mit einem Ultraschallsensor funktioniert ähnlich, wie das Erkennen von Hindernissen mit einem simplen Tastsensor. Lasse den Roboter von einem Hindernis wegdrehen, sobald der Sensor eine Distanz unter 10cm misst.

Wie das geht, erfährst du unter workshop.pglu.ch > Sensor > Ultraschallsensor. Dort lernst du auch, dass der Roboter noch cleverer gemacht werden kann, indem er den Raum so ausmisst, dass er weiss, ob er links oder rechts mehr Platz hat, um weiterzufahren!

Anforderung:
✓ Erweitert
✓ Erweiterte Anforderung an das Löten
✓ Bauen ohne Werkstatt
✓ Mehrmals bauen und zerlegen

Thema:
> Sensor Aktor
> Programmablauf mit verschachtelten Bedingungen
> Neopixel
> Werte in Variablen speichern

Werkzeug:
> Lötstation

Material:
> Bausatz pglu.ch/shop > Arduino Roboter
> Controller: pglu.ch/shop > Mikrocontroller KOMFORT oder MOTOR
> Sensor: pglu.ch/shop > Sensor > Ultraschallsensor
> Servo: pglu.ch/shop > Servo&Motor > Servo
> Neopixel: pglu.ch/shop > Elektronik > MATRIX


Anleitung Roboter:
> Roboter bauen: pglu.ch > BAU > ARDUINO ROBOTER
> Elektronik anschliessen: pglu.ch > BAU > ARDUINO ROBOTER
> Grundroboter programmieren: pglu.ch > CODING > ARDUINO ROBOTER

Anleitung LED & Neopixel
> Neopixel anschliessen: pglu.ch > BAU > NEOPIXEL

3D-Modell:
> Hier anschauen

Videos:
> Roboter: Ultraschallsensor
> Neopixel Matrix: pglu.ch > CODING > NEOPIXEL

Basics:
> Lernumgebung aufbauen: pglu.ch > ANLEITUNG
> XML in Editor importieren: pglu.ch > ANLEITUNG > EDITOR

Editor:
> Online: mach.pglu.ch
> Teacher’s Box: mach.pglu.box

Erweiterungen:
> Matrix Designer: TTG PROJEKT > NEOPIXEL MATRIX > CODING
> Ultraschallsensor: workshop.pglu.ch > SENSOR
> Weiteres: pglu.ch > HILFREICHE DOKUMENTE
> Erweiterung mit KI: ki-kit.ch