Python : Radar

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

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