Instructables
Picture of Self Balancing Segway Instructabot

Supplies:

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

Tools:

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


 
Remove these adsRemove these ads by Signing Up
1-40 of 67Next »
Librav1 year 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
SBR12.JPGSBR11.JPGSBR10.JPG

Wow....that's awsome segway!

jwalter007 Librav5 months ago

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

florman (author)  Librav8 months 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)  gunnlaugursig5 days 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.

http://www.parallax.com/product/570-00080

Marta0151 month 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 month ago

Hello,

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.

jwalter0075 months 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 );

ERROR:

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.

mushfiq19964 months ago

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?

monkeybuiluan5 months ago

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

monkeybuiluan5 months ago

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

chenjian5 months ago

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

florman (author)  chenjian5 months ago

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

chenjian florman5 months ago

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

ssamaiya5 months ago

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

ccrome1 year 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.

-Caleb
KalkiV ccrome5 months 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 KalkiV5 months 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,
-Caleb

KalkiV ccrome5 months 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.
nerd74731 year ago
I like how you incorperated the instructables robot
florman (author)  nerd74736 months ago

thanks

nerd7473 florman6 months ago

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

nihit3010 months ago
Can I use L239D motor controller instead of sabertooth ? Will the programming change?
florman (author)  nihit306 months ago

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

siddhu991996 months ago

can i use L293D motor driver circuit.

florman (author)  siddhu991996 months ago

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

Gabosanram8 months 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)  Gabosanram8 months 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
Mic1009 months ago
thanks for this instructable
nice project! but what are the other alternative cheap components can i used to this project?
florman (author)  JoelBekimon1 year ago
You can use any motors, but you would have to change some settings in the program. As for the speed controller any one would work but the program is designed for that speed controller so you would have to right an entire new program. Any other arduino would work for the project.

Nice! Would be better with encoders on your motors. You need speed and position for stability.
can we use any arduino???sorry i am new to this
florman (author)  swadib silla1 year ago
as far as I know any arduino should work.

Hope this helps
1-40 of 67Next »