- fchao-Sinus-Wechselrichter AliExpress         
Seite 16 von 19 ErsteErste ... 61415161718 ... LetzteLetzte
Ergebnis 151 bis 160 von 188

Thema: Asuro: Umbau der IR-Schnittstelle zur Hinderniserkennung

  1. #151
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2010
    Alter
    37
    Beiträge
    18
    Anzeige

    Praxistest und DIY Projekte
    ja das hab ich schon verstanden
    ich meinte eigentlich das, was man in der asuro.c ändern muss, wenn man nicht die lib 2.8 verwendet?

  2. #152
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2010
    Alter
    37
    Beiträge
    18
    also habs jetzt erstmal so gemacht und er zeigt folgendes an:
    CKCKCKCK...
    63
    63
    63
    63
    .
    .
    .
    63

  3. #153
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.695
    Hallo Sir,

    das sieht ja nicht wirklich gut aus. Ich setzte mal voraus, dass der asuro bei der Messfahrt wirklich die 1 bis 1,5 m mit etwa 20 cm/sec zurückgefahren ist. Da der hexfile mit der zutreffenden lib compiliert wurde (bei mir ist dieser file ein Standardtest, wenn mal was zur Abstandsmessung nicht geht) müsste auch alles stimmen - WENN die hardware korrekt läuft. Die IR-Datenübertragung zum Flashen und für Daten läuft aber - wie wir sehen. Da weiß ich im Moment leider auch nicht weiter.
    Ciao sagt der JoeamBerg

  4. #154
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2010
    Alter
    37
    Beiträge
    18
    Also reagiert bei jeder Pulsbreite auf die gleich distanz, ca 1-3cm vor den tastern

  5. #155
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2010
    Alter
    37
    Beiträge
    18
    Hm, irgendwie geht es jetzt wieder. Sehr sehr komisch. aber ich habe einen neuen Fehler. hab den folgenden code:

    while(1)
    {

    ir=PIND & (1 << PD0);

    if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
    {
    FrontLED(OFF);
    BackLED(OFF,OFF);
    MotorDir(FWD,FWD);
    //MotorSpeed(speed,speed);
    }
    else // HINDERNIS!!!!!!!!!!!!!!
    {
    BackLED(ON,ON);
    FrontLED(ON);
    .
    .
    .

    nun gehen sowohl die BackLED's, als auch die FrontLED in diesem Fall nur an, falls in unmittelbarer nähe ein Hindernis auftaucht. Wenn ich MotorSpeed nun aber wieder als Befehl nehme, sprich die Motoren anschmeiße, dann leuchten die LED's permanent. Es wird also immerzu ein Hindernis erkannt, auch wenn weit und breit keins in seiner Richtung ist

  6. #156
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Was ist die förmel fur ir1, ir2, ir3 und ir4? Oder welcher wert bekommen sie am anfang? Bitte poste das ganzen program. Wir können die If regel nicht entscheiden ohne diese hinweis.

  7. #157
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2010
    Alter
    37
    Beiträge
    18
    also der code von radbruch ist ja folgender:

    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    int main(void)
    {
    
       unsigned char sw, speed;
       unsigned char ir,ir1,ir2;
       
       Init();
       DDRD |= (1 << DDD1);   // Port D1 als Ausgang
       PORTD &= ~(1 << PD1);   // PD1 auf LOW
       OCR2  = 0xFC;
       speed=140;
    
       ir = 0;
       ir1 = 0;
       ir2 = 0;
       ir3 = 0;
       ir4 = 0; 
    
    
       while(1)
       {
       ir=PIND & (1 << PD0);
       if (ir || ir1){
          BackLED(OFF,OFF);
          MotorDir(FWD,FWD);
          MotorSpeed(speed,speed);
       } else {
          BackLED(ON,ON);
          MotorDir(RWD,RWD);
          MotorSpeed(speed,speed);
          if (speed > 0) Msleep(500);
          MotorDir(BREAK,RWD);
          MotorSpeed(0,speed);
          if (speed > 0) Msleep(500);
       }
       ir2=ir1; ir1=ir;
    
       sw = PollSwitch();
    /*
       if (sw & 0x01)
          OCR2  = 0xFE;
       if (sw & 0x02)
          OCR2  = 0xFD;
    */
       if (sw & 0x04)
          OCR2  = 0xFC;
       if (sw & 0x08)
          OCR2  = 0xFB;
    /*
       if (sw & 0x10)
          OCR2  = 0xFA;
       if (sw & 0x20)
          OCR2  = 0xF9;
    */
       }
       return 0;
    }
    der funktioniert bei mir ausgezeichnet

    jetzt hab ich wie gesagt versucht, den etwas auszubauen, bzw abzuwandeln(sind sicher auch noch einige andere fehler drin)
    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    int Abbiegtest();
    
    int main(void)
    {
    	
       unsigned char speed,Abbiegen;
       unsigned char ir,ir1,ir2,ir3,ir4;
       
       Init();
       DDRD |= (1 << DDD1);   // Port D1 als Ausgang
       PORTD &= ~(1 << PD1);   // PD1 auf LOW
       OCR2  = 0xFE;
       speed=100;
    	
       
       
       
       
       
       
       while(1)
       {
       
       ir=PIND & (1 << PD0);
       
    	if (ir || ir1 || ir2 || ir3 || ir4)						// ALLES OK 
    	{
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		MotorDir(FWD,FWD);
    		MotorSpeed(speed,speed);
    	} 
    	else 								// HINDERNIS!!!!!!!!!!!!!!
    	{
    		BackLED(ON,ON);
    		FrontLED(ON);
    	
    
    		/*Abbiegen = 1 & rand();  
    	  
    		
    		if(Abbiegen == 0)				// nach links lenken
    		{
    			MotorSpeed(110,130);
    			Msleep(300);
    			
    			if (Abbiegtest() == 0)		//wenn in die linke Richtung ein Hindernis kommt...
    			{
    				MotorSpeed(230,100);	//...eine Sekunde nach rechts lenken
    				Msleep(800);
    			}
    			else
    				continue;
    		}
    		else
    		{
    			MotorSpeed(speed,130);
    			Msleep(300);
    			
    			if (Abbiegtest() == 0)		//wenn in die linke Richtung ein Hindernis kommt...
    			{
    				MotorSpeed(100,230);	//...eine Sekunde nach rechts lenken
    				Msleep(800);
    			}
    			else
    				continue;
    		}*/
    	
    	}
    	
    	ir4 = ir3;
    	ir3 = ir2;
    	ir2 = ir1;
    	ir1 = ir;  
    	  
       }
       return 0;
    } 
    
    
    int Abbiegtest ()
    	{
    		unsigned char i,infr,infr1,infr2;
    		
    		OCR2 = 0xDE;
    		
    		infr = PIND & (1 << PD0);
    		
    		for(i=1;i<=50;i++)
    		{
    			if (infr||infr1)
    				continue;
    			else
    				return 0;	// Hindernis in der Richtung
    		}
    		
    		infr2 = infr1;
    		infr1 = infr;
    			
    		
    		return 1;			// kein Hindernis, Richtung kann weiterbehalten werden
    	}
    ich hab erstmal den rest vom else-teil auskommentiert, um den fehlerbereich einzugrenzen
    fakt ist, lass ich in dem teil
    Code:
    	if (ir || ir1 || ir2 || ir3 || ir4)						// ALLES OK 
    	{
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		MotorDir(FWD,FWD);
    		MotorSpeed(speed,speed);
    	}
    den MotorSpeed an, springt er jedes mal nach dem Anschalten in den else-teil
    Kommentier ich es aus, Fangen die LEDs erst an zu leuchten, wenn ich zb mit der Hand vor meiner IR-Abteilung rumwinke

  8. #158
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2010
    Alter
    37
    Beiträge
    18
    ich verzweifel hier langsam echt mit diesem tollen gefährt...

  9. #159
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2010
    Alter
    37
    Beiträge
    18
    Ich hab jetzt folgende eine Zeile, die Radbruch auch drinne hatte, mitreingenommen, und plötzlich funktioniert es: sw = PollSwitch(); !!!! Kann mir das einer erklären?

    Code:
    while(1)
       {
       
        sw = PollSwitch(); // <-------------------------------- HIER
       
       ir=PIND & (1 << PD0);
       
    	if (ir || ir1)						// ALLES OK 
    	{
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		MotorDir(FWD,FWD);
    		MotorSpeed(speed,speed);
    	} 
    else 								// HINDERNIS!!!!!!!!!!!!!!
    	{
    		BackLED(ON,ON);
    		FrontLED(ON);
    		MotorSpeed(150,0);
    		Msleep(1000);
            }
    also lediglich der Variablen "sw" den Wert der Taster zugewiesen mit "sw = PollSwitch();"

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

    Ich glaube nicht, dass PollSwitch() selbst diesen Effekt auslöst. Vielmehr scheint mir eine fehlende Verzögerung in der Hauptschleife in Verbindung mit IR-Störungen durch Fremdlicht (Leuchtstoff, Halogen, LCDs, CRTs..) die Ursache zu sein. Wenn solch ein verirrtes IR-Teilchen den Empfänger irritiert und er seinen Ausgang auf Low setzt, werden die IRx quasi in einem Rutsch eingelesen. Mit PollSwitch() wird das Einlesen der IRx aber durch ein paar zusätzliche Sleep()s verzögert. (ein Sleep() ist ein Takt Trägerfrequenz, der TSOP benötigt ca. 6-10 Takte der Trägerfrequenz für die Erkennung)

    Ersetze mal in deinem Progamm sw=PollSwitch(); durch ein schlichtes Sleep(20);

    Code:
    /* function to read out switches */
    unsigned char PollSwitch (void)
    {
    	unsigned int i;
    	int ec_bak=autoencode;
    	autoencode=FALSE;
    	DDRD |= SWITCHES;				// Switches as Output
    	SWITCH_ON;						// Output HIGH for measurement
    	ADMUX = (1 << REFS0) | SWITCH;	// AVCC reference with external capacitor
    	Sleep(10);
    	
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	i = ADCL + (ADCH << 8);
    	
    	SWITCH_OFF;
    	Sleep(5);
    	autoencode=ec_bak;
    	//return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
    	//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
    	return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
    }
    
    Und noch die switches-Defines aus asuro.h dazu:
    
    #define SWITCHES   (1 << PD3)
    #define SWITCH_ON  PORTD |= SWITCHES
    #define SWITCH_OFF PORTD &= ~SWITCHES
    Die Funktion PollSwitch() aus der asuro-Library

    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!

Seite 16 von 19 ErsteErste ... 61415161718 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen