8. Mehrere Sensoren verwenden

Ein Brick kann auch mit mehreren verschiedenen Sensoren ausgerüstet werden (maximal 4). Dies ist auch im Simulationsmodus möglich. Will man im Simulationsmodus einen Sensor im hinteren Teil des Roboters anbringen, muss man diesen Sensor am Sensorport S4 anschliessen.

Beispiel 1: Roboter hat einen Soundsensor, einen Lichtsensor (vorne) und einen Touchsensor (hinten).
Der Roboter startet bei einem akustischen Signal (z. Bsp. laut Klatschen oder Pfeifen) und bewegt sich vorwärts. Wenn er mit dem Lichtsensor dunkel sieht, so bewegt er sich rückwärts so lange, bis er mit dem Touchsensor die gelbe Wand berührt. Danach bewegt er sich wieder vorwärts.

Die Sensorwerte werden mit Pollen in einer endlosen Schleife abgefragt. Bei der Simulation wird das Hintergrundbild, welches im RobotContext mit useBackground aufgeführt ist, mit dem Lichtsensor "gelesen" und das Hintergrundbild, welches mit useObstacle aufgeführt ist, vom Touchsensor wahrgenommen.

 

 



# Ro8a.py

from simrobot import *
#from ev3robot import *

RobotContext.useBackground("sprites/bridge.gif")
RobotContext.useObstacle("sprites/bar2.gif", 250, 350)
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
ss = SoundSensor(SensorPort.S1)
robot.addPart(ss)
ts = TouchSensor(SensorPort.S4)
robot.addPart(ts)
ls = LightSensor(SensorPort.S3)
robot.addPart(ls)

while not robot.isEscapeHit():
   if ss.getValue() > 30:
      print ss.getValue()
      gear.forward()
   if ts.isPressed():
      gear.forward()
   if ls.getValue() < 500:
      gear.backward()
   Tools.delay(100)   
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

ts = TouchSensor(SensorPort.S4): Touchsensor ist am Port S4 angeschlossen. Im Simulationsmodus erscheint er daher hinten. Im Realen Modus spielt die Portzuteilung keine Rolle
Tools.delay(100): Alle drei Sensoren werden ständig abgefragt. Um das System zu entlasten, ist es besser kleine Pausen einzubauen

 

Beispiel 2: Roboter mit einem Ultraschallsensor und einem Touchsensor.
Das Programm mit Ultraschallsensor, der einen Gegenstand (Target) sucht kann mit einem Touchsensor erweitert werden. Der Roboter dreht zuerst am Ort, bis er ein Target findet, dann fährt er auf ihn los und hält an wenn er daran anstösst. Der Zusammenstoss mit dem Target wird als Ereignis aufgefasst und der Touchsensor mit Events programmiert.

Die Verwendung von Events kann ein Programm vereinfachen und leichter verständlich machen, da die Callbacks eigeständige Programmblöcke bilden, die nur dann durchlaufen werden, wenn der Event eintritt.

 


# Ro8b.py

from simrobot import *
#from ev3robot import *

mesh = [[50, 0], [25, 43], [-25, 43], [-50, 0],[-25, -43], [25, -43]] 
RobotContext.useTarget("sprites/redtarget.gif", mesh, 400, 400)
RobotContext.useObstacle("sprites/redtarget.gif",400,400)                      

def pressCallback(port):
   gear.stop()

def searchTarget():
   global left, right
   found = False
   step = 0

   while not robot.isEscapeHit():  
      gear.right(50)
      step = step + 1
      dist = us.getDistance()
      if dist != -1:
         if not found:
            found = True
            left = step
      else:
         if found:   
            right = step
            break

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.setSpeed(10)
us = UltrasonicSensor(SensorPort.S1)
robot.addPart(us)
us.setBeamAreaColor(Color.green)  
us.setProximityCircleColor(Color.lightGray)
ts = TouchSensor(SensorPort.S3, 
     pressed = pressCallback)
robot.addPart(ts)
print "Searching target..."
searchTarget()
gear.left((right - left) * 25)
gear.forward()

while not robot.isEscapeHit()and gear.isMoving(): 
   dist = us.getDistance()
   print "Distance = " + str(dist)
print "All done"      
robot.exit()
Programmcode markieren (Ctrl+C kopieren)

Erklärungen zum Programmcode:

RobotContext.useTarget("sprites/redtarget.gif",mesh, 400, 400) : die Bilddatei für den Ultraschallsensor
RobotContext.useObstacle("sprites/redtarget.gif",400,400): die Bilddatei für den Touchsensor
if dist != -1: Die Levels beim realen Sensor müssen angepasst werden. Bei der Simulation ist der Wert -1, wenn kein Objekt gefunden hat. (Im realen Modus 255)
gear.left((right - left) * 25): Damit der Roboter direkt auf das Target fährt, wird zuerst der linke und der rechter Rand registriert, dann dreht der Roboter um den halben Winkel zurück (1 step = 50 Millisekunden). Auf hier gibts es ein leichter Unterschied zwischen den Werten im realen und Simulierten Modus.