| |
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.
- 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.
+ Das neue FishFa50.OCX (enthält auch die Beispiele).
- 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.
- 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
- 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.
- 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.
- 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.
- 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
- 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
- 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
|