User Tools

Site Tools



by Tyler Bletsch (Tyler.Bletsch AT

SimpleSoftwareServo is an Arduino library; it drives servos on any number of pins at once. Same API as the default servo library, except you need to call SimpleSoftwareServo::refresh() each time you want to send a pulse (at least every 20ms, preferably).



  • Arduino-compatible microcontroller running at ≥ 8 MHz
  • If using an ATtiny, you need an Arduino specification file and programmer that can get to it (details).
  • The user must call refresh() each time a pulse needs to be generated


  • Extract to the 'libraries' directory under your sketchbook directory.


Based on SoftwareServo with pieces from Servo8Bit by CunningTurtle.

This is a replacement for SoftwareServo, which was great for ATtiny controllers, except for two problems:

  1. It didn't include "Arduino.h", so it didn't compile (?)
  2. It played pretty loose with the inter-pulse time, waiting until AFTER 20ms to pulse again, so if you had a delay of 15ms before the refresh, you'd wait 15+15=30ms plus computation time between pulses, which is fine for servos, but might upset the motor controller I'm using.

So I took it and rewrote the refresh method and a few other things to standardize the pulse-to-pulse time rather than the inter-pulse time. Now the output on my oscilloscope is gorgeous.

It's nearly a drop-in replacement for SoftwareServo, but be aware: It will generate a pulse EVERY time refresh is called, unlike SoftwareServo, which would ignore calls that were too close together. This may change behavior in some cases. I prefer this behavior, because it avoids uneven pulse timing.

Example usage


#include <SimpleSoftwareServo.h>
 * Move a servo based on input from a knob.  Also set brightness of an LED proportional to servo angle.
SimpleSoftwareServo servo1;
int servo1_pin = 2;
int led_pin = 0;
int pot_pin = 2;  // analog input pin (different numbering scheme from digital pins)
void setup() {
  pinMode(led_pin, OUTPUT);
void loop() {
  int val = analogRead(pot_pin);
  delay(15); // optional, since refresh() will delay as needed for the next pulse
simplesoftwareservo.txt · Last modified: 2013/03/28 18:01 by tkbletsc

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki