- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Fernsteuerung für den RP6

  1. #11
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Anzeige

    E-Bike
    Natürlich kannst du das machen. Aber dann kannst du genauso gut eine Fensteueranlage kaufen.(oder servos, motoren und empfänger was du eben ausschlachten willst...)
    Nichts existiert durch sich allein!
    Bild hier  

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.03.2010
    Ort
    Hamburg
    Beiträge
    333
    war ne idee da ich ein altes Auto hab wo der Servo für die Lenkung Defekt ist

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    An Radbruch!
    Hi,
    das Demoprogram zur Ansteuerung von Servos habe ich soweit verstanden. Da geht es ja drum ein Positives Signal zu senden aber ich möchte eines empfangen. Wie geht das? ( Mit den gleichen Ports: SCL, SDA) Der Empfänger dessen Signal hier ausgewertet werden soll sendet ganz normale Servo Impulse. Mir geht es eben nur darum zu wissen wie ich dass Empfängersignal auswerten kann.
    Danke!!
    Nichts existiert durch sich allein!
    Bild hier  

  4. #14
    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

    Schon klar, dass du die Impulslängen der Servosignale des RC-Empfängers messen und auswerten willst. Aber wenn du kapiert hast, wie die Impulse in der ISR erzeugt werden, ist der Schritt zur Impulslängenmessung mit der selben ISR nicht mehr weit:
    https://www.roboternetz.de/phpBB2/vi...=356247#356247

    bzw. wird hier der Code in einer Timer0-ISR verwendet und ist deshalb nicht mit der RP6-Lib verträglich. Eine Kombination mit der Timer1-Overflow-ISR wäre der optimale Kompromiss:
    https://www.roboternetz.de/phpBB2/vi...=328824#328824

    Damit geht dann das:
    Bild hier  
    http://www.youtube.com/watch?v=A_GYUeFAgY8

    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!

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Hallo nchmal,
    Ich habe mir gestern die oben verlinkte Fernsteueranlage von Conrad gekauft. Sie funktioniert wunderbar und auch das Fernsteuerprogramm von Radbruch läuft super. Nur wollte ich auch mal ein "eigenes" Program schreiben um den RP6 fernsteuern zu können. Es funktioniert leider nicht so wie ich es mir vorgestellt hatte. Deswegen brauche ich noch ml Hilfe!!
    Undzwar hatte ich das Teilprogramm um die Signale auszulesen von Radbruch. ( In dem Program werden Werte von SCL und SDA ausgegeben)
    Dieses habe ich ein wenig gekürzt und wollte mithilfe einer Ergänzung erreiche, dass die Signalwerte in Motorbefehle umgewandelt werden. Doch wenn ich das Program starte und die Fernsteuerrung anschalte macht der RP6 was er will. Manchmal dreht sich die rechte Kette dann wieder die Linke ohne das ich es beeinflussen kann. (Ein Hardware Problem liegt definitiv nicht vor, weil das rb-programm ja tadellos funktioniert.)
    Noch was zu den Variablennamen: Ich habe die absichtlich umbenannt, weil ich jeden Motor einzelnd ansteuern will. (pwrr= rechter Motor, pwrl= linker Motor.)
    Die anderen Variablen(y,x,c,v) Sind als Eingrenzung gedacht, damit man die ausgewerteten Signale auch VERWERTEN kann. Ich glaube allerdings nicht, dass das Problem daher kommt. Denn ich habe schon ein Program zum einlesen der Variablen rc_input... laufen lassen und die Eingrenz-Variaben danach ausgerichtet.
    Hier ist nun der Code: (mir ist es wichtig die orginal RP6.h Lib zu verwenden, deshalb benutze ich auch nicht Radbruchs Programm mit der rb-Lib als Ansatz.)
    Code:
    #include "RP6RobotBaseLib.h" 
    
    volatile uint8_t rc_input_pwrr=26, rc_input_pwrl=26; 
    
    int main(void) 
    { 
       initRobotBase(); 
       TIMSK |= (1 << TOIE1);          // Die Timer1 Overflow-ISR zur Signalauslesung
       powerON();
       uint8_t y=29;
       uint8_t x=26; 
       uint8_t c=24;
       uint8_t v=28;
    
        while(1) 
       { 
         if (rc_input_pwrl>y ) {changeDirection(BWD); while (rc_input_pwrl<y) {moveAtSpeed(0,60);}}
    	 if (rc_input_pwrl<x ) {changeDirection(FWD); while (rc_input_pwrl>x) {moveAtSpeed(0,60);}}
         if (rc_input_pwrr<c ) {changeDirection(BWD); while (rc_input_pwrl<c) {moveAtSpeed(60,0);}}
    	 if (rc_input_pwrr>v ) {changeDirection(FWD); while (rc_input_pwrl>v) {moveAtSpeed(60,0);}}
    	 task_motionControl();
       } 
       return 0;
    }  
     
    ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen 
    { 
       static uint16_t rc_temp_pwrl=0; 
       static uint16_t rc_temp_pwrr=0; 
       if (PINC & 1) rc_temp_pwrl++; else 
          if (rc_temp_pwrl) { rc_input_pwrl=rc_temp_pwrl-1; rc_temp_pwrl=0; } 
       if (PINC & 2) rc_temp_pwrr++; else 
          if (rc_temp_pwrr) { rc_input_pwrr=rc_temp_pwrr-1; rc_temp_pwrr=0; } 
    }
    Diejenigen von euch deMir helfen wollen und eine eigene Fernsteuerung besitzen können das Programm ja mal ausprobieren und rumprbieren. Ich bin wirklich dankbar wenn ihr mir helfen könnt.
    Nichts existiert durch sich allein!
    Bild hier  

  6. #16
    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

    Bei x/y stimmen die > und < nicht. Wäre diese Abfrage nicht besser?
    Code:
    if (rc_input_pwrl>y )
    {
    	changeDirection(BWD);
    	pwr_l=60;
    }
    else if (rc_input_pwrl<x )
    {
    	changeDirection(FWD);
    	pwr_l=60);
    }
    else pwr_l=0;
    
    if(pwr_l || pwr_r)
    	moveAtSpeed(pwr_l, pwr_r);
    else
    	stop();
    (ungetestet, drehen mit beiden Motoren geht so aber auch nicht)

    Schön dass es quasi auf Anhieb funktioniert ;)

    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!

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Hi,
    Die Werte für x und y stimmen schon. Die sind nur anders weil ich Die Laufrichtung der Servos geändert habe, aber deine Anregung habe ich umgesetzt und folgendes ist dabei rasgekommen:
    Code:
    #include "RP6RobotBaseLib.h" 
    
    volatile uint8_t rc_input_pwrr=26, rc_input_pwrl=26, rc_input_schalt; 
    
    int main(void) 
    { 
       initRobotBase(); 
       TIMSK |= (1 << TOIE1);          // Die Timer1 Overflow-ISR zur Signalauslesung
       powerON();
       setACSPwrHigh();
       setLEDs(0b111111); 
       uint8_t y=21;
       uint8_t x=29; 
       uint8_t c=22;
       uint8_t v=29;
       uint8_t pwr_l=0;
       uint8_t pwr_r=0;
       void acsStateChanged(void)
     {
      if(!obstacle_left && !obstacle_right)
           {
    	     move(160, FWD, DIST_MM(50), true);
    	   }
        while(true)
        {
       
    	   if(!obstacle_left && !obstacle_right)
           {
    	     move(160, FWD, DIST_MM(50), true);
    	   }
           else
           {
    
            if(obstacle_right) 
    		{
    		 rotate(160, LEFT, 2,true);
    		}
    		else
    		{
             while((obstacle_left && obstacle_right) || obstacle_left) 
             { 
              rotate(160, RIGHT, 2,true);
             }
            }
           }
    	    task_Bumpers();
            if(getBumperLeft() && getBumperRight()) // Beide Bumper
            {
    		move(160, BWD, DIST_MM(30), true);
            rotate(160, LEFT, 35,true);
            }
            if(getBumperLeft()) // Bumber Links
            {
    		move(160, BWD, DIST_MM(30), true);
            rotate(160, RIGHT, 25,true);
            }
            if(getBumperRight()) // Bumber Rechts
            {
    		move(160, BWD, DIST_MM(30), true);
            rotate(160, LEFT, 25,true);
            }
        mSleep(10);
    	
    	
    	
    	
    	}
      }
       
        while(1) 
       { 
           task_motionControl();
    	   task_ACS();
    	   if (rc_input_schalt>x) // Umschalten auf Autopilot
    	   {
    	    while (rc_input_schalt>x)
    		{
    		 ACS_setStateChangedHandler(acsStateChanged); // ACS Event Handler registrieren 
    		} 
    	   }
    	   if (rc_input_pwrr<17 && rc_input_pwrl<17 && rc_input_pwrr>32 && rc_input_pwrl>32)
    	   {
    	    stop();
    	   }
    	   if (rc_input_pwrr<c && rc_input_pwrl<y)
    	   { while (rc_input_pwrr<c && rc_input_pwrl<y)
    	     {
    		  rotate(60, LEFT, 1, true);
    	     }
    	   }
    	   if (rc_input_pwrr>v && rc_input_pwrl>x)
    	   { while (rc_input_pwrr>v && rc_input_pwrl>x)
    	     {
    		  rotate(60, RIGHT, 1, true);
    	     }
    	   }
    	
    	   if (rc_input_pwrr<c ) 
           { 
            changeDirection(FWD); 
            pwr_r=60; 
           } 
           else if (rc_input_pwrr>v ) 
           { 
            changeDirection(BWD); 
            pwr_r=60; 
           } 
           else pwr_r=0; 
    	   if (rc_input_pwrl<y ) 
           { 
            changeDirection(BWD); 
            pwr_l=60; 
           } 
           else if (rc_input_pwrl>x ) 
           { 
            changeDirection(FWD); 
            pwr_l=60; 
           } 
           else pwr_l=0; 
    
           if(pwr_l || pwr_r) 
           {
            moveAtSpeed(pwr_l, pwr_r); 
           }
           else 
            stop();
    	 
       } 
       return 0;
    }  
     
    ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen 
    { 
       static uint16_t rc_temp_pwrl=0; 
       static uint16_t rc_temp_pwrr=0; 
       static uint16_t rc_temp_schalt=0;
       if (PINC & 1) rc_temp_pwrl++; else 
          if (rc_temp_pwrl) { rc_input_pwrl=rc_temp_pwrl-1; rc_temp_pwrl=0; } 
       if (PINC & 2) rc_temp_pwrr++; else 
          if (rc_temp_pwrr) { rc_input_pwrr=rc_temp_pwrr-1; rc_temp_pwrr=0; } 
       if (PINA & 16) rc_temp_schalt++; else 
          if (rc_temp_schalt) { rc_input_schalt=rc_temp_schalt-1; rc_temp_schalt=0; } 
    
    
    
    }
    Funktiniert ganz ausgezeichnet =D>
    Nichts existiert durch sich allein!
    Bild hier  

  8. #18
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Glückwunsch. Das Auswerten der RC-Signale hast jetzt echt gut im Griff. Die Umschaltung zwischen Autopilot und Fernsteuerung ist eine prima Idee.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

LiFePO4 Speicher Test