- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: RP6 Servo Ansteuerung

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    11.10.2010
    Beiträge
    11
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Vielen Dank für Deine Antwort
    Leider geht beim ersten Programm das ACS garnicht. Bei meinem Programm hat es wie, du schon gesagt hast das ACS nur immerwieder mal aufgerufen.
    Woran könnte es liegen?
    Also Roboter fährt ganz normal geradeaus, Rudermaschine dreht sich jedoch reagieren weder Bumper noch ACS

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Seltsam, dass es überhaupt mal funktioniert hatte:

    Code:
    	powerON();
    	enableACS();
    	setACSPwrHigh();
    Ich habe meinen RP6 jetzt auch mal aktiviert. Mit der Änderung oben sehe ich mit der Digicam die ACS-LEDs blinken. Wenn ich mit der TV-Fernbedienung auf den IR-Empfänger ziele, dann startet er auch das ACS-Ausweichprogramm. Aber sonst tut sich nichts. Selbst so nicht:

    Code:
    	while(1)
       {
    		//setLEDs(0b100100);
    		task_ACS();
    		if(obstacle_right || obstacle_left) setLEDs(63); else setLEDs(0b100100);
    		task_RP6System();
    Wenn ich nun die Bumpers betätige, startet er das Bumpersprogramm, wenn ich loslasse, wechselt er zum ACS-Programm?! setLEDs(63) kommt gar nicht.

    Muss ich mal forschen, was da nicht funzt. Bin wohl etwas aus der Übung :)

    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. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Oje:
    Code:
    #include "RP6RobotBaseLib.h"
    
    uint8_t i, servoposition;
    
    void acsStateChanged(void)
    {
    	setLEDs(8);
    	if(obstacle_right && obstacle_left) // beide Seiten?
    		rotate(60, RIGHT, 100, true);
    	else if(obstacle_left) 					// nur links
    		rotate(80, RIGHT, 50, true);
    	else if(obstacle_right) 				// bleibt nur noch rechts übrig
    		rotate(80, LEFT, 50, true);
    		
    	changeDirection(FWD); 					// weiterfahren
    	moveAtSpeed(100,100);
    }
    
    void bumpersStateChanged(void)
    {
    	setLEDs(1);
    	if(bumper_left || bumper_right)
    	{
    		changeDirection(BWD);
    		move(100, BWD, DIST_MM(200), true);
    		rotate(50, RIGHT, 120, true);
    	}
    	changeDirection(FWD);
    	moveAtSpeed(100,100);
    }
    
    int main(void)
    {
    	initRobotBase();
    	setLEDs(0b111111);
    	mSleep(500);
    	setLEDs(0b001001);
    	DDRA |= 1;
    	BUMPERS_setStateChangedHandler(bumpersStateChanged);
    	ACS_setStateChangedHandler(acsStateChanged);
    	powerON();
    	enableACS();
    	setACSPwrLow();
    
    	changeDirection(FWD);
    	moveAtSpeed(100,100);
    	servoposition=0; 									// 0 ist sleep(8), 1 ist sleep(23)
    	startStopwatch1(); 								// Stoppuhr starten
    
    	while(1)
       {
    		setLEDs(0b100100);
    		task_RP6System();
    		//sleep(50); // das Tasksystem muss man nicht so häufig aufzurufen
    
    		if(getStopwatch1() > 2000) 				// zwei Sekunden sind vorbei
    		{
    			setStopwatch1(0); 						// Stoppuhr zurücksetzen
    			setLEDs(0b010010);
    			for(i=0; i<50; i++) 						// ein Sekunde lang Servo bewegen
          	{
             	PORTA |= 1;
             	if(servoposition) sleep(23); else sleep(8);
             	PORTA &= ~1;
             	sleep(100); 							// Impulspause ist sleep() und Task zusammen!
             	task_RP6System(); 					// beim Servoschwenken weiterfahren
          	}
          	if(servoposition) servoposition=0; 	// andere Servoposition wählen
    				else servoposition=1;
    		}
       }
       return(0);
    }
    Man sollte eben mit dem Tasksystem kein sleep() verwenden ;)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  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
    Irgendwie wird's nicht wirklich besser, ich breche hier mal ab:
    Code:
     #include "RP6RobotBaseLib.h"
    
    uint8_t i, servoposition;
    
    void acsStateChanged(void)
    {
       setLEDs(statusLEDs.byte | 0b001001);
       if(obstacle_right && obstacle_left)		// beide Seiten?
          rotate(60, RIGHT, 100, true);
       else if(obstacle_left)						// nur links
       {
    		setLEDs(statusLEDs.byte & ~1);
    		rotate(80, RIGHT, 50, true);
    	}
      	else if(obstacle_right)             	// bleibt nur noch rechts übrig
      	{
         	setLEDs(statusLEDs.byte & ~8);
    		rotate(80, LEFT, 50, true);
    	}
    	
    	setLEDs(statusLEDs.byte & ~0b001001);
       changeDirection(FWD);                  // weiterfahren
       moveAtSpeed(100,100);
    }
    
    void bumpersStateChanged(void)
    {
       setLEDs(statusLEDs.byte | 0b001001);
       if(bumper_left || bumper_right)
       {
          changeDirection(BWD);
          move(100, BWD, DIST_MM(200), true);
          rotate(50, RIGHT, 120, true);
       }
    	setLEDs(statusLEDs.byte & ~0b001001);
       changeDirection(FWD);
       moveAtSpeed(100,100);
    }
    
    int main(void)
    {
       initRobotBase();
       setLEDs(0b111111);
       DDRA |= 1;
       BUMPERS_setStateChangedHandler(bumpersStateChanged);
       ACS_setStateChangedHandler(acsStateChanged);
       powerON();
       enableACS();
       setACSPwrMed();
    
       mSleep(500);
       setLEDs(0b000000);
    
       changeDirection(FWD);
       moveAtSpeed(100,100);
       servoposition=8;
       startStopwatch1();                         // Stoppuhr starten
    
       while(1)
       {
          task_RP6System();
    
          if(getStopwatch1() > 2000)             // zwei Sekunden sind vorbei
          {
             setStopwatch1(0);                   // Stoppuhr zurücksetzen
             if(servoposition==8)                // Servoseite anzeigen
    				setLEDs((statusLEDs.byte & ~16) | 2);
    			else
    			   setLEDs((statusLEDs.byte & ~2) | 16);
    
             for(i=0; i<50; i++)                 // ein Sekunde lang Servo bewegen
             {
                PORTA |= 1;														// Impuls senden
    				cli(); // vorsichtshalber atomar
    				timer=0; // timer wird in ISR alle 100µs inkrementiert
    				sei();
    				while(timer < servoposition) task_RP6System();
    
                PORTA &= ~1;													// Impulspause
    				cli(); // vorsichtshalber atomar
    				timer=0; // timer wird in ISR alle 100µs inkrementiert
    				sei();
    				while(timer < (200-servoposition)) task_RP6System();
             }
    
             if(servoposition==8) servoposition=23; // andere Servoposition wählen
                else servoposition=8;
          }
    
          if((getStopwatch1() % 125) == 0)                         // Betriebsanzeige
    		{
    			if(statusLEDs.byte & 4)
    				setLEDs((statusLEDs.byte & ~4) | 32);              // (Spielerei :)
    			else                                                  // krass!
    			   setLEDs((statusLEDs.byte & ~32) | 4);
    		}
       }
       return(0);
    }
    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
  •  

Solar Speicher und Akkus Tests