Samstag, 11. Mai 2013

Abstandsmessungen mit dem Netduino

Quadrocopter_41

Links: HC-SR04 Ultraschall Sensor, Rechts: GP2-1080 Optischer Sensor

Für die Abstandsmessung kann wahlweise ein Ultraschall- oder ein optischer Sensor verwendet werden. Naja beides könnte man auch verwenden, es kommt aber auf die Anwendung an:

  • Welche Entfernungen muss ich messen können?
  • In welcher Umgebung wird agiert?
  • Wie sieht es mit Störfaktoren aus?
  • Wie viel darf der Sensor kosten?

Was nun von beidem besser ist, möchte ich hier nicht begründen, da beide Varianten eine Daseinsberechtigung haben. Für einen richtigen Vergleich hätte ich allerdings mehr einkaufen müssen, daher ist meine Vergleichstabelle nur als Ansatz gedacht.

  HC-SR04 GP2-1080
Betriebsspannung 5V 4,5V-5,5V
Stromaufnahme 15mA 33mA
Messung erfolgt Abstand von Trigger Puls bis Echo Puls Ergebnis wird als Analoges Spannungssignal ausgegeben
Distanzmessung 2cm - 400cm 10cm – 80cm
Nachteile Kann durch Geräusche gestört werden Funktioniert auf Reflektierenden Oberflächen nicht
Vorteile weite Distanz-Messung Kann leicht in Analoge Schaltungen verwendet werden.
Preis 1,86€ (Ebay, aus China Import), ab 4,99€ (Amazon)
7,05€ (Reichelt)

Im programmatischen Anteil sind beide recht unterschiedlich von der Handhabung. Wo es beim optischen Sensor geradezu ein Kinderspiel ist, zeigt sich der Ultraschallsensor wesentlich aufwendiger.

image
Schaltbild für den optischen Sensor

So einfach der Aufbau, so einfach ist auch der Programmcode.

public static void Main()
{
    AnalogInput ai = new AnalogInput(Cpu.AnalogChannel.ANALOG_0);

    while (true)
    {
        Debug.Print("ReadRaw:" + ai.ReadRaw().ToString());
        Thread.Sleep(10);
    }
}

Die Ausgabe zeigt einen Wert zwischen 0 bis 1000 an.

Ich glaube, dass ist bisher unter den Sensoren der übersichtlichste Programmcode, was ich bisher posten konnte. Im Grunde wird nur ein Pegel vom Infrarotsensor gemessen. Beim Ultraschallsensor ist nur die einfache Verkabelung, der Rest sieht daher leider anders aus.

image
Die Schaltung mit dem Ultraschall Sensor ist unwesentlich gegenüber dem optischen Sensor. (Leider gibt es in der Fritzing Software den Ultraschallsensor nicht.)

Für den Ultraschallsensor habe ich versucht, so weit wie möglich zu kürzen. Naja, das ist dabei herausgekommen:

private static long _End;

public static void Main()
{
    OutputPort transmitter = new OutputPort(Pins.GPIO_PIN_D12, false);
    InterruptPort receiver = new InterruptPort(Pins.GPIO_PIN_D11, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeLow);

    receiver.OnInterrupt += new NativeEventHandler(receiver_OnInterrupt);

    long begin;
    long result = 0;

   while (true)
    {
        // Sende Ping
        transmitter.Write(true);
        Thread.Sleep(1);

       // Werte auf Startpunkt festlegen
        _End = 0;
        begin = DateTime.Now.Ticks;
        transmitter.Write(false);

       // Bis in 50 Millisekunden sollte die Messung erfolgt sein.
        Thread.Sleep(50);

        if (_End > 0)
        {
           // Differenz von Start und Stopzeit berechnen
            result = _End - begin;
            if (result < 0)
            {
                result = 0;
            }
        }

        Debug.Print("Result: " + result.ToString());
        Thread.Sleep(100);
    }
}
// Wird ausgeführt, wenn der Ping Empfangen wurde.
private static void receiver_OnInterrupt(uint data1, uint data2, DateTime time)
{
    _End = time.Ticks;
}

Deutlich mehr als das, was man vermutet.

Wenn man sich unbelastet und die Sache als Unerfahrener von außen betrachtet, würde man davon ausgehen, dass die vielen Chips auf dem HC-SR04 bereits diese Arbeit abnimmt. Wer nicht viel drum herum programmieren möchte, der sollte zumindest eine fertige Klasse schreiben. Wer Threads verwendet, der sollte berücksichtigen, dass es zu Messfehlern kommen kann.

Fazit: Wer einen großen Messbereich für wenig Geld benötigt, für den ist der Ultraschallsensor das Richtige. Für einfache und präzise Anwendungen dürfte der optische Sensor die ideale Lösung sein.

Keine Kommentare: