Code:
#include "asuro.h"
#define TRIGGERLEVEL 640
#define HYSTERESIS 5
#define LOW 0
#define HIGH 1
#define durchlauf 200
void linien_verfolgen ( int *wert3,int z);
int main(void)
{
unsigned int data[2];
signed int status[2]={0,0};
signed char difference=0;
unsigned int data2[2];
int hell;
unsigned char wert1[5];
unsigned char wert[200];
unsigned char d,e,f,g,i,t,h;
unsigned char a=0;
char b=1;
unsigned char resultat=0;
unsigned char count1=0;
unsigned char count2=0;
char zeichen1[16]={'H','V','F','Ü','L','Ä','P','J','B','X','C','Y','Z','Q','Ö','\0'};
char zeichen2[9]={'S','U','R','W','D','K','G','O','\0'};
char zeichen3[6]={'I','A','N','M','\0'};
char zeichen4[4]={'T','E','\0'};
char w;
unsigned char wert2[10];
unsigned char count3=0;
unsigned char eingabe[] = "0123";
Init();
MotorDir(FWD, FWD);
while(PollSwitch()==0) //start helligkeitswert einstellung
{
}
SerWrite (" hellgkeitswert speichern ",26); //speichert den Wert für weisse Fläche
FrontLED(ON); //schaltet das Licht für Lichtsensoren ein
LineData(data2); //Ausführ befehl für einlesen von Lichtsensoren
SerWrite ("\n",2);
hell = data2[0]-14; //stellt tolleranz für den weiss abgleich her
PrintInt(hell);
for (i = 0; i < 100; i++) //Pause
Sleep (255);
FrontLED(OFF); //schaltet das Licht für Lichtsensoren aus
SerWrite (" hellgkeitswert gespeichern ",28);
for (i = 0; i < 100; i++)
Sleep (72);
SerRead (eingabe, 3, 0);
for (i = 0; i < 100; i++)
Sleep (72);
SerWrite (" Los gehts! ",12);
FrontLED(ON); //schaltet das Licht für Lichtsensoren ein
for (i = 1; i < durchlauf; i++)
{
OdometrieData(data); // Helligkeitswerte der Lichtschranken auslesen
if ((status[0]==0) && (data[0]>TRIGGERLEVEL+HYSTERESIS))
{ // Wechsel linker Sensor von niedrig auf hoch?
status[0]=1;
difference++;
}
if ((status[0]==1) && (data[0]<TRIGGERLEVEL-HYSTERESIS))
{ // Wechsel linker Sensor von hoch auf niedrig?
status[0]=0;
difference++;
}
if ((status[1]==0) && (data[1]>TRIGGERLEVEL+HYSTERESIS))
{ // Wechsel rechter Sensor von niedrig auf hoch?
status[1]=1;
difference--;
}
if ((status[1]==1) && (data[1]<TRIGGERLEVEL-HYSTERESIS))
{ // Wechsel rechter Sensor von hoch auf niedrig?
status[1]=0;
difference--;
}
if (difference>0) MotorSpeed(155-difference,155); // Zähldifferenz passend auf die Motoren verteilen
else MotorSpeed(155,155+difference);
LineData(data2); //Ausführ befehl für einlesen von Lichtsensoren
wert[i] = data2[0]; // Helligkeitswerte der Lichtschranken in ein array speichern
PrintInt(data2[0]);
}
MotorDir(BREAK,BREAK); //Haalt!
FrontLED(OFF); //schaltet das Licht für Lichtsensoren aus
BackLED(ON,ON);
while(PollSwitch()==0) //start auswertung
{
}
SerWrite(" Auswerten ",11);
for (i=1;i<durchlauf;i++) //schleife für das auswerten der hell dunkel unterschiede
{
if (wert[i]<hell) //wenn wert im Arry kleiner als der Hell Wert array neu mit 1 belegen
{
wert[i]=1;
PrintInt(wert[i]);
SerWrite("\n",2);
}
else if(wert[i]>=hell)
{
wert[i]=0; //wenn wert im Arry grösser als der Hell Wert array neu mit 0 belegen
PrintInt(wert[i]);
SerWrite("\n",2);
}
}
SerWrite(" Auswertung:\n ",15);
for(h=0,e=0;e<12;e++,h++)
{
for (;b<durchlauf;b++,h++) //schleife für vereinfachung der Lichtsensor daten in eins und null
{
if ( wert[a] == 0 )
{
for ( ; a<durchlauf;a++) //0 auswertung
{
if (wert[a]==0) //die nullen in Alphabet Array speichern
count1++;
else if (count1>9&&b>1) //wert für buchstaben wechsel
{
b=durchlauf;
count1=0;
wert2[h]=2;
count3++;
break;
}
else if (count1>9 && b==1) //wert für anfangs toleranz
{
b--;
count1=0;
break;
}
else if (count1<=7 && count1>2) //wert für zeichen wechsel
{
b--;
count1=0;
break;
}
}
}
else
{
for ( ;a<durchlauf;a++) // 1 auswertung
{
if (wert[a] == 1)
count1++;
else if (count1>=5) //wert für strich
{
wert1[b]=1;
count2++;
count1=0;
wert2[h]=1;
count3++;
break;
}
else if (count1<5 && count1>=1) //wert für punkt
{
wert1[b]=0;
count2++;
count1=0;
wert2[h]=0;
count3++;
break;
}
}
}
}
t=count2; //count für anzahl punkt und strich
t--; //für auswertung wichtig count zahl minus eins
for (d=t,g=2;d>0;d--,g*=g) //schleife für die beschränkung der anzahl von zeichen in einem buchstaben
{
f=d+1; //wird der wert des letzten zeichens ermittelt von letzter stelle des arrays gerechnet wird
wert1[d]*=g; //array wird bei drei zeichen von rechts nach links gerechnet mal 1 mal 2 mal 4 mal 8
wert1[d]+=wert1[f]; //zusammen ergibt sich für die zeichen einen wert den man dan bei buchstaben array abfragen kann
resultat=wert1[d]; //speichern des arry wertes in eine variabel
}
if ( count2==4){ //den buchstaben für das zeichen die vierten array reihe ausgeben
w=zeichen1[resultat];
SerWrite (" ",1);
SerWrite (&w,1);
count2=0;
b=1;
}
else if ( count2==3){ //den buchstaben für das zeichen die dritte array reihe ausgeben
w=zeichen2[resultat];
SerWrite (" ",1);
SerWrite (&w,1);
count2=0;
b=1;
}
else if ( count2==2){ //den buchstaben für das zeichen die zweite array reihe ausgeben
w=zeichen3[resultat];
SerWrite (" ",1);
SerWrite (&w,1);
count2=0;
b=1;
}
else if( count2==1){ //den buchstaben für das zeichen die erste array reihe ausgeben
w=zeichen4[resultat];
SerWrite (" ",1);
SerWrite (&w,1);
count2=0; //um für das nächste zeichen weiter zu rechnen müssen diese variablen zurückgestellt werden
b=1;
}
else
b=1;
}
linien_verfolgen(wert2,count3);
return 0;
}
void linien_verfolgen ( int *wert3,int z)
{
unsigned int data4[2];
unsigned int i;
Init();
SerWrite (" Ready? ",8);
while(PollSwitch()==0)
{
}
SerWrite (" Los gehts! ",12);
FrontLED(ON);
MotorDir(FWD,FWD);
while(1)
{
LineData(data4);
for (i=0;i<z;i++)
{
if (wert3[i] == 2)
{
StatusLED(OFF);
for (i = 0; i < 100; i++)
Sleep (200);
}
if (wert3[i] == 0);
{
StatusLED(RED);
for (i = 0; i < 100; i++)
Sleep (75);
StatusLED(OFF);
}
if (wert3[i] == 1);
{
StatusLED(RED);
for (i = 0; i < 100; i++)
Sleep (200);
StatusLED(OFF);
}
}
if(data4[0]>data4[1])
{
MotorSpeed(160,0);
BackLED(ON,OFF);
}
else if (data4 [0] < data4 [1] )
{
MotorSpeed(0,160);
BackLED(OFF,ON);
}
else
{
MotorSpeed(160,160);
BackLED(ON,ON);
}
}
}
Das ganze bewirkt eine MOrse übersetzung sprich er fährt mir über morse striche die natürlich genug breit sind das der ASURO sie nicht bei der fahrt verliert und gibt mir am schluss die bedeutung der Morse zeichen aus. ZU guter letzt fährt er eine kleine gezeicnete strecke ab und gibt mir während der fahrt den morse code via LED immer wieder aus.
Lesezeichen