PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Snake Vision



Mangoon
08.05.2010, 15:48
Hallo Jungs und Mädels.
Ich muss für ein Projekt ein Programm schreiben dass mit dem Wärmesensoren arbeitet.
Wir haben den asuro bereits umgerüstet.
Es gibt eine Teststrecke, heißt es sind 3 Lampen aufgestellt und der Asuro (beide Wärmesensoren nach links ausgerichtet) soll gerade aus dran kvorbei fahren und wenn er die Wärmequelle neben sich erkannt hat stehen bleiben, eine sekunde warte und danach weiter fahren udn die neue erkennen.

Habe mir mal den Code im Spaß mit dem Asuro Band 2 angeschaut aber bei mir funktioniert das leider nicht ganz richtig.
Vielleicht hat einer von euch schon mal so ein Programm geschrieben und köntne mir helfen.
Lieben Gruß
Mangoon

radbruch
08.05.2010, 17:26
Hallo

Der Testcode für meine ersten Versuche, das Buch habe ich allerdings nicht:


#include "asuro.h"

// Code für das SnakeVision stammt von hier:

// *******************************************
// * Snakevision für ASURO *
// * Verfolgt eine Wärmequelle *
// * *
// * *
// * *
// * *
// * (c) 2007 Robin Gruber *
// * Details zum Code in: *
// * "Mehr Spaß mit ASURO, Band II" *
// *******************************************
void SnakeData(unsigned int *data)
{
// ThermalData() funktioniert genauso, wie LineData(), ...
// ... nur dass dabei die interne Spannungsreferenz als ...
// ... AD-Wandlerreferenz verwendet wird.

// Prozessorinterne Referenz verwenden
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[0] = ADCL + (ADCH << 8);

// Prozessorinterne Referenz verwenden
// Multiplexer auf rechten Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[1] = ADCL + (ADCH << 8);
}

int main(void)
{
unsigned int data[2];
Init();

while(1)
{
SnakeData(data);
if(data[0]>data[1])
{
MotorDir(RWD,FWD);
MotorSpeed(150,150);
}
else
{
MotorDir(FWD, RWD);
MotorSpeed(150, 150);
}
PrintInt(data[0]);
SerPrint("-");
PrintInt(data[1]);
SerPrint("\n\r");
//Beep(300);
Msleep(300);
}
return(0);
}

"...aber bei mir funktioniert das leider nicht ganz richtig." Kann auch so ziemlich alles bedeuten, oder?

Gruß

mic

Mangoon
08.05.2010, 17:54
Das Problem ist bei mir, wenn ich im AVR Studio das compiliere meckert der bei ADMUX und auch z.b. bei MotorDir(FWD,FWD) [so stehts im Buch]
letztes mal wollte er nicht mal #inlude (...) annehmen weiß nicht was ich falsch mache

radbruch
08.05.2010, 18:32
weiß nicht was ich falsch macheDu zeigst nicht dein Programm und auch nicht die Fehlermeldungen des Kompilers. Beides kannst du in den jeweiligen Ausgabefenstern kopieren und hier in einer Code-Box einfügen.

Mangoon
09.05.2010, 13:28
Ich kann im moment nicht dazu sagen, da ich die Fehlermeldung in der Schule hatte.
Er erkennt die ADMUX Befehle zum Beispiel nicht die will er nicht machen.
Hab zu hause das AVR Studio aber da kann ich nur in Assembler programmieren leider nicht in GCC
Also muss ich morgen in der Schule nochmal schauen

Mangoon
10.05.2010, 17:45
So, dass ist der bisherige Code, auch wenn er noch nicht fertig ist, da gefällt mir deiner wesentlich besser. Kann man ihm da eigentlich sagen, dass er anhalten soll wenn der Wert so und so hoch ist. Nicht dass er schon anhält, wenn er nur eine kleine Wärmequelle hat.
Danke für deine Bemühungen


#include "asuro.h"

#define THRESH1 20 ; Schwellen für die intensitätsabhängige Geschwindigkeit
#define THRESH2 80
#define THRESH3 200
void ThermalData (unsigned int *data) {
ADMUX = (1<<REFS0) | (1<<REFS1) | IR_LEFT // Multiplexer auf linken Sensor schalten
ADCSRA|= (<<ADSC) // Wandlung starten
while (!(ADCSRA & 81<<ADIF))) // Warten, bis Wandlung beendet ist
ADCSRA |= (1<<ADIF) ;// ADCIF zurück setzen
data[0]= ADCL + (ADCH <<8)// ADC-Wert auslesen
ADMUX= (1<<REFS0)| (1<< REFS1) | IR_Right // Multiplexer auf rechten Sensor schalten
ADSCRA|= (1<<ADSC) // Wandlung starten
while (!(ADCSRA & (1<<ADIF))) // Warten bis Wandlung beendet
ADCSRA |= (1<<ADIF) // ADCIF zurücksetzen
data[1] = ADCL + (ADCH<<8)// ADC-Wert auslesen
}

int main (volid) {
// Speicher für die Messwerte bereitstellen
unsigned int tdata[2]
unsigned int speed
signed int diff,sum
Int()
//Motoren immer auf vorwärts
MotorDir(FWD,FWD)
while(1)
{
//Messwerte einlesen
ThermalData(tdata)
//Die Summe der Werte wird für die Berechnung der Geschwindigkeit genutzt
sum=data[0]+tdata[1]
//Signal stark genug?
if (sum>THRESH1) {
StatusLED(GREEN)
speed=140
//Ziemlich stark?
if (sum>THRESH2) {
StatusnLED(YELLOW)
speed=200
}
//Sehr stark?
if(sum>THRESH3) {
StatusLED(RED)
speed=255
}

//Richtung bestimmen
diff=((signed)tdata[0]-(signed)tdata[1])*32/sum
if (diff>4) {
//Links deutlich wärmer? Nach links fahren!
BackLED (ON,OFF)
MotorSpeed(0,speed)
}
else {
//Sonst geradeaus!
BackLED(OFF,OFF)
MotorSpeed(speed,speed)
}
}
}
return 0
}






Build started 10.5.2010 at 18:31:08
avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT asuroniklas.o -MF dep/asuroniklas.o.d -c ../asuroniklas.c
../asuroniklas.c:1:19: error: asuro.h: No such file or directory
../asuroniklas.c: In function 'ThermalData':
../asuroniklas.c:7: error: 'ADMUX' undeclared (first use in this function)
../asuroniklas.c:7: error: (Each undeclared identifier is reported only once
../asuroniklas.c:7: error: for each function it appears in.)
../asuroniklas.c:7: error: 'REFS0' undeclared (first use in this function)
../asuroniklas.c:7: error: 'REFS1' undeclared (first use in this function)
../asuroniklas.c:7: error: 'IR_LEFT' undeclared (first use in this function)
../asuroniklas.c:8: error: expected ';' before 'ADCSRA'
../asuroniklas.c:9: error: expected statement before ')' token
../asuroniklas.c:10: error: 'ADCSRA' undeclared (first use in this function)
../asuroniklas.c:10: error: 'ADIF' undeclared (first use in this function)
../asuroniklas.c:11: error: 'ADCL' undeclared (first use in this function)
../asuroniklas.c:11: error: 'ADCH' undeclared (first use in this function)
../asuroniklas.c:12: error: expected ';' before 'ADMUX'
../asuroniklas.c: In function 'main':
../asuroniklas.c:19: warning: type of 'volid' defaults to 'int'
../asuroniklas.c:22: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'unsigned'
../asuroniklas.c:23: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'signed'
../asuroniklas.c:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Int'
../asuroniklas.c:34: error: stray '\374' in program
../asuroniklas.c:34: error: stray '\344' in program
../asuroniklas.c:34: error: stray '\344' in program
../asuroniklas.c:63: error: expected ';' before '}' token
../asuroniklas.c:23: warning: unused variable 'diff'
make: *** [asuroniklas.o] Error 1
Build failed with 21 errors and 2 warnings...




Wie gesagt, den Code habe ich so aus dem Buch heraus geschrieben. Den wollte ich benutzen und dann verändern wie ich ihn brauche.

Mangoon
10.05.2010, 22:14
Ok ein problem habe ich gefunden aber warum macht der keine einfach Motor vorwärts oder so. Muss ich noch was einbinden, damit der die Befehle versteht?



#include "avr/io.h"
#include <stdlib.h>


void SnakeData(unsigned int *data)
{
// ThermalData() funktioniert genauso, wie LineData(), ...
// ... nur dass dabei die interne Spannungsreferenz als ...
// ... AD-Wandlerreferenz verwendet wird.

// Prozessorinterne Referenz verwenden
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[0] = ADCL + (ADCH << 8);

// Prozessorinterne Referenz verwenden
// Multiplexer auf rechten Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT; // Wandlung starten
ADCSRA |= (1 << ADSC); // Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF))); // ADCIF zurücksetzen
ADCSRA |= (1 << ADIF); // ADC-Wert auslesen
data[1] = ADCL + (ADCH << 8);
}

int main(void)
{
unsigned int data[2];
Init();

while(1)
{
SnakeData(data);
if(data[0]>data[1])
{
MotorDir(RWD,FWD);
MotorSpeed(150,150);
}
else
{
MotorDir(FWD, RWD);
MotorSpeed(150, 150);
}
PrintInt(data[0]);
SerPrint("-");
PrintInt(data[1]);
SerPrint("\n\r");
//Beep(300);
Msleep(300);
}
return(0);
}




Build started 10.5.2010 at 23:10:26
avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT asuroniklas.o -MF dep/asuroniklas.o.d -c ../asuroniklas.c
../asuroniklas.c:3:10: error: #include expects "FILENAME" or <FILENAME>
../asuroniklas.c: In function 'SnakeData':
../asuroniklas.c:13: error: 'IR_LEFT' undeclared (first use in this function)
../asuroniklas.c:13: error: (Each undeclared identifier is reported only once
../asuroniklas.c:13: error: for each function it appears in.)
../asuroniklas.c:25: error: 'IR_RIGHT' undeclared (first use in this function)
../asuroniklas.c: In function 'main':
../asuroniklas.c:35: warning: implicit declaration of function 'Init'
../asuroniklas.c:42: warning: implicit declaration of function 'MotorDir'
../asuroniklas.c:42: error: 'RWD' undeclared (first use in this function)
../asuroniklas.c:42: error: 'FWD' undeclared (first use in this function)
../asuroniklas.c:43: warning: implicit declaration of function 'MotorSpeed'
../asuroniklas.c:50: warning: implicit declaration of function 'PrintInt'
../asuroniklas.c:51: warning: implicit declaration of function 'SerPrint'
../asuroniklas.c:55: warning: implicit declaration of function 'Msleep'
make: *** [asuroniklas.o] Error 1
Build failed with 7 errors and 6 warnings...

Mangoon
12.05.2010, 17:51
Ok das Programm läuft erstmal habe aber noch eine Frage zu einem anderen

Und zwar soll dieses Programm einer Wärmequelle wirklich hinter her fahren, hab noch ein Fehler den bekomm ich aber nicht weg, vllt könnt ihr mir helfen



#include "avr/io.h"
#include "stdlib.h"
#include "G:/FGT2-TE/03-Programmieren-in-C/AsuroLib-v280rc1/lib/inc/asuro.h"


#define THRESH1 20 // Schwellen für die intensitätsabhängige Geschwindigkeit
#define THRESH2 80
#define THRESH3 200
void ThermalData (unsigned int *data)
{
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[0] = ADCL + (ADCH << 8);

// Prozessorinterne Referenz verwenden
// Multiplexer auf rechten Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[1] = ADCL + (ADCH << 8);
}

int main (volid) {
// Speicher für die Messwerte bereitstellen
unsigned int tdata[2];
unsigned int speed;
signed int diff,sum;
Init();
//Motoren immer auf vorwärts
MotorDir(FWD,FWD);

while(1)
{
//Messwerte einlesen
ThermalData(tdata)
//Die Summe der Werte wird für die Berechnung der Geschwindigkeit genutzt
sum = data[0]+tdata[1]
//Signal stark genug?
if (sum>THRESH1) {
StatusLED(GREEN);
speed=140;
//Ziemlich stark?
if (sum>THRESH2) {
StatusnLED(YELLOW);
speed=200;
}
//Sehr stark?
if(sum>THRESH3) {
StatusLED(RED);
speed=255;
}

//Richtung bestimmen
diff=((signed)tdata[0]-(signed)tdata[1])*32/sum;
if (diff>4) {
//Links deutlich wärmer? Nach links fahren!
BackLED (ON,OFF);
MotorSpeed(0,speed);
}
else {
//Sonst geradeaus!
BackLED(OFF,OFF);
MotorSpeed(speed,speed);
}
}
}
return 0;
}






rm -rf asuroniklas.o asuro.o asuroniklas.elf dep/* asuroniklas.hex asuroniklas.eep asuroniklas.lss asuroniklas.map
Build succeeded with 0 Warnings...
avr-gcc -I"G:\Projekt\..\FGT2-TE\03-Programmieren-in-C\AsuroLib-v280rc1\lib\inc" -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fgnu89-inline -MD -MP -MT Verfolgung.o -MF de
p/Verfolgung.o.d -c ../Verfolgung.c

../Verfolgung.c: In function 'main':
../Verfolgung.c:35: warning: type of 'volid' defaults to 'int'
../Verfolgung.c:49: error: expected ';' before 'sum'
../Verfolgung.c:39: warning: unused variable 'sum'
../Verfolgung.c:39: warning: unused variable 'diff'
../Verfolgung.c:38: warning: unused variable 'speed'
make: *** [Verfolgung.o] Error 1
Build failed with 1 errors and 4 warnings...