ROBO Explorer

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

ROBO Explorer von 2007 : UltraSonic mit Autopilot

Das Modell entspricht dem ROBO Explorer aus dem gleichnamigen Kasten. 

Das Betriebsprogramm gibt es in einer C# 2005 Version :

Das Programm entspricht der Summe der mitgelieferten ROBO Pro Programme Explorer 3 (es versteckt sich hinter dem AutoPiloten) und dem Explorer 4 zur manuellen Steuerung über Buttons. Bei Markierung von "Autopilot" übernimmt der Explorer3-Nachbau die Kontrolle über den Explorer und steuert ihn über den ebenfalls mitgelieferten Parcour. Die aktuellen Werte seiner Sensoren werden laufend angezeigt.

Programmdetails

Der Explorer4-Teil ist recht einfach, er besteht aus einer Reihe von Button-Routinen (MouseDown, MouseUp, Click), die die einzelnen Komponenten steuern. Die Sensor-Werte werden in der Routine Action in einer do-Schleife ständig ausgelesen und angezeigt.

Wesentlich komplexer ist der Explorer3-Teil (automatische Spursuche ...). Die Teilkomponenten wurden in eigenen Threads untergebracht(Thread(Routine) : AutoPilot(AutoLoop), Licht(LichtLoop), Temperatur(TempLoop) und Farberkennung(FarbLoop). Sie sind global deklariert und werden auf die AutoPilot-CheckBox initialisiert und gestartet. Da die Thread-Routinen einen Loop einsetzen, muß eine  Ende-Bedingung vorhanden sein, die auf Ende AutoPilot und den HALT-Button eingeht : 
while(!ft.Finish()) {
Der Thread "läuft dann selber aus". Längerlaufende ft.Methoden (Wait..., Pause) fragen zusätzlich die ft.Finish = true Bedingungen ab, um hier ein Hängenbleiben zu vermeiden.
Die Threads nutzen neben den Fahr-Routinen auch noch die Routine Hindernis(Erkennen) und Spursuche.

Das Gesamt-Programm wird im wesentlichen durch die Buttons ACTION und HALT/ENDE gesteuert. Der AutoPilot durch die zur CheckBox gehörende Routine für CheckedChanged. Hier wird eine Menge gesperrt und freigegeben. z.B. werden die Buttons hier Enabled.

Bei C# 2005 gibt es zwei funktionsgleiche Lösungen : Alles in der MainForm (thick client) und Funktionalität des Explorers selber ausgelagert in eine Klasse (thin client).

Eine interessante Lösung für das FTS

MouseExplorer : Steuern des Explorers durch Mausbewegungen

Durch Mausbewegungen in dem Quadrat mit der roten Ecke kann der Robot durch Mausbewegungen gesteuert werden. 
Maus nach oben : Vorwärts
Maus nach unten : Rückwärts

Im Einzelnen :
- LinksVor (Linkskurve)
- Vor (beide Motoren gleiche Geschwindigkeit)
- RechtsVor (Rechtskurve)
- LinksDrehen (Motoren gegenläufig)
- Halt
- RechtsDrehen (Motoren gegenläufgig)
- LinksRück (Linkskurve)
- Rück (beide Motoren gleiche Geschwindigkeit)
- RechtsRück (Rechtskurve)

Jeweils mit wählbarer Geschwindigkeit, sie steigt zum Rand hin, in der Mitte ist sie null.

Das hier gezeigte rote Feld steht für RechtsVor. Maus am oberen Rand mittig im Feld steht für Rechtskurve. Linkes Rad fährt voll, rechtes halb.

Programmausschnitt mit der Steuerung :

Private  Do
    canvas.Clear(Color.White)    If mouseY < mitteOben And mouseX < mitteLinks Then
      ft.SetMotor(Out.M1, Dir.Left, Speed(mouseX))
      ft.SetMotor(Out.M2, Dir.Left, Speed(mouseY))
      canvas.FillRectangle(Farbe, 0, 0, mitteLinks, mitteOben)
    ElseIf mouseY < mitteOben And mouseX < mitteRechts Then        ft.SetMotor(Out.M1, Dir.Left, Speed(mouseY))
       ft.SetMotor(Out.M2, Dir.Left, Speed(mouseY))
       canvas.FillRectangle(Farbe, mitteLinks, 0, mitte, mitteOben)    ElseIf mouseY < mitteOben Then
       ft.SetMotor(Out.M1, Dir.Left, Speed(mouseY))
       ft.SetMotor(Out.M2, Dir.Left, Speed(mouseX))
       canvas.FillRectangle(Farbe, mitteRechts, 0, mitteLinks, mitteOben)    ElseIf mouseY < MitteUnten And mouseX < mitteLinks Then
       ft.SetMotor(Out.M1, Dir.Left, Speed(mouseX))
       ft.SetMotor(Out.M2, Dir.Right, Speed(mouseX))
       canvas.FillRectangle(Farbe, 0, mitteLinks, mitteLinks, mitte)    ElseIf mouseY < MitteUnten And mouseX < mitteRechts Then
       ft.SetMotor(Out.M1, Dir.Off)
       ft.SetMotor(Out.M2, Dir.Off)    ElseIf mouseY < MitteUnten Then
       ft.SetMotor(Out.M1, Dir.Right, Speed(mouseX))
       ft.SetMotor(Out.M2, Dir.Left, Speed(mouseX))
       canvas.FillRectangle(Farbe, mitteRechts, mitteOben, mitteLinks, mitte)    ElseIf mouseX < mitteLinks Then
       ft.SetMotor(Out.M1, Dir.Right, Speed(mouseX))
       ft.SetMotor(Out.M2, Dir.Right, Speed(mouseY))
       canvas.FillRectangle(Farbe, 0, MitteUnten, mitteLinks, mitteOben)    ElseIf mouseX < mitteRechts Then
       ft.SetMotor(Out.M1, Dir.Right, Speed(mouseY))
       ft.SetMotor(Out.M2, Dir.Right, Speed(mouseY))
       canvas.FillRectangle(Farbe, mitteLinks, MitteUnten, mitte, mitteOben)    Else
       ft.SetMotor(Out.M1, Dir.Right, Speed(mouseY))
       ft.SetMotor(Out.M2, Dir.Right, Speed(mouseX))
       canvas.FillRectangle(Farbe, mitteRechts, MitteUnten, mitteLinks, mitteOben)    End Sub

Das Programm ist mit VB2005 / FishFace2005.DLL für das Robo Interface geschrieben.

Nur Action : Der Explorer gesteuert über den Wiimote

Steuern des Explorers über den Wii Remote mit VB2008 (Standard-Template FishWindowsVB), FishFace2005.DLL/umFish40.DLL und WiimoteLib.DLL. Das Modell wird über ein Robo Interface und eine Robo RF Datalink betrieben und über ein Wii Remote über Bluetooth gesteuert. Der Explorer hat hier (wie üblich) zwei Motoren (mit Ketten oder Raupen) an M1 und M2 und eine gelbe Lampe an M4 (Gelbblinker) :

Imports FishFace40
Imports
WiimoteLib

Public Class WiiExplorer
  Dim ft As New FishFace()
  Dim wii As New Wiimote()
  Dim gelbOn As Boolean = False

Instanzieren von FishFace (über RF Datalink) und der WiimoteLib für den Zugriff auf Wiimote über Bluetooth sowie einer Statusvariablen für den Gelbblinker.

 Private Sub Action()
      Do
         If wii.WiimoteState.ButtonState.Up Then
              ft.SetMotor(Out.M1, Dir.Left)
              ft.SetMotor(Out.M2, Dir.Left)
          ElseIf wii.WiimoteState.ButtonState.Down Then
              ft.SetMotor(Out.M1, Dir.Right)
              ft.SetMotor(Out.M2, Dir.Right)
          ElseIf wii.WiimoteState.ButtonState.Left Then
              ft.SetMotor(Out.M1, Dir.Left)
              ft.SetMotor(Out.M2, Dir.Right, Speed.Half)
          ElseIf wii.WiimoteState.ButtonState.Right Then
              ft.SetMotor(Out.M1, Dir.Right)
              ft.SetMotor(Out.M2, Dir.Left, Speed.Half)
          ElseIf wii.WiimoteState.ButtonState.Plus Then
               tmrGelb.Enabled = True
          ElseIf wii.WiimoteState.ButtonState.Minus Then
               tmrGelb.Enabled = False
               ft.SetMotor(Out.O4, Dir.Off)
           Else
              ft.SetMotor(Out.M1, Dir.Off)
              ft.SetMotor(Out.M2, Dir.Off)
           End If
               ft.Pause(333)
           Loop Until ft.Finish()
           ft.SetMotor(Out.O4, Dir.Off)
        End Sub

Das eigentliche Programm liegt in Sub Action() und ist rechtübersichtlich : In einer Schleife werden die interessierenden Tasten (Kreuz, +/-) des Wiimote auf gedrückt abgefragt. Im True-Fall werden die Motoren entsprechend gesteuert. Bei Plus/Minus wird die TimerTick Routine für den Gelbblinker (de)aktiviert. 

"--- ProgramControl ---" 
wii.Connect()
wii.SetLEDs(
False, True, True, False)
wii.Disconnect()

Standard ProgrammControl mit zusätzlich Befehlen für das Wiimote.

Private Sub tmrGelb_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 
Handles
tmrGelb.Tick
   If gelbOn Then
      ft.SetMotor(Out.O4, Dir.On)
    Else
       ft.SetMotor(Out.O4, Dir.Off)
    End If
    gelbOn = Not gelbOn
  End Sub
End
Class

Der TimerTick schaltet die glebe Lampe ein/aus (Interval 333)

Hinweis : Die Ansteuerung des Wiimote zickt bei mir etwas, Vorgehen : Vor Einschalten des Wiimote das Gerät in der Bluetooth-Liste löschen, Wiimote einschalten und wieder installieren. Das hält solange es eingeschaltet bleibt.

Mitwirkende :

Marcel (ein Mann so alt wie das Jahrtausend) hat die praktische Erprobung besorgt
Johannes Hörmann (viel älter) hat mich mit seinen Versuchen zum Thema auf die Idee gebracht
Wiimote(liegt bei) stammt von Brian Peek.
FishFace2005.DLL und umFish40.DLL (liegen bei) und über die Sprachenseite

Download

Die Programme MouseExplorer (VB2005), Eplorer Super (C# 2005 und VB2005) sowie WiiExplorer (VB2008) in ExAuto.ZIP enthalten. _ReadMe.TXT konsultieren.

Die Lösung mit der neuen Programmiersprache : Processing

Stand : 10.10.2010