Der nächste Sensor, den ich mir angesehen habe, ist ein Sensor zur Messung von Entfernungen mit HIlfe von Ultraschall. Es ist ein kleines Board mit der Bezeichnung HC-SR04.

 

Der Prinzip der Messung ist recht einfach: Es wird ein Ultraschall-Signal gesendet (40 kHz Ultraschall, ein Burst von ca. 200 Mikrosekunden Dauer, ausgelöst durch ein HIGH (mindestens 10 Mikrosekunden) am 'Trigger'-Eingang). Danach geht der 'Echo'-Pin auf HIGH und nach dem Eintreffen eines Echos (falls es denn ankommt) wird wieder auf LOW geschaltet. Die Zeit wird gemessen, durch zwei geteilt (die Strecke muss der Schall in beide Richtungen passieren) und wieder geteilt durch 29 (Entfernung in cm, die Ultraschal in einer Mikrosekunde zurücklegt). Das Egebnis ist die ungefähre Entfernung in cm.

Die Genaugkeit soll ca. 0,3 cm betragen, der Messbereich liegt laut Dokumentation bei 2 bis 400-500 cm. Mein Exemplar schafft jedoch nur etwas über drei Meter, danach werden die Rückgabewerte instabil oder das Echo bleibt ganz aus. In letztem Fall geht der 'Echo'-Ausgang nach 200ms auch auf LOW und zeigt dadurch eine erfolglose Messung an. Nach der Messung benötigt der Sensor eine Pause von ca. 20 Mikrosekunden. Die besten Messergebnisse ergeben sich bei Reflektion an glatten, ebenen Flächen. Bei Distanzen bis 1m ist das Material der Fläche recht unkritisch. Der Winkel zum Objekt kann bei kurzen Distanzen von unter 1m bis etwa 45° betragen. Auch recht dünne Objekte werden zuverlässig erkannt.

Die Betriebsspannung beträgt 5V, die Stromaufnahme liegt bei ca. 15mA.

Im einfachsten Fall sieht die Ansteuerung etwa folgendermaßen aus:

int TrigPin = 11;
int EchoPin = 10;
void setup() { Serial.begin(9600); pinMode(TrigPin,OUTPUT); pinMode(EchoPin,INPUT); }
void loop() { int distance, duration; digitalWrite(TrigPin,HIGH); delayMicroseconds(11); digitalWrite(TrigPin,LOW); duration = pulseIn(EchoPin, HIGH); // In cm umrechnen. Schalgeschwindigkeit ist 340 m/s oder 29 Microseconden per cm. duration = duration/29/2; Serial.print(duration); Serial.print("cm"); Serial.println(); delay(1000);

(s.a http://playground.arduino.cc/Main/UltrasonicSensor)

Bei der Suche nach Beispielen habe ich auch eine bessere Alternative zum 'alles selbst machen' gefunden. Unter http://code.google.com/p/arduino-new-ping/ kann eine bequemm zu benutzende Bibliothek heruntergeladen werden. Sie bietet u.a. die Möglichkeit, ein Durchschnittswert mehreren Messungen zu ermitteln. Dadurch werden kleine Abweichungen und Zufallsfehler weitgehens 'herausgerechnet'.

Auf dieser Basis habe ich ein Sketch für ein LCD-Entfernungsmesser entwickelt.

/* 
 * Sonar_LCD
 * 
 * Version 1.0
 * Datum: 12.08.2013
 * 
 * Das Programm benutzt den Ultraschallmodull HC-SR04 um Entfernungen zu messen.
 * Die gemessene Entfernung wird auf einem per I2C angeschlossenen LCD angezeigt.
 * 
 * Verdrahtung (UNO, Nano...)
 * 
 * HC-SR04:
 *     Sensor Trig pin an pin 11
 *     Sensor Echo pin an pin 10
 *     Sensor VDD pin an 5V
 *     Sensor GND pin an GND
 *  
 * LCD wird per I2C-Modul an I2C Bus (A4, A5) angeschlosen.
 *
 *   Copyright (c) 2013 Alexander Schulz.  All right reserved.
 *  
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 * 
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include  
#include <LiquidCrystal_I2C.h>
#include 
// Setup LCD-Shield
LiquidCrystal_I2C  lcd(0x20,16,2); //  I2C Addresse: 0x20  LCD:  16x2
#define TRIGGER_PIN  11  // Arduino-Pin verbunden mit dem Trigger-Pin des Ultraschall-Sensors.
#define ECHO_PIN     10  // Arduino-Pin verbunden mit dem Echo-Pin des Ultraschall-Sensors.
#define MAX_DISTANCE 500 // Mxaimale beabsichtigte Entfernung (in cm). Der Sensor liefert max. ca. 400-500cm.
// NewPing setup
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup
void setup() 
{ 
  // Display initialisieren
  lcd.init();
  lcd.backlight(); 
  lcd.home(); 
  lcd.print("Sonar v1.0"); 
  lcd.setCursor(0,1); 
  lcd.print("Initializing..."); 
  delay(1000);
  lcd.clear();
} 
void loop() 
{ 
  // Ermittlung der Entfernung mittels Bildung eines Durchschnittswertes mehrerer Messungen
  unsigned int uS = sonar.ping_median(7);
  lcd.home();
  lcd.print("Dist: ");
  lcd.print((float)uS / US_ROUNDTRIP_CM); // In cm umrechnen (0 steht für 'Entfernung zu weit')
  lcd.print(" cm  ");
  delay(100);
} 

Kommentare (0)

Cancel or