Академический Документы
Профессиональный Документы
Культура Документы
h> //Khởi tảo chuẩn giao tiếp I2C để nhận dữ liệu cho MPU 6050
#include “Kalman.h” //Định nghĩa thư biện KALMAN lọc nhiễu cho MPU 6050 trả giá
trị về
Kalman kalamanx; //Tạo ra một hàng KALMAN
//IMU Data
Int16_t accX, acc Y, accZ;
Int16_t gyroX, gyroY, gyroZ;
Float accXangle; //Góc tính toán từ máy đo gia tốc
Float gyroXangle; //Góc tính toán sử dụng GYRO
Float kalAngleX; //Tính toán sử dụng lọc KALMAN
Float SensorValue; //Giá trị góc trả về
Uint8_t i2cData[14]; //Khởi tạo mảng để giao tiếp I2C cho MPU 6050
Unsigned long timer; //Biến đếm time
//ID
Float K[=25; //15; //31,3
Float Ki = 0.7; //0.32; //0.03;
Float Kd =50; //35;
Float pTerm, iTerm, dTerm, iError, prevError, Error;
Float K=3;
#define GUARD_GAIN 5.0
Int PWM_Value;
Void setup() {
Serial.begin(9600)
Wire.begin(); // initialize i2c (Khởi tạo i2c)
accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
Void loop() {
Getangle();
If (SensorValue <= 180.1 && SensorValue >=179.9)
Stop();
Else
{
If (SensorValue <230 && SensorValue > 130)
{
PID();
Motors();
}
Else
{
Stop();
}
}
Serial.println(SensorValue);
Void Motors()
If (PWM_Value > 0)
{
//forward
digitalWrite(M1CW, LOW);
digitalWrite(M1CCW, HIGH);
analogWrite(M1EN, PWM_Value);
digitalWrite(M2CW, LOW);
digitalWrite(M2CCW, HIGH);
analogWrite(M2EN, PWM_Value);
}
Else
{
//backward
PWM_Value = map(PWM_Value, 0, -255, 0, 255);
digitalWrite(M1CW, HIGH);
digitalWrite(M1CCW, LOW);
analogWrite(M1EN, PWM_Value);
digitalWrite(M2CW, HIGH);
digitalWrite(M2CCW, LOW);
analogWrite(M2EN, PWM_Value);
}
}
Void stop() {
digitalWrite(M1CW, 0);
digitalWrite(M1CCW, 0);
digitalWrite(M2CW, 0);
digitalWrite(M2CCW, 0);
}
Void PID() {
Error = 180.90 –SensorValue; 1800 = Level
pTerm =Kp +Error;
iError += Error;
item =Ki*constrain(iError, -GUARD_GAIN, GUARD_GAIN);
Void getangle()
{
accX = ((i2cData[0] << 8) | i2cData[1]);
accY = ((i2cData[2] << 8) | i2cData[3]);
accZ= ((i2cData[4] << 8) | i2cData[5]);
gyroXX = ((i2cData[8] << 8) | i2cData[9]);
gyroY = ((i2cData[10] << 8) | i2cData[11]);
gyroZ= ((i2cData[12] << 8) | i2cData[13]);
double gyrXrate