Nibobee Liniensensoren kalibrieren
Zitat:
Zitat von workwind
Die Kalibrierung wird mit schwarzem und mit weissem Untergrund durchgeführt, die Messung wird moduliert durchgeführt. Als Ergebnis erhält man 0 für schwarz und 1024 für weiss.
Diese Anmerkung ist zwar nun schon ein Vierteljahr alt, hab sie aber erst heute gelesen.
Deshalb meine Frage: Ist das wirklich so? 1024 (400h) nach dem Weissabgleich bei weissem Untergrund? Bei mir sieht das nach dem Kalibrieren so aus, wenn die Bee auf einem weißen Blatt steht - auf genau dem Blatt, mit dem auch kalibriert wurde!
Bild hier
Auf dem schwarzen Blatt, mit dem kalibriert wurde, sind alle Werte 0 - reproduzierbar!
Sind bei Dir die Weiß-Werte nach dem Kalibrieren tatsächlich alle 400h??? Dann wäre bei meiner Bee irgendwas noch nicht in Ordnung :-( Für ganz unmöglich halte ich das nicht, da ich bisher noch keine wirklich vernünftige Linienverfolgung hinbekommen habe :?:
Mir scheint (aufgeschrieben habe ich es leider nicht), daß die Weiß-Werte etwas besser und gleichmäßiger geworden sind, nach dem ich kürzlich die Fototransistoren mit etwas Schrumpfschlauch versehen hatte.
Bild hier
Kann aber auch Einbildung sein.
Messprogramm (für ohne Display, läuft auf Standardbiene)
So, etwas tippen geübt, eine Packung Zigaretten und einige Liter Kaffe später:
Das Messprogramm ist soweit fertig.
Man kann die Biene auf eine beliebige Unterlage stellen und dann mit einem der Fühler (antippen) die drei Liniensensoren messen lassen.
Im angefügten Programm (dürfte gut genug dokumentiert sein, hoffe ich?) ist eine Variable enthalten, die man nach Lust und Laune ändern kann: es wird im derzeitigen Zustand zehnmal gemessen und ein Durchschnittswert gebildet. Wenn man die Variable ändert, ändert man die anzahl der Messungen.
Das Ergebnis wird dann der Reihe nach ausgegeben, und zwar über die LED`s und im Klartext: die linke (gelb) LED gibt die Tausender, die linke (rot) die Hunderter, und so weiter. Mann muss nur mitzählen.
So werden der Reihe nach (genaueres steht im Kommentar am Programmanfang) alle drei Sensorwerte ausgegeben.
Wers probieren will ein Tipp: lasst nach erfolgter Messung die Biene mal stehen, und messt unter den selben Bedingungen nach einer Stunde erneut, was wird wohl passieren... ;)
Übrigens habe ich es auf meiner Testunterlage (jaha, die selbe, mit der ich das Kalibrierungsprogramm ausgeführt habe) nie Werte über 600 auf weiss gemessen...;)
Code:
/*Messprogramm für NIBOBee (by Rabenauge)
Beim betätigen des linken Fühlers nach hinten werden die drei
Liniensensoren der Reihe nach mehrmals abgefragt und Durchschnittswerte ermittelt. Die An-
zahl der Messungen wird mit der Variable iv eingestellt. Während des Messvorganges blinken die
roten LED für jede Messung kurz auf, während der Zeit sollte der Roboter nicht bewegt werden.
Nach der Messung werden die Ergebnisse mittels den LED ausgegeben: jede LED steht für eine
Stelle, das heisst, links gelb blinkt die Tausender aus, links rot die Hunderter, rechts rot
die Zehner und rechts gelb die Einer.
Bevor die Ausgabe beginnt, leuchten kurz alle vier LED, um das Ende der Messung anzuzeigen.
Danach werden der Reihe nach alle drei Messwerte ausgegeben, vor der Ausgabe wird das je-
weils durch die roten LED (leuchten anderthalb Sekunden) visualisiert: leuchtet die Linke,
wird anschliessend der Wert des linken Sensors ausgegeben, leuchten beide, der Wert des mitt-
leren, leuchtet die rechte dann...
Indem man den linken Fühler nach vorne betätigt, kann das Messergebnis gelöscht werden, um eine
neue Messung vorzunehmen.
*/
#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/sens.h>
#include <nibobee/delay.h>
#include <nibobee/line.h>
int main()
{
enable_interrupts();
led_init();
sens_init();
line_init();
while (1==1)
{
int mode=0; //Modus, per Eingabe
int i=0; //Zählervariable
int iv=10; //Variable Messwiederholung,
//ändern für mehr/weniger Messungen
int l_line=0; //Rückgabe Messergebnis Linie_links
int r_line=0; //Rückgabe Messergebnis Linie_rechts
int c_line=0; //Rückgabe Messergebnis Linie_mitte
int status_L =sens_getLeft(); //linker TastSensor
switch (status_L)
{
case -1: mode=1; //nach hinten =Messung starten
led_set(LED_L_RD,0);
led_set(LED_L_YE,1); //Auswahl zeigen
delay(1500);
led_set(LED_L_YE,0);
delay(500);
break ;
case +1: mode=2; //nach vorne =Messung zurücksetzen
led_set(LED_L_YE,0);
led_set(LED_L_RD,1); //Auswahl zeigen
delay(1500);
led_set(LED_L_RD,0);
delay(500);
break ;
default :led_set(LED_L_RD,0); //links Mitte
led_set(LED_L_YE,0);
break ;
}
if(mode!=0) //was soll es werden?
{
switch (mode)
{
case 1:
for (i=0; i<iv; i++) //Messchleife
{
led_set(LED_L_RD,1);
led_set(LED_R_RD,1);
delay(5);
l_line=(l_line + line_get(LINE_L)); //messen und addieren
r_line=(r_line + line_get(LINE_R));
c_line=(c_line + line_get(LINE_C));
led_set(LED_L_RD,0);
led_set(LED_R_RD,0);
delay(500);
}
l_line= (l_line/iv); //Ergebnis durch Anzahl Messungen
r_line= (r_line/iv);
c_line= (c_line/iv);
delay(500);
break;
case 2:
led_set(LED_L_RD,1); //Messergebnisse zurücksetzen
led_set(LED_R_RD,1);
delay(500);
led_set(LED_L_YE,1);
led_set(LED_R_YE,1);
delay(20);
l_line=0;
r_line=0;
c_line=0;
led_set(LED_L_RD,0);
led_set(LED_R_RD,0);
led_set(LED_L_YE,0);
led_set(LED_R_YE,0);
break;
default:
{line_get(0);
break;
}
}
delay(1000); //Anzeige der gemessenen Werte
led_set(LED_L_RD,1); //zuerst den linken Liniensensor
delay(1000);
led_set(LED_L_RD,0);
delay(1500);
if (l_line>1000) //Tausender?
{
led_set(LED_L_YE,1);
delay(300);
led_set(LED_L_YE,0);
delay(300);
l_line=(l_line-1000);
}
for(i=0; i<10; i++) //Hunderter?
{
if (l_line>100)
{
led_set(LED_L_RD,1);
delay(300);
led_set(LED_L_RD,0);
delay(300);
l_line=(l_line-100);
}
}
for(i=0; i<10; i++) //Zehner?
{
if (l_line>10)
{
led_set(LED_R_RD,1);
delay(300);
led_set(LED_R_RD,0);
delay(300);
l_line=(l_line-10);
}
}
for(i=0; i<10; i++) //Einer?
{
if (l_line>1)
{
led_set(LED_R_YE,1);
delay(300);
led_set(LED_R_YE,0);
delay(300);
l_line=(l_line-1);
}
} //linker Sensor fertig
delay(1000); //Anzeige der gemessenen Werte
led_set(LED_R_RD,1); //mittlerer Liniensensor
led_set(LED_L_RD,1);
delay(1000);
led_set(LED_R_RD,0);
led_set(LED_L_RD,0);
delay(1500);
if (c_line>1000) //Tausender?
{
led_set(LED_L_YE,1);
delay(300);
led_set(LED_L_YE,0);
delay(300);
c_line=(c_line-1000);
}
for(i=0; i<10; i++) //Hunderter?
{
if (c_line>100)
{
led_set(LED_L_RD,1);
delay(300);
led_set(LED_L_RD,0);
delay(300);
c_line=(c_line-100);
}
}
for(i=0; i<10; i++) //Zehner?
{
if (c_line>10)
{
led_set(LED_R_RD,1);
delay(300);
led_set(LED_R_RD,0);
delay(300);
c_line=(c_line-10);
}
}
for(i=0; i<10; i++) //Einer?
{
if (c_line>1)
{
led_set(LED_R_YE,1);
delay(300);
led_set(LED_R_YE,0);
delay(300);
c_line=(c_line-1);
}
} //mittlerer Sensor fertig
delay(1000); //Anzeige der gemessenen Werte
led_set(LED_R_RD,1); //rechter Liniensensor
delay(1000);
led_set(LED_R_RD,0);
delay(1500);
if (r_line>1000) //Tausender?
{
led_set(LED_L_YE,1);
delay(300);
led_set(LED_L_YE,0);
delay(300);
r_line=(r_line-1000);
}
for(i=0; i<10; i++) //Hunderter?
{
if (r_line>100)
{
led_set(LED_L_RD,1);
delay(300);
led_set(LED_L_RD,0);
delay(300);
r_line=(r_line-100);
}
}
for(i=0; i<10; i++) //Zehner?
{
if (r_line>10)
{
led_set(LED_R_RD,1);
delay(300);
led_set(LED_R_RD,0);
delay(300);
r_line=(r_line-10);
}
}
for(i=0; i<10; i++) //Einer?
{
if (r_line>1)
{
led_set(LED_R_YE,1);
delay(300);
led_set(LED_R_YE,0);
delay(300);
r_line=(r_line-1);
}
} //Ende Ausgabe
}
}
}
Übrigens: ich _denke_ dass die Ausgaben stimmen, aber ich garantiere es natürlich nicht, schaut bitte mal über den Code, ob sich bei der Auflösung der Werte kein Fehler eingeschlichen hat!
Schlussendlich aber kommt es wohl kaum auf den exakten Wert an, wichtiger ist es, zu sehen, wie die Sensoren unterschiedliche (ich habe nie drei gleiche Werte bekommen, die liegen locker um 20 auseinander) Ergebnisse liefern.
Ausserdem kann man so bequem ermitteln, wie "dunkel" das Schwarz oder wie "hell" das Weiss wirklich ist.