Jython HomeDruckenJava-Online

Remotesteuerung mit Cursortasten und Smartphone

Im Remote-und Simulationsmodus kann der Roboter mitt den Cursor-Tasten und den Tasten Escape und Enter wie mit einer Fernsteuerung  bewegt werden. Die Funktionen isUpHit(), isDownHit(), isLeftHit(), isRightHit(), isEnterHit() und isEscapeHit() geben True zurück, wenn die entsprechende Taste gedrückt wurde. Die Aktionen, die das Drücken dieser Tasten auslösen soll, werden im Programm festgelegt. Die folgenden Beispiele können nur im Remote- Modus ausgeführt werden, d.h. auf dem Raspi muss mit langem Drücken der Taste das Brickgate-Programm gestartet werden (auf dem Display erscheint Hold)..


Beispiel 1: Roboter mit den Tastaturtasten steuern

Die Tasten werden wie folgt belegt:

  • UP: vorwärts fahren
  • DOWN: rückwärts fahren
  • LEFT: auf dem linken Kreisbogen fahren
  • RIGHT: auf dem rechten Kreisbogen fahren
  • ENTER: anhalten
  • ESCAPE: Programmausführung beenden
# KeyControl1.py

from raspisim import *
# from raspibrick import *

robot = Robot()
gear = Gear()
gear.setSpeed(20)

while not isEscapeHit():
    if isUpHit():
        gear.forward()
    elif isDownHit():
        gear.backward()
    elif isLeftHit():
        gear.leftArc(0.1)
    elif isRightHit():
        gear.rightArc(0.1)
    elif isEnterHit():
        gear.stop()   
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 

Tastaturtasten

Erklärungen zum Programmcode:

if isUpHit(): Die nachfolgende Anweisung wird ausgeführt, wenn die Taste UP gedrückt wurde. Analog beim Drücken der Tasten DOWN, LEFT, RIGHT und ENTER. Man nennt dieses Verfahren auch "pollen" der Tasten. Es wird allerdings nicht genau zum Zeitpunkt des Aufrufs die Taste abgefragt, sondern ein Tastenflag, das gesetzt wird, wenn irgend einmal vor dem Aufruf die Taste gedrückt wurde.


Beispiel 2: Roboter durch eine Hindernisbahn steuern

Die Hindernisbahn besteht aus senkrecht aufeinander stehenden Wegstücken. Mit den Cursortasten LEFT / RIGHT dreht der Roboter jeweils in die entsprechende Richtung. Die Drehung kann mit der Taste DOWN beendet werden.

Die Tastenbelegung:

  • UP: vorwärts fahren
  • DOWN: stoppen
  • LEFT: links drehen
  • RIGHT: rechts drehen
  • ESCAPE: Programmausführung beenden
# KeyControl2.py

from raspisim import *
# from raspibrick import *

robot = Robot()
gear = Gear()

while not isEscapeHit():
    if isUpHit():
        gear.forward()
    elif isDownHit():
        gear.stop()
    elif isLeftHit():
        gear.left(550)
    elif isRightHit():
        gear.right(550)      
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 

Erklärungen zum Programmcode:

isLeftHit(): Der Roboter dreht nach links so lange bis die Taste DOWN gedrückt wird. Mit der Taste DOWN kann auch Vorwärtsbewegung und Rechtsdrehung gestoppt werden.

 

Beispiel 3: Geschwindigkeit mit den Taste UP und DOWN ändern

Die Tastenbelegung:

  • UP: die Geschwindigkeit wird um 5 vergrössert
  • DOWN: die Geschwindigkeit wird um 5 verkleinert
  • LEFT: auf einem linken Kreisbogen fahren
  • RIGHT: auf einem rechten Kreisbogen fahren
  • ESCAPE: Programmausführung beenden
# KeyControl3.py

from raspisim import *
# from raspibrick import *

robot = Robot()
gear = Gear()
speed = 15

while not isEscapeHit():
    if robot.isUpHit():
        speed += 5
        gear.setSpeed(speed)
        gear.forward()
    elif isDownHit():
        speed += - 5
        gear.setSpeed(speed)
        gear.forward()
    elif isLeftHit():
        gear.leftArc(0.1)
    elif isRightHit():
        gear.rightArc(0.1)
    elif isEnterHit():
        gear.stop()    
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
   

Erklärungen zum Programmcode:

speed += 5: die im Programm gespeicherte Geschwindigkeitswert wird um 5 vergrössert.
Danach muss mit setSpeed(speed) die Geschwindigkeit auf den neuen Wert gesetzt werden. Dieser wird aber vom Roboter erst beim nächsten Aufruf einer Bewegungsfunktion (hier forward()) wirklich übernommen

 

Beispiel 4: Roboter mit Smartphone steuern

Der direkte Modus von RaspiBrick ist perfekt angepasst, um die Motoren von einem entfernten Gerät zu steuern. Die Android-App RaspiPilot.apk wurde dem Framework JDroidLib erstellt. Man kann die fertige App mit dem untenstehendem Link oder mit dem QR-Code herunterladen und auf ihrem Smartphone installieren. Mehr Informationen zur Android-Programmierung findet man auf unserer Android-Webseite www.jdroid.ch.

Der Raspi und das Smartphone müssen mit dem gleichen Router verbunden sein und auf dem Raspi muss der Brickgate-Programm gestartet sein (Taste so lange drücken bis Hold erscheint). Nach dem Start der Android-App auf dem Smartphon erscheint eine Dialogbox, in welcher die IP-Adresse des Raspi eingegeben werden kann. Danach erschein das nebenstehende GUI-Programm, mit welchen der Raspi gesteuert werden kann.

Als spezieller Zusatz blinken die linken oder rechten LEDs, wenn der Roboter links oder rechts abbiegt. Das ist keine triviale Aufgabe, denn der Blinker muss in einem separaten Thread laufen.

App installieren auf Smartphone oder Tablet

QR-Code

 

 


Aufgaben Serie 4:

1)

Schreibe ein Programm, mit welchen du den Roboter mit den Cursortasten LEFT und RIGHT durch den Slalomparcours steuern kannst. Mit der Taste ENTER wird der Lauf beendet.

 

 



2)
Der Roboter bewegt sich auf einer Kreisbahn. Mit der Taste DOWN wird er angehalten, mit der Taste UP setzt er die Bewegung fort. Mit der Taste ESCAPE wird das Programm beendet.

 



3)

Eine Hindernisbahn besteht aus gleich langen, rechtwinklig zueinander stehenden Wegstücken. Bestimme zuerst durch Probieren, wie lange der Roboter forwärts fahren muss, um ein solches Wegstück abzufahren. Dann kannst du den Roboter nur mit zwei Tasten LEFT und RIGHT steuern.

Der Roboter fährt nach dem Start die erste Strecke vorwärts und wartet, bis du die Taste LEFT bzw. RIGHT gedrückt hast. Dann dreht er um 90° links bzw. rechts und fährt das nächste gerade Stück vorwärts.

Für die Simulation kannst du das Hintergrundbild bg.gif verwenden. welches im Programm unter RobotContext eingeführt wird.

from raspisim import*

RobotContext.setStartPosition(320, 480)
RobotContext.useBackground("sprites/bg.gif")

robot = Robot()
gear = Gear()  
robot.addPart(gear)
....