Um zu testen, wie gut man den ASURO mit Hilfe seiner Liniensensoren im Spielfeld halten kann, habe ich ein kleines Testprogramm geschrieben.
Die Auswertung der Liniensensoren reagiert auf die sprungartige Helligkeitsänderung der Liniensensoren. Dazu wird die über einen Tiefpassfilter ermittelte durchschnittliche Helligkeit mit den aktuellen Werten der Sensoren verglichen.
Code:
#include "asuro.h"
#define LIMIT 20 // Helligkeitsveraenderung, bei der eine Linie detektiert wird
#define TIEFPASS 50 // grosser Wert=grosse Zeitkonstante
// globale Variablen
uint16_t HellLinks;
uint16_t HellRechts;
/*************************************************************************
uint8_t testhell()
testhell ermittelt die durchschnittliche Helligkeit der beiden
Linienphottransistoren mit Hilfe eines Tiefpassfilters.
Unterschreitet die Helligkeit schlagartig den tiefpassgefilterterten
Wert, wird ein Flag gesetzt.
Ausgabe:
testhell=0: keine Linie
Bit0= Linie links erkannt
Bit1= Linie rechts erkannt
Bit0+Bit1 Linie senkrecht
*************************************************************************/
uint8_t testhell()
{
uint8_t ergebnis=0;
uint16_t lineData[2];
LineData(lineData);
HellLinks=(HellLinks*TIEFPASS+lineData[0])/(TIEFPASS+1);
HellRechts=(HellRechts*TIEFPASS+lineData[1])/(TIEFPASS+1);
StatusLED(YELLOW);
if((lineData[0]+LIMIT)<(HellLinks)) ergebnis|=1;
if((lineData[1]+LIMIT)<(HellRechts)) ergebnis|=2;
Msleep(10);
return ergebnis;
}
int main(void)
{
int n;
Init();
StatusLED(RED);
FrontLED(ON);
// mittlere Helligkeit im Stand ermitteln
for(n=0;n<300;n++)
{
testhell();
}
StatusLED(YELLOW);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
while(1)
{
n=testhell();
BackLED(n&0x01,n&0x02);
StatusLED(YELLOW);
if(n!=0) // Falls Linie erkannt, dann drehen und zurück
{
StatusLED(GREEN);
MotorDir(RWD,RWD);
MotorSpeed(150,100);
Msleep(600);
MotorDir(RWD,FWD);
MotorSpeed(200,200);
Msleep(600);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
Msleep(10);
}
}
/***************************************************************************
*
* 2007 robo.fr (Nickname) , christoph(at)roboterclub-freiburg.de
*
***************************************************************************
* 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 version 2 of the License, *
* If you extend the program please maintain the list of authors. *
* ( if there is no real name, the nick name has to be mentioned )
* If you want to use this software for commercial purposes and you *
* don't want to make it open source, please contact the authors for *
* licensing. *
***************************************************************************/
Wie gut das ganze funktioniert sieht man hier .
Lesezeichen