RCServo Entity

The RCServo entity provides a pulsed signal based on the RC servo standard. This consist of a period lasting 20ms with a high pulse between 1-2ms. The time high corresponds to a specific position determined by the servo being used. For example if you are using a 90 degree servo a 1.5ms pulse will correspond to the 45 degrees. 1ms and 2ms pulses will correspond to 0 and 90 degree positions respectively.

The RCServo entity is an overload to the Digital Entity and therefor requires proper configuration of the Digital entity before the RCServo entity can be enabled.

Note

Not all BrainStem modules will have this capability.

Set/Get Enable

servo [ index ] . getEnable <= (unsigned char) enable
servo [ index ] . setEnable => (unsigned char) enable

This functions gets/sets the RCServo function for a given pin (pending, it has been properly configured in the digital entity). At a firmware level this enables/disables the timers.

Set/Get Position

servo [ index ] . getPosition <= (unsigned char) position
servo [ index ] . setPosition => (unsigned char) position

This functions gets/sets the RCServo position. For outputs this will return the currently set position; however, for inputs it will return the value seen at the pin pending the pulse is valid. If the pulse or period are invalid a zero will be returned along with the error code aErrRange.

The default range is: 64 (1ms) - 192 (2ms). For example when working with a 90 degree servo setting the position to 64 will give you 0 degrees and 192 will give you 90 degrees.

Set/Get Reverse

servo [ index ] . getReverse <= (unsigned char) reverse
servo [ index ] . setReverse => (unsigned char) reverse

This functions gets/sets the reverse (invert) option in the RCServo Class.

Given a setPosition of 64 the servo pulse will be 1ms; however, if you reverse it the value will now be treated as 192.

Note

getPosition() will return the original setPosition() regardless of the reverse settings.

Aligning the Digital and RCServo Entities

digital[0] servo[0] Pin 0 RCServo Input
digital[1] servo[1] Pin 1 RCServo Input
digital[2] servo[2] Pin 2 RCServo Input
digital[3] servo[3] Pin 3 RCServo Input
digital[4] servo[4] Pin 4 RCServo Output
digital[5] servo[5] Pin 5 RCServo Output
digital[6] servo[6] Pin 6 RCServo Output
digital[7] servo[7] Pin 7 RCServo Output

Code Examples

C++

// All commands return aErr values when errors are encountered and aErrNone on
// success.

//Output
//Set digital pin 8 as an RCServo output.
err = stem.digital[8].setConfiguration(digitalConfigurationRCServoOutput);
//Enable the servo channel
err = stem.servo[4].setEnable(1);
//Set servo to middle/neutral position
err = stem.servo[4].setPosition(128);

//Input
//Set digital pin 0 as an RCServo input.
err = stem.digital[0].setConfiguration(digitalConfigurationRCServoInput);
//Enable the servo channel
err = stem.servo[0].setEnable(1);
//Set servo to middle/neutral position
err = stem.servo[4].getPosition(&pPosition);

Python

# All commands return aErr values when errors are encountered and aErrNone on
# success.

#Output
#Set digital pin 8 as an RCServo output.
err = stem.digital[8].setConfiguration(CONFIGURATION_RCSERVO_OUTPUT)
#Enable the servo channel
err = stem.servo[4].setEnable(1)
#Set servo to middle/neutral position
err = stem.servo[4].setPosition(128)

#Input
#Set digital pin 0 as an RCServo input.
err = stem.digital[0].setConfiguration(CONFIGURATION_RCSERVO_INPUT)
#Enable the servo channel
err = stem.servo[0].setEnable(1)
#Set servo to middle/neutral position
err = stem.servo[0].getPosition(&pPosition)