Radarturm Ultra

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

Eigenbau : Der Radarturm mit Ultraschallsensor

Modell RadarTurm diesmal in schwarz/rot.

Das Modell simuliert einen Radarturm durch Abtasten der Umgebung mit dem Ultraschallsensor des ROBO Explorer. Die erhaltenen Abstandswerte werden in Farbinformationen auf dem "Radarschirm" des Betriebsprogrammes angezeigt - Nah : kleiner 15 cm, Mittel - kleiner 75 cm, Weit - darüber. Das Modell lehnt sich an den alten Radarturm an, auch wenn es gründlich anders aussieht. Das Betriebsprogramm erfüllt die gleiche Aufgabe, wurde aber in C# 2005 und in gleicher Struktur in VB2005 auf Basis der FishFace2005.DLL vollkommen neu entwickelt.

Radar-Panel des Modell RadarTurm.

 Anmerkungen zum Betriebsprogramm in C# 2005

Es setzt auf der Vorlage FishRobotWindowsCS siehe auch CS2005 / VB2005 Seite auf. Verwendet wird die Klasse FishtRobot. Das OpenInterface wurde für die Nutzung des Ultraschallsensors modifiziert.
Zu VB2005 siehe weiter unten :

Zunächst die Interfacebelegung und andere nützliche Konstanten :

const

Die Instanzierung von FishRobot sieht so aus :

FishRobot ft = new FishRobot(new int[,] { { mTurm, 180 }, { mSensor, 99 }});

Die End- und Impulstaster werden in Abhängigkeit der Motoren intern festvergeben :
mTurm, Ende : Inp.I1, Impuls : Inp.I2, mSensor, Ende : Inp.I3, Impuls : Inp.I4 
180 bzw. 99 stehen für den maximalen Fahrweg.

ft.OpenInterface(IFTypen.ftROBO_first_USB, 0, Distance.UltraSonic);

Der Betrieb des Modells läuft in der Routine Action() ab :

private void Action() {
   rs = picAnzeige.CreateGraphics();
   rs.Clear(Color.Black);
   lblPosition.Text = "Bei der Arbeit";

  while (!ft.Finish()) {
      lblStatus.Text = "Home";
      ft.MoveHome();
      while(ft.MotCntl[iTurm].actPos < ft.MotCntl[iTurm].maxPos && !ft.Finish()){
         ft.MoveTo(ft.MotCntl[iTurm].actPos, ft.MotCntl[iSensor].maxPos);
         ft.MoveDelta(incTurm);
         ft.MoveTo(ft.MotCntl[iTurm].actPos, 0);
      ft.MoveDelta(incTurm);
       }
       while (ft.MotCntl[iTurm].actPos > 0 && !ft.Finish()) {
          ft.MoveTo(ft.MotCntl[iTurm].actPos, ft.MotCntl[iSensor].maxPos);
          ft.MoveDelta(-incTurm);
          ft.MoveTo(ft.MotCntl[iTurm].actPos, 0);
      ft.MoveDelta(-incTurm);
        }}}

Eine EndlosSchleife in der der Turm um jeweils incTurm Impuls weiterfährt, dann stoppt damit der Sensor die Umgebung von oben nach unten und dann von unten nach oben abtasten kann. Dazu fährt das Modell zunächst auf die Home-Position (an die Endtaster) und dann in incTurm-Schritten weg vom Endtaster, zwischendurch wird gescannt. In der zweiten while-Schleife gehts dann wieder zurück auf den Endtaster des Turms zu.

Die Positionsanzeige erfolgt in einer Event-Routinen, die durch MoveTo/MoveDelta intern ausgelöst wird.

private void PositionAusgabe(object sender, int   if ((actPos[iTurm] % incTurm) > 0) return   string Pos = "Position : "   for (int      Pos += actPos[i].ToString("000") + " - "    }
    Pos += actPos[actPos.Length - 1].ToString("000");
    int dis = ft.GetDistance(dSensor);
    lblPosition.Text = Pos + " Wert : " + dis.ToString();
    if (actPos.Length == 2) {
       if (dis < disNah) Farbe = new SolidBrush(Color       else if (dis < disMittel) Farbe = new SolidBrush(Color       else Farbe = new SolidBrush(Color     rs.FillRectangle(Farbe, actPos[iTurm] * 2, actPos[iSensor] * 2, 50, 4);
   }}

Im Label lblPosition werden die aktuelle Position und der Distancewert angezeigt. Zusätzlich wird der Distancewert klassifiziert : Nah, Mittel, Weit und farblich codiert in der PictureBox picAnzeige als Rechteck 50 * 4 angezeigt.

VB2005 Version

Private   rs = picAnzeige.CreateGraphics()
   rs.Clear(Color.Black)
   Do
      lblStatus.Text = "Home"
      ft.MoveHome()      Do While ft.MotCntl(iTurm).actPos < ft.MotCntl(iTurm).maxPos And Not          ft.MoveDelta(incTurm)
          ft.MoveTo(ft.MotCntl(iTurm).actPos, 0)
          ft.MoveDelta(incTurm)
       Loop
       Do While ft.MotCntl(iTurm).actPos > 0 And Not         ft.MoveTo(ft.MotCntl(iTurm).actPos, ft.MotCntl(iSensor).maxPos)
         ft.MoveDelta(-incTurm)
         ft.MoveTo(ft.MotCntl(iTurm).actPos, 0)
         ft.MoveDelta(-incTurm)
       Loop
     Loop Until  End Sub

Die Action Routine in der VB2005 Version

Private   If (ActPositions(iTurm) Mod incTurm) > 0 Then     Dim Pos As String =
    Pos &= ft.MotCntl(iTurm).actPos.ToString("000") &
    Pos &= ft.MotCntl(iSensor).actPos.ToString("000")
    Dim dis As Integer    lblPosition.Text = Pos & " Wert : " & dis.ToString()
    If ActPositions.Length = 2       If dis < disNah
         Farbe = New SolidBrush(Color.Red)
       ElseIf dis < disMittel
         Farbe = New SolidBrush(Color.Yellow)
       Else
         Farbe = New SolidBrush(Color.Green)
       End
       rs.FillRectangle(Farbe, ActPositions(iTurm) * 2, ActPositions(iSensor) * 2, 50, 4)
     End Sub

Und hier die VB2005 Version der Event-Routine. Es sieht etwas anders aus, aber einen wirklichen Unterschied gibt es nicht.

Download

Das Betriebsprogramm (VB2005 / C# 2005) ist in UlraRadar.ZIP enthalten.

Und noch einen Radarscanner von Johannes Hoermann

Der Distanzsensor auf dem Radarturm macht eine volle Umdrehung und zeigt dabei die jeweils gemessene Entfernung auf einem Radarschirm winkelgerecht an.

Details sind bei http://www.die-hoermaenner.de/johannes/Computer/ft radar.php zu finden.

Hier noch ein minimalistischer Aufbau von mir mit Reedkontakt zur Bestimmung des Nullpunktes (Magnet dazu links außen). Das Modell kann ebenfalls mit dem Hoermann-Programm betrieben werden.

Stand : 16.01.2011