TurmVonHanoi

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

 

Industry Robots und der Turm von Hanoi

Schöne, komplizierte und große Programme finden sich mehrere auf der Site, aber ganz einfache mit Pfiff fehlen noch, hier die Visual Basic Version der Knobelaufgabe "Turm von Hanoi" - Schritt für Schritt.
  1. Was man dazu braucht :
    + Visual Basic 6.
    + Einen fischertechnik Industry Robot : Rob3 Säulenrobot oder Rob4 Knickarmrobot
    + Ein fischertechnik Interface (Parallel (Universal) oder Seriell (Intelligent))
    + Einen Magneten (Art.Nr. 32 363), der federnd am Greifer befestigt wird und drei oder mehr runde Eisenscheiben mit Durchmessern zwischen 10 - 60 mm, ca.1 mm dick. Unterschiedlich große Münzen tun es auch, wenn sie magnetisch sind. Wenn der Magnet sie nicht wieder losläßt, ein, zwei Lagen Tesafilm draufkleben. Hanoi : GreiferMagnet
    + Das neue FishFa50.OCX (enthält auch die Beispiele).
  2. Beginnen des VB6 Projektes
    + Anlegen eines Standard-Projektes mit einer einfachen Form
    + Markieren von FishFace Control 5.0 (FishFa50.OCX) in Projekt | Komponenten. Wenn es nicht zu finden ist auf Durchsuchen Klicken und in der Fileliste markieren (sollte bei der Installation von FishFa50.ZIP in \Windows\System bzw. \WinNT\System32 gelandet sein.
    + Das Control FishFace auf die Form ziehen und ft taufen.
    + Und dann (Hinweise später) noch einige Buttons und Labels plazieren.
  3. Die globalen Daten
    Option Explicit
    Dim PortName$
    und Konstanten zur Beschreibung des Problems
    Const Scheiben = 3
    Const hanSaule = 1, hanPosA = 140, hanPosB = 110, hanPosC = 80
    Const hanArmHor = 2
    Const hanArm = 3, hanOben = 50, hanUnten = 100
    Const hanGreifer = 4
  4. Initialisieren
    Private Sub Form_Load()
    Starten des Interfaces
    If ft.OpenInterface("COM1") = ftifehler Then
    MsgBox "Interface-Problem", vbCritical + vbOKOnly, App.ProductName
    Exit Sub
    End If
    Und Beschreiben des Robots
    With ft.MotCntl
    .Name(1) = "Säule"
    .EndPosition(1) = 240
    .Name(2) = "ArmHorizontal"
    .EndPosition(2) = 140
    .Name(3) = "ArmVertikal"
    .EndPosition(3) = 112
    .Name(4) = "Greifer"
    .EndPosition(4) = 26
    End With
    End Sub
    Das FishFace Objekt ft.MotCntl (Bestandteil des FishFace Controls) enthält eine kompakte Beschreibung des Robots. Aufgeführt wurden nur die von den Defaults abweichenden Werte Name der Robot-Komponente und die Anzahl der Impulse, die sich die Komponente vom Endtaster wegbewegen darf, hier die Werte für Rob3. Die Ende(Taster) sind 1, 3, 5, 7 und die Impuls(Taster) 2, 4, 6, 8, die Motoren 1 - 4. Sie (die Motoren) sollten so gepolt sein, dass sie beim Klicken auf "L" im InterfacePanel (ft.ShowPanel) in Richtung Endtaster laufen.
  5. Starten von Hanoi
    Private Sub cmdAction_Click()
    Init
    Hanoi Scheiben, hanPosA, hanPosB, hanPosC
    ft.MoveTo hanPosB, 0, 0
    lblStatus.Caption = "Fertig"
    End Sub

    Init : Fahren auf Ausgangsposition

    Private Sub Init()
    ft.NotHalt = False
    ft.MoveHome
    ft.DriveTo hanArmHor, 120
    ScheibeLegen
    ArmHeben
    SauleNach hanPosA
    End Sub

    Hanoi : Starten des eigentlichen Programms. Es werden die Anzahl der Scheiben auf Position A angegeben und die drei nutzbaren Positionen in der gewünschten Reihenfolge aufgezählt.
    Und dann noch auf die Endposition fahren und die Fertig-Meldung.
  6. Hanoi
    Private Sub Hanoi(ByVal n&, ByVal PosA&, ByVal PosB&, ByVal PosC&)
    If n = 1 Then
    Ziehe PosA, PosB
    Else
    Hanoi n - 1, PosA, PosC, PosB
    Ziehe PosA, PosB
    Hanoi n - 1, PosC, PosB, PosA
    End If
    End Sub
    Wenn auf PosA nur noch eine Scheibe liegt, wird sie auf PosB gelegt und das Unterprogramm beendet. Wenn auf PosA noch mehrere Scheiben liegen, wird Hanoi mit der um eins verminderten Scheibenzahl erneut (rekursiv) aufgerufen, die oberste Scheibe wird umgelegt und wieder Hanoi mit n-1.
  7. Umlegen einer Scheibe
    Private Sub Ziehe(ByVal PosA&, ByVal PosB&)
    lblStatus.Caption = PosA & " nach " & PosB
    Hole PosA
    Setze PosB
    End Sub
    Holen der obersten Scheibe von PosA (wieviele Scheiben auf PosA liegen ist hier nicht bekannt, deswegen der gefederte Magnet, er stammt aus dem Computing Kasten von 1984 und dem dortigen "Turm von Hanoi Robot".
    Und absetzen oben auf PosB
    Hier noch die Programme dazu

    Private Sub Hole(ByVal Pos&)
    SauleNach Pos
    ArmSenken
    ScheibeGreifen
    ArmHeben
    End Sub

    Und

    Private Sub Setze(ByVal Pos&)
    SauleNach Pos
    ArmSenken
    ScheibeLegen
    ArmHeben
    End Sub
  8. Hilfsprogramme
    Hanoi und Ziehe (mit Hole und Setze) sind die Kernprogramme zum Lösen des Problem, es fehlen jetzt noch die Hilfprogramme zu Betreiben des Robots:

    Private Sub ArmHeben()
    ft.DriveTo hanArm, hanOben
    End Sub

    Private Sub ArmSenken()
    ft.DriveTo hanArm, hanUnten
    End Sub

    Private Sub SauleNach(ByVal Pos&)
    ft.DriveTo hanSaule, Pos
    End Sub

    Private Sub ScheibeGreifen()
    ft.SetMotor hanGreifer, ftiEin
    End Sub

    Private Sub ScheibeLegen()
    ft.SetMotor hanGreifer, ftiAus
    End Sub
  9. Das Ende

    Private Sub cmdEnde_Click()
    Unload Me
    End Sub
    Der neue Button ENDE beendet das Programm über die Sub Form_Unload.

    Private Sub Form_Unload(Cancel As Integer)
    ft.NotHalt = True
    ft.CloseInterface
    End Sub

    Die ft.Eigenschaft NotHalt wird auf True gesetzt, um noch laufenden ft.Methoden zu beenden und dann wird die Verbindung zum Interface geschlossen. Die Platzierung in Form_Unload hat den Vorteil, dass auch ein Klick auf "x" zum korrektenEnde führt.

Das war schon alles und soll gleichzeitig der Ausgangspunkt für ein viel schöneres, größeres und komplizierteres eigenes Programm sein.

Weitere Programme zum gleichen Thema

Seite Turm von Hanoi

Stand : 08.10.2003