Servo Conversion - I2C Control

FrontPage?action=AttachFile&do=get&target=openservo.jpg



In various groups and blogs I peruse on here, there's been talk about I2C control of servos (as opposed to standard PWM). This certainly solves several problems, as it allows one I/O port (I2C) to service over a hundred servos with ease. With some built-in intelligence, the servo itself can take care of interpreting and following commands without the need for continual updates from the system (i.e., true asynchronous operation). In addition, servo power lines are kept separate from the autopilot board, thus eliminating the possibility of overheating board traces due to excessive current draw (a stack of 8 servos, especially digital ones, can easily exceed the amperage rating of the traces and wiring used in some autopilot boards). The one drawback to I2C control... if one servo's electronics fails and "latches" the bus, the entire network is toast. However, that possibility can be mitigated through an isolation network built onto the servo control board.

Coincidentally, today I read a message on the UAV Dev Group about an open source servo project called (not surprisingly) OpenServo*. Among other things, they offer complete ready-to-go boards that fit inside some standard servos and convert them to I2C. Here's a list of features, directly from their page:

  • High performance AVR 8-bit microcontroller
  • Compact H-Bridge with high performance MOSFETs
  • Precision control over servo position and speed
  • I2C/TWI based interface for control and feedback
  • Feedback of position, speed, voltage and power
  • Advanced curve based motion profile support
  • EEPROM storage of servo configuration information
  • Software written in C using free development tools
  • I2C/TWI bootloader and GUI programmer

I thought I'd mention it here, since there seem to be people from several diverse groups interested in this (I2C servo control). Price is $14.95 from SparkFun Electronics.

*Credit to Peter Holands of UAV Dev Group for spotting this.
E-mail me when people leave their comments –

You need to be a member of diydrones to add comments!

Join diydrones

Comments

  • A digital servo on an I²C (or CAN) bus seems like a very good idea, because it can potentially offers features that a standard analog servo (and even some digital ones) can't offer:
    - a very low latency for the commands
    - a digital control loop, way more accurate than an analog one
    - by measuring current and back-EMF, the servo µC can have more info (torque and speed)
    - possibility of torque limiting, speed limiting and power limiting
    - such servo can auto-test, and send an interrupt in case of motor or H-bridge failure
    - the parameters of the control loop can be dynamically tuned
    - and finally the servos can send some info (real position, torque) that can be fed back in the autopilot control loop

    Overall, there's great potential :)
  • Auxiliary I2C servo controller boards (best of both worlds)...

    20 Channel I2C to Servo Driver Chip (off the old block)

    I2C Servo Interface Board (8 servos)

    8 Channel Servo Controller Module

    (I'm posting these for my own reference, to make them easier to find in the future)
  • Developer
    Ops... no need to stone me.. I'm correcting Obama's slogan: "Yes, we can". :)
  • Developer
    Yes, you're right about this, mook. In fact, nothing is impossible. Sure you can controlling PWM by interrupt with overflow, using two timers, etc... but it tends to be very performance dependent or tricky. And, in mine opinion, it would be a waste of time, because you will need a lot of effort to achieve something similar to a fast and solid PWM signal that already comes functional on some chips. Resuming... like Obama said: "we can do it". But, in that case, with a lot of trouble to face.
  • @sandro
    my mistake, I didn't realize not all the pins are exposed.
    good insight. I guess I just meant any generic uC with an i2c controller could be used. you don't really need a PWM controller if that is it's main function, you can implement pwm on all IO pins with just an interrupt.
  • Nice catch, Sandro! Thanks for looking at the specs and noticing this.
  • Developer
    @mook... It's a great PWM to PPM product. BUT, if we try to reuse it for that other purpose... we will find a lot of trouble.
    -First issue: the i2c pins (PC4 and PC5) are disconnected.
    -Second: it have PD0 to PD7 exposed on signal pins. Only PD3, PD5 and PD6 are PWM capable.
    -Third: why would we do that, if the best output are not exposed on the signal pins? (remember... 16bit PWM is only disposable on PB1 and PB2). So... I see no sense in trying to do that.
  • In noisy environment, I used LVDS driver for a long SPI line clocked at 100 MHz.
    Maybe it could work for I2C ?, LVDS driver are very common and low cost.
  • Developer
    OK... I'm sure that i2c by itself won't solve everything... But in conjunction with another aspects it can be interesting. For example, it's very significant the use of an i2c layer instead of direct PWM for make ESCs more responsive for all lines of a quadrotor. But i2c isn't the hero. The real gain is achieved by two other things: Fast PWM with 16bit resolution. The i2c is only a comfortable way to turn the communication more easy and intuitive on code.

    For servos... I saw only one point that is interesting in that kind of implementation. It will need more clock cycles... OK. It's really the true. BUT the mostly part of ICs have a limited number of channels that provides PWM output at 16bit. Atmega328 have only "timer/counter1" in conjunction with "OC1A/OC1B" to provides two 16bits PWM output channel. So, if you need a way to achieve more channels by using an external board... it's understandable. By other hand... If you make a 12c board for control a servo and you DON'T choose the best timer channel for that job, loosing the 65536 steps on counter and the same steps at the level set of the output comparator for construct the PWM signal... so, you really wasted all your precious time and money. :/

    Atmega1280 (used on ArduPilot Mega) have timers 1,3,4 and 5 for it with a lot of output comparators. So, in that case... I think that rarely you will need this kind of trick.
  • Developer
    CAN bus would be great for all this...
This reply was deleted.