Warm verwendet ihr eigentlich alle servos und keine Motoren?
Druckbare Version
Warm verwendet ihr eigentlich alle servos und keine Motoren?
servos sind viel einfacher und preziser anzusteuern als normale motoren
servos kann man vorallem auch sehr leicht (ohne viel verkabelung, etc) in alle 2 richtungen bewegen lassen
hi allerseits,
ich habe mit folgendem programm (stammt glaube ich sogar aus diesem thread)
beide servos am rp6 zum laufen bekommen....Code:// Servoansteuerung2: Wir erzeugen zwei Impulse im Wechsel 10.1.2010 mic
// sleep(1) verzögert ca. 0,1ms, 50 Impulse dauern ca. 1 Sekunde
// Servo an SDA (PC1) (XBUS Pin 12)
#include "RP6RobotBaseLib.h"
uint8_t c; // allgemeine 8-Bit-Variable (ein Char)
int main(void)
{
initRobotBase();
DDRC |= SDA;
PORTC &= ~SDA;
while(1)
{
for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= SDA; // Impulsstart servo I
sleep(25); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~SDA; // Impulsende
sleep(150); //50ms warten
PORTC |= SL1; // Impulsstart servo II
sleep(10); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~SL1; // Impulsende
sleep(150); //50ms warten
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(5); //30 = 3ms warten = Servoposition 2
PORTC &= ~SDA;
sleep(150);
PORTC |= SL1; // Impulsstart servo II
sleep(25); // 1 = 0.1ms warten = Servoposition 2
PORTC &= ~SL1; // Impulsende
sleep(150); //50ms warten
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(20); //10 = 1ms warten = Servoposition 3
PORTC &= ~SDA;
sleep(150);
PORTC |= SL1; // Impulsstart servo II
sleep(15); // 1 = 0.1ms warten = Servoposition 3
PORTC &= ~SL1; // Impulsende
sleep(100); //50ms warten
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(10); //20 = 2ms warten = Servoposition 4
PORTC &= ~SDA;
sleep(150);
/* PORTC |= SL1; // Impulsstart servo II
sleep(30); // 1 = 0.1ms warten = Servoposition 4
PORTC &= ~SL1; // Impulsende
sleep(100); //50ms warten */
}
for(c=0; c<50; c++)
{
PORTC |= SDA; // Impulsstart servo I
sleep(20); //5 = 0.5ms warten = Servoposition 5
PORTC &= ~SDA;
sleep(150);
/* PORTC |= SL1; // Impulsstart servo II
sleep(10); // 1 = 0.1ms warten = Servoposition 5
PORTC &= ~SL1; // Impulsende
sleep(100); //50ms warten */
}
}
return(0); // wird nie erreicht
}
/*
zweites servo an sl1
PORTC |= SL1)
PORTC &= ~SL1
*/
jetzt habe ich einen greifarm für den asuro gebaut, der auf der kleinen platine befestigt ist und die drei servos über die pins INT0, PD3 und PD6 gesteuert werden sollen. Wenn ich das programm auf den asuro umstricke, sieht es im ersten ansatz so aus (viel ist noch auskomentiert)
zuckt der erste servo (hängt am PD3) nur unkontrolliert in der gegend herum und auch der dritte macht so komische zuckungen, auch wenn er an keinem signal hängt, bzw. die software noch gar nicht in funktion ist.Code:#include "asuro.h"
uint8_t c; // allgemeine 8-Bit-Variable (ein Char)
int main(void)
{
DDRC |= (1<<PD3);
PORTC &= ~(1<<PD3);
while(1)
{
for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= (1<<PD3); // Impulsstart servo I
Msleep (25); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<PD3); // Impulsende
Msleep (150); //50ms warten
}
/* for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= (1<<PD3); // Impulsstart servo I
Msleep (20); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<PD3); // Impulsende
Msleep (150); //50ms warten
}*/
/* for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTC |= (1<<PD6); // Impulsstart servo II
Msleep(10); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<PD6); // Impulsende
Msleep(150); //50ms warten*/
/* PORTC |= (1<<INT0); // Impulsstart servo III
Msleep(17); // 1 = 0.1ms warten = Servoposition 1
PORTC &= ~(1<<INT0); // Impulsende
Msleep(150); //50ms warten */
/* PORTC |= (1<<PD3); // Impulsstart servo I
Msleep (5); // 1 = 0.1ms warten = Servoposition 2
PORTC &= ~(1<<PD3); // Impulsende
Msleep (170); //50ms warten
}*/
}
return(0); // wird nie erreicht
}
habe ich was falsch gemacht, oder bestimmte asuro-eigenheiten vergessen zu berücksichtigen?
die servos liefen bereits einzeln (über kabel mit dem rp6 verbunden) und mit der rp6 software...die hardware scheint also ok zu sein ( die platine mit den servos)...
danke für euere hinfe
Hast du schon mal geschaut ob mit der Spannungsversorgung alles in Ordnung ist?
M__sleep != sleep
Die eine Funktion in Millisekunden die andere in 100 µs Schritten...
Hallo
DDRC |= (1<<PD3);
PORTC &= ~(1<<PD3);
Wenn du Pins von Port D verwenden willst, dann musst du auch das Datenrichtungsregister und den Port von D verwenden.
Bei mehreren Servos werden die Impulse nacheinander erzeugt und dann wird eine gemeinsame Restpause lang gewartet:
Beim asuro wird Sleep() mit dem 36kHz-Timer2 erzeugt, eine Millisekunde ist dann Sleep(36). Mehr Infos zum Servotiming beim asuro findest du z.B. hier:Code:for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde
{
PORTD |= (1<<PD3); // Impulsstart servo I
Sleep (servo1);
PORTD &= ~(1<<PD3); // Impulsende
PORTD |= (1<<PD6); // Impulsstart servo 2
Sleep (servo2);
PORTD &= ~(1<<PD6); // Impulsende
Sleep (255); // Pause
Sleep (255);
Sleep (255);
}
https://www.roboternetz.de/phpBB2/ze...=500813#500813
Gruß
mic
hallo zusammen
habe ein m32 erweiterungssatz gekauft. würde gerne ein servo über adc2 ansteuern. wie kann ich den im programmcode aufrufen?
kann man den folgenden code umschreiben?
Code:
#include "RP6ControlLib.h"
uint8_t i;
{
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 1;
sleep(8);
PORTA &= ~1;
sleep(200-10);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 1;
sleep(20);
PORTA &= ~1;
sleep(200-20);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 1;
sleep(14);
PORTA &= ~1;
sleep(200-10);
}
}
den code habe ich auf dem mainboard-adc0 angewendet.
thx
ADC2 ist ebenfalls am Port A und hat die Wertigkeit 4 (2^2)
Datenrichtung: DDRA |= 4;
Einschalten: PORTA |= 4;
Ausschalten: PORTA &= ~4;
danke für deine antwort. habe es mal ausprobiert.
der code sieht so aus:
das übersetzen funktioniert. leider bewegt sich mein servo nicht. kann das sein das ich auf dem mainboard ein code laden muss damit es korrekt funktioniert? habe m32 eingesteckt und den code draufgeladen.Code:#include "RP6ControlLib.h"
uint8_t i;
{
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(8);
PORTA &= ~4;
sleep(200-10);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(20);
PORTA &= ~4;
sleep(200-20);
}
for(i=0;i<100; i++) // 100 mal Impuls
{
PORTA |= 4;
sleep(14);
PORTA &= ~4;
sleep(200-10);
}
}
noch eine kleine frage: wo kann ich nachschauen wenn ich ein adc port ermitteln will d.h wo finde ich die oben genannten daten (4)?