- LiFePO4 Speicher Test         
Seite 2 von 11 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 110

Thema: RP6 Servo Ansteuerung

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Servos ansteuern

    Anzeige

    Praxistest und DIY Projekte
    Hallo Robotoni,

    ich habe da jetzt kein Beispielprog in der Schublade.

    "stochri" hat hier 'mal einen GCC-Code veröffentlicht, mit dem 10 Servos mit Timer1-PWM angesteuert werden.
    Geh mal auf die Suche.

    Gruß Dirk

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Servo an der RP6 Control M32

    Hallo Robotoni,
    ... aber es wäre schon toll, wenn das Signal über den Timer des RP6-M32 Erweiterungsmodules laufen würde.
    Da habe ich mich dann 'mal dran gesetzt und das ist heraus gekommen.

    Viel Spaß!

    Gruß Dirk
    Angehängte Dateien Angehängte Dateien

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2007
    Ort
    Vallendar
    Alter
    64
    Beiträge
    5
    Hallo Dirk... toll wenn man richtig Ahnung hat ...... funktioniert super...
    bin bereits am Experimentieren.... mit meinem Entfernungssensor und einem Servo.. danke..danke..danke
    Gruß Robotoni (Toni)

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Servoansteuerung mit PWM

    Hallo RP6 Servo-Tester,

    SlyD: ... gäbe es ... auch die Möglichkeit ein PWM Modul des MEGA32 auf dem RP6-M32 zu verwenden.
    Diese tolle Lösung zur Servoansteuerung fehlte ja noch.

    Hier ein 1. Vorschlag zur Umsetzung für den RP6.

    Viel Spaß damit!

    Gruß Dirk
    Angehängte Dateien Angehängte Dateien

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211

    Also so richtig klappt bei mir noch nicht...

    Ich habe das ganze mal wie oben beschrieben durch probiert...

    1. mal das programm mit copy paste übernommen
    2. die Lib für das programm verändert.
    3. make all

    Das rote lämpchen leuchtet aber der servo tut nix... außer beim anschließen kurz zucken

    !Wichtig habe bis jetzt nur das RP6 basis modul - aber das sollte ja klappen wie im video zu sehen ist ...!

    kann mir da jemand weiter helfen ?

    Danke

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo carlitoco,

    da müßte radbruch etwas zu sagen.

    Wenn du erst 'mal nicht die Lib verändern willst, probier evtl. meine Version (RP6Base_Servo.zip vom 3.10.07).

    Gruß Dirk

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211
    ok da hat er sich jetzt schon mal in eine richtung gedreht - prima -jetzt muss ich mal schauen warum er versucht immer weiter in die selbe richtung zu drehen..

    Danke

  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
    Ups, ich dachte, ihr redet über Servos am Erweiterungsmodul. Inwischen steure ich die Servos etwas anders an:
    Code:
    // Vierradantrieb mit RC-Steuerung v1.0 9.12.2007 mic
    
    #include "rblib.h"
    #include "rblib.c"
    
    uint8_t servo_l, servo_r, demo;
    uint16_t i, j, time;
    uint8_t rc_input_pwr, rc_input_dir, rc_pwr, rc_dir, rc_misch=6;
    
    ISR(TIMER0_COMP_vect)
    {
    	static uint16_t count=0;
    	uint8_t rc_in;
    	static uint8_t rc_temp_pwr=0;
    	static uint8_t rc_temp_dir=0;
    	if(count>servo_l) PORTA &= ~1;  else PORTA |= 1;	// ADC0
    	if(count>servo_r) PORTA &= ~2;  else PORTA |= 2;	// ADC1
    	if(count<2000)count++; else { count=0; time++; }
    	rc_in=PINC;
    	if (rc_in & 1) rc_temp_dir++; else						// SCL (Pin10)
    		if (rc_temp_dir) { rc_input_dir=rc_temp_dir; rc_temp_dir=0; }
    	if (rc_in & 2) rc_temp_pwr++; else						// SDA (Pin12)
    		if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr; rc_temp_pwr=0; }
    }
    void servo_init(void)
    {
    	//DDRA |= 16;				// E_INT1 als Ausgang
    	//DDRC |= 3;				// SCL und SDA als Ausgang
    	DDRA |= 3;				// ADC0(PortA0) und ADC1(PortA1) als Ausgang
    
    	TCCR0 =  (0 << WGM00) | (1 << WGM01);					// CTC-Mode
    	TCCR0 |= (0 << COM00) | (0 << COM01);					// ohne OCR-Pin
    	TCCR0 |=	(0 << CS02)  | (1 << CS01) | (0 << CS00);	// prescaler /8
    	TIMSK =  (1 << OCIE0); 										// Interrupt ein
    	OCR0  = 13; // 100kHz?
    	time=0;
    }
    int main(void)
    {
    	rblib_init();
    	servo_init();
    	servo_l=130;
    	servo_r=120;
       setMotorDir(FWD,FWD);
    	setMotorPWM(130,90);
    	setLEDs(0b1001);
    
    	while(0)
    	{
    	   if (1) {
    		writeString("\n\r");
    	   writeInteger(rc_input_pwr, 10);
    	   writeString("-");
    	   writeInteger(rc_input_dir, 10);
    
    	   if (rc_input_pwr > 105)
    	   {
    			rc_pwr=rc_input_pwr-100;
    	   	servo_l=servo_r=rc_input_pwr;
    	   	setMotorDir(FWD,FWD);
    	   	setMotorPWM(rc_pwr*rc_misch,rc_pwr*rc_misch);
    		}
    		else if (rc_input_pwr < 95)
    		   {
    				rc_pwr=100-rc_input_pwr;
    		   	servo_l=servo_r=rc_input_pwr;
    	   		setMotorDir(BWD,BWD);
    	   		setMotorPWM(rc_pwr*rc_misch,rc_pwr*rc_misch);
    			}
    			else
    			{
    				servo_l=servo_r=100;
    				setMotorPWM(0,0);
    			}
    	   }
    
    	}
    
    	while(1);
    	return 0;
    }
    Ich verwende nicht die orginalen Libraries, so kann ich freier über die Funktionen des Mega32 verfügen. (Meine abgespeckte Lib ist im Anhang, Verwendung auf eigene Gefahr, weil ohne Überwachungen! Ist ideal beim Anhauchen wenn ein Antrieb spinnt*grins*)

    Alternativ könnte man auch die Timer 2 Compare ISR in der RP6BaseLib verwenden, die wird aber nicht ganz so häufig aufgerufen, die Werte für die Servostellung sind dann anders. Und man muss von Hand dafür sorgen, dass der Interrupt überhaupt läuft. Deshalb meine eigene Lib, damit geht das einfacher.

    Zum Programm(, das eigentlich die Vorbereitung meines 4-Rad-Antriebs ist):

    Die zwei Servos hängen an ADC0/1, das sind die freien ADC-Anschlüsse hinter dem IR-Empfänger auf der RP6-Platine. Hier habe ich zwei 3-polige Stiftleisten (+,-,ADC0/1) angelötet. Blöderweise sind die nicht servokompaktibel (bei den Servos ist + in der Mitte), aber an den Steckern der Servos kann man recht einfach die Adern vertauschen. Die Werte für die Servostellungen werden in uint8_t servo_l/servo_r übergeben, count erzeugt die 20ms-Wiederholung (und time dient als allgemeiner Timer):

    if(count>servo_l) PORTA &= ~1; else PORTA |= 1; // ADC0
    if(count>servo_r) PORTA &= ~2; else PORTA |= 2; // ADC1
    if(count<2000)count++; else { count=0; time++; }
    SDA und SCL verwende ich hier zum Einlesen der Signale einer RC-Fernbedienung die am xBus hängt, das wird in der ISR gleich miterledigt. Mit dem Programm steure ich momentan die Motoren und die Servos zusammen an. Denn unnötigen Code kann man natürlich rausschmeissen. Das passiert im unteren Teil der ISR:

    rc_in=PINC;
    if (rc_in & 1) rc_temp_dir++; else // SCL (Pin10)
    if (rc_temp_dir) { rc_input_dir=rc_temp_dir; rc_temp_dir=0; }
    if (rc_in & 2) rc_temp_pwr++; else // SDA (Pin12)
    if (rc_temp_pwr) { rc_input_pwr=rc_temp_pwr; rc_temp_pwr=0; }
    Man kann auch gut die SDA/SCL am xBus zur Ansteuerung der Servos verwenden.

    Gruß

    mic
    Angehängte Dateien Angehängte Dateien
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    25.12.2007
    Beiträge
    16
    Also ich will auch mal ein Servo ansteuern, aber leider werde ich aus den ganzen Beiträgen nicht schlau. Ich habe ein Robby ohne Erweiterung. Welche Möglichkeiten gibt es jetzt, um einen oder mehrere Servos anzusteuern und vor allem welche Ausgänge nutzt man dann?
    Stratege993

  10. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    40
    Beiträge
    211
    @Radbruch Hm das beispiel aber einmal nachzuarmen wird nicht toll, da ich mir jetzt überlegen muss wo lege ich die rblib.c /.h ab um anschließend die makefile zu bearbeiten... jedoch frage ich mich ob ich für das program nur deine beiden libs brauch oder die anderen aus dem RP6Lib-ordner auch...

    Wie ist das?
    MfG carlitoco

Seite 2 von 11 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen