生活随笔
收集整理的這篇文章主要介紹了
基于arduino单片机智能避障小车
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于arduino單片機智能避障小車
思路簡介
本文簡要介紹了基于arduino單片機智能小車可以通過手機端藍牙助手對其進行遙控操作‘可以切換手動操作和自動避障兩個模式,避障基于蝙蝠超聲波測距的原理,利用超聲波傳感器和舵機旋轉,檢測小車前方障礙物的距離,然后把數據傳送給單片機。當超聲波檢測到距離小車前方40CM有障礙物時單片機就發出指令讓小車調整方向,然后停止行進繼續探測如果前方40CM沒有障礙物則直行,否則繼續調整角度。如此通過超聲波不斷的循環檢測周邊環境的情況進行自動避障。滅火通過繼電器控制水泵和蜂鳴器進行滅火報警
所需元件
arduino uno *1
L298N電機驅動模塊 *1
HCSR04超聲波測距模塊 *1
360度舵機 *1
HC-06 主從一體藍牙模塊 *1
5V繼電器 *1
小水泵 *1
水管 40cm
船型開關 *1
壓力刻板小車底盤輪胎套件 *1
杜邦線 公線母線若干
十字花螺絲刀 *1
led點陣 *1
UML 圖表
流程圖
行走思路設計
控制頁面
控制軟件使用的是其他人開發好的spp
下面是我編輯的頁面
代碼
話不多說直接上代碼了
代碼太多省略了一部分、接線圖看代碼就差不多了
轉彎就是讓兩側輪胎相反方向走就能實現了、繼電器那里由于默認上電是聯通狀態、所以將那個口digitalwrite 為低電平
#include<Servo.h>
#define AUTO 1
#define MAN 0
#define Do 262
#define Si_h 988
#define OK_DIST 40
#define trigPin A0
#define echoPin A1
Servo myservo
;
int pos
;
int pinRelay
= 12;
int length
;
int scale
[]={Do
,Si_h
,};
float durt
[]={0.51,};
int tonepin
=13;
float cm
, duration
;
const int ENA
= 5;
const int ENB
= 6;
char cmdChar
= '5';
char cmdCharSave
= cmdChar
;
byte systemMode
= MAN
;
int getDistance()
{digitalWrite(trigPin
, LOW
); delayMicroseconds(5);digitalWrite(trigPin
, HIGH
);delayMicroseconds(10);digitalWrite(trigPin
, LOW
);duration
= pulseIn(echoPin
, HIGH
);cm
= (duration
/ 2) / 29.1; return cm
;
}
void setup() {
length
=sizeof(scale
)/sizeof(scale
[0]); Serial
.begin(9600); delay(100);myservo
.attach(7);myservo
.write(90); }void loop()
{if (Serial
.available()>0)
{ cmdChar
= Serial
.read();}
runMode(); }
void runMode() {switch (cmdChar
) {case 'A': systemMode
= AUTO
; break;
case 'M': systemMode
= MAN
; turn_stop(); cmdChar
= '5'; break;}if (systemMode
== MAN
) { manMode(); } else if (systemMode
== AUTO
) {
autoMode();} }
void manMode()
{
switch (cmdChar
) {
case '2': turn_up();break;
case '8': turn_back();break;
case '4': turn_left();break;
case '6': turn_right();break;
case '5': turn_stop();break;
case'3': water();break;case'7': warn();break;
}
void turn_up()
{digitalWrite(8, LOW
);digitalWrite(9, HIGH
);digitalWrite(10, LOW
);digitalWrite(11, HIGH
);analogWrite(5, 150);analogWrite(6, 150);
}
void turn_left()
/{digitalWrite(8, HIGH
);digitalWrite(9, LOW
);digitalWrite(10, LOW
);digitalWrite(11, HIGH
);analogWrite(5, 150);analogWrite(6, 150);
}
}
void water()
{digitalWrite(pinRelay
, LOW
);
for(int x
=0;x
<length
;x
++){ tone(tonepin
,scale
[x
]);delay(500*durt
[x
]);
noTone(tonepin
);
}delay(200);digitalWrite(3,HIGH
);}
void warn()
{
digitalWrite(3,HIGH
);
for(int x
=0;x
<length
;x
++){ tone(tonepin
,scale
[x
]);delay(500*durt
[x
]); noTone(tonepin
);}delay(200);
}
void autoMode()
{myservo
.write(90); delay(50); int frontDist
= getDistance(); if (frontDist
>= OK_DIST
) { turn_up(); } else { turn_stop(); autoTurn(); }}
void autoTurn() {
for (int pos
= 90; pos
>= 10; pos
-= 1){myservo
.write(pos
);delay(3);}delay(300);int rightDist
= getDistance();
for (int pos
= 0; pos
<= 180; pos
+= 1) {myservo
.write(pos
);delay(3);}delay(300);int leftDist
= getDistance();
for (int pos
= 180; pos
>= 90; pos
-= 1) {myservo
.write(pos
);
delay(3);}delay(500);
if ( rightDist
< OK_DIST
&& leftDist
< OK_DIST
) { turnBack(); } else if ( rightDist
>= leftDist
) { turnR90(); return;} else { turnL90(); return; }}
void turnL90() {turn_left();delay(300);turn_stop();delay(500);
}
}
小車實物圖
滅火是手動控制的 如果有精力的也可以考慮用火焰傳感器搞一下自動滅火
總結
以上是生活随笔為你收集整理的基于arduino单片机智能避障小车的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。