- LiFePO4 Speicher Test         
Seite 4 von 7 ErsteErste ... 23456 ... LetzteLetzte
Ergebnis 31 bis 40 von 64

Thema: Anschluss von Infrarotsensoren

  1. #31
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    Anzeige

    E-Bike
    hallo, bei meinem ir radar projekt stehe ich gerade bei der rotate funktion ein wenig auf dem schlauch und brauche hilfe.
    interessant ist eigentlich nur der folgende kurze programmauszug:

    Code:
    void RP6_Bewegung(void)
    {if (ir_hindernis)
    	{
    	
    if (!(ir_ende))
    	{stopStopwatch3();
    	writeString_P("ir ende gleich false\n");}
    	
    	
    	
    if (getStopwatch3() <1000 || getStopwatch3() >6000)
    	{rotate(50,RIGHT,90,true);
    	ir_ende= true;
    	}
    	
     if ((getStopwatch3() >1000 && getStopwatch3() <2000)||(getStopwatch3()>5000 && getStopwatch3() <6000))	
    	{rotate(50,RIGHT,45,true);
    	ir_ende= true;
    	}
    	
    	
    if (ir_ende)
    	{startStopwatch3();
    	writeString_P("ir ende gleich true\n");}
    	
    	
    }}
    mein ziel ist, dass nachdem die rotate- funktionen ausgeführt wurden die variable ir_ende auf true gesetzt wird.

    nachdem ich die anleitung genauer untersucht habe, bin ich zum entschluss gekommen, dass das eigentlich mit der variable true am ende der rotate- funktion funktionieren müsste.

    aber leider ist es jetzt so, dass nach dem ausführen der rotate- funktionen nichts mehr geschieht und die variable ir_ende nicht auf true gesetzt wird.

    mit den parametern BLOCKING und false habe ich es auch schon erfolglos probiert.

    wer kann mir weiterhelfen?

    mfg andi

  2. #32
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Der trick ist das du eine move oder rotate auftrag nur einmal aufruft, aber nicht mit "blocking". Der auftrag wird dan automatisch weiter ausgefuhrt und ihre main program kan sich um andere Sachen bekummern. Ende von Auftrag wird dan in main abgefragt mit ismovementcomplete(). Eine kleines codeschnipsel (nicht einfach kopieren, da ich da gans fiele Sachen in die lib geandert habe):
    Code:
    void sharp_rotate(void)		//elke 40 mS samplen tijdens 360° draai
    	{
    	
    	if (state==1) {reset_odometrie();rotate(10,10,360,LEFT,0);state++;}
    	if (state==2) if (getStopwatch2()>40)
    								{
    								setStopwatch2(0);
    								adc0 = 0.3*adc0+0.7*readADC(ADC_0);
    								adc1 = 0.3*adc1+0.7*readADC(ADC_1);
    								adc2 = 0.3*adc2+0.7*readADC(ADC_2);
    								adc3 = 0.3*adc3+0.7*readADC(ADC_3);
    								int16_t sharp0= Sharp_LR(adc0);//omzetten naar afstand in mm
    								int16_t sharp1= Sharp_MR(adc1);
    								int16_t sharp2= Sharp_MR(adc2);
    								int16_t sharp3= Sharp_LR(adc3);
    								writeInteger((e_compass/E_COMPASS_RESOLUTION), DEC);writeString_P("  ");
    								writeInteger(sharp0, DEC);writeString_P("  ");
    								writeInteger(sharp3, DEC);writeString_P("  ");
    								writeInteger(sharp1, DEC);writeString_P("  ");
    								writeInteger(sharp2, DEC);writeString_P("  ");
    								writeChar('\n');
    								}	
    	if (state==3) {program=0;state=1;}
    	if (isMovementComplete()&&#40;state!=0)) state++;
    	}

  3. #33
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    danke für die schnelle antwort. jetzt hab ich es mal so abgeändert:

    Code:
    void RP6_Bewegung(void)
    {if (ir_hindernis)
    	{
    	
    if (!(ir_ende))
    	{stopStopwatch3();
    	writeString_P("ir ende gleich false\n");}
    	
    	
    	
    if (getStopwatch3() <1000 || getStopwatch3() >6000)
    	{rotate(50,RIGHT,90,true);
    	}
    	
     if ((getStopwatch3() >1000 && getStopwatch3() <2000)||(getStopwatch3()>5000 && getStopwatch3() <6000))	
    	{rotate(50,RIGHT,45,true);
    	}
    	
    if (isMovementComplete())
    	{ir_ende= true;}
    	
    if (ir_ende)
    	{startStopwatch3();
    	writeString_P("ir ende gleich true\n");}
    	
    	
    }}
    aber das ergebnis ist das gleiche wie vorher. der rp6 führt die rotate bewegung korrekt bis zum ende aus aber die ir_ende variable wird nicht auf true gesetzt.
    was ist noch falsch?

    mfg

  4. #34
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    so, jetzt habe ich mir mal etwas genauer das RP6_Move_04_FSM2 beispielprogramm angeschaut.
    bei diesem wird die move- funktionen ja in switch cases abgearbeitet. nach diesem vorbild habe ich jetzt auch mein programm abgeändert.

    hier der ausschnitt:


    Code:
    void RP6_Bewegung(void)
    {if (ir_hindernis)
    	{
    	
    if (!(ir_ende))
    	{stopStopwatch3();
    	writeString_P("ir ende gleich false\n");}
    
    else {startStopwatch3();}	
    	
    	
    if (getStopwatch3() <1000 || getStopwatch3() >6000)
    	{move_state= 0;
    	}
    	
     if ((getStopwatch3() >1000 && getStopwatch3() <2000)||(getStopwatch3()>5000 && getStopwatch3() <6000))	
    	{move_state=1;
    	}
    
    	
    switch(move_state)
    	{case 0:
    	rotate(50,RIGHT,90,NON_BLOCKING);
    	move_state= 2;
    	break;
    	
    	case 1:
    	rotate(50,RIGHT,45,NON_BLOCKING);
    	move_state= 2;
    	break;
    	
    	case 2:
    	if(isMovementComplete())
    	{ir_ende= true;
    	startStopwatch3();
    	writeString_P("ir ende gleich true\n");
    	}
    	break;
    	
    	
    	}}}
    obwohl ich meiner meinng nach nach dem gleichem schema wie in diesem beispielprogramm programmiert habe, funktioniert es nicht im beispielprogramm.
    ich habe nun das problem, dass der rp6 sich ständigt dreht, d.h. er dreht nicht eine bestimmte gradzahl sondern er dreht sich permanent auf der stelle.
    außerdem wird ir_ende= true immer noch nicht gesetzt.

    woran liegt das?

    mfg

  5. #35
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    jetzt hab ich mal nochmal alles genau überarbeitet und mit dem beispielprogramm verglichen. aber ich kann einfach keinen unterschied der programmiervariante bzw. fehler finden.

    kann mir denn niemand helfen?

    danke schon mal im voraus

  6. #36
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Habe grad mal fix drübergeschaut.

    Das hier
    if (getStopwatch3() <1000 || getStopwatch3() >6000)
    {move_state= 0;
    }
    wird immer ausgeführt!


    Damit wird der Teil hier:

    case 0:
    rotate(50,RIGHT,90,NON_BLOCKING);
    move_state= 2;
    break;


    auch dauernd ausgeführt denn das move_state=2 hat solange keinen Effekt wie die Stopwatch3 nicht bei 1000 angekommen ist.


    ir_ende ist wohl zu beginn false also wird ständig das hier:
    if (!(ir_ende))
    {stopStopwatch3();
    writeString_P("ir ende gleich false\n");}

    aufgerufen. Also läuft die Stopwatch3 nicht.

    --> RP6 dreht dauerhaft.

    Formatier den Code in Zukunft mal übersichtlicher dann sieht man sowas auch leichter

    MfG,
    SlyD

  7. #37
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    @Slyd: wenn ich deinen post richtig verstanden habe, war mein ursprüngliches problem, dass in meinem programm move_state immer = 0 war und dadurch case 1 erst gar nicht ausgeführt wird.

    Aus diesem grund habe ich jetzt noch einmal alles abgeändert und auch ein paar kommentare hinzugefügt.

    zum besseren verständnis hier noch meine dazugehörige liberweiterung:
    Code:
    void infrarotkollission(void)
    {DDRC &=~ (1<<PC3);    //PC3 als Eingang infrarotempfänger
    
    if(ir_erweiterung ==0)
    {
    if (!(PINC & (1<<PC3)))
     {writeString_P("Infrarotempfang ein\n");
     writeStringLCD("ir_counter=:");
     writeString("ir_counter=:");
    writeInteger(ir_counter,DEC);
    
     writeIntegerLCD(ir_counter, DEC);
     writeChar('\n');
     
    ir_ende = false;
     ir_counter++;  //infrarot empfangen
     }
    }
    
    if (ir_counter ==50)
    	{ir_hindernis = true;
    	ir_erweiterung = 1;
    	}
    
    if (ir_ende)
    {ir_counter =0;
    ir_erweiterung =0;
    ir_hindernis = false;
    }
    
    }
    und hier jetzt mein komplettes abgeändertes demoprogramm:
    Code:
     // Uncommented Version of RP6ControlServo.c
    
    // ------------------------------------------------------------------------------------------
    
    #include "RP6ControlLib.h"
    #include "RP6ControlServoLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_I2CMasterLib.h"
    
    //Servo 1 => PC2
    //Servo 2 => PC3
    //Servo 3=> PC4 
    //Servo 4=> PC5 
    //Servo 5=> PC6
    
    uint8_t move_state = 0; // Wenn nichts anderes zugewiesen ist, ist move_state =0
    
    
    
    void RP6_Bewegung(void)
    {if (ir_hindernis)
    	{
    if (!(ir_ende))
    	{stopStopwatch3();		//stopwatch3 anhalten wenn ir erkannt wird und damit servobewegung anhalten
    	writeString_P("ir ende gleich false\n");}	
    
    
    	
    	
    
    	{switch(move_state)
    	
    {case 0:
    	if (getStopwatch3() <1000 || getStopwatch3() >6000)
    	{rotate(50,RIGHT,90,NON_BLOCKING);      //um 90 grad rotieren    
    	move_state= 1;}	// move_state den wert 1 zuweisen
    	
    	break;
    	
    	
    case 1:
    	if(isMovementComplete())
    	{ir_ende= true; 		//ir_ende=true, wenn bewegung abgeschlossen
    	startStopwatch3();		//stopwatch3 wieder starten und servo wieder starten
    	writeString_P("ir ende gleich true\n");
    	}
    	break;
    }
    	
    
    }}
    
    }
    	
    	
    	
    	
    
    
    
    
    
    void servoansteuerung(void)
    {if (getStopwatch3() <1000)
    	{servo3_position = 0;
    	writeString_P("LEFT Touch\n");}
    
    
    if (getStopwatch3() >1000 && getStopwatch3() <2000)
    	{servo3_position = 20;
    	writeString_P("servo position 40\n");}
    	
    if (getStopwatch3() >2000 && getStopwatch3() <3000)
    	{servo3_position = 90;}
    
    if (getStopwatch3() >3000 && getStopwatch3() <4000)
    		{servo3_position = RIGHT_TOUCH;
    		writeString_P("Servo Right touch\n");}
    		
    if (getStopwatch3() >4000 && getStopwatch3() <5000)
    	{servo3_position = 90;}
    	
    if (getStopwatch3() >5000 && getStopwatch3() <6000)
    	{servo3_position = 20;}
    		
    if (getStopwatch3() >6000 && getStopwatch3() <7000)
    	{servo3_position = 0;
    	writeString_P("LEFT Touch\n");}
    	
    if (getStopwatch3() >7000)
    	{
    	setStopwatch3(0);
    	writeString_P("stopwatch3 auf 0 zurück\n");}
    	
    	}
    
    
    
    
    
    
    	
    
    	
    int main(void)
    { 
       initRP6Control();
       
       I2CTWI_initMaster(100);  
    	
    	
     
    
     initSERVO(SERVO3); 
    startStopwatch3(); 
       
       while(true) 
       {
    servoansteuerung();
        task_SERVO();
     
    	  infrarotkollission();
    	  RP6_Bewegung();
    
       }
       return 0;
    }
    das alte problem, dass das programm in der case 0 ständig "hängen" bleibt müsste ich jetzt eigentlich behoben habe. der RP6 dreht sich jetzt auf jeden fall schon mal 90 grad und bleibt dann stehen.

    was allerdings immer noch nicht geht, ist dass das programm nach der rotationsbewegung in die case 1 geht und dann mit startStopwatch3() die servobewegung wieder startet.

    hat jemand vielleicht auf dieses phänomen eine erklärung?

    Zitat Zitat von SlyD
    Formatier den Code in Zukunft mal übersichtlicher dann sieht man sowas auch leichter

    MfG,
    SlyD
    ich gelobe in zukunkt besserung

  8. #38
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    so, jetzt hab ich mal zur besseren veranschaulichung ein kleines video hochgeladen:

    http://www.youtube.com/watch?v=Wi1J1KOA0Gc

    das alte problem besteht aber nach wie vor. nachdem ein hindernis erkannt wird, stoppt die servobewegung und der RP6 dreht um 90 grad und bleibt dann stehen (kann man im video ganz gut sehen).
    allerdings sollte anschließend mein programm (liberweiterung und programm im letzten post) in case 1 springen und da dann servobewegung und infrarotempfang wieder starten.

    das programm springt auch in case 1(hab ich gerade mit einer textmeldung getestet) aber irgendwie wird isMovementComplete() nie true und damit werden auch die damit verbundenen funktionen (startStopwatch3(), ir_ende= true nicht ausgelöst.

    ich habe trotz langem suchens immer noch keine erklärung dafür gefunden aber dafür ist das forum ja auch da, um für solche probleme antworten zu bekommen .

    mfg andi

  9. #39
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Ihre void RP6_Bewegung(void) fangt an mit
    {if (ir_hindernis)
    Das bedeutet naturlich auch das (ir_hindernis) immer TRUE sein muss um die weitere ablauf zu bearbeiten. Ist das auch so ?
    Du muss absolut die layout so machen, das es klar ist welche {} zusammen horen. Auf das ende von diese function stehen 4 } nacheinander, und mir ist es nicht klar was bei was gehort.

  10. #40
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2008
    Ort
    Allgäu
    Alter
    37
    Beiträge
    220
    Zitat Zitat von RP6conrad
    Ihre void RP6_Bewegung(void) fangt an mit
    {if (ir_hindernis)
    Das bedeutet naturlich auch das (ir_hindernis) immer TRUE sein muss um die weitere ablauf zu bearbeiten. Ist das auch so ?
    ir_hindernis ist solange TRUE bis ir_ende gleich TRUE wird, also die ganze zeit.

    siehe hier:
    Code:
    void infrarotkollission(void)
    {DDRC &=~ (1<<PC3);    //PC3 als Eingang infrarotempfänger
    
    if(ir_erweiterung ==0)
    {
    if (!(PINC & (1<<PC3)))
     {writeString_P("Infrarotempfang ein\n");
     writeStringLCD("ir_counter=:");
     writeString("ir_counter=:");
    writeInteger(ir_counter,DEC);
    
     writeIntegerLCD(ir_counter, DEC);
     writeChar('\n');
     
    ir_ende = false;
     ir_counter++;  //infrarot empfangen
     }
    }
    
    if (ir_counter ==50)
       {ir_hindernis = true;
       ir_erweiterung = 1;
       }
    
    if (ir_ende)
    {ir_counter =0;
    ir_erweiterung =0;
    ir_hindernis = false;
    }
    
    }
    Zitat Zitat von RP6conrad
    Du muss absolut die layout so machen, das es klar ist welche {} zusammen horen. Auf das ende von diese function stehen 4 } nacheinander, und mir ist es nicht klar was bei was gehort.
    hier habe ich das demoprogramm noch mal sorgfältig überarbeitet:

    Code:
      // Uncommented Version of RP6ControlServo.c
    
    // ------------------------------------------------------------------------------------------
    
    #include "RP6ControlLib.h"
    #include "RP6ControlServoLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_I2CMasterLib.h"
    
    //Servo 1 => PC2
    //Servo 2 => PC3
    //Servo 3=> PC4
    //Servo 4=> PC5
    //Servo 5=> PC6
    
    uint8_t move_state = 0; // Wenn nichts anderes zugewiesen ist, ist move_state =0
    
    
    
    void RP6_Bewegung(void)
    {if (ir_hindernis)
      {
    if (!(ir_ende))
             {stopStopwatch3();      //stopwatch3 anhalten wenn ir erkannt wird und damit servobewegung anhalten
       writeString_P("ir ende gleich false\n");
              }   
    
    
       
       
    
      {switch(move_state)
       
             {case 0:
       if (getStopwatch3() <1000 || getStopwatch3() >6000)
         {rotate(50,RIGHT,90,NON_BLOCKING);      //um 90 grad rotieren   
          move_state= 1;   // move_state den wert 1 zuweisen
         }
         break;
       
       
    case 1:
       if(isMovementComplete())
         {ir_ende= true;       //ir_ende=true, wenn bewegung abgeschlossen
       startStopwatch3();      //stopwatch3 starten => servo wieder drehen
       writeString_P("ir ende gleich true\n");
          }
        break;
                }
       
    
       }
     }
    }
       
       
       
       
    
    
    
    
    
    void servoansteuerung(void)
    {if (getStopwatch3() <1000)
       {servo3_position = 0;
       writeString_P("LEFT Touch\n");}
    
    
    if (getStopwatch3() >1000 && getStopwatch3() <2000)
       {servo3_position = 20;
       writeString_P("servo position 40\n");}
       
    if (getStopwatch3() >2000 && getStopwatch3() <3000)
       {servo3_position = 90;}
    
    if (getStopwatch3() >3000 && getStopwatch3() <4000)
          {servo3_position = RIGHT_TOUCH;
          writeString_P("Servo Right touch\n");}
          
    if (getStopwatch3() >4000 && getStopwatch3() <5000)
       {servo3_position = 90;}
       
    if (getStopwatch3() >5000 && getStopwatch3() <6000)
       {servo3_position = 20;}
          
    if (getStopwatch3() >6000 && getStopwatch3() <7000)
       {servo3_position = 0;
       writeString_P("LEFT Touch\n");}
       
    if (getStopwatch3() >7000)
       {
       setStopwatch3(0);
       writeString_P("stopwatch3 auf 0 zurück\n");}
       
       }
    
    
    
    
    
    
       
    
       
    int main(void)
    {
       initRP6Control();
       
       I2CTWI_initMaster(100); 
       
       
     
    
     initSERVO(SERVO3);
    startStopwatch3();
       
       while(true)
       {
    servoansteuerung();
        task_SERVO();
     
         infrarotkollission();
         RP6_Bewegung();
    
       }
       return 0;
    }
    mfg andi

Seite 4 von 7 ErsteErste ... 23456 ... LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress