EENX15/EENX15_LQR/EENX15_LQR.ino

178 lines
3.9 KiB
Arduino
Raw Normal View History

2021-04-13 21:51:43 +02:00
#include <Wire.h>
//temporary variable to measure main loops
int temp_loops;
//lqr stuff
const uint8_t statesNumber = 4;
/** Low pass filter angular Position*/
float angularPositionLP = 0;
/** Zumo's angular position */
float angularPosition = 0;
/** Corrected angular position */
float correctedAngularPosition = 0;
/** Zumo's angular speed */
float angularSpeed = 0;
/** Motor's angular position */
float motorAngularPosition = 0;
/** Motor's angular speed */
float motorAngularSpeed = 0;
/** PWM signal applied to the motor's driver 255 is 100% */
int32_t speed;
int safe_angle;
//gyro stuff
float AccX, AccY, AccZ;
float GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ;
float roll, pitch, yaw;
float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ;
float elapsedTime, currentTime, previousTime;
int gyro_x, gyro_y, gyro_z;
long gyro_x_cal, gyro_y_cal, gyro_z_cal;
boolean set_gyro_angles;
long acc_x, acc_y, acc_z, acc_total_vector;
float angle_roll_acc, angle_pitch_acc;
float angle_pitch, angle_roll;
int angle_pitch_buffer, angle_roll_buffer;
float angle_pitch_output, angle_roll_output;
long loop_timer;
int temp;
//motor stuff
#define encoderA1 2
#define encoderB1 3
#define encoderA2 4
#define encoderB2 7
volatile int countA = 0;
volatile int countB = 0;
const int MotorPinA = 12;
const int MotorSpeedA = 3;
const int MotorBrakeA = 9;
const int MotorPinB = 13;
const int MotorSpeedB = 11;
const int MotorBrakeB = 8;
const int CCW = HIGH;
const int CW = LOW;
volatile byte half_revolutionsA;
volatile byte half_revolutionsB;
unsigned int rpmA;
unsigned int rpmB;
unsigned long timeoldA;
unsigned long timeoldB;
void setup() {
2021-04-13 21:51:43 +02:00
Wire.begin();
Serial.begin(115200);
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console opens
gyro_setup();
//motor
pinMode(encoderA1, INPUT_PULLUP);
pinMode(encoderB1, INPUT_PULLUP);
pinMode(encoderA2, INPUT_PULLUP);
pinMode(encoderB2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(encoderA1), pulseA, RISING);
//attachInterrupt(digitalPinToInterrupt(encoderB1), pulseB, RISING);
pinMode(MotorPinA, OUTPUT);
pinMode(MotorSpeedA, OUTPUT);
pinMode(MotorBrakeA, OUTPUT);
pinMode(MotorPinB, OUTPUT);
pinMode(MotorSpeedB, OUTPUT);
pinMode(MotorBrakeB, OUTPUT);
half_revolutionsA = 0;
rpmA = 0;
timeoldA = 0;
half_revolutionsB = 0;
rpmB = 0;
timeoldB = 0;
}
void loop() {
gyro_loop();
safe_angle = int(round(angle_pitch_output));
if(temp_loops>250){
Serial.println("");
Serial.print(" pitch Angle = "); Serial.println(angle_pitch_output);
Serial.print(" pitch Angle abs = "); Serial.println(abs(safe_angle));
Serial.print(" pitch Angle measured = "); Serial.println(angle_pitch);
Serial.print("Position: "); Serial.println(countA);
//Serial.print("A: "); Serial.println(countA);
//Serial.print("B: "); Serial.println(countB);
temp_loops = 0;
}
else {
temp_loops++;
}
2021-04-13 22:29:15 +02:00
if(abs(safe_angle)<50 ){
speed = 8*safe_angle;
if(speed<0){
digitalWrite(MotorPinB, CW);
digitalWrite(MotorPinA, CCW);
2021-04-13 22:29:15 +02:00
speed -= 30;
}
2021-04-13 22:29:15 +02:00
else if(speed>0){
digitalWrite(MotorPinB, CCW);
digitalWrite(MotorPinA, CW);
2021-04-13 22:29:15 +02:00
speed += 30;
}
2021-04-13 22:29:15 +02:00
else {
speed = 0;
}
speed = abs(speed);
speed = constrain(speed, 0, 249);
analogWrite(MotorSpeedB, speed); //Wheel close to connections
analogWrite(MotorSpeedA, speed); //First experiment wheel
}
else{
speed = 0;
analogWrite(MotorSpeedB, speed);
analogWrite(MotorSpeedA, speed);
}
}
int directionA(){
if(digitalRead(encoderA2) == HIGH){
return 1;
}
else{
return -1;
}
}
int directionB(){
if(digitalRead(encoderB2) == HIGH){
return 1;
}
else{
return -1;
}
}
void pulseA(){
countA += directionA();
}
void pulseB(){
countB += directionB();
}