TigerJython | xx für Gymnasien |
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). 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
|
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. 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
|
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. |