原來有這樣一款基於Arduino的小車,不通過循跡,紅外,超聲波?

2022-04-25     大方老師單片機

原標題:原來有這樣一款基於Arduino的小車,不通過循跡,紅外,超聲波?

有這樣一款基Arduino的小車,不通過循跡,紅外,超聲波

Hello,大家好!今天我要給大家分享一下我近期製作的一arduino的小項----智能避障小車。之前在某站上沒意間刷到某位博主製作的一款智能避障小車,覺得很有意思,便打算自己也只做一個來玩玩,於是便寫了一款我自己了解的避障小車,在此根底上,我還增加了藍牙遙控功能,二者能夠互相切換,提高其趣味性。和其他的避障小車類似,這款也是超聲波來進行距離避障,代碼相對其他大神來說顯得比較表層,但這也相對來說顯得愈加好了解一些,廢話不多說,看代碼!!!

///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比///

正文開始:

一、代碼

/*********************************/ //調取藍牙模塊,調取伺服電機庫

#include //調取庫函數

#include //聲明調Servo.h

SoftwareSerial BT(A0, A1); //新建對象,接管腳A0--TXD,發送腳A1--RXD

Servo servo; //創建一個舵機對象

/*********************************/ //定義驅動模塊串口及變量

int TrigPin = 2; //發出超聲波

int EchoPin = 3; //收到反射回來的超聲波

int Input1 = 4; //unopin5Input1輸出

int Input2 = 5; //unopin5Input2輸出

int Input3 = 6; //unopin5Input3輸出

int Input4 = 7; //unopin5Input4輸出

int pos = 118; //創建變量,存儲從模擬埠讀取的值

float cm; //由於測得的距離是浮點型的,單位cm

int xuan;

int choice; //小車功能選擇

/********************* ************/ //控制函數局部

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() //小車左轉

{

digitalWrite(Input1,HIGH); //給高電平

digitalWrite(Input2,LOW); //給低電平

digitalWrite(Input3,LOW); //給低電平

digitalWrite(Input4,HIGH); //給高電平

delay(50);

}

void turnright() //小車右轉

{

digitalWrite(Input1,LOW); //給低電平

digitalWrite(Input2,HIGH); //給高電平

digitalWrite(Input3,HIGH); //給高電平

digitalWrite(Input4,LOW); //給低電平

delay(50);

}

void Left() //舵機左轉

{

while(pos < 180)

{

pos++;

servo.write(pos); //寫入舵機角度

delay(15); //延時使舵機轉到相應角度

}

}

void Right() //舵機右轉

{

while(pos > 60)

{

pos--;

servo.write(pos);

delay(15);

}

}

void Ranging() //測量距離

{

digitalWrite(TrigPin, LOW); //低電平發一個短時長脈衝TrigPin

delayMicroseconds(2); //delayMicroseconds在更小的時長內延時精確delayMicroseconds是毫秒級計時單位

digitalWrite(TrigPin, HIGH); //通過這裡控制超聲波的發射

delayMicroseconds(10);

digitalWrite(TrigPin, LOW); //通過這裡控制停下超聲波的發射

cm = pulseIn(EchoPin, HIGH) / 58.0; //將回波時長換算cm,其pulseIn(接管信號引腳,高低電平)函數用來接管反射回來的聲波

cm = (int(cm * 100.0)) / 100.0; //保留兩位小數

Serial.print("Distance:");

Serial.print(cm);

Serial.print("cm");

Serial.println();

//以上四句在串口監督器中輸出

delay(1000);

}

/****************************************************/

void setup()

{

Serial.begin(9600); //與電腦串口相連,波特率9600

servo.attach(9); //9號引腳輸出電機控制信號,僅能使PWM引腳

pinMode(Input1, OUTPUT); //Input1引腳設置為輸出模式

pinMode(Input2, OUTPUT); //Input2引腳設置為輸出模式

pinMode(Input3, OUTPUT); //Input3引腳設置為輸出模式

pinMode(Input4, OUTPUT); //Input4引腳設置為輸出模式

pinMode(TrigPin, OUTPUT); //發出超聲波串口設置為輸出

pinMode(EchoPin, INPUT); //承受超聲波接口設為輸寫

BT.begin(9600); //設置波特率9600

}

void loop()

{

switch(choice)

{

case 'X' : //選擇避障

Ranging(); //測量距離

if(cm > 10.0) //沒有碰到障礙物

forward();

else //碰到障礙物

{

backward(); //小車後退

delay(200); //延時確定後退距離

stop(); //小車停下

Right(); //舵機右轉

Ranging(); //測量距離

servo.write(118); //舵機回中

if(cm > 10.0) //假如右邊滿足條件

{

turnright(); //小車右轉

delay(200); //延時確定轉彎角度

}

else //假如右邊不滿足

{

Left(); //舵機左轉

Ranging(); //測量距離

servo.write(118); //舵機回中

turnleft(); //小車左轉

delay(200); //延時確定轉彎角度

}

}

case 'Y' : //選擇遙控

while(BT.available()) //藍牙識別字符

{

xuan = BT.read(); //藍牙讀取字符

switch(xuan)

{

case 'A' :

forward(); //調取前進函數

case 'B' :

backward(); //調取後退函數

case 'C' :

turnleft(); //調取左轉函數

case 'D' :

turnright(); //調取右轉函數

case 'E' :

stop(); //調取停下函數

}

}

}

}

代碼看起來是不是很通俗易懂呢!!!

在後面我也寫了詳細的注釋,方便大家了解;

接下來給你們介紹我了解的手機藍牙通訊和電腦串口通訊分別是(波特率):

BT.begin(9600);

Serial.begin(9600);

雖然說二者的更深層次的含義由於學術不精,沒法給出詳細解釋,但經過實際檢測是正確的。

在代碼中波及的伺服電機角度,是依據我所買的伺服電機聯合製作時須要所測量和設定的角度,只具有參照性。各位能夠依據自己買的伺服電機來進行修改。

void Left() //舵機左轉

{undefined

while(pos < 180)

{undefined

pos++;

servo.write(pos); //寫入舵機角度

delay(15); //延時使舵機轉到相應角度

}

}

這局部控制舵機轉動運while循環主要是為了能夠是舵機逐角度的變化,也能夠直接用

servo.write(pos)

寫入須要的角度,但這就會使得舵機在轉動到所須要的角度所需時長會非常短,可能會對舵機有損耗(個人觀點)。

二、所需素材

1.Arduino UNO板子

2.HC-SR04超聲波模塊

3.HC-06藍牙模塊

4.L298N電機驅動板模塊

5.智能小車底盤

6.18650充電電池及電池倉

7.杜邦線若干

以上這些素材我製作時所用到,都是能夠在1個寶上買到的。當然對於小車底盤,有才能的朋友,能夠自己設計建模一款小車底盤,然後通3D印表機列印出來也是很好的。

手機端藍牙遙控器用的是手機藍牙調試器,在應用商店裡就能夠下載到。相對應A,B,C,D,E,X,Y在按鍵操作里編輯即可。

文章來源: https://twgreatdaily.com/zh-cn/9bb32888407b8405c30a2aab8eb3b564.html