PDA

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



Arjen98
11.01.2014, 23:55
Hallo Community,

ich habe vor einiger Zeit den RP6 bekommen, bin jedoch noch ein kompletter Neuling auf dem Gebiet.
Jedoch kenne ich mich mit den Grundfähigkeiten einigermaßen aus, und bin auch dabei eigene Programme zu schreiben.
Seit neuem Besitze ich einen Servo, den ich gerne anbringen und einbinden möchte.

Ich habe seit langer Zeit das Forum durchforstet und habe mir sämtliche Themen im Community-Bereich, sowie im RN-Wissen-Bereich durchgelesen. Doch ich werde nicht so richtig schlau aus den Themen, deshalb schonmal vorab: Entschuldigt, dass ich es nicht sofort verstehe, und einen eigenen Thread eröffne.

Meine Frage ist die. In einem Thread fand ich diese kleine Demo zur Ansteuerung eines Servos und wollte diese einmal zum testen ausprobieren.

Jedoch werde ich aus dem Programm nicht schlau, wie ich den Servo am RP6 montieren muss, sprich welche Ports ich belegen muss.
Ich habe einen Servo von Modelcraft mit einem Orangem-, Rotem- und Braunemkabel.

Ich hoffe ihr könnt mir helfen und ärgert euch nicht so über die doofen Fragen eines Neulings ;)
Danke im Voraus.

Ps. Ich hoffe ihr verzeiht mir wenn etwas im Code unten nicht so gut lesbar ist oder so, ich mache es das erste Mal;)


#include "RP6RobotBaseLib.h" // The RP6 Robot Base Library.
// Always needs to be included!

/************************************************** ***************************/
// Defines:

// RP6 Base Servo Connection:
#define SERVO_OUT SDA // PINC1 XBUS Pin 12

// Servo movement limits (depending on servo type):
#define LEFT_TOUCH 550 // Left servo touch
#define RIGHT_TOUCH 254 // Right servo touch [max. 255]
#define PULSE_ADJUST 4
#define PULSE_REPETITION 19 // Pulse repetition frequency

/************************************************** ***************************/
// 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
}

/**
* PULSE SERVO
*
* This is the servo pulse generation. This function
* must be called every 20ms (pulse repetition).
*
* position = 0 : Left touch
* position = RIGHT_TOUCH : Right touch
*
* ATTENTION: ! This function is BLOCKING all other activities for about 1 !
* ! to 2ms (depending on the value of position)!!! !
* ! If you generate a pulse every 20ms 5-10% of the processor's !
* ! calculating time is wasted by this kind of pulse generation. !
* ! If this is a problem for the rest of your program, you !
* ! cannot use this method. !
* ! You will need an interrupt-based solution instead. !
*
*/
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();
}

/**
* SERVO TASK
*
* This is the servo demo task.
* The positioning demo shows the servo lever rapidly
* moving to the left touch, then slowly moving to
* the right touch and so on ...
*
*/
void task_SERVO(void)
{static uint8_t pos;
if (getStopwatch1() > PULSE_REPETITION) { // Pulse every ~20ms
pulseSERVO(pos); // Servo pulse [1..2ms]
// ---------------------------------------------------------------------
// Your test code for positioning the servo here:
if (getStopwatch2() > 48) { // Change position every ~50ms
pos++; // Next position to the right
if (pos > RIGHT_TOUCH) {pos = 0;} // pos: 0..RIGHT_TOUCH
setStopwatch2(0);
}
// ---------------------------------------------------------------------
setStopwatch1(0);
}
}

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

int main(void)
{
initRobotBase(); // Always call this first! The Processor will not work
board_init(); // correctly otherwise.


mSleep(2500);

setLEDs(0b111111); // Turn all LEDs on
mSleep(500); // delay 500ms
setLEDs(0b000000); // All LEDs off

initSERVO();
startStopwatch2(); // Used for the demo task

while(true)
{
task_SERVO();
task_RP6System();
}
return 0;
}

/************************************************** ****************************
* Additional info
* ************************************************** **************************
* Changelog:
* - v. 1.0 (initial release) 03.10.2007 by D. Ottensmeyer
*
* ************************************************** **************************
*/

/************************************************** ***************************/

Dirk
12.01.2014, 09:30
Hi Arjen98,

Jedoch werde ich aus dem Programm nicht schlau, wie ich den Servo am RP6 montieren muss, sprich welche Ports ich belegen muss. Ich habe einen Servo von Modelcraft mit einem Orangem-, Rotem- und Braunemkabel.
In der Demo wird der Impuls an SDA ausgegeben,- in der Zeile:
#define SERVO_OUT SDA // PINC1 XBUS Pin 12
... kann man das lesen.
SDA ist am XBUS-Stecker der Pin 12.

Das Servo müßte man dann so anschließen (am XBUS-Stecker):
Braun --- GND --- Pins 1,2 oder 14
Rot --- +5V --- Pins 3 oder 5
Orange --- Impuls --- Pin 12

Das solltest du aber nur zu Testzwecken so machen. Wenn du mal mehr als 1 Servo anschliessen willst, must du die Stromversorgung (+5V, GND) auf der Hauptplatine des RP6v2 (Link! (http://www.rn-wissen.de/index.php/RP6v2#I2C.2F.2BUB.2F.2B5V)) anschliessen und du kannst dann z.B. auch die RP6Base Library für 8 Servos (https://www.roboternetz.de/community/showthread.php?40052-RP6Base-Library-für-8-Servos) nutzen. Es gibt auch noch andere Programme zum Ansteuern von Servos mit dem RP6.

Arjen98
12.01.2014, 15:01
Vielen vielen dank Dirk.
Endlich hab ich es richtig verstanden und es funktioniert.
Ich werde in der nächsten zeit einmal ein Programm versuchen zu Schreiben für den Servo.
Wenn ich fragen hab kann ich mich ja zum Glück hier melden.
Danke für die Hilfe :)

XRay117
13.01.2014, 07:39
Hallo,
da ich im Moment an Nahezu dem selben Problem bastle und schon eine Sicherung durchgehauen habe, wollte ich fragen, wo ich den die von euch verwendete Pin Nummerierung für den XBUS nachlesen kann?

Danke

TrainMen
13.01.2014, 13:25
schon mal mit dem Handbuch probiert ? in meinem Handbuch finde ich die Xbus1 Belegung auf Seite 28

XRay117
13.01.2014, 15:07
Tatsächlich... Danke
Habe es gestern durchgesucht aber irgendwie muss ich es übersehen haben... Sorry aber Danke