|
[table=98%]
[tr][td]小弟最近好不容易求到了可以讓平衡車子站起來的程式碼
#include "Wire.h"
#include <Servo.h>
#include <Kalman.h>
#include "I2Cdev.h"
#include "MPU6050.h"
float fRad2Deg = 57.295779513f; //將弧度轉為角度的乘數
const int nCalibTimes = 1000; //校準時讀數的次數
int calibData[6]; //校準數據
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
bool blinkState = false;
char flag = false; //打印開關
unsigned long nLastTime = 0; //上一次讀數的時間
Kalman kalmanRoll; //Roll角濾波器
Kalman kalmanPitch; //Pitch角濾波器
/*********** PID控制器參數 *********/
float ITerm, lastInput; // 積分項、前次輸入
float Output = 0.0; // PID輸出值
/***********電機參數**************/
Servo ServoL;
Servo ServoR;
/***********四元數參數***********/
#define KP 0.025f//10.0f
#define KI 0.0f//0.008f
#define halfT 0.001f
float q0 = 1, q1 = 0, q2 = 0, q3 = 0;
float exInt = 0, eyInt = 0, ezInt = 0;
float Angle_roll, Angle_pitch, Angle_yaw;
byte ENA = 5;byte IN1 = 9; byte IN2 = 10;
byte ENB = 6;byte IN3 = 11;byte IN4 = 12;
void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
// initialize serial communication
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
// it's really up to you depending on your project)
Serial.begin(38400);
// initialize device
Serial.println("Initializing I2C devices...");
accelgyro.initialize();
// verify connection
Serial.println("Testing device connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
for( byte i = 0; i <= 12 ; i++){
pinMode(i,OUTPUT);
}
// configure Arduino LED for
}
void loop() {
int16_t readouts[6];
ReadAccGyr(readouts); //讀出測量值
float realVals[6];
Rectify(readouts, realVals); //根據校準的偏移量進行糾正
//四元數解析出歐拉角
// AngleUpdate(realVals);
//計算加速度向量的模長,均以g為單位
float fRoll = GetRoll(realVals); //計算Roll角
float fPitch = GetPitch(realVals); //計算Pitch角
//計算兩次測量的時間間隔dt,以秒為單位
unsigned long nCurTime = micros();
float dt = (double)(nCurTime - nLastTime) / 1000000.0;
//對Roll角和Pitch角進行卡 |
|