| | Scan der Umgebung mit ROBO TX und VB 2008 Console
Einfache Beispiele zum Einstieg in VB 2008 .NET
|
Drehkranz angetrieben durch Motor an M1 mit
Endtaster an I1 und Impulstaster an C1. UltraschallSensor (ersatzweise
auch Photowiderstand) an I8, sowie rote Lampe an O3 Programm RadarTurmEins :
Der Turm oszilliert zwischen Position 0 und 100. Dabei wird alle 10
Impulse der am Ultraschallsensor gemessene Abstandswert in cm ausgegeben.
Programm RadarTurmZwei :
Wie Eins. Hinzugekommen ist die rote Lampe zur Anzeige von Distanzwerten
kleiner 16 cm. Die Messung wurde in eine Sub verlegt. Programm
RadarTurmSechs :
Wie Zwei, aber modifiziertes Modell für einen ZweiAchsenbetrieb. |
Programm RadarTurmEins, der einfachste Fall :
Imports
System.Console
Imports FishFaceTX
Module RadarTurmEins
Dim
tx As New
FishFace()
Sub
Main()
tx.OpenController("COM4")
WriteLine("gestartet")
tx.SetMotor(Mot.M1, Dir.Left)
tx.WaitForInput(Unv.I1)
tx.SetMotor(Mot.M1, Dir.Off)
Dim
Schrittweite As
Int16 = 10
Do
Until
tx.Finish()
For i As
Int16 = 0 To 101 Step
Schrittweite
WriteLine("Position
: {0:000} Radarwert : {1:0000}",
i, tx.GetDistance(Unv.I8))
tx.StartRobMotor(Mot.M1, Dir.Right,
512, Schrittweite)
tx.WaitForMotor(Mot.M1)
Next
For i As
Int16 = 90 To 0 Step
-Schrittweite
tx.StartRobMotor(Mot.M1, Dir.Left,
512, Schrittweite)
tx.WaitForMotor(Mot.M1)
WriteLine("Position
: {0:000} Radarwert : {1:0000}",
i, tx.GetDistance(Unv.I8))
Next
Loop
tx.CloseController()
WriteLine("FINIS")
ReadLine()
End
Sub
End Module
Anmerkungen :
- Imports für den Zugriff auf die Console (WriteLine, ReadLine) und auf
FishFaceTX.DLL (Achtung in My Project einen entsprechenden Verweis einrichten).
- Dim tx : Instanzieren eines FishFace-Objekts
- tx.OpenController : Herstellen einer Verbindung zum TX-Controller (COM-Name
mit RoboTxTest.EXE ermitteln).
- tx.SetMotor ...: Der Drehkranz wird zu seiner Home-Position am Endtaster
gefahren.
- Do Until : Endlosschleife, Abbruch durch ESC-Taste
- For i : Zwei Schleifen um den Drehkranz in 10er Schritten (Schrittweite) erst
nach rechts und dann wieder nach links zu drehen. Bei jeder Zwischenposition
wird der aktuelle Abstandswert angezeigt. Zum Positionieren wird die Methode
StartRobMotor verwendet, sie erlaubt die Angabe der zu fahrenden Impulse. Bei
Linksdrehung wird zusätzlich noch auf den Endtaster abgefragt um dessen
Überfahren zu verhindern. Die Methode ist asynchron und beendet sich selber. Um
im Programm festzustellen, ob das Ziel erreicht wurde, wird die Methode
WaitForMotor eingesetzt.
Program RadarTurmZwei :
Imports
FishFaceTX
Module RadarTurm
Const
SchrittWeite = 10
Const
DistLimit = 16
Sub Main()
tx.OpenController("COM4")
Console.WriteLine("gestartet")
tx.SetMotor(Mot.M1, Dir.Left)
tx.WaitForInput(Unv.I1)
tx.SetMotor(Mot.M1, Dir.Off)
Next
For i As
Int16 = 100 To 0 StepNext
Loop
tx.CloseController()
Console.WriteLine("FINIS")
Console.ReadLine()
Else
tx.SetLamp(Out.O3, Dir.Off)
Console.WriteLine("Position
: {0:000} Radarwert : {1:0000}",
Pos, Distanz)
tx.StartRobMotor(Mot.M1, Turn, 512, SchrittWeite)
tx.WaitForMotor(Mot.M1)
Module
Anmerkungen :
- Aufbau wie Eins. Die Positionierung des Drehkranzes wurde aber in ein eigenes
Unterprogramm verlegt. Hier lohnt sich das da der Code in den beiden Schleifen
nahezu gleich ist.
- Die Unterschiede zwischen Rechts- und Links-Schleife werden als Parameter
übergeben : Turn, Pos
- In der Sub selber ist zusätzlich eine Abfrage auf DistLimit enthalten bei
dessen Unterschreitung die rote Lampe ein- sonst aus-geschaltet wird.
- die {0:0000} und {1:0000} dienen der Formatierung der Ausgabe. Hier Parameter
0 und 1 sollen immer drei- bzw. vierstellig, ggf. mit führenden Nullen
ausgegeben werden. So stehen die Ausgaben schön untereinander.
RadarTurmSechs : Jetzt wird es etwas
komplizierter - Betrieb mit zwei Bewegungsachsen
|
Imports
FishFaceTX
Module
SechsMain
Dim
tx As New
FishFace()
Const
motTurm As Mot
= Mot.M1
Const
endTurm As Unv
= Unv.I1
Const
impTurm As Cnt
= Cnt.C1
Const
motSensor As
Mot = Mot.M2
Const
endSensor As
Unv = Unv.I2
Const
impSensor As
Cnt = Cnt.C2
Const
roteLampe As
Out = Out.O5
Const
ultraSensor As
Unv = Unv.I8
Const
SchrittWeite = 5
Const
SchrittAufAb = 3
Const
DistLimit = 16
Sub
Main()
.....
End Sub
|
Sub
Distance(ByVal Turn As
Dir, ByVal Pos As
Int32)
Dim
Distanz As
Int32
tx.SetMotor(motSensor,
Dir.Left)
tx.WaitForInput(endSensor)
tx.SetMotor(motSensor, Dir.Right)
For
i As Int16 = 0 To If
tx.Finish() Then Return
Distanz
= tx.GetDistance(Unv.I8)
If
Distanz < DistLimit Then
tx.SetLamp(roteLampe,
Dir.On)
Else
tx.SetLamp(roteLampe,
Dir.Off)
End
Console.WriteLine("Position
: {0:000} / {2:000} Radarwert : {1:0000}",
_
Pos, Distanz, i)
tx.SetMotor(motSensor, SchrittAufAb)
Next
tx.SetMotor(motSensor,
Dir.Off)
tx.StartRobMotor(motTurm,
Turn, 512, SchrittWeite)
tx.WaitForMotor(motTurm)
End
Sub
End Module
Anmerkungen :
- Aufbau wie RadarTurmZwei. Anstelle der enums für die Parameter wurden
modellspez. Bezeichnungen verwendet : Also stat Mot.M1 - motTurm .. impTurm /
impSensor wurden nur der vollständigkeithalber aufgeführt, sie sind den
RobMotoren fest zugeordnet.
- Sub Main wie bisher, Erweiterungen sind in Sub Distance untergebracht.
- Zweite Achse (motSensor) : Bewegung zunächst linksdrehend zum EndTaster, dann
in SchrittAufAb Messen analog Turmbewegung. Anzeige Distanz / roteLampe wie
bisher. Die Positionsausgabe enthält jetzt eine zusätzliche Höhenangabe.
- If tx.Finish() : wurde mehrmals eingefügt, um die Abbrechbarkeit des
Programms zu gewährleisten. Do Until mit tx.Finish() allein reicht nicht da die
Befehle in den Schleifen von Distance zwar abgebrochen werden, die Schleifen
selber aber weiterlaufen.
Download
Sources enthalten in DrehzahlD
Weitere Radartürme sind auf radar.htm und radarex.htm
zu bewundern.
Stand : 02.02.2010
|