Go Down

Topic: Servo library handling speed (Read 1 time) previous topic - next topic

Hello!

I have made a modification on the servo library to handle speed of the servo.

I dont know if i can propose it somewere.
If someone is interested, feel free to contact me

By

Robin

i would surely be interested in something like that.
Could you share the code here or somewhere else for a glimpse.

Here it is!

I haven't take too much time to made a clear and good code, but it is working.
I didnt change the name of the class, so I can change back to the older library just by changing the include.

I wrote an example.

The new function available are:

  void writeMicrosecondsWithSpeed(int value);
  void writeSpeed(int value);
  bool moving();

The others are working without modifications.

By,

Robin

robtillaart

A quick look at your library made me wonder if values can become negative?  It seems that pulseWidths and speeds are always 0 or positive.
If not, there is quite some improvement to be made by using unsigned ints.

something like this:
Code: [Select]

class Servo
{
public:
 Servo();
 uint8_t attach(uint8_t pin);           // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure
 uint8_t attach(uint8_t pin, uint16_t min, uint16_t max); // as above but also sets min and max values for writes.
 void detach();
 void write(uint16_t value);                   // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds
 void writeMicroseconds(uint16_t value);   // Write pulse width in microseconds
 void writeWithSpeed(uint16_t value);
 void writeMicrosecondsWithSpeed(uint16_t value);
 void writeSpeed(uint16_t value);
 bool moving();
 uint8_t read();                        // returns current pulse width as an angle between 0 and 180 degrees
 uint16_t readMicroseconds();            // returns current pulse width in microseconds for this servo (was read_us() in first release)
 bool attached();                   // return true if this servo is attached, otherwise false
 
private:
  uint8_t servoIndex;               // index into the channel data for this servo
  int8_t min;                       // minimum is this value times 4 added to MIN_PULSE_WIDTH    
  int8_t max;                       // maximum is this value times 4 added to MAX_PULSE_WIDTH  
};


write microSeconds() has a potential bug??: // if value == SERVO MIN subtracting - TRIM_DURATION makes it even smaller? is that correct?

furthermore you could use the constrain and skip the channel >=0 test.
Code: [Select]
void Servo::writeMicroseconds(int value)
{
 // calculate and store the values for the given channel
 byte channel = this->servoIndex;
 if( channel < MAX_SERVOS )                      // channel is byte so always >= 0
 {
   value = constrain( value, SERVO_MIN(), SERVO_MAX() );  // shorter code
   value = value - TRIM_DURATION;     // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ?
   ...


further a smaller bug in readMicroseconds() the signature should be unsigend int Servo::readMicroseconds()  or  uint16_t Servo::readMicroseconds()


Not reviewed all code but some of the remarks are applicable in multiple places of the lib

my 2 cents
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

many thanks rob for the code. works as said.
robtillaart, thanks for pointing that out. i will post the updated file soon.

robtillaart

when updated I will review it again
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy