標(biāo)題:
Arduino超聲波自平衡小車
[打印本頁(yè)]
作者:
koyii
時(shí)間:
2020-4-4 17:10
標(biāo)題:
Arduino超聲波自平衡小車
有需要的可以下載
//利用超聲波測(cè)距傳感器實(shí)現(xiàn)小車平衡
char val='z'; //調(diào)節(jié)與控制命令字
double Kp=0.01, Kd=0.02; //PID系數(shù)
unsigned int PB_ad=0, KP_ad=0, KD_ad=0, i; //平衡點(diǎn)調(diào)整,PID各調(diào)整設(shè)定系數(shù)
unsigned int Len_Echo = 0; //回波時(shí)間
int E_0 = 0, E_1 = 0, PWM_Out; //誤差,PWM輸出
double Len_filter = 0, Len_0 = 100; //測(cè)距濾波,機(jī)械平衡距離
unsigned int TrigPin = 4; //HC-SR04觸發(fā)信號(hào)
unsigned int EchoPin = 5; //HC-SR04回波檢測(cè)
unsigned int M_IN1 = 6; // L298-IN1
unsigned int M_IN2 = 7; // L298-IN2
unsigned int M_IN3 = 8; // L298-IN3
unsigned int M_IN4 = 9; // L298-IN4
unsigned int M_ENA = 10; // L298-ENA
unsigned int M_ENB = 11; // L298-ENB
//初始化
void setup() {
Serial.begin(115200);
pinMode(M_ENA, OUTPUT); //電機(jī)控制
pinMode(M_IN1, OUTPUT);
pinMode(M_IN2, OUTPUT);
pinMode(M_ENB, OUTPUT);
pinMode(M_IN3, OUTPUT);
pinMode(M_IN4, OUTPUT);
pinMode(EchoPin, INPUT); //超聲波測(cè)距
pinMode(TrigPin, OUTPUT);
digitalWrite(TrigPin, LOW);
for(i=0; i<64; i++) {
PB_ad += analogRead(A0); //讀取平衡點(diǎn)電位器設(shè)定值
KP_ad += analogRead(A1); //讀取PID-P電位器設(shè)定值
KD_ad += analogRead(A2); //讀取PID-D電位器設(shè)定值
}
Kp *= KP_ad/64; //Kp = 3.23;
Kd *= KD_ad/64; //Kd = 8.14;
Len_0 += PB_ad/640; //Len_0 = 189;
i = 0;
}
//主循環(huán)程序
void loop() {
if (Serial.available() > 0) {
val = Serial.read();
if(val == 'F') {
Serial.print(Len_0); Serial.print("\t"); Serial.print(Kp); Serial.print("\t"); Serial.println(Kd);//查看設(shè)置參數(shù)
}
if(val == 'L') {
Serial.print(Len_Echo); Serial.print("\t"); Serial.println(Len_filter); //查看傳感器實(shí)測(cè)值,濾波值
}
}
digitalWrite(TrigPin, HIGH); //發(fā)送超聲波測(cè)量觸發(fā)脈沖
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
Len_Echo = pulseIn(EchoPin, HIGH); //回波時(shí)間測(cè)量
if((Len_Echo < 300) && (Len_Echo > 70)) {
Len_filter *= 0.7; //一階互補(bǔ)濾波
Len_filter += 0.3*Len_Echo;
i ++;
if(i > 50){
E_0 = Len_0 - Len_filter;
PWM_Out = Kp * E_0 + Kd * (E_0 - E_1);
E_1 = E_0;
i = 100;
SetMotorVoltage(PWM_Out);
}
}else {
SetMotorVoltage(0); //超出平衡范圍,停止PWM輸出
}
delay(5); //延時(shí)5毫秒,保證超聲測(cè)距可靠工作
}
//電機(jī)輸出
void SetMotorVoltage(int MotorVol) {
if(MotorVol >=0) {
digitalWrite(M_IN1, LOW);
digitalWrite(M_IN2, HIGH);
digitalWrite(M_IN3, LOW);
digitalWrite(M_IN4, HIGH);
}else {
digitalWrite(M_IN1, HIGH);
digitalWrite(M_IN2, LOW);
digitalWrite(M_IN3, HIGH);
digitalWrite(M_IN4, LOW);
MotorVol = -MotorVol;
}
if(MotorVol > 255) MotorVol = 255; //防止PWM值超過(guò)255
analogWrite(M_ENA, MotorVol);
analogWrite(M_ENB, MotorVol);
}
復(fù)制代碼
超聲自平衡小車程序.zip
2020-4-4 17:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.51 KB, 下載次數(shù): 6, 下載積分: 黑幣 -5
自行下載
作者:
admin
時(shí)間:
2020-4-7 15:58
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1