Simple Balancer
this simple balancing robot using accelerometer , small simple sketch. built robot center of gravity (cg) inch above pivot (axle) , put accelerometer close cg possible. putting accelerometer @ cg reduces affect of motor acceleration during balancing. put x axis of accelerometer in direction of travel parallel ground detect direction of tipping.
here short video:
https://www.youtube.com/watch?v=pfol2efpzms
here sketch more notes:
i made experiment can accelerometer. better use accelerometer , gyro, has done
dave
here short video:
https://www.youtube.com/watch?v=pfol2efpzms
here sketch more notes:
code: [select]
/*
simple balancing robot
by dave gundlach
8/5/2014
this simple balancer using robot short distance center of gravity (cg) above wheel centers.
this uses on accelerometer sensor. tilt calculated reading value , direction of an
axis parallel ground. accelerometer located @ robot cg minimize motor acceleration.
in addition, motors shut down small delay before reading accelerometer minimize motor acceleration.
robot: radioshack make robotics starter kit + motor addon
robot 2 black tip motors, 2 (4 aa) battery packs
battery pack (9v) arduino power
arduino uno
adafruit v1.2 motor controller
make prototype shield mini breadboard
adafruit adxl335 accelerometer
wiring: 2 (4 aa) battery packs connected in parallel motor power connection (jumper off)
motors connected each of motor connections on motor controller, black wire inner terminal.
accelerometer connected 5v, ground, a0 xout., , aref 3vo (see adafruit tutorial more info).
libraries:
adafruit motor shield library
copyright adafruit industries llc, 2009
code public domain, enjoy!
*****warning - see arduino reference page important info on external reference usage******
warning - failure not follow external reference instruction may result in damage arduino
*/
// motor shield setup //
#include <afmotor.h>
af_dcmotor motor1(1, motor12_64khz); // instance each motor
af_dcmotor motor2(2, motor12_64khz);
// accelerometer setup //
#define xpin a0 // x axis pin
//#define ypin a1 // y axis pin
//#define zpin a2 // z axis pin
#define xzero 509 // x 0 g value // calibration values (need use values sensor)
//#define yzero 510 // y 0 g value
//#define zzero 523 // z 0 g value
#define xinc 103.0 // x increment value (float)
//#define yinc 106.0 // y increment value (float)
//#define zinc 101.0 // z increment value (float)
void setup() {
analogreference(external); // see warning
serial.begin(9600); // set serial library @ 9600 bps
// turn on motor
motor1.setspeed(250);
motor2.setspeed(250);
motor1.run(release);
motor2.run(release);
}
void loop() {
motor1.run(release); // release motors reduce motor accel on sensor
motor2.run(release);
//delay(1); // short delay let motors release
int xraw = analogread(xpin); // read raw accelerometer values
float xg = (xraw - xzero)/xinc; // calc g values (note, xinc needs float value)
int del = 2; // set delay 2ms
int xgh = xg*100; // make xg integer multiplying 100
int speed = (xgh) * 90; // calculate motor speed , multiply speed factor
speed = abs(speed); // make positive
speed = constrain(speed, 0, 250); // constrain max of 250
serial.println (speed);
if (xgh < 0) { // if negative
motor1.run(forward); // move forward
motor2.run(forward);
motor1.setspeed(speed);
motor2.setspeed(speed);
delay(del);
}
else { // else positive
motor1.run(backward); // move backward
motor2.run(backward);
motor1.setspeed(speed);
motor2.setspeed(speed);
delay(del);
}
}
i made experiment can accelerometer. better use accelerometer , gyro, has done

dave
Arduino Forum > Topics > Robotics (Moderator: fabioc84) > Simple Balancer
arduino
Comments
Post a Comment