Arjen98
12.01.2014, 00: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
*
* ************************************************** **************************
*/
/************************************************** ***************************/
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
*
* ************************************************** **************************
*/
/************************************************** ***************************/