Picture of Self Balancing Segway Instructabot


1.  Arduino:  I used an Uno
2.  7.2v battery
3.  Set of motors:  Parralax's 7.2v motor set  http://www.robotshop.com/parallax-7-2v-motor-bracket-wheel-kit-pair.html
4.  Analog accelerometer http://www.robotshop.com/sfe-3g-tripleaxis-accelerometer-breakout-board-adxl335-2.html
5.  Sabertooth 5X2 motor controller   http://www.robotshop.com/productinfo.aspx?pc=RB-Dim-19&lang=en-US
6.  base board
7.  3/4" threaded rod and nuts for balance
8.  Zip ties
9.  Screws


1.  Drill
2.  3/4" and 1/4" drill bits

Step 1: Instructabot Platform

Picture of Instructabot Platform
I used a piece of wood 6" x 12" x 0.5"
1-40 of 73Next »

it was awesome but the arduino uno is showing errorketch_may27a:21: error: expected unqualified-id before '\x616c'

sketch_may27a.ino: In function 'void initSabertooth()':

sketch_may27a:26: error: 'SaberSerial' was not declared in this scope

sketch_may27a.ino: In function 'void setup()':

sketch_may27a:29: error: redefinition of 'void setup()'

sketch_may27a:1: error: 'void setup()' previously defined here

sketch_may27a.ino: In function 'void set_motor()':

sketch_may27a:102: error: 'SaberSerial' was not declared in this scope

sketch_may27a.ino: In function 'void loop()':

sketch_may27a:107: error: redefinition of 'void loop()'

sketch_may27a:6: error: 'void loop()' previously defined here

expected unqualified-id before '\x616c'

so can you help me for solving it

aesome . but i have got a problem that a have not got the sabertooth motor controller anywhere so can i use l298 p

hwarang12315 months ago

Awesome. I'm doing segway and trying optimal trajectory problem. I was wondering for your RF control what kind of receiver you used. Or anyone use a specific type of receiver?

is possible with mma7361 or gy-521 acclerometer ?

HELLO i have one question i tried to use your program and i couldn´t do it sorry i´m new in this topic :'( but i would like to do that amaizing robot =D can you help me :( please I´ll be very glad with you for the rest of my life =D

Espasio10 months ago

Where is schema of the accellerometer and arduino??

Librav2 years ago
Hi again, Can you tell me the max + and - angle from the vertical you based your code on? I'm still having difficulty in smoothing out the motion. Thanks

Wow....that's awsome segway!

Nice job on this. Which wheels sets are you using?

florman (author)  Librav1 year ago
Your bot looks great. The max my accelerometer measured while on the segway was 400 and the minimum was 270 with 330 about flat

Nice instructable you got there.

But could you please provide me with little more details about the type of motors you used since the link you provided is no longer valid.

Thank you.

florman (author)  gunnlaugursig1 year ago
You could use any brushed small motor and you would just have to adjust the program a little. Hope this helps.

These would probably do the job.


Marta0151 year ago

Hi, the project is great but I have a one question.Can I use Accelerometer Gyro module for Arduino (something like 6DOF or MUP-6050) and did you use Serial Controlled Motor Driver Arduino (ROB-09571) or other?

florman (author)  Marta0151 year ago


I'm sure your acelerometer/gyro assembly would work fine for this but the program would have to be changed most likely. As for the motor controller I used the Sabertooth 5X2 motor controller, a little pricey but does its job well.

jwalter0071 year ago

Is there sometype of include file that I need for the saber board?

I get an error if I just try to upload the sketch?

Update: I got mine working. Turned out that I used a 2x12RC board. The "RC" does not allow serial comm. The nice folks at dimension swapped it out for me & with my minor mod to the code I show below, I have it working.

I should post the error. Also, I just realized that I bought a 2x12RC board. Would that make a difference?

The following line is highlighted:

SoftwareSerial SaberSerial = SoftwareSerial (SABER_RX_PIN, SABER_TX_PIN );


BalanceBot.ino:4:9: error: #include expects "FILENAME" or <FILENAME>

BalanceBot:13: error: 'SoftwareSerial' does not name a type

BalanceBot.ino: In function 'void initSabertooth()':

BalanceBot:18: error: 'SaberSerial' was not declared in this scope

BalanceBot.ino: In function 'void set_motor()':

BalanceBot:94: error: 'SaberSerial' was not declared in this scope

I believe I have figured out the error.

I changed the the first couple of lines to this:
#include <SoftwareSerial.h>
int x, r, l, s, f, xa, xb, xc;

And the errors were gone & code uploaded.

However, the motors dont seem to be doing anything when I angle the bot foward & backward. Not sure if the changes I made are correct.

I am absolutely new to this. I need the code for the L239D with a Groove 3-axis accelerometer. Could you please help me out asap?

I wonder f,s ? caculate s,f ? thanks you

why i try your code, it happen error #include<filename> , you can help me?

chenjian1 year ago

Hi,bro ,i want to know how to change the direction, does it have any switch ?

florman (author)  chenjian1 year ago

please expand on ur question. The robot goes both directions to balance and reversing it would make it fall

WOW..sorry ...i got it thanks very much very nich work,,

ssamaiya1 year ago

Hey , Is your machine also move forward and backward in balanced condition, like segway moves ??

ccrome2 years ago
Very nice. What you need for stability is a PID control algorithm. You already have the basic idea in your code, but the general solution has been studied for many years.

The PID is an acronym for 'Proportional, integral, differential' controller. It goes kind of like this:

You measure your angle. Your target angle is '0' degrees, right? So, you take your measured angle and subtract your target angle, this gives you an angular error:

e = (a - a0) // a is measured angle, a0 is target angle, e is error

So, now you know how far off you are, you need to decide how much energy to put into the wheels. We'll start simple with just the 'P' or 'proportional part:

f = k * e; // f is the force to apply to the wheels, e is the error, and k is some constant you make up.

If k is too big, it goes unstable. if too small, your control algorithm can't keep up and balance. You determine k empirically by trying different numbers until you get it about right.

So... in short you 'P' or proportial control algorithm will look like this:

float get_motor_power(float angle, float target_angle, float k) {
float error = angle - target_angle;
float result = k * error;
return result;

That's it! I did it all in float, but you may be able to change to ints for the parameters,but float computations makes things much easier.

Once you get your proportional algorithm going, you can easily add the integral and differential parts (slightly more complex) to further improve stability and accuracy.

KalkiV ccrome1 year ago

Thanks Caleb, that was very useful piece of information for me. I have few more questions, could help me out, please?-

  1. Can I calculate constant K with some calculations or the trial and error method is only way?
  2. Where does Kalman filter comes into picture, do I also need to write code for Kalman filter considering this application?
ccrome KalkiV1 year ago
Yes you can calculate k in principle, but you need to know all the equations regarding your system. Easiest to simply go through trial and error.

Unfortunately, Kalman filtering is beyond my knowledge. It's a filter that's able to work out the equations, even when conditions change. It's an adaptive filter of sorts. More than that though, I can't really help.

PID is pretty much the most basic kind of filter, but it's all I really understand. The more complicated stuff requires math that's really at the limit (and perhaps beyond the limit) of my math skills. (BTW, I took engineering math for 4 years at college :-/ )

Sorry I can't be of more help,

KalkiV ccrome1 year ago

:-).. no worries Caleb, thanks for taking time out to answer.

I won't need a Kalman filter; for now I am using Savitzky-Galoy filter. I hope it should do the trick with smoothing Accelerometer values.

I also found nice theory on PID in Bela G Liptak.

Cheers! Shreyas

Caleb raises a good point, there is a PID library included with the Ardunio IDE
(http://playground.arduino.cc/Code/PIDLibrary), might be worth playing about.

For tidier code you might want to refactor (generalise) some of your repetitious code. For example:
if ((x > 250) && (x < 280)) {
r = 6;
l = 133;

if ((x > 390) && (x < 410)) {
r = 122;
l = 250;

these two pieces of code are very similar, you could make a function that performs this conditional statement:
void setMotorSpeedBasedOnAngle(int minAngle, int maxAngle, int rightMotorSpeed, int leftMotorSpeed) {
if (x > minAngle && x < maxAngle)
r = rightMotorSpeed;
l = leftMotorSpeed;

that way you can replace the above two statements respectively as:
setMotorSpeedBasedOnAngle(250, 280, 6, 133);
setMotorSpeedBasedOnAngle(390, 410, 122, 250);

This means should you want to change your conditional code, you only have to change it one place, which is benefit enough to use this style of programming.

Cool project, I enjoyed reading about it.
nerd74732 years ago
I like how you incorperated the instructables robot
florman (author)  nerd74731 year ago


you're welcome! Why did it take you so long to reply?

nihit301 year ago
Can I use L239D motor controller instead of sabertooth ? Will the programming change?
florman (author)  nihit301 year ago

You would have to completely rewrite the code to use those speed controllers.

can i use L293D motor driver circuit.

florman (author)  siddhu991991 year ago

No sorry only Sabertooth speed controllers will work with the code.

Gabosanram1 year ago
Hi can i do this but using a 2 motor with 1hp each one, and with bigger wheels?? like a real segway??
florman (author)  Gabosanram1 year ago
You could but I'm not sure it would be stable enough to stand on. To do it you would just have to get a bigger speed controller, I believe Sabertooth makes a 25 watt model that would be compatible with my code.

Hope this helps
1-40 of 73Next »