- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Sonnenverfolger

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    18.06.2008
    Ort
    Thüringen
    Alter
    31
    Beiträge
    19
    Anzeige

    Powerstation Test
    Vieeeeeelen Dank es funktionirt nun!

    Für alle die das Programm auch mal verwenden wollen, aufpassen:
    ich hab die beiden rotier Anweisungen vertauscht! -> der Roboter dreht sich in die falsche Richtung!

    Grüße

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    hallo, hab gerade ein ähnliches programm programmiert. bei mir sucht der roboter selbstständig in die hellste richtung. jetzt frag ich mich allerdings, warum die int_16t im programm nur die werte von -100 bis +100 annehmen kann, obwohl es ja ein 16 bit datentyp ist, der eigentlich von -32768 ... +32767 gehen sollte. ich hab es jetzt mal mit -200 und +200 ausprobiert, aber dann tut sich irgendwie gar nichts mehr. wer hat eine ahnung an was das liegt bzw. ich dieses problem lösen kann?
    hier mein programm:

    Code:
    #include "RP6RobotBaseLib.h"     
     
    #define BATRANGE 500
    #define RANGE 950
    
    void task_LDRinfo(void)
    {writeString_P("LDR_L: ");
    	writeIntegerLength(adcLSL,DEC,4);
    	writeChar('\n');
    writeString_P("LDR_R: ");
    	writeIntegerLength(adcLSR,DEC,4);
    	writeChar('\n');
    	int16_t dif = ((int16_t)(adcLSL - adcLSR));
    	if(dif > 100) dif = 100;
    	if(dif < 100) dif = -100;
    	
    	
    if(dif==100)
    	{setLEDs(0b000001);
    	
    	moveAtSpeed(20,50);}
    	
    
    else if(dif==-100)
    		{setLEDs(0b000010);
    		moveAtSpeed(50,20);}
    		
    
    else{setLEDs(0b000000);
    		moveAtSpeed(0,0);}
    }
    
    void bumpersStateChanged(void)
    {if(bumper_left)
    	{move(60,BWD,DIST_MM(150),true);
    	rotate(50,RIGHT,90,true);
    	changeDirection(FWD);
    	}
    
    if(bumper_right)
    	{move(60,BWD,DIST_MM(150),true);
    	rotate(50,LEFT,90,true);
    	changeDirection(FWD);}
    
    }
    
    
    int main(void)
    {initRobotBase();
    powerON();
    
    
    BUMPERS_setStateChangedHandler(bumpersStateChanged);
    
    while(true)
    {task_LDRinfo();
    task_RP6System();
    task_ADC();
    }
    return 0;
    }
    mfg

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    10.08.2007
    Beiträge
    47
    Code:
    if(dif > 100) dif = 100; /* Obergrenze 100*/
    if(dif < 100) dif = -100; /* Untergrenze -100*/
    /* Wertebereich nun -100 ... 100 !!*/
    
    if(dif==100) /* genau gleich 100 ?*/
    ...
    else if(dif== -100) /* genau gleich -100?*/
    ...
    else
    /*tue nichts*/
    Was macht das Programm bei z.B. 95, oder -43, oder ...?
    Es ist doch seeehhhr unwahrscheinlich das die Werte genau erreicht werden. Ueberpruefe Deine Abfragen nochmal und sei nicht ganz so strikt mit den Forderungen.

    Edit: ich sehe gerade, das Du ja nur die zwei Werte erreichen kannst. Ich sehs mir nochmal genauer an...

    Edit2: RP6 dreht also immer entweder rechts oder links und findet nie eine Ruheposition...

    Code:
    if(dif < -100) dif = -100; /*so waers wohl besser*/
    hth
    Kay

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    hallo, verstehe jetzt leider nicht was du mir mit deinem post sagen willst.

    meiner meinung nach ist dein verbesserungsvorschlag doch genau das, wie ich es programmiert habe.

    mit +100 und -100 funktioniert das programm ja.

    aber wenn ich diese werte mal mit +200 bzw. -200 ersetze geht nichts mehr.

    mfg

  5. #15
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    if(dif > 100) dif = 100;
    if(dif < 100 ) dif = -100;
    Steht oben - da fehlt das Minus in der zweiten Abfrage.

    Bei sowas rate ich immer: ALLE Zwischenergebnisse in einzelne Schritte aufdröseln und alles mit writeInteger ausgeben lassen! So lässt sich schnell feststellen wo es hakt.

    MfG,
    SlyD

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    macht es dann einen unterschied ob ich in meinem programm if(dif==100){} oder if(dif=100) {} schreibe?
    mfg

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    10.08.2007
    Beiträge
    47
    Das macht einen gewaltigen Unterschied!
    "==" ist eine Abfrage auf Gleichheit (kann wahr oder falsch sein)
    "=" ist eine Zuweisung (veraendert Deine Variable!)

    Das Problem war/ist nur das fehlende "-" in Deiner zweiten Abfrage.

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    ok, ja stimmt hab ich vorher übersehen. du hast natürlich recht gehabt.
    danke nochmal

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    36
    Beiträge
    220
    so, jetzt ist mein programm fertig. funktioniert einwandfrei. der rp6 findet nun jede lichtquelle zuverlässig.

    Code:
    #include "RP6RobotBaseLib.h"     
     
    #define BATRANGE 500
    #define RANGE 1005
    
    void task_LDRinfo(void)
    {writeString_P("LDR_L: ");
    	writeIntegerLength(adcLSL,DEC,4);
    writeString_P(" ; LDR_R: ");
    	writeIntegerLength(adcLSR,DEC,4);
    
    writeChar('\n');
    	int16_t dif = ((int16_t)(adcLSL - adcLSR));
    	if(dif > 50) dif = 50;
    	if(dif < -50) dif = -50;
    	
    	
    if(dif==50 && adcLSL<1005 & adcLSR<1005)
    	{setLEDs(0b000001);
    	
    	moveAtSpeed(20,50);}
    	
    
    else if(dif==-50 && adcLSL<1005 & adcLSR<1005)
    		{setLEDs(0b000010);
    		moveAtSpeed(50,20);}
    		
    else if(adcLSL>1005 || adcLSR>1005)
    {moveAtSpeed(0,0);
    setLEDs(0b111111);
    writeString_P("Lichtquelle gefunden");}
    
    
    else{setLEDs(0b000000);
    		moveAtSpeed(50,50);}
    }
    
    void bumpersStateChanged(void)
    {if(bumper_left)
    	{move(60,BWD,DIST_MM(150),true);
    	rotate(50,RIGHT,90,true);
    	changeDirection(FWD);
    	}
    
    if(bumper_right)
    	{move(60,BWD,DIST_MM(150),true);
    	rotate(50,LEFT,90,true);
    	changeDirection(FWD);}
    
    }
    
    
    int main(void)
    {initRobotBase();
    powerON();
    
    
    BUMPERS_setStateChangedHandler(bumpersStateChanged);
    
    while(true)
    {task_LDRinfo();
    task_RP6System();
    task_ADC();
    }
    return 0;
    }
    die werte sind auf einen schwach beleuchteten raum ausgelegt, nur für den fall, dass es jemand ausprobieren will.

    mfg

  10. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    39
    Beiträge
    211
    mein Edit zu Drivers ursprünglicher Variante
    Code:
       else if ((Licht_L + 1 <= Licht_R) && (Licht_L - 1 >= Licht_R))    //wenn Licht auf beiden Sensoren gleich ist...
    gruss

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

12V Akku bauen