TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
touchsensor

5. TOUCHSENSOR

 

 

DU LERNST HIER...

 

wie du ein einen Touchsensor dafür einsetzen kannst, Hindernisse zu erkennen und entsprechend zu reagieren.

 

 

MUSTERBEISPIEL

 

Der EV3-Touchsensor ist wie ein Schalter aufgebaut, der beim Hineindrücken des roten Knopfs Kontakt macht. Gewöhnlich baust du ihn vorne in der Mitte des Roboters an. Der Touchsensor kennt die zwei Zustände gedrückt (pressed) und nicht gedrückt.

 

Es ist deine Aufgabe, dass der Roboter sich in einer quadratischen oder rechteckigen Kiste so bewegt, dass er ungefähr rechtwinklig zueinander stehende Bahnen abfährt. Wie beim Lichtsensor fasst du den Touchsensor als ein Objekt mit dem beliebig wählbaren Namen ts auf, das du mit ts = TouchSensor() unter Angabe des Sensorports erzeugst. Mit addPart(ts) schliesst du ihn bildlich gesprochen am Brick an.

Um den Zustand des Sensors zu erfassen, rufst du in einer while-Schleife die Funktion isPressed() auf.. Diese liefert den Wahrheitswert True, falls im Moment des Aufrufs der Knopf gedrückt ist, sonst liefert sie False. Für die Simulation musst du in der virtuellen Welt mit RobotContext.useObstacle() eine Kiste erstellen.

Verwende den Sensorport 3, damit in der Simulation der Touchsensor vorne in der Mitte ausgewählt wird.

 

from simrobot import *
# from ev3robot import *

RobotContext.useObstacle("sprites/field1.gif", 250, 250)  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
ts = TouchSensor(SensorPort.S3)
robot.addPart(ts)
gear.forward()

while not robot.isEscapeHit(): 
    if ts.isPressed():
        gear.backward(1500)
        gear.left(550)
        gear.forward()
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MERKE DIR...

 

Der Touchsensor kann nur zwei Werte abgeben, und zwar die die Wahrheitswerte (boolean) True oder False.

Dein Programm "bemerkt" den gedrückten Zustand nur, wennsich der Roboter vorwärtsbewegt.. Ist das Programm in den Funktionen backward(1500) oder left(550) blockiert, kannst du den Knopf so oft drücken wie du willst und es geschieht rein gar nichts.

 

 

ZUM SELBST LÖSEN

 

 


1.


Der Roboter bewegt sich in einer Kiste mit einem Ausgang. Du lässt ihn in der Mitte der Kiste starten und er soll möglichst rasch den Ausgang finden. Dabei darfst du aber nicht davon ausgehen, dass der Roboter von sich aus schon "weiss", wo sich der Ausgang befindet.

Für die Simulation benötigst du folgenden Context:

 
 
RobotContext.useObstacle("sprites/trap.gif", 250, 250)


2.

Ein Kanalroboter soll sich in einem rechtwinklig gebogenen Röhrensystem selbständig, also ohne Fernsteuerung, bewegen.

Wie bei vielen Aufgaben ist es sinnvoll, das Problem zuerst im  Simulationsmodus zu lösen. Verwende dazu zwei vorne angebrachte Touchsensoren, die an den Sensorports S1 und S2 angeschlossen sind. Wenn du Lust hast, so kannst du aber auch einen echten Parcours bauen.

Für die Simulation lautet der Context:

 
RobotContext.useBackground("sprites/racetrack.gif", 250, 250)
RobotContext.setStartPosition(420, 460)

 

 

   

 

   

 

5-1
Fachliche Hinweise:

Da der Tastenzustand nur genau dann vom Programm erfasst wird, wenn die Sensorfunktion isPressed() aufgerufen wird, verliert man oft "schnelle" Tastenbetätigungen, also Tastenklicks. Um dies zu vermeiden, muss die Taste sehr oft hintereinander abgefragt werden (dies nennt man "Pollen").

Um jedes Tastenereignis zu erfassen, müsste man eine Prozess starten, der ausschliesslich mit Pollen der Taste mit einer Wiederholzeit von ungefähr 10 ms beauftragt wird. Dies erreicht man mit einem "Tastenhandler", der in einem eigenen Thread läuft. Tastenereignisse werden dann wie folgt mit dem Eventmodell behandelt:

from simrobot import *
#from ev3robot import *

RobotContext.useObstacle("sprites/field1.gif", 250, 250);

# Callback returns immediately
def onPressed(port):
    global hit
    print "hit"
    hit = True

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
ts = TouchSensor(SensorPort.S3, pressed = onPressed)
robot.addPart(ts)
gear.forward()
hit = False
while not robot.isEscapeHit():
    if hit:
        hit = False
        gear.backward(1500)
        gear.left(240)
        gear.forward()
robot.exit()

Man kann nun die Taste von Hand sehr schnell drücken und es wird immer "hit" ausgeschrieben.

5-2
Kanalroboter
 

Abwasserkanäle halten unsere Städte sauber und helfen, Überflutungen bei starken Regenfällen zu verhindern. Rund 80% der Abwasserkanäle sind nicht begehbar. Kanalroboter werden eingesetzt, um die Kanalnetze zu kontrolliert und Leckstellen aufzuspüren.

Der Roboter navigiert autonom mit Hilfe seiner Touchsensoren in Kanälen mit 30 - 60 cm Durchmesser und kann mit dem eingebauten Laser-Kamerasystem die beschädigten Stellen entdecken.