56 responses to “Building a self balancing bot”

  1. Anber

    I was wondering. Wouldn’t it be better to put you sensor, not at the tilt position but rather at the center pivot point? In your case, where the micro-controler is.

    The problem is that by the time your robot detect that it’s upright, it’s momentum from the top of your robot, which include the weight of your micro-controller board, will already be on it’s way to “fall” to the opposite side. This will cause the robot to always over-correct itself and eventually fall over.

  2. Drake

    What engines did you use? What are the characteristics? What brand are they? They are equipped with reduction gear?


  3. Drone

    Vimeo says Sorry There was a problem loading this video 🙁

  4. nelson

    muy buen proyecto, me atrevo a decir que el problema es por las velocidades de las ruedas, de seguro son diferentes. seria bueno colocar un encoder a cada una y así de alguna manera mediante software comparar dichas velocidades y hacer que giren a la misma velocidad saludos desde Venezuela

    very good project, I dare say that the problem is the wheel speeds, insurance are different. Good serious post each encoder and so somehow compare these speeds with software and spinning at the same speed Greetings from Venezuela

  5. henrique mariz

    i have an large polystirene sheet (2metersX1,22meters)
    i wanna know some questions:
    what type of screws is indicated if i use an polystirene sheet?
    where should i put the screws in order to get better perfomance?
    (milimeter of the screw,torque etc)
    is there some kind of way to open the hole for the screws?
    something i need to know?
    the drill that you used it has to be smaller or bigger than the hole for the screws?
    i dont understand about carpenter/joiner so it is why i am asking you.
    if you know some good tutorial or book about make chassi/case for robots with polystirene sheet i will really appreciate!


  6. Anber

    Tilt Robots works on the basis of an inverted pendulum. You will need most of your weight at the top of your robot. This will increase your momentum at the top and make your robot more stable.

    Put your battery on-top and add more weight to it if needed.
    You tilt sensor should be about the middle, at your center of balance.

    Try balancing a plastic ruler, upright, on your finger. Try adding a lump of clay to the top end and try again. You’ll see that the ruler is much easier to balance if there are weight at the top.

    I’m sure that will make your robot more stable.

  7. Raphael Pereira

    I’m having a problem to compile the code,
    the error saying: ‘i2cWrite’ was not declared in this scope.
    What can it be?
    I copied your code exactly as in your post, but I can not make it work, I appreciate the help!

  8. Raphael Pereira

    I tried again, and got a new error:
    ‘Kalman’ does not name a type
    Do you have any tips of what can be?

  9. Chris A.

    I looked at your code and can make some suggestions:

    1) You need to calibrate your sensors. IS everything really square, Does Y remain constant when X changes? If not the sensor is not aligned. You can fix it with some trig

    2) I don’t see where you are correcting out a zero error. Are the sensors saying “zero” at zero or is there a bias.

    3) If using integer math don’t convert to degrees. You have 15 bits use then ALL or at least more of them “hundredths of a degree” fits but better to make up your own units like “1/32nd counts” or whatever so you can do the scaling with a shift.
    In any case one degree per count is so large a unit for integer math. One a larger computers I use double (64-bit floats) in radians for all angles.

    4) you motor gearbox likely has “backlash” so when you reverse the direction the motor has to spin a little before the wheel turns. You might be able to see this if you make it go really slow. You may have to compensate in software.

    Once you get the motor encoders then you PID sends wheel speed, not voltage and your wheel driver can ignore the first N counts after a direction change because they do’t move the wheel.

    Yo are actually ahead of me. I’m waiting on on parts, so I’m writing hexapod code, not balance bot code.

  10. Smitti

    Hi nice Work
    i tried to get it work but always i got the error I2CWrite not declared in this scope
    I got the right kalman library but i thing its a problem of the wire library or the arduino version i use 1.0.5
    I want to use the code on a Real size Segway
    Hope you can help with my Problem


  11. Fatih

    nice project.

    but i got always same error ” I2CWrite not declared in this scope”
    i downloaded kalman library but now only have that error.

  12. Balancebot 1 | Random Occasional Musings
  13. mark s

    why do you calculate the X acceleration angle from the accY and accZ values, should it not be accX and accZ?

    your code: accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;

  14. Sagar Shah

    I’m having a problem to compile the code,
    the error saying: ‘i2cWrite’ was not declared in this scope.
    What can it be?
    I copied your code exactly as in your post, but I can not make it work, I appreciate the help!

  15. Roway | Graficad

    […] di controllo: PID (spiegazione QUI, QUI, QUI); LQR; Kalman filter per utilizzare accelerometro e giroscopio, si trova su github: […]

  16. Tushar

    May i know the inputs from your sensors to the Arduino(Plzz specify the pin names on the arduino along with the pin on the mpu6050).Thank you

  17. Sagar Shah

    I’m having a problem to compile the code,
    the error saying: ‘i2cRead’ was not declared in this scope.
    What can it be?
    I copied your code exactly as in your post, but I can not make it work, I appreciate the help!

  18. John Crawford

    Sagar Shah,
    You will need to install the KalmanFilter library. In the examples for this library you will see a folder called MPU6050, inside you will see a file called I2C.ino. Copy this file into the folder where you have downloaded the code. Stop and restart the Arduino IDE and it should now compile.

  19. edissty

    just sharing for ‘i2cRead’ was not declared in this scope
    in your active sketch (coppied sketch from admin) add file I2C.ino, you can find it as John Crawford said, add file by clicking sketch-add file-choose i2c.ino then you get new tab i2c.ino beside your sketch ,verify your your sketch than error will gone:)

  20. Leander

    Is it really necessary to use motors with encoders or can we use ordinary 12V dc motors WITHOUT ENCODERS?

  21. Trungvn

    hi, It is very good, Could you tell me What is Funtion constrain(integrated_error, -GUARD_GAIN, GUARD_GAIN)??

  22. manju

    can you give circuit diagram

  23. Andy182

    hello mate, thanks for sharing this tutorial, but I have to try and get an error

    sketch_feb09a.ino: In function ‘void setup ()’:
    sketch_feb09a.ino: 55: 38: error: ‘i2cWrite’ was not declared in this scope
    sketch_feb09a.ino: 56: 32: error: ‘i2cWrite’ was not declared in this scope
    sketch_feb09a.ino: 58: 33: error: ‘i2cRead’ was not declared in this scope
    sketch_feb09a.ino: 67: 31: error: ‘i2cRead’ was not declared in this scope
    sketch_feb09a.ino: In function ‘void dof ()’:
    sketch_feb09a.ino: 140: 32: error: ‘i2cRead’ was not declared in this scope
    Error compiling.

    how do I fix it? and can you share the wiring diagram?

    1. Andy182

      oh sorry, I have to fix the problem and succeed … and now I want to ask how to connect mpu6050 to arduino?

      SCL and SDA pin on mpu6050 in arduino pin plug to the Which?

      1. Adam

        Hey how you fix it ?

  24. QuanNB

    I have a problem about ‘i2cRead’ was not declared in this scope when I complie this code. Please help me, I tried to solve but i can’t do it.

  25. John Crawford

    Hi QuanNB,
    You could have solved your problem had you just read this forum. Please see my post of 17/09/2014 and that of edissty on 21/09/2014 above.



  26. Tom

    Do you have gears? Makes a big difference. I had a reduction gearbox but it wasn’t enough. You need about 30:1

  27. Korean student

    hey, i m interesting your self-balancing bot, but i wanna question. would you tell me your self balancing bot’s components in detail?

  28. Duhan

    Everything is just perfect but i couldnt find the library in the code.

  29. shivani

    could you pls share the link to the codes…especially the mpu6050 code

    1. Ankitkumar Chheda

      Jeff Rowberg’s I2CDev library is also needed. Google for ‘github’ jeff rowberg’s i2cdev’

  30. George Gallant

    I have been working on a self balancing robot (third attempt) and have added some debugging print statements inside the computation loop. Noticed that the angle computed by the kalman filter lags the raw angle from the accelerator by about 6 state changes. This results the the computation loop thinking that it is tilting one way when it has already passed the center point.

    I understand that the kalman filter is not your code but wondered if anyone else has observed this behavior. I have played with the q_angle & q_bias. Making the 0.1 and 0.3 seems to decrease the lag at the expense of stability. I also changed the loop iteration time to 2 miliseconds.

    Also wondered if using the embedded code in the 6050 would help.

    Note – I am on a different CPU and did port the kalman filter code to C so there is a real probability that I am the culprit.

  31. brent

    I could figure out why, but if you display all the values on the serial monitor, then the iTerm goes up to a value: -10 and i will not change. I changed the following in the program: “float pTerm, iTerm, dTerm, last_error, error; // deleted integrated_error” and in the part Void Pid(){ I put in the beginning ” integrated_error = 0; ” and this solved the problem for me, I have now changing values for the iTerm. I don’t know if this is the right thing to do, but can you check on this, or maybe I am wrong.
    Thanks for putting your time in this project.

  32. ha


    Can it balance now ?

  33. sanjay suthar

    hello i have interfaced mpu6050 with atmega32.it is successfully reading the mpu6050.but when i read the value of accelerometer and gyro it gives zero.Even i wake it from sleep mode.still it is giving zero

  34. sanjay suthar

    so can u tell me what can be the problem .and give me appropriate solution

  35. John Gore

    Hi, I just watched the tutorial from EEEnthusiast (Arduino Accelerometer MPU-6050 Tutorial) and was wondering if you could help me with it. I’m working on a quadcopter and wanted to use the MPU to balance the unit. Do I need to use both accelerometer and gyroscope data to do that? Do you have an example I could use for it?


  36. Vauger

    Hello! What RPM is your engine?

  37. Somesh

    Hello !
    My bot is working only backward direction
    it doesn’t working forward side
    please help me

  38. vjay

    Arduino: 1.6.1 (Windows 8.1), Board: “Arduino NG or older, ATmega8”

    sketch_apr17a.ino: In function ‘void setup()’:

    sketch_apr17a.ino:55:38: error: ‘i2cWrite’ was not declared in this scope

    sketch_apr17a.ino:56:32: error: ‘i2cWrite’ was not declared in this scope

    sketch_apr17a.ino:58:33: error: ‘i2cRead’ was not declared in this scope

    sketch_apr17a.ino:67:31: error: ‘i2cRead’ was not declared in this scope

    sketch_apr17a.ino: In function ‘void dof()’:

    sketch_apr17a.ino:140:32: error: ‘i2cRead’ was not declared in this scope

    Error compiling.

    This report would have more information with
    “Show verbose output during compilation”
    enabled in File > Preferences.

  39. Bruno Sales

    Saudações do Brasil

  40. Madara Uchiha

    Constrain() is the reason why you had to give up. Use map() instead and see the magic!!

  41. Usman

    can you please show the circuit diagram or show the connections of MPU6050 with Arduino.

Leave a Reply