关于超声波智能车转向问题,求代码(或求改正)谢谢!!!
我们做了超声波智能车,但是代码输进去后,没有遇到障碍物还是在原地转圈,我们希望改成向前进,求高手帮帮忙,谢谢!!!{:soso_e100:} /*程式的開頭要描述你的設備再來要說是脽寫的日期版本
然後碰到問題一次一次都要寫清楚
馬達幾個驅動電路都要描述
L = 左
R = 右
F = 前
B = 後
*/
#include <Servo.h>
int pinLB=6; // 定義8腳位 左後
int pinLF=9; // 定義9腳位 左前
int pinRB=10; // 定義10腳位 右後
int pinRF=11; // 定義11腳位 右前
int inputPin = A0;// 定義超音波信號接收腳位
int outputPin =A1;// 定義超音波信號發射腳位
int Fspeedd = 0; // 前速
int Rspeedd = 0; // 右速
int Lspeedd = 0; // 左速
int directionn = 0; // 前=8 後=2 左=4 右=6
Servo myservo; // 設 myservo
int delay_time = 250; // 伺服馬達轉向後的穩定時間
int Fgo = 8; // 前進
int Rgo = 6; // 右轉
int Lgo = 4; // 左轉
int Bgo = 2; // 倒車
void setup()
{
Serial.begin(9600); // 定義馬達輸出腳位
pinMode(pinLB,OUTPUT); // 腳位 8 (PWM)
pinMode(pinLF,OUTPUT); // 腳位 9 (PWM)
pinMode(pinRB,OUTPUT); // 腳位 10 (PWM)
pinMode(pinRF,OUTPUT); // 腳位 11 (PWM)
pinMode(inputPin, INPUT); // 定義超音波輸入腳位
pinMode(outputPin, OUTPUT);// 定義超音波輸出腳位
myservo.attach(5); // 定義伺服馬達輸出第5腳位(PWM)
}
void advance(int a) // 前進
{
digitalWrite(pinRB,LOW);// 使馬達(右後)動作
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,LOW);// 使馬達(左後)動作
digitalWrite(pinLF,HIGH);
delay(a * 100);
}
void right(int b) //右轉(單輪)
{
digitalWrite(pinRB,LOW); //使馬達(右後)動作
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,HIGH);
delay(b * 100);
}
void left(int c) //左轉(單輪)
{
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,LOW); //使馬達(左後)動作
digitalWrite(pinLF,HIGH);
delay(c * 100);
}
void turnR(int d) //右轉(雙輪)
{
digitalWrite(pinRB,LOW);//使馬達(右後)動作
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,LOW);//使馬達(左前)動作
delay(d * 100);
}
void turnL(int e) //左轉(雙輪)
{
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,LOW); //使馬達(右前)動作
digitalWrite(pinLB,LOW); //使馬達(左後)動作
digitalWrite(pinLF,HIGH);
delay(e * 100);
}
void stopp(int f) //停止
{
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,HIGH);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,HIGH);
delay(f * 100);
}
void back(int g) //後退
{
digitalWrite(pinRB,HIGH);//使馬達(右後)動作
digitalWrite(pinRF,LOW);
digitalWrite(pinLB,HIGH);//使馬達(左後)動作
digitalWrite(pinLF,LOW);
delay(g * 100);
}
void detection() //測量3個角度(0.90.179)
{
int delay_time = 250; // 伺服馬達轉向後的穩定時間
ask_pin_F(); // 讀取前方距離
if(Fspeedd < 10) // 假如前方距離小於10公分
{
stopp(1); // 清除輸出資料
back(2); // 後退 0.2秒
}
if(Fspeedd < 25) // 假如前方距離小於25公分
{
stopp(1); // 清除輸出資料
ask_pin_L(); // 讀取左方距離
delay(delay_time); // 等待伺服馬達穩定
ask_pin_R(); // 讀取右方距離
delay(delay_time); // 等待伺服馬達穩定
if(Lspeedd > Rspeedd) //假如 左邊距離大於右邊距離
{
directionn = Rgo; //向右走
}
if(Lspeedd <= Rspeedd) //假如 左邊距離小於或等於右邊距離
{
directionn = Lgo; //向左走
}
if (Lspeedd < 10 && Rspeedd < 10) //假如 左邊距離和右邊距離皆小於10公分
{
directionn = Bgo; //向後走
}
}
else //加如前方不小於(大於)25公分
{
directionn = Fgo; //向前走
}
}
void ask_pin_F() // 量出前方距離
{
myservo.write(90);
digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);// 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓
float Fdistance = pulseIn(inputPin, HIGH);// 讀差相差時間
Fdistance= Fdistance/5.8/10; // 將時間轉為距離距离(單位:公分)
Serial.print("F distance:"); //輸出距離(單位:公分)
Serial.println(Fdistance); //顯示距離
Fspeedd = Fdistance; // 將距離 讀入Fspeedd(前速)
}
void ask_pin_L() // 量出左邊距離
{
myservo.write(5);
delay(delay_time);
digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);// 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓
float Ldistance = pulseIn(inputPin, HIGH);// 讀差相差時間
Ldistance= Ldistance/5.8/10; // 將時間轉為距離距离(單位:公分)
Serial.print("L distance:"); //輸出距離(單位:公分)
Serial.println(Ldistance); //顯示距離
Lspeedd = Ldistance; // 將距離 讀入Lspeedd(左速)
}
void ask_pin_R() // 量出右邊距離
{
myservo.write(177);
delay(delay_time);
digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);// 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓
float Rdistance = pulseIn(inputPin, HIGH);// 讀差相差時間
Rdistance= Rdistance/5.8/10; // 將時間轉為距離距离(單位:公分)
Serial.print("R distance:"); //輸出距離(單位:公分)
Serial.println(Rdistance); //顯示距離
Rspeedd = Rdistance; // 將距離 讀入Rspeedd(右速)
}
void loop()
{
myservo.write(90);//讓伺服馬達回歸 預備位置 準備下一次的測量
detection(); //測量角度 並且判斷要往哪一方向移動
if(directionn == 2)//假如directionn(方向) = 2(倒車)
{
back(8); //倒退(車)
turnL(2); //些微向左方移動(防止卡在死巷裡)
Serial.print(" Reverse "); //顯示方向(倒退)
}
if(directionn == 6) //假如directionn(方向) = 6(右轉)
{
back(1);
turnR(6); // 右轉
Serial.print(" Right "); //顯示方向(左轉)
}
if(directionn == 4) //假如directionn(方向) = 4(左轉)
{
back(1);
turnL(6); // 左轉
Serial.print(" Left "); //顯示方向(右轉)
}
if(directionn == 8) //假如directionn(方向) = 8(前進)
{
advance(1); // 正常前進
Serial.print(" Advance "); //顯示方向(前進)
Serial.print(" ");
}
}
麻烦网友:) :'(请大家帮帮忙,谢了!!!十分感激!!! 检查一下引脚,看引脚有没有错,还有看代码你的车轮前后两排轮是反着安的,
页:
[1]