TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
touchsensor

8. TOUCHSENSOREN (BERÜHRUNGSSENSOREN)

 

 

DU LERNST HIER...

 

wie du Touchsensoren dafür einsetzen kannst, Hindernisse zu erkennen und entsprechend zu reagieren.

 

 

WIE FUNKTIONIERT EIN TOUCHSENSOR

 
Der Touchsensor ist wie ein Schalter aufgebaut, der beim Drücken der kleinen Metallstifts einen Kontakt macht. Der Touchsensor kennt zwei Zustände gedrückt (1) und nicht gedrückt (0). Der Callibot verfügt über zwei Touchsensoren.  
 
 

Um die Berührungen mit den Gegenständen zu detektieren, ist es praktisch an der Front des Callibots eine Stossstange zu befestigen. Wenn der Roboter frontal ein Objekt berührt, werden beide Sensoren gedrückt. Wenn er seitlich ankommt, wird nur der linke- bzw. rechte Sensor gedrückt.

Die Stossstange kannst du bei knotech.de bestellen.

 


Falls dir ein 3D-Drucker zur Verfügung steht, kannst du eine solche Stossstange selbst fabrizieren. Pascal Lütscher (Pädagogische Hochschule Graubünden) hat 3D-Printing Vorlagen erstellt und uns zur Verfügung gestellt.

https://www.tinkercad.com/things/0bfM0UhJQOk (Stossstange)
https://www.tinkercad.com/things/bqsSISDhCit (Schrauben zu Stossstange)

 

 

MUSTERBEISPIELE

 

Beispiel 1: Ein Hindernis registrieren und ausweichen

Der Roboter soll sich in einem mit vier Wänden beschränken Raum bewegen. Wenn er mit dem Touchsensor eine Wand berührt, fährt er eine kurze Strecke zurück, dreht 90° nach links und fährt in der neuen Richtung weiter.

Wenn der Touchsensor frontal eine Wand berührt, werden beide Sensoren gedrückt und der Befehl tsValue() gibt 1 zurück. Die Sensorwerte werden alle 100 ms in einer repeat-Schleife abgefragt.

 

from callibot import *
#RobotContext.useObstacle("sprites/field1.gif", 250, 250) 

forward()
repeat:
    ts = tsValue() 
    if ts == 1:
        backward()
        delay(1500)
        left()
        delay(550)
        forward()
    delay(100)
► In Zwischenablage kopieren

Du kannst daa Programm auch im Simulationsmodus ausführen. Dazu musst du die Zeile RobotContext useObstacle("sprites/field1.gif, 250, 250) aktivieren. Das Hintergrundbild field1.gif hat einen transparenten Hintergrund und wird mit der Angabe der Koordinaten im Grafikfenster poitioniert.

Beispiel 2: Kanalroboter
Ein Roboter mit zwei Touchsensoren soll den Weg im Kanal finden. Mit zwei Touchsensoren kannst du den Roboter effizienter steuern. Je nachdem, ob er ein Hindernis mit dem linken oder mit dem rechten Sensor berührt, fährt er zuerst kurz zurück und dreht um einen kleinen Winkel in die Gegenrichtung. Die Berührung des linken oder rechten Sensors überprüfst du mit den Befehlen tsLLeftValue() bzw. tsRightValue(). Diese gehen 1 zurück, falls der Sensor berührt wurde, sonst 0.
Baue eine Hindernisbahn und teste das folgende Programm.

 




from callibot import *
#RobotContext.useObstacle("sprites/racetrack.gif", 250, 250)
#RobotContext.setStartPosition(420, 460)

setSpeed(30)
forward()
repeat:
    tsL = tsLeftValue()
    tsR = tsRightValue()
    if tsL == 1:
        backward()
        delay(250)
        right()
        delay(200)
        forward() 
    elif tsR == 1:        
        backward()
        delay(250)
        left()
        delay(200)
        forward()
    delay(100)
► In Zwischenablage kopieren

Für die Simulation aktivierst du die beiden RobotContext-Zeilen. Das Bild racetrack.gif ist in der TigerJython Bildbibliothek vorhanden.


 

MERKE DIR...

 

Die Touchsensoren können nur zwei Werte zurückgeben und zwar 1, falls der Sensor gedrückt wurde, sonst 0. Zum Abfragen der Sensorwerte stehen dir drei Befehle zur Verfügung:

  • tsValue() verwendest du, wenn die Stossstange frontal berührt wird
  • tsLeftValue() verwendest du, um die Berührung des linken Sensors abzufangen
  • tsRightValue() gibt 1 zurück, wenn der rechte Sensor berührt wurde, sonst 0

 

 

ZUM SELBST LÖSEN

 

 


1.


Ein Roboter mit einem oder zwei Tousensoren bewegt sich im Käfig mit einem Ausgang. Er startet in der Mitte und soll möglichst rasch den Ausgang finden.

 

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


2.

Der Roboter soll eine rechteckige Fläche, die auf allen Seiten begrenzt ist, so abfahren, als ob er sie wie ein Rasenmäher mähen würde. Falls er auf eine Begrenzung trifft, so fährt er zuerst ein wenig zurück, dreht um 90 Grad, fährt eine kurze Strecke parallel zur Wand, dreht nochmals um 90 Grad und fährt wieder vorwärts.

Beachte, dass der Rasenmäher immer einmal links und einmal rechts drehen muss. Um es so zu programmieren, gibt es ein einfacher Trick:

 

Du wählst Variable n, die zu Beginn 0 ist, nach einer Linksdrehung auf 1 und bei einer Rechtsdrehung wieder auf 0 gesetzt wird. Du überprüfst bei jeder Wende, ob n 0 oder 1 ist und machst die entsprechende Drehung. Um das Programm besser zu strukturieren, kannst du die Links-Wende als Funktion turnLeft() und die Rechts-Wende als Funktion turnRight() definieren. Falls du nicht weiter kommst, kannst du hier spicken:


3.

Kanalroboter.
Ein Roboter mit zwei Touchsensoren soll das ganze Rohr durchfahren und wieder zum Ausgangsort zurückkehren.

 

 

 

 

 
 
4.

Dein Roboter soll das nebenstehende Labyrinth mit Hilfe seines Touchsensors und mit Hilfe der Buttons button_a und button_b durchfahren. Er startet unten rechts und fährt vorwärts. Wenn er mit dem Touchsensor eine Wand berührt, fährt er eine kurze Strecke rückwärts, bleibt stehen und wartet, bis du den Button left oder right gedrückt hast. Dann dreht er rechtwinklig in dieser Richtung und fährt vorwärts.

 

 


 

   

 

8-1
Fachliche Hinweise:

 

from callibot import *

def turnLeft(): 
    ...

def turnRight(): 
    ...
    
n = 0
forward()
repeat: 
    if tsValue() == 1: 
        backward()
        ...
        if n == 0:
            turnLeft()
            n = 1
        else:
            turnRight()
            n = 0   
        forward()
    delay(100)
 
8-2
Fachliche Hinweise:

Einige Hintergrundbilder für die Simulation stehen im TigerJython zur Verfügung (siehe "Hilfe/APLU-Dokumentation/Bilderbibliothek").

Du kannst auch eigenes Hintergrundbild erstellen. Es muss 500x500 Pixel gross sein und transparrenten Hintergrund haben. Wenn du das Bild im gleichen Verzeichnis speicherst, in dem sich dein Programm befindet, wird er automatisch in deinem Programm integriert.

RobotContext.useObstacle("myBackground.gif")