|
Hello,大家好!今天我要給大家分享一下我近期制作的一個arduino的小項目----智能避障小車。之前在某站上無意間刷到某位博主制作的一款智能避障小車,覺得很有意思,便打算自己也只做一個來玩玩,于是便寫了一款我自己理解的避障小車,在此基礎(chǔ)上,我還增加了藍(lán)牙遙控功能,二者可以相互切換,提高其趣味性。和其他的避障小車類似,這款也是超聲波來進行距離避障,代碼相對其他大神來說顯得比較表層,但這也相對來說顯得更加好理解一些,廢話不多說,看代碼。!
一、代碼
/*********************************/ //調(diào)取藍(lán)牙模塊庫,調(diào)取伺服電機庫
#include <SoftwareSerial.h> //調(diào)取庫函數(shù)
#include <Servo.h> //聲明調(diào)用Servo.h庫
SoftwareSerial BT(A0, A1); //新建對象,接收腳為A0--TXD,發(fā)送腳為A1--RXD
Servo servo; //創(chuàng)建一個舵機對象
/*********************************/ //定義驅(qū)動模塊串口及變量
int TrigPin = 2; //發(fā)出超聲波
int EchoPin = 3; //收到反射回來的超聲波
int Input1 = 4; //定義uno的pin5向Input1輸出
int Input2 = 5; //定義uno的pin5向Input2輸出
int Input3 = 6; //定義uno的pin5向Input3輸出
int Input4 = 7; //定義uno的pin5向Input4輸出
int pos = 118; //創(chuàng)建變量,存儲從模擬端口讀取的值
float cm; //因為測得的距離是浮點型的,單位為cm
int xuan;
int choice; //小車功能選擇
/********************* ************/ //控制函數(shù)部分
void stop() //小車停止
{
digitalWrite(Input1,LOW); //給低電平
digitalWrite(Input2,LOW); //給低電平
digitalWrite(Input3,LOW); //給低電平
digitalWrite(Input4,LOW); //給低電平
delay(50);
}
void forward() //小車前進
{
digitalWrite(Input1,HIGH); //給高電平
digitalWrite(Input2,LOW); //給低電平
digitalWrite(Input3,HIGH); //給高電平
digitalWrite(Input4,LOW); //給低電平
delay(50);
}
void backward() //小車后退
{
digitalWrite(Input1,LOW); //給低電平
digitalWrite(Input2,HIGH); //給高電平
digitalWrite(Input3,LOW); //給低電平
digitalWrite(Input4,HIGH); //給高電平
delay(50);
}
void turnleft() //小車左轉(zhuǎn)
{
digitalWrite(Input1,HIGH); //給高電平
digitalWrite(Input2,LOW); //給低電平
digitalWrite(Input3,LOW); //給低電平
digitalWrite(Input4,HIGH); //給高電平
delay(50);
}
void turnright() //小車右轉(zhuǎn)
{
digitalWrite(Input1,LOW); //給低電平
digitalWrite(Input2,HIGH); //給高電平
digitalWrite(Input3,HIGH); //給高電平
digitalWrite(Input4,LOW); //給低電平
delay(50);
}
void Left() //舵機左轉(zhuǎn)
{
while(pos < 180)
{
pos++;
servo.write(pos); //寫入舵機角度
delay(15); //延時使舵機轉(zhuǎn)到相應(yīng)角度
}
}
void Right() //舵機右轉(zhuǎn)
{
while(pos > 60)
{
pos--;
servo.write(pos);
delay(15);
}
}
void Ranging() //測量距離
{
digitalWrite(TrigPin, LOW); //低電平發(fā)一個短時間脈沖去TrigPin
delayMicroseconds(2); //delayMicroseconds在更小的時間內(nèi)延時準(zhǔn)確,delayMicroseconds是毫秒級計時單位
digitalWrite(TrigPin, HIGH); //通過這里控制超聲波的發(fā)射
delayMicroseconds(10);
digitalWrite(TrigPin, LOW); //通過這里控制停止超聲波的發(fā)射
cm = pulseIn(EchoPin, HIGH) / 58.0; //將回波時間換算成cm ,其中pulseIn(接收信號引腳,高低電平)函數(shù)用來接收反射回來的聲波
cm = (int(cm * 100.0)) / 100.0; //保留兩位小數(shù)
Serial.print("Distance:");
Serial.print(cm);
Serial.print("cm");
Serial.println();
//以上四句在串口監(jiān)視器中輸出
delay(1000);
}
/****************************************************/
void setup()
{
Serial.begin(9600); //與電腦串口相連,波特率為9600
servo.attach(9); //9號引腳輸出電機控制信號,僅能使用PWM引腳
pinMode(Input1, OUTPUT); //Input1引腳設(shè)置為輸出模式
pinMode(Input2, OUTPUT); //Input2引腳設(shè)置為輸出模式
pinMode(Input3, OUTPUT); //Input3引腳設(shè)置為輸出模式
pinMode(Input4, OUTPUT); //Input4引腳設(shè)置為輸出模式
pinMode(TrigPin, OUTPUT); //發(fā)出超聲波串口設(shè)置為輸出
pinMode(EchoPin, INPUT); //接受超聲波接口設(shè)為輸入
BT.begin(9600); //設(shè)置波特率為9600
}
void loop()
{
switch(choice)
{
case 'X' : //選擇避障
Ranging(); //測量距離
if(cm > 10.0) //沒有碰到障礙物
forward();
else //碰到障礙物
{
backward(); //小車后退
delay(200); //延時確定后退距離
stop(); //小車停止
Right(); //舵機右轉(zhuǎn)
Ranging(); //測量距離
servo.write(118); //舵機回中
if(cm > 10.0) //如果右邊滿足條件
{
turnright(); //小車右轉(zhuǎn)
delay(200); //延時確定轉(zhuǎn)彎角度
}
else //如果右邊不滿足
{
Left(); //舵機左轉(zhuǎn)
Ranging(); //測量距離
servo.write(118); //舵機回中
turnleft(); //小車左轉(zhuǎn)
delay(200); //延時確定轉(zhuǎn)彎角度
}
}
case 'Y' : //選擇遙控
while(BT.available()) //藍(lán)牙識別字符
{
xuan = BT.read(); //藍(lán)牙讀取字符
switch(xuan)
{
case 'A' :
forward(); //調(diào)取前進函數(shù)
case 'B' :
backward(); //調(diào)取后退函數(shù)
case 'C' :
turnleft(); //調(diào)取左轉(zhuǎn)函數(shù)
case 'D' :
turnright(); //調(diào)取右轉(zhuǎn)函數(shù)
case 'E' :
stop(); //調(diào)取停止函數(shù)
}
}
}
}
代碼看起來是不是很通俗易懂呢。。
接下來給你們介紹我理解的手機藍(lán)牙通訊和電腦串口通訊分別是(波特率):
BT.begin(9600);
Serial.begin(9600);
雖然說二者的更深層次的含義由于學(xué)術(shù)不精,無法給出具體解釋,但經(jīng)過實際檢測是正確的。
在代碼中涉及的伺服電機角度,是根據(jù)我所買的伺服電機結(jié)合制作時需要所測量和設(shè)定的角度,只具有參考性。各位可以根據(jù)自己買的伺服電機來進行修改。
void Left() //舵機左轉(zhuǎn)
{undefined
while(pos < 180)
{undefined
pos++;
servo.write(pos); //寫入舵機角度
delay(15); //延時使舵機轉(zhuǎn)到相應(yīng)角度
}
}
這部分控制舵機轉(zhuǎn)動運用while循環(huán)主要是為了能夠是舵機逐角度的變化,也可以直接用
servo.write(pos);
寫入需要的角度,但這就會使得舵機在轉(zhuǎn)動到所需要的角度所需時間會非常短,可能會對舵機有損耗(個人觀點)。
二、所需材料
1.Arduino UNO板子
2.HC-SR04超聲波模塊
3.HC-06藍(lán)牙模塊
4.L298N電機驅(qū)動板模塊
5.智能小車底盤
6.18650充電電池及電池倉
7.杜邦線若干
以上這些材料我制作時所用到,都是可以在某1個寶上買到的。當(dāng)然對于小車底盤,有能力的朋友,可以自己設(shè)計建模一款小車底盤,然后通過3D打印機打印出來也是很好的。
手機端藍(lán)牙遙控器用的是‘手機藍(lán)牙調(diào)試器’,在應(yīng)用商店里就可以下載到。相對應(yīng)的A,B,C,D,E,X,Y在按鍵操作里編輯即可。
|
評分
-
查看全部評分
|