PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 Servo Ansteuerung



Christian3
24.01.2009, 18:13
Hey,
ich habe den RP6 bekommen und habe so die grundsachen schon kapirt aber weil nur rumfahren nen bissel langweilig is will ich jetzt einen servo ansteuern. ich habe schon foren darüber gesehen aber habs Leider nicht hinbekommen :oops: da wollte ich mal fragen ob ihr mir das mal für dummies erklären können^^
lg
Christian

Dirk
24.01.2009, 19:28
Hallo Christian,

das ist hier im Forum schon sooo oft und einfach erklärt worden, geh 'mal zuerst auf die Suche!

Ergebnisse z.B.:

Grundwissen zu Servos im Wiki:
https://www.roboternetz.de/wissen/index.php/Servos

Langer Thread zur Servoansteuerung mit dem RP6:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=34407

RP6Base: Library für 8 Servos:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=45180

RP6Control: Library für 8 Servos:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=45223

Gruß Dirk

.:Robin:.
25.01.2009, 12:14
hatte vor kurzem das gleiche problem... wenn du den Servo an ADC0 oder ADC1 anschließen willst dann mach es so:

1 : Rotes Kabel (Spannungsversorgung+, VDD)

2 : Schwarzes Kabel (Spannungsversorgung-, GND)

3 : Weißes Kabel (Impuls)

und jetzt kannste z.B. des als Code verwenden:

is en leicht veränderter code von radbruch:



// Servoansteuerung mit sleep(), Servoimpuls an ADC0, 2 Positionen 10.1.09 mic

#include "RP6RobotBaseLib.h"

uint8_t i;

int main(void)
{
initRobotBase(); // initialisieren
DDRA |= 1; // Datenrichtung Port A Bit 0 (das ist ADC0) auf Ausgang

while(true)
{
for(i=0;i<100; i++) // 100 mal Impuls für Position 1 senden
{
PORTA |= 1;
sleep(2);
PORTA &= ~1;
sleep(200-2);
}
for(i=0;i<100; i++) // 100 mal Impuls für Position 2 senden
{
PORTA |= 1;
sleep(12);
PORTA &= ~1;
sleep(200-12);
}
for(i=0;i<100; i++) // 100 mal Impuls für Position 3 senden
{
PORTA |= 1;
sleep(20);
PORTA &= ~1;
sleep(200-20);
}
for(i=0;i<100; i++) // 100 mal Impuls für Position 4 senden
{
PORTA |= 1;
sleep(12);
PORTA &= ~1;
sleep(200-12);
}
}
return(0);
}

Christian3
25.01.2009, 15:26
cool danke muss ich muss doch die "RP6RobotBaseLib.h" datei ändern oder ?

radbruch
25.01.2009, 16:11
Nein, die Library muss nicht geändert werden. Es wird (blockierend) die Sleep()-Funktion verwendet.

Christian3
26.01.2009, 19:30
OK ich habs hinbekommen =D>
wäre aber cool wenn er von limks nach rechts dreht und dan wieder zurück macht er aber ihrgent wie ned


#include "RP6RobotBaseLib.h" // The RP6 Robot Base Library.
// Defines:
#define SERVO_OUT SDA // PINC1 XBUS Pin 12


// Servo movement limits (depending on servo type):
#define LEFT_TOUCH 10//550 // Left servo touch
#define RIGHT_TOUCH 10 // Right servo touch [max. 255]
#define PULSE_ADJUST 10
#define PULSE_REPETITION 18 // Pulse repetition frequency
//Variablen
int richtung=0; //0=rechts; 1=links
int speed=10;
/************************************************** ***************************/
// Functions:

/**
* INIT SERVO
*
* Call this once before using the servo task.
*
*/
void initSERVO(void)
{
DDRC |= SERVO_OUT; // SERVO_OUT -> OUTPUT
PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO
startStopwatch1(); // Needed for 20ms pulse repetition
}
void pulseSERVO(uint8_t position)
{
cli();
PORTC |= SERVO_OUT; // SERVO_OUT -> HI (pulse start)
delayCycles(LEFT_TOUCH);
while (position--)
{
delayCycles(PULSE_ADJUST);
}
PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO (pulse end)
sei();
}
void task_SERVO(void)
{static uint8_t pos;
if (getStopwatch1() > PULSE_REPETITION) { // Pulse every ~20ms
if(richtung==0) pos=pos+speed;
else pos=pos-speed;
if (pos > RIGHT_TOUCH) {richtung = 1;} //nach links drechen
if (pos < LEFT_TOUCH) {richtung = 0;} //nach rechts drehen

pulseSERVO(pos);
setStopwatch1(0);
}
}

/************************************************** ***************************/
// Main function - The program starts here:

int main(void)
{
initRobotBase();
powerON();//anschalten
startStopwatch1();
setLEDs(0b111111); // Turn all LEDs on
mSleep(500); // delay 500ms
setLEDs(0b000000); // All LEDs off

initSERVO();

while(true)
{
task_SERVO();
task_RP6System();

}
return 0;
}

Christian3
26.01.2009, 22:19
schon gut fehler gerunden sry

Christian3
29.01.2009, 21:07
Hey eine frage hätte ich noch wie kann ich den servo in eine bestimte position stehlen? also z.b das wen ich den rp6 starte des der servo automatich in die mittel stellung fährt?

Dirk
30.01.2009, 18:17
... wie kann ich den servo in eine bestimte position stehlen? also z.b das wen ich den rp6 starte des der servo automatich in die mittel stellung fährt?
Du könntest z.B. in deiner Programmversion eine Konstante als Mittelposition definieren:
MIDDLE_POSITION = RIGHT_TOUCH / 2

... und dann das Servo am Programmanfang in Mittelposition fahren:
pos = MIDDLE_POSITION

Gruß Dirk

P.S.: In deinem Prog sind RIGHT_TOUCH und LEFT_TOUCH beide 10. Du testest die Grenzen von pos im Hauptprogramm auf < LEFT_TOUCH und auf > RIGHT_TOUCH. Das ist eigentlich so noch nicht ok:
pos darf von 0 bis RIGHT_TOUCH gehen, wenn LEFT_TOUCH für dein Servo richtig eingestellt ist. Du bekommst auch höhere Werte für pos, wenn du PULSE_ADJUST kleiner machst (4..6). Probier das 'mal aus!

Christian3
07.02.2009, 13:50
Hi,
ich habe mir das CONTROL M32 Erweiterungsmodul gekauft habe jetzt einen servo angeschlossen und probiere ihn anzuseuert^^ aber jedes mal wenn der Servo an fängt sich zu drehen geht der RP6 kurtz aus und man muss neu starten habe gedacht mh.... vil. sind die akkus leer daran liegt es nich dann habe ich ne externe stromversorgung für den servo angebaut und jetzt gehts ?!

Es ist kein anderer strom fresser an (wie z.b Der Antrieb) ist das nomal das die strom versorgung bei einen servo abstürtzt?
es ist nur der RP6 und das Erweiterungsmodul an!

SlyD
07.02.2009, 14:01
Hallo,

wo hast Du den Servo denn genau angeschlossen?
Der Servo verursacht natürlich Störungen auf den Versorgungsleitungen und kann durchaus einen RESET des Mikrocontrollers auslösen wenn die Spannung zu stark einbricht.

Immer versuchen die Versorgungsleitungen größerer Verbraucher so nah wie möglich am Spannungsregler (das dreipolige, am Mainboard festgeschraubte Teil neben dem Hauptschalter) anzuschließen...

Falls das nicht geht, IMMER mindestens einen Elektrolyt Kondensator (auf korrekte Polung achten!) parallel zum Verbraucher anschließen - bei nem Servo sollten es schon 100µF oder mehr sein. Besser direkt noch eine Induktivität (10 bis 100µH) mit in die Leitung...

MfG,
SlyD

Christian3
14.02.2009, 17:08
sry Dirk,
das ich mich undeutlich ausgedrückt habe!
ich meine ob ich die servos einfach an die akkus vom RP6 anschlissen kann? die haben ja etwas mehr V da geht doch höstens der servo kaput oder? oder kann da auch der micro prozessor am RP6 kaput gehen?

Dirk
14.02.2009, 18:29
@Christian3:

kann ich ihn auch direkt an die batterie anschließen geht doch höchstens der servo kaputt oder??
??? Was ist deine Frage?

In deinem Post vom 7.2. hast du geschrieben:

dann habe ich ne externe stromversorgung für den servo angebaut und jetzt gehts ?!

Willst du uns jetzt verar...en oder etwas wissen?
Du solltest hier posten, wenn du wirklich etwas willst und nicht aus Langeweile.

Eine Frage wäre z.B.:
Welche Spannung brauchen eigentlich Servos?

Dirk

petzi--
27.05.2012, 18:02
Ich hätte da mal eine Frage ,
ich habe mir vor kurzem auch einen rp6 gekauft
das grundsätzliche hab ich auch schon verstanden ,
jetzt möchte ich aber einen externen Motor mit dem RP6 steuern ,
des wäre nett wenn mir einer erklären könnte wo ich die Kabel auf dem Mainboard anlöten muss und wie man das dann programmiert...

Dirk
27.05.2012, 23:04
Hier ging's vor 3 Jahren mal um Servos!