How To : Radar bauen mit Arduino - der Code für den Arduino
Kommen wir jetzt zum Code für den Arduino:
ich programmiere den Arduino vorzugsweise in C++, dafür gibt es ein ausgezeichnetes Plugin für Eclipse unter Baeyebs Arduino Nightly
hier erstmal die beiden Dateien:
die Radar.cpp
die Radar.h
Um den Servo laufen lassen zu können brauchen wir noch den Header File für den Servo. Den binden wir in Eclipse folgender Maßen ein:
Man wählt im Menü den Menüpunkt Arduino aus, dann klickt man auf Add a Library to the selected Project. Damit öffnet sich ein Fenster, in dem man die verfügbaren Libraries für den Arduino
sieht. Hier wählt man Servo aus und klickt auf Finish. Damit ist das Projekt vorbereitet zum compilieren.
nun zum Code:
in den Zeilen 4 - 6 machen wir die Pins der beiden Bauelemente bekannt. Wie bereits im Planning der Platine besprochen liegt auf 6 der Echo des Sonic Sensors, auf 7 der Trigger und auf 9 der Datenpin des Servo.
in der Funktion setup initialisieren wir, wie gewohnt, die Bauelemente und setzen die Übertragungsrate der seriellen Schnittstelle.
loop ruft lediglich die scan Funktion auf, in der wir eine Range von bis in Grad angeben.
scan bekommt als parameter die Grad von und die Grad bis, innerhalb derer der Servo sich bewegen soll. Diese Range wird durchlaufen und dem Stepper die Position Schrittweise übergeben. Innerhalb der Schleife wird
calculateDistance läßt den Ultraschall Sensor die aktuelle Distanz erfragen
calculateAverageDistance läßt den Ultraschall Sensor ebenfalls die Distanz erfragen, hier wird aber an Hand der Klassenvariable iAverageCount mehrmals beim Ultraschall Sensor angefragt und aus den Werten ein Durchschnittswert gebildet, da mir die einfache Anfrage ein großes Stück zu ungenau war.
readEchoFromSonic läßt den Sensor eine Distanzmessung durchführen. Dafür wird der Ultraschall Sensor erst resettet (LOW Signal an den Trigger PIN), 2 Microsekunden später wird ein Schallsignal über den Sensor gesendet, was 10 Microsekunden dauert (HIGH Signal an den Trigger PIN), abschließend wird nach 10 Millisekunden der Trigger PIN wieder mit LOW befeuert, was ihn verstummen läßt.
Die Dauer zwischen dem Absenden und dem Empfang des Signals erhält man über den Echo PIN des Ultraschall Sensors mit pulseIn(PIN, HIGH)
communicateCurrentData dient lediglich der Ausgabe der errechneten Daten und der aktuellen Position des Servo über die Serielle Schnittstelle.
convertMicrosecondsToInches berechnet die erhaltene Dauer bis zur Rückantwort des Echo Signales in Inches um, da 2.5 Inch 1cm sind und der Schall in 1 Microsekunde 29 cm zurück legt, errechnen wir aus der erhaltenenen Dauer des Echos / 74 die Strecke in Inches, da das Echo hin und zurück diese Dauer benötigte, teilen wir das Ergebnis durch 2 und haben somit das Ergebnis einer einfachen Strecke zwischen dem Sensor und dem Hindernis.
convertMicrosecondsToCm berechnet die erhaltene Dauer bis zur Rückantwort des Echo Signals in cm, analog zu convertMicrosecondsToInches, nur das hier die erhaltene Dauer durch 29 gerechnet wird. Die Erklärung sollte aus der Erklärung für das konvertieren in Inches schlüssig sein.
ich programmiere den Arduino vorzugsweise in C++, dafür gibt es ein ausgezeichnetes Plugin für Eclipse unter Baeyebs Arduino Nightly
hier erstmal die beiden Dateien:
die Radar.cpp
C++
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"{
oServo.attach(iServoSensor);
// make the trigger (tx) pin an output:
pinMode(iSonicTrigger, OUTPUT);
// make the echo pin an input:
pinMode(iSonicEcho, INPUT);
// initialize the serial port:
Serial.begin(9600);
}
#include "Radar.h"
#include "Radar.h"{
// scan from 0 to 90
scan(0, 90);
// scan from 90 to 0
scan(90, NULL);
}
#include "Radar.h"
#include "Radar.h"{
iCurrentPos = iStart;
int iStep = 1;
int iFrom = iStart;
int iTo = iEnd;
if (iStart > iEnd) {
iFrom = iEnd;
iTo = iStart;
iStep *= -1;
}
for (int iCounter = iFrom; iCounter < iTo; iCounter++) {
iCurrentPos += iStep;
oServo.write(iCurrentPos);
calculateDistance();
#include "Radar.h"
communicateCurrentData();
delay(100);
}
}
#include "Radar.h"
#include "Radar.h"{
readEchoFromSonic();
}
#include "Radar.h"
#include "Radar.h"{
iEchoValueSummary = 0;
for (int iAverageIndex = 0; iAverageIndex <= iAverageCount; iAverageIndex++) {
readEchoFromSonic();
iEchoValueSummary += lDuration;
}
lDuration = (iEchoValueSummary/iAverageCount);
}
#include "Radar.h"
#include "Radar.h"{
digitalWrite(iSonicTrigger, LOW);
delayMicroseconds(2);
digitalWrite(iSonicTrigger, HIGH);
delayMicroseconds(10);
digitalWrite(iSonicTrigger, LOW);
lDuration = pulseIn(iSonicEcho, HIGH);
}
#include "Radar.h"
#include "Radar.h"{
Serial.print("X");
Serial.print(iCurrentPos);
Serial.print("V");
Serial.println(convertMicrosecondsToCm(lDuration));
}
#include "Radar.h"{
return microseconds / 74 / 2;
}
#include "Radar.h"{
return microseconds / 29 / 2;
}
die Radar.h
C++
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h"
#include "Radar.h";
#include "Radar.h";
#include "Radar.h";
#include "Radar.h";
#include "Radar.h";
#include "Radar.h";
#include "Radar.h";
#include "Radar.h"
#include "Radar.h"
Um den Servo laufen lassen zu können brauchen wir noch den Header File für den Servo. Den binden wir in Eclipse folgender Maßen ein:
Man wählt im Menü den Menüpunkt Arduino aus, dann klickt man auf Add a Library to the selected Project. Damit öffnet sich ein Fenster, in dem man die verfügbaren Libraries für den Arduino
sieht. Hier wählt man Servo aus und klickt auf Finish. Damit ist das Projekt vorbereitet zum compilieren.
nun zum Code:
in den Zeilen 4 - 6 machen wir die Pins der beiden Bauelemente bekannt. Wie bereits im Planning der Platine besprochen liegt auf 6 der Echo des Sonic Sensors, auf 7 der Trigger und auf 9 der Datenpin des Servo.
in der Funktion setup initialisieren wir, wie gewohnt, die Bauelemente und setzen die Übertragungsrate der seriellen Schnittstelle.
loop ruft lediglich die scan Funktion auf, in der wir eine Range von bis in Grad angeben.
scan bekommt als parameter die Grad von und die Grad bis, innerhalb derer der Servo sich bewegen soll. Diese Range wird durchlaufen und dem Stepper die Position Schrittweise übergeben. Innerhalb der Schleife wird
- wie bereits erwähnt der Servo auf seine aktuelle Position gesetzt
- über den Ultraschall Sensor (HR-SC40) für die aktuelle Position des Servo die Entfernung bis zum nächsten Hindernis berechnet
- die berechneten Daten ausgegeben
calculateDistance läßt den Ultraschall Sensor die aktuelle Distanz erfragen
calculateAverageDistance läßt den Ultraschall Sensor ebenfalls die Distanz erfragen, hier wird aber an Hand der Klassenvariable iAverageCount mehrmals beim Ultraschall Sensor angefragt und aus den Werten ein Durchschnittswert gebildet, da mir die einfache Anfrage ein großes Stück zu ungenau war.
readEchoFromSonic läßt den Sensor eine Distanzmessung durchführen. Dafür wird der Ultraschall Sensor erst resettet (LOW Signal an den Trigger PIN), 2 Microsekunden später wird ein Schallsignal über den Sensor gesendet, was 10 Microsekunden dauert (HIGH Signal an den Trigger PIN), abschließend wird nach 10 Millisekunden der Trigger PIN wieder mit LOW befeuert, was ihn verstummen läßt.
Die Dauer zwischen dem Absenden und dem Empfang des Signals erhält man über den Echo PIN des Ultraschall Sensors mit pulseIn(PIN, HIGH)
communicateCurrentData dient lediglich der Ausgabe der errechneten Daten und der aktuellen Position des Servo über die Serielle Schnittstelle.
convertMicrosecondsToInches berechnet die erhaltene Dauer bis zur Rückantwort des Echo Signales in Inches um, da 2.5 Inch 1cm sind und der Schall in 1 Microsekunde 29 cm zurück legt, errechnen wir aus der erhaltenenen Dauer des Echos / 74 die Strecke in Inches, da das Echo hin und zurück diese Dauer benötigte, teilen wir das Ergebnis durch 2 und haben somit das Ergebnis einer einfachen Strecke zwischen dem Sensor und dem Hindernis.
convertMicrosecondsToCm berechnet die erhaltene Dauer bis zur Rückantwort des Echo Signals in cm, analog zu convertMicrosecondsToInches, nur das hier die erhaltene Dauer durch 29 gerechnet wird. Die Erklärung sollte aus der Erklärung für das konvertieren in Inches schlüssig sein.