Ich habe einen IR-Sensor, den Sharp GP2Y....der zwischen zehn und 80 cm misst.
Habe mich für den entschieden, da ich denke, dass mein NiboBee mit 80cm allemal auskommt und wenn er näher als 10cm dran ist, hilft eh nur noch Stop und Rückwärts. 
Ausgewertet wird analog (grundsätzlich jedenfalls) per AD-Wandler vom AtMega16 (hat ja genug Ports).
Derzeit allerdings "reagiert" mein Sensor nur auf einen fest voreingestellten Wert, aber da der nur eine Variable ist, kann ich den zur Laufzeit mühelos ändern und somit schön genau messen.
Geht auf jeden Fall genauer als auf den cm.
Eine wirkliche Entfernungsmessung habe ich _noch_ nicht ins Programm integriert, eigentlich hatte ich vor, ihn erstmal digital zu benutzen, das heisst, dass die Biene einfach erkennen soll: da gehts nicht lang...und nen anderen Weg suchen.
Programmiert wird in C mit dem AVR-Studio, ja.
Die Vorgehensweise ist momentan so, dass im Hauptprogramm ständig ein Unterprogramm aufgerufen wird, in dem das Servo jeweils einige Grad geschwenkt wird (wechselweise von rechts nach links bzw. umgekehrt) und bei jeder Richtungsänderung der Sharp abgefragt wird (derzeit wird ein Mittelwert aus je fünf Messungen gebildet, ich hatte erst zehn, aber da dauerte das scannen zu lange).
Der Sharp wird (unter Zuhilfename der NiboBee-Bibliothek) so abgefragt:
Code:
int Sharp(void)
{
sharpResult=0; // Ergebnis zurücksetzen
int16_t sharpTemp=0; // temporäre Variable zum messen
int8_t i;
for (i=1; i<=5; i++)
{ // Sharp mehrmals abfragen
sharpTemp=analog_getValue(ANALOG_EXT3); // ADC-Wert holen
sharpResult=sharpResult+sharpTemp; // Ergebnis aufaddieren
delay(5);
}
sharpResult=sharpResult/5; // Mittelwert bilden
lcd_setCursor(0,2); // Ergebnis ausgeben
printf("Sharp:%4d",sharpResult);
return 0;
}
Damit sind Messungen im Milimeterbereich drin, auch wenn er selbst bei um die 5cm (so lange steigt der Wert) nur auf ca. 600 kommt, anstelle der maximal möglichen 1023. Noch näher an einem Hindernis sinkt der Wert wieder rapide.
Je weiter weg das Hindernis ist, umso geringer ist der Wert, ab jenseits der 80cm gibts nur noch Werte zwischen 10 und 20, wahrscheinlich "rauscht" da irgendwas.
Gescannt wird so:
Code:
int Scan(void)
{
while(servo<servo_maxLinks) // nun stückweise nach links schwenken
{
i=0;
servo=servo+servo_scanStep;
Sharp(); // Sharp abfragen
if (sharpResult>150) // wenn Sharp was findet...
{
i=servo-(servo*2); // Wert Servo negieren
i=i+155; // i wieder positiv machen
i=i*10; // um Kommarechnung zu vermeiden
CSp=i/56+2; // Ergebnis auf die Skala aufteilen
lcd_setCursor(0,1);
printf(" ");
lcd_setCursor(CSp, 1);
printf("\x5e");
delay(10);
}
delay(50); // Zeit fürs Servo
}
while(servo>servo_maxRechts) // stückweise nach rechts schwenken
{
i=0;
servo=servo-servo_scanStep;
Sharp(); // Sharp abfragen
if (sharpResult>150) // wenn Sharp was findet...
{
i=servo-(servo*2); // Wert Servo negieren
i=i+155; // i wieder positiv machen
i=i*10; // um Kommarechnung zu vermeiden
CSp=i/56-2; // Ergebnis auf die Skala aufteilen
lcd_setCursor(0,1);
printf(" ");
lcd_setCursor(CSp, 1);
printf("\x5e");
delay(10);
}
delay(50); // Zeit fürs Servo
}
return(0);
}
Da der Wert servo_maxLinks höher als servo_maxRechts ist, die umständliche Umwandelei, damit ich am Ende auf meine Displayzeile von 16 Zeichen komme.
Ergab sich halt durch meinen Aufbau so, das Servo bedient den Sharp über ein Gestänge mit Kugelköpfen (wäre auch anders lösbar gewesen, aber nicht so schön).
servo_scanStep ist auch eine Variable, ich arbeite momentan lediglich mit einem Zehntel der möglichen Servoauflösung, reicht, um 4cm breite Hindernisse auf nen halben Meter zu entdecken. Der Sharp ist also wirklich ziemlich scharf. 
Höher Auflösen werde ich nur, wenn es mir zu unpräzise wird, das geht dann gewaltig auf die Zeit alles.
Vermutlich geht das Ganze auch effizienter zu programmieren, aber _es_ funktioniert bis auf eine Ungenauigkeit in der Display-Ausgabe, die vom runden her kommt.
Als nächstes werde ich (nur dann ist eine leidlich effiziente Wegfindung möglich, wenn die Anzahl und Entfernung der Hindernisse unbekannt ist) mal eine vernünftige Entfernungsmessung einbauen und vielleicht habe ich bis dahin dann ein paar Ideen, wie weiter.
Ausserdem überlege ich, ob ich den Sensor nicht wenige Grad nach unten neigen sollte, dann kann man auch Abgründe (meine Biene lebt gewöhnlich auf dem Tisch) gleich noch mit erkennen.
Lesezeichen