| | Scan der Umgebung mit ROBO TX und Python 3.1.1
|
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 RadarTurmEins, der einfachste Fall :
from FishFaTX import *
tx = FishFace()
Full = 512
Turm = 1
Impuls = 1
EndTaster = 1
Distance = 8
tx.OpenController(4)
tx.SetMotor(0, Turm, tx.Links)
tx.WaitForInput(0, EndTaster)
tx.SetMotor(0, Turm, tx.Aus)
inc = 10
while not tx.Finish():
for i in range(0, 101, inc):
print("Position : %4.0f Radarwert : %4.0f" %
(i, tx.GetDistance(0, Distance)))
tx.StartRobMotor(0, Turm, tx.Rechts, Full, inc)
tx.WaitForMotor(0, Turm)
for i in range(90, 0, -inc):
tx.StartRobMotor(0, Turm, tx.Links, Full, inc)
tx.WaitForMotor(0, Turm)
print("Position : %4.0f Radarwert : %4.0f" %
(i, tx.GetDistance(0, Distance)))
tx.CloseController()
print("--- FINIS ---")
Anmerkungen :
- Imports für den Zugriff auf auf FishFaTX.py
- 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.
- while : Endlosschleife, Abbruch durch ESC-Taste
- for i : Zwei Schleifen um den Drehkranz in 10er Schritten (inc) 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 :
from FishFaTX import *
tx = FishFace()
cFull = 512
mTurm = 1
oLampe = 3
cImpuls = 1
iEndTaster = 1
iDistance = 8
SchrittWeite = 10
DistLimit = 16
def Distance(Turn, Pos):
Dist = tx.GetDistance(0, iDistance)
if Dist < DistLimit: tx.SetLamp(0, oLampe, cFull)
else: tx.SetLamp(0, oLampe, tx.Aus)
print("Position : %4.0f Radarwert : %4.0f" % (Pos, Dist))
tx.StartRobMotor(0, mTurm, Turn, cFull, SchrittWeite)
tx.WaitForMotor(0, mTurm)
tx.OpenController(4)
tx.SetMotor(0, mTurm, tx.Links)
tx.WaitForInput(0, iEndTaster)
tx.SetMotor(0, mTurm, tx.Aus)
while not tx.Finish():
for i in range(0, 101, SchrittWeite): Distance(tx.Rechts, i)
for i in range(100, -1, -SchrittWeite): Distance(tx.Links, i)
tx.CloseController()
print("--- FINIS ---")
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 %4.0f und %4.0f dienen der Formatierung der Ausgabe. Die Werte sollen immer
vierstellig ausgegeben werden. So stehen die Ausgaben schön untereinander.
Download
Sources enthalten in PythonFish311.ZIP
Weitere Radartürme sind auf radar.htm und radarex.htm
zu bewundern.
Stand : 28.01.2010
|