- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Snake Vision

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.05.2010
    Beiträge
    6

    Snake Vision

    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

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

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

    Code:
    #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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    07.05.2010
    Beiträge
    6
    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

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    weiß nicht was ich falsch mache
    Du 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.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    07.05.2010
    Beiträge
    6
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    07.05.2010
    Beiträge
    6
    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
    Code:
    #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
    }

    Code:
    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.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    07.05.2010
    Beiträge
    6
    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?

    Code:
    #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);
    }
    Code:
    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...

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    07.05.2010
    Beiträge
    6
    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

    Code:
    #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;
    }
    Code:
    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...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test