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.