Professional Documents
Culture Documents
h>
#include <I2Cdev.h>
#include <MPU6050.h>
*/
MPU6050 accelgyro;
_lasttime += (t))
float gyroYaw = 0;
uint32_t timer;
// input
double InitialRoll;
// Motors
int enablea = 3;
int enableb = 9;
int a1 = 5;
int a2 = 4;
int b1 = 10;
int b2 = 11;
void setup() {
Wire.begin();
Serial.begin(9600);
accelgyro.initialize();
// verify connection
delay(1500);
// Motor
pinMode(enablea, OUTPUT);
pinMode(enableb, OUTPUT);
pinMode(a1, OUTPUT);
pinMode(a2, OUTPUT);
pinMode(b1, OUTPUT);
pinMode(b2, OUTPUT);
digitalWrite(a1, HIGH);
digitalWrite(a2, HIGH);
digitalWrite(b1, HIGH);
digitalWrite(b2, HIGH);
accelgyro.setXAccelOffset(-250);
accelgyro.setYAccelOffset(-1929);
accelgyro.setZAccelOffset(1077);
accelgyro.setXGyroOffset(98);
accelgyro.setYGyroOffset(-145);
accelgyro.setZGyroOffset(-22);
gyroBiasX = 0;
gyroBiasY = 0;
gyroBiasZ = 0;
accBiasX = 4;
accBiasY = -4;
accBiasZ = 16378;
gyroPitch = accPitch;
gyroRoll = accRoll;
timer = micros();
delay(1000);
initializeValues();
double Setpoint;
if (out > 0) {
digitalWrite(a1, LOW);
digitalWrite(a2, HIGH);
digitalWrite(b1, HIGH);
digitalWrite(b2, LOW);
} else {
digitalWrite(a1, HIGH);
digitalWrite(a2, LOW);
digitalWrite(b1, LOW);
digitalWrite(b2, HIGH);
}
byte vel = abs(out);
if (vel < 0)
vel = 0;
vel = 255;
analogWrite(enablea, vel);
analogWrite(enableb, vel);
void initializeValues() {
//////////////////////
// Accelerometer //
//////////////////////
//////////////////////
// GYRO //
//////////////////////
timer = micros();
InitialRoll = accRoll;
Setpoint = InitialRoll;
double filtered = 0;
void loop() {
runEvery(10) {
//////////////////////
// Accelerometer //
//////////////////////
//////////////////////
// GYRO //
//////////////////////
timer = micros();
//Complementary filter
MotorControl(Compute(filtered - InitialRoll));
float lastInput = 0;
double ITerm = 0;
double kp = 100;
double ki = 10;
double kd = 2;
lastInput = input;
return output;