第一次做,很粗糙,都是模塊的組合,變速箱用的是模型小車的,最大的難點在于變速箱和馬達齒輪的配合因為完全是不配套的兩樣東西,視頻中小車也有走外的跡象,配合是主要問題,兩塊亞克力板的孔沒有打好,在安裝上還是有瑕疵
智能小車接線
重要的電機驅動擴展板到了
最初的設想想加個散熱扇
這邊用到了接口擴展板
舵機到貨,有點小貴,金屬齒的
搭建中,,,
程序DEBUG中
完成圖
變速箱和馬達
為了使用大扭力電機,改變了原有變速箱的安裝方式
代碼部分
//超聲波智能避障車程序(ARDUINO)
#include
int pinI1=5;//定義I1接口(I1-I4是l298N擴展模塊上的電機輸出接口)
int pinI2=4;//定義I2接口
int pinI3=7;//定義I3接口
int pinI4=6;//定義I4接口
int inputPin = A1; // 定義超音波信號接收腳位(插錯的后果,讀值為0,舵機不停地轉頭)
int outputPin =A0; // 定義超音波信號發射腳位
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(pinI1,OUTPUT);
pinMode(pinI2,OUTPUT);
pinMode(pinI3,OUTPUT);
pinMode(pinI4,OUTPUT);
pinMode(inputPin, INPUT); // 定義超音波輸入腳位
pinMode(outputPin, OUTPUT); // 定義超音波輸出腳位
myservo.attach(9); // 定義伺服馬達輸出第9腳位(PWM)
}
void advance(int a) // 前進
{
digitalWrite(pinI4,LOW);//使直流電機(右)逆時針轉
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,LOW);//使直流電機(左)順時針轉
digitalWrite(pinI2,HIGH);
delay(a * 100);
}
void turnR(int b) //右轉(雙輪)
{
digitalWrite(pinI4,HIGH);//使直流電機(右)順時針轉
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,LOW);//使直流電機(左)順時針轉
digitalWrite(pinI2,HIGH);
delay(b * 100);
}
void turnL(int c) //左轉(雙輪)
{
digitalWrite(pinI4,LOW);//使直流電機(右)逆時針轉
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流電機(左)逆時針轉
digitalWrite(pinI2,LOW);
delay(c * 100);
}
void stopp(int d) //停止
{
digitalWrite(pinI4,HIGH);//使直流電機(右)剎車
digitalWrite(pinI3,HIGH);
digitalWrite(pinI1,HIGH);//使直流電機(左)剎車
digitalWrite(pinI2,HIGH);
delay(d * 100);
}
void back(int e) //後退
{
digitalWrite(pinI4,HIGH);//使直流電機(右)順時針轉
digitalWrite(pinI3,LOW);
digitalWrite(pinI1,HIGH);//使直流電機(左)逆時針轉
digitalWrite(pinI2,LOW);
delay(e * 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(8); // 正常前進
Serial.print(“ Advance ”); //顯示方向(前進)
Serial.print(“ ”);
}
}
-
智能小車
+關注
關注
87文章
549瀏覽量
81669 -
Arduino
+關注
關注
187文章
6464瀏覽量
186675
發布評論請先 登錄
相關推薦
評論