-

+ Antworten
Seite 3 von 14 ErsteErste 1234513 ... LetzteLetzte
Ergebnis 17 bis 24 von 110

Thema: RP6 Servo Ansteuerung

  1. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    30
    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

  2. #18
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    52
    Beiträge
    5.696
    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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #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

  4. #20
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    30
    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

  5. #21
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    52
    Beiträge
    5.696
    Blog-Einträge
    8
    Sorry, wenn meine Vorschläge nicht wirklich einfach nachzuvollziehen sind. Ich bastle eben schon eine Weile dran rum und das ist alles eher "natürlich gewachsen".

    Die einfachste Lösung für den RP6 habe ich wohl hier beschrieben:
    http://www.roboternetz.de/phpBB2/zei...ag.php?t=34950

    Oder ohne sleep(), dafür mit Verzögerungsschleifen:
    http://www.roboternetz.de/phpBB2/zei...=321483#321483

    Oder so wie bei meinem Monoleg:

    Code:
    #include "RP6RobotBaseLib.h" 
    
    uint8_t  i, pause, servo_stellzeit, servo_delay; 
    
    void servo(uint8_t w0, uint8_t w1, uint8_t w2) 
    { 
    unsigned int count=0; 
       do{ 
          PORTA |= E_INT1;      // E_INT1 (Pin8) 
          sleep(w0); 
          PORTA &= ~E_INT1; 
          PORTC |= 1;            // SCL (Pin10) 
          sleep(w1); 
          PORTC &= ~1; 
          PORTC |= 2;            // SDA (Pin12) 
          sleep(w2); 
          PORTC &= ~2; 
          sleep(servo_delay-(w0+w1+w2)); 
          //sleep(127); 
       } while (count++ < servo_stellzeit); 
       mSleep(10*pause); 
    } 
    
    int main(void) { 
    
    initRobotBase(); 
    i=0; 
    servo_stellzeit=15; 
    DDRA |= E_INT1;            // E_INT1 als Ausgang 
    DDRC |= 3;                  // SCL und SDA als Ausgang 
    // 5 - 15 - 25             // Min - Mitte - Max 
    servo(15,15,15);           // Grundstellung 
    while (1) 
    { 
       switch (i) 
       { 
          case 0: i++; pause=30; servo_delay=255; mSleep(1000); break; 
          case 1: i++; pause=10; servo_delay=255; break; 
          case 2: i++; pause=10; servo_delay=127; break; 
          case 3: i++; pause=1;  servo_delay=127; break; 
          case 4: i=0; pause=1;  servo_delay=127; break; 
       } 
       servo(10,15,15);        // Finger zurück 
       servo(15,15,15); 
       servo(20,15,15);        // Finger vor 
       servo(15,15,15); 
        
       servo(15,10,15);        // Arm runter 
       servo(15,15,15); 
       servo(15,20,15);        // Arm hoch 
       servo(15,15,15); 
        
       servo(15,15,10);         // Schulter links 
       servo(15,15,15); 
       servo(15,15,20);         // Schulter rechts 
       servo(15,15,15); 
    
       servo(20,10,15);        // Finger vor, Arm runter 
       servo(25,5,15); 
       servo(20,10,15); 
       servo(15,15,15); 
        
       servo(20,20,15);        // Finger vor, Arm hoch, Schulter links 
       servo(15,15,10); 
    
       servo(10,20,10);        // Finger zurück, arm hoch 
       servo(5,25,10); 
       servo(10,20,10); 
       servo(15,15,15); 
    
    } 
    return 0; 
    }
    Alles Lösungen mit der orginalen Library und Anschluß am XBUS-Stecker. Einfach zu finden wenn man hier im RN-Forum nach "servo AND rp6 AND radbruch" sucht.

    Einfacher geht's wohl nur so:

    http://www.roboternetz.de/phpBB2/zei...ag.php?t=29902

    rblib muss ins selbe Verzeichniss wie das Programm (wegen den "", bei <> müßte es in den Pfad).

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #22
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Alter
    67
    Beiträge
    1.123
    Zitat Zitat von radbruch
    Hardware ist ein 5€-Miniservo von Conrad, aufgeklebt auf den RP6 mit einem Power-Strip. Aus dem Stecker(JBL) habe ich den Taktpin (orange) ausgebaut. Nun kann ich den Servo-Stecker mit +(rot) und -(braun) in den XBUS-stecken (Pin1=GND, Pin3=5V-Vcc) und das Signal z.b. in Pin8 (INT1) oder Pin10 (SCL).

    Für die Ansteuerung zapfe ich den 72kHz-Interrupt an, der Timerinterrupt hat mit nur 10 kHz eine zu geringe Auflösung (=weniger mögliche Servopositionen). Das ergibt zwar "krumme" Werte für die Positionen, funktioniert aber wunderbar:

    Code:
    #include "RP6RobotBaseLib.h"
    #define servo_min 26
    #define servo_mitte 85
    #define servo_max 155
    volatile unsigned char servo_winkel;
    uint8_t servo_pos=servo_mitte;
    
    void servo(uint8_t winkel)
    {
    	uint16_t servo_stellzeit;
    	if (servo_winkel != winkel)
    	{
    	   TIMSK |= (1 << OCIE2);
    		servo_stellzeit=200*abs(servo_winkel-winkel);
    		servo_winkel=winkel;
    		while (servo_stellzeit--);
    		TIMSK &= ~(1 << OCIE2);
    	}
    }
    int main(void) {
    uint8_t i;
    
    	initRobotBase();
    	DDRC |= 1; // SCL auf Ausgang stellen
    
    	while (1)
    	{
    		servo(servo_mitte);
    		mSleep(500);
    		servo(servo_min);
    		mSleep(200);
    		for (i=servo_max; i>servo_min; i-=2)
    		{
    			servo(i);
    			setLEDs(16);
    		}
    		for (i=servo_min; i<servo_max; i+=2)
    		{
    			servo(i);
    			setLEDs(32);
    		}
    	}
    while(1);
    return 0;
    }
    
    /*
    ISR (TIMER2_COMP_vect)
    {
    #define Servo on
    #ifdef Servo
    	extern unsigned char servo_winkel;
    	static unsigned int servo_zyklus=0;
    	if (servo_winkel)
    	{
    		if (servo_zyklus>servo_winkel) extIntOFF(); else extIntON();
    		//if (servo_zyklus>servo_winkel) PORTC &= ~1; else PORTC |= 1;
    		if (servo_zyklus<1440) servo_zyklus++; else servo_zyklus=0;
    	}
    
    	//else
    	if (0)
    	{
    #endif
    ...
    #ifdef Servo
    	}
    #endif
    }
    
    /**
    */
    Der einfache Democode definiert die Lageendpunkte und die Mitte, und steuert das Servo endlos auf diese Punkte. In der Funktion servo() wird die Stellzeit berechnet und der Winkel in servo_winkel eingetragen. Dann wird der Interrupt freigegeben und die Erweiterung des Interrupts steuert dann das Servo automatisch. Nach Ablauf der Stellzeit wird der Interrupt wieder gesperrt.
    Um Seiteneffekte zu vermeiden, wird in der Library der restliche Code der ISR ausgeblendet. Der Code für die Änderung der ISR befindet sich am Ende des Democodes. Das Ganze ist noch in der Entwicklung.
    Hi mic,
    es ist schon lange her, aber vielleicht erinerst du dich noch. Ich habe es so versucht, wie hier beschrieben, der servo bewegt sich leider nicht (der kontakt 1 am XBUS1 ist ja auf der platine gekennzeichnet)...
    Was muss ich da mit dem ISR tun?
    danke

    @Dirk:
    ich habe mir auch Deine version angeschaut, wie schliesse ich den servo an die LED1, bzw. wo finde ich freie anschlüsse für SL1? Bin ich blind, oder zu doof?

    thanx...
    gruß inka

  7. #23
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    52
    Beiträge
    5.696
    Blog-Einträge
    8
    Hallo

    Das funktioniert nur, wenn du in der RP6BaseLib.c die Timer2-Overflow-ISR komplett ersetzt:
    http://www.roboternetz.de/phpBB2/vie...=318456#318456

    Inzwischen, das ist ja schon zwei Jahre her, erkenne ich auch, dass diese Art der Ansteuerung ziemlicher Mist ist. Deshalb rate ich von der Benutzung eher ab.

    Da die RP6-Library alle Timer verwendet, muss man bei der Servoansteuerung immer Kompromisse eingehen, die von der jeweiligen Anwendung abhängig sind:

    Das einfachste (wie oben schon beschrieben) ist eine blockierende Ansteuerung (mit Sleep() oder Zählschleife) bei der das Programm wartet, bis das Servo seine Position erreicht hat. Das ist für erste Servoversuche die übersichtlichste Lösung. Diesen Ansatz mit einem Servo an SCL hatte ich hier mal in das Tasksystem eingebunden:
    Code:
    #include "RP6RobotBaseLib.h"
    
    #define pos1 800
    #define pos2 1600
    
    extern uint8_t acs_state;
    
    uint16_t servo_pos, servo_timer, servo_dummy;
    
    int main(void) {
    
    	initRobotBase();
    	DDRC |= 1;
    	
    	startStopwatch1();
    	startStopwatch2();
    	servo_pos = pos1;
    	
    	while (1)
    	{
    		if ((getStopwatch1() > 20) && (acs_state < 2)) // alle 20ms einen Servoimpuls erzeugen
    		{
    	      setStopwatch1(0);
    			servo_timer = servo_pos;
    	      PORTC|=1;
    			while(servo_timer--) servo_dummy ^= servo_timer;
    	      PORTC&=~1;
    		}
    
    		if (getStopwatch2() > 1000) // alle 1000ms Servo auf andere Seite fahren
    		{
    			if (servo_pos == pos1) servo_pos=pos2; else servo_pos=pos1;
    			setStopwatch2(0);
    		}
          //task_RP6System();
          task_ADC();
    		task_ACS();
    		task_Bumpers();
          task_motionControl();
    	}
    return 0;
    }
    Alle Servoansteuerungen, die im Hintergrund ausgeführt werden, müssen einen Timer umbiegen und blockieren damit die Lib-Funktion des betreffenden Timers. Ohne Timer0 gibt es keine StopWatch() und andere Zeitfunktionen mehr, ohne Timer1 funktionieren die Motoren nicht mehr und ohne Timer2 gibt es keine 36kHz-Trägerfrequenz fürs IR. Das bedeutet, man muss sich entscheiden, auf welche Funktionsgruppe man verzichten möchte und steuert die Servos dann mit dem freien Timer an. Dabei kann man natürlich jederzeit wieder die orginale Funktion des Timers aktivieren indem man initRobotBase() aufruft und das Timersetup der Lib wiederherstellt. Hier eine resourcenschonende Variante mit Timer2 und drei Servos an SDA, SCL und E-INT am XBUS:
    Code:
    //Servos mit Timer2 Overflow-ISR                                 27.2.2008 mic
    
    #include "RP6RobotBaseLib.h"
    
    uint8_t pos[3]={255,170,85}; // Positionen der drei Servos an SDA, SCL und E_INT
    
    int main(void)
    {
    	initRobotBase();
    	DDRA |= 16;
    	PORTA &= ~16;
    	DDRC |= 3;
    	PORTC &= ~3;
    
    	//Timer2 Initialisierung
    	TCCR2 = (0 << WGM21) | (0 << COM20) | (1 << CS22); // Normal Mode, prescaler /64
    	TIMSK |= (1 << TOIE2); // Timer2 Overflow-Interrupt erlauben
    
    	while(1)
    	{
    	   pos[0]=pos[1]=pos[2]=170;
    	   mSleep(1000);
    	   pos[0]=pos[1]=pos[2]=220;
    	   mSleep(1000);
    	   pos[0]=pos[1]=pos[2]=170;
    	   mSleep(1000);
    	   pos[0]=pos[1]=pos[2]=120;
    	   mSleep(1000);
    	}
    	return(0);
    }
    ISR (TIMER2_OVF_vect)
    {
    	static uint8_t servo_nr=0;
    	static uint16_t impulspause;
    	if(servo_nr)
    	{
    	   if(servo_nr==1) {TCNT2=-pos[0]; PORTC |= 1; impulspause-=pos[0];}
    	   if(servo_nr==2) {TCNT2=-pos[1]; PORTC &= ~1; PORTC |= 2; impulspause-=pos[1];}
    	   if(servo_nr==3) {TCNT2=-pos[2]; PORTC &= ~2; PORTA |= 16; impulspause-=pos[2];}
    	   if(servo_nr==4) {PORTA &= ~16; servo_nr=0;}
    	   if(servo_nr) servo_nr++;
    	}
    	else
    	{
    	   if(impulspause>256) impulspause-=256;
    			else {TCNT2=-impulspause; servo_nr++; impulspause=1500;}
    	}
    }
    In diesem Zusammenhang möchte ich noch den ADC-Interrupt erwähnen. Er wird von der RP6-Lib nicht verwendet und eignet sich auch dazu, Servoimpulse im Hintergrund zu erzeugen. Der ADC läuft dabei im Dauerlauf, dadurch wird allerdings der Zugriff auf unterschiedliche ADC-Kanäle etwas komlizierter. Ein Beispiel mit Servos an den LEDs und SDA/SCL:
    Code:
    // Domino Day für den RP6 mit neuem Greifarm und ADC-ISR         19.1.2008  mic
    
    #include "RP6RobotBaseLib.h"
    
    uint16_t s1, s2, s3, s4 ,s5, s6;
    
    void servo_ON(void)
    {
    	cli();
    // Freeruning, 5V-Ref, ISR enable, prescale /32 ((8MHZ/32)/12,5 sind ca. 20kHz bzw. 0,05us)
    // AVCC with external capacitor at AREF pin, Ergebniss linksbündig, Kanal ADC7 (UBAT)
    	ADMUX = (0<<REFS1) | (1<<REFS0)  | (1<<ADLAR) | 7;
    // setzte free running triggern
    	SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
    // Interrupt ein, Wandler einschalten, prescaller /32
    	ADCSRA = (1<<ADIE) | (1<<ADEN) | (1<<ADPS2) | (0<<ADPS1)  | (1<<ADPS0);
    // Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen
    	ADCSRA |= (1<<ADATE) | (1<<ADIF);
    // Initialisierung starten
    	ADCSRA |= (1<<ADSC);
    // und noch die wohl eher unnötige Initiallesung
    	while (!(ADCSRA & (1<<ADIF)));
    	ADCSRA |= (1<<ADIF);
    
    	DDRC |= 0x70;		// LED1-3 auf Ausgang und low
    	PORTC &= ~0x70;
    	DDRB |= 0x83;		// LED4-6 auf Ausgang und low
    	PORTB &= ~0x83;
    	DDRC |= 0x3;		// SCL und SDA auf Ausgang und low
    	PORTC &= ~0x3;
    	sei();
    }
    void servo_OFF(void)
    {
    	cli();
    	// Initialize ADC: (Defaultsetup der RP6-Library)
    	ADMUX = 0; //external reference
    	ADCSRA = (0<<ADIE) | (0<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADIF);
    	SFIOR = 0;
    	sei();
    	setLEDs(0); // LEDs restaurieren
    }
    int main(void)
    {
    	initRobotBase();
    
    	s1=25;
    	s2=25;
    	s3=25;
    	s4=25;
    	s5=25;
    	s6=25;
    	servo_ON();
    	setLEDs(63);
    	mSleep(2000);
    	setLEDs(0);
    	while(1)
    	{
    		mSleep(1000);
    		s1=40;
    		mSleep(1000);
    		s1=25;
    		mSleep(1000);
    		s2=35;
    		mSleep(1000);
    		s2=15;
    	}
    	return 0;
    }
    
    ISR(ADC_vect)
    {
    	static uint16_t count=0;
    	(count>s1)?(PORTC&=~SL1):(PORTC|=SL1);
    	(count>s2)?(PORTC&=~SL2):(PORTC|=SL2);
    	(count>s3)?(PORTC&=~SL3):(PORTC|=SL3);
    	(count>s4)?(PORTB&=~SL4):(PORTB|=SL4);
    	(count>s5)?(PORTB&=~SL5):(PORTB|=SL5);
    	(count>s6)?(PORTB&=~SL6):(PORTB|=SL6);
    
    	(count>s1)?(PORTC&=~1):(PORTC|=1); // SCL
    	(count>s2)?(PORTC&=~2):(PORTC|=2); // SDA
    
    	(count<500)?count++:(count=0);
    }
    Bitte beachtet, dass ich inzwischen ziemlich viel Zeit mit Servoansteuerungen vergeudet habe...

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #24
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Alter
    67
    Beiträge
    1.123
    danke erstmal mic,

    servoanschluss braun an XBUS1-1, rot an XBUS1-3, orange an XBUS1-10, codebeispiel 1 fehlerfrei kompiliert und upgeloaded - servo (conrad, VSD-1) steht, nur die SL5 blinkt in bestimmten abständen 10x...
    gruß inka

+ Antworten
Seite 3 von 14 ErsteErste 1234513 ... LetzteLetzte

Berechtigungen

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