標(biāo)題:
基于單片機(jī)的智能小車的設(shè)計(jì) 附程序
[打印本頁]
作者:
ljl8970
時(shí)間:
2020-1-14 17:47
標(biāo)題:
基于單片機(jī)的智能小車的設(shè)計(jì) 附程序
基于單片機(jī)的智能小車的設(shè)計(jì),還包括小車源碼,功能齊全
硬件組成:電機(jī)模塊是智能小車的整個(gè)動(dòng)力系統(tǒng),智能上車上搭載了一顆L293D雙H橋路電機(jī)驅(qū)動(dòng)芯片及2個(gè)減速電機(jī),車輪為65mm防滑車輪。
工作原理:通過開發(fā)板輸出控制信號給L293D,由L293D驅(qū)動(dòng)左右2個(gè)減速馬達(dá)正傳或反轉(zhuǎn)來實(shí)現(xiàn)小車的前后左右行駛動(dòng)作。
將我們準(zhǔn)備好的 6P 杜邦線接頭按照排線原有顏色順序整理成一排,一端接插至智能小車底板 J10 排針上,另一端根據(jù) J10 排針標(biāo)注的引腳絲印對應(yīng)順序接插至開發(fā)板的 P12~P17排針。
51hei.png
(50.75 KB, 下載次數(shù): 24)
下載附件
2020-1-20 14:30 上傳
3.4藍(lán)牙模塊設(shè)計(jì)
藍(lán)牙模塊主要為了實(shí)現(xiàn)數(shù)據(jù)傳輸,本設(shè)計(jì)是通過藍(lán)牙轉(zhuǎn)串口模塊,實(shí)現(xiàn)無線通訊功能,所以本質(zhì)上使用的是單片機(jī)串口通信。
藍(lán)牙模塊支持短距離無線傳輸,可以通過手機(jī)與藍(lán)牙模塊的配對實(shí)現(xiàn)對小車的無線控制。本小車采用的是BT-06藍(lán)牙芯片,在BT-06藍(lán)牙芯片,在BT-06芯片里已經(jīng)將藍(lán)牙協(xié)議封裝好,只需要通過串口通信實(shí)現(xiàn)上位機(jī)(手機(jī))與下位機(jī)(51單片機(jī))的無線通信。
串行通信的特點(diǎn)是:數(shù)據(jù)按比特順序傳輸,至少可以通過一條傳輸線即可完成,成本低,傳輸速度慢。串行通信的范圍可以從幾米到幾公里。根據(jù)信息傳輸?shù)姆较颍型ㄐ趴梢赃M(jìn)一步分為三中類型:單、半雙工和全雙工。信息智能單向傳輸?shù)臑閱喂;能雙向傳遞但不能同時(shí)雙向傳送的稱為半雙工;信息能夠同時(shí)雙向傳送則成為全雙工。串行通信可分為異步通信和同步通信。在單片機(jī)中,主要采用異步通信。
3.5PCB圖設(shè)計(jì)
在電路原理圖設(shè)計(jì)完成后,根據(jù)布線原理布置元件,布線,最后布置銅和撕裂。
焊接芯片的步驟:
1.將芯片平放在PCB板上,將芯片引腳對準(zhǔn)焊盤然后用手指按。
2.將芯片的兩個(gè)對角焊牢;
3.在芯片的四周上適量焊錫;
4.將PCB板向著焊接引腳的方向下傾斜45度,用松香去掉烙鐵頭端多余的焊錫;
5.把粘有松香的焊鐵頭放在焊錫的部分;
6.來回拖動(dòng)烙鐵,將焊錫均勻的布在芯片的引腳上;
7.重復(fù)上述步驟焊接芯片的另外的引腳,如果發(fā)現(xiàn)引腳間有多余的焊錫就用吸錫絲將多余的焊錫吸掉。
3.6智能車結(jié)構(gòu)分析
在本次設(shè)計(jì)中,小車使用雙驅(qū)動(dòng),采用雙輪+定向輪式的結(jié)構(gòu),來驅(qū)動(dòng)小車做出相應(yīng)的指令,定向輪有效的防止了方向偏移的問題,且雙驅(qū)動(dòng)兩輪驅(qū)動(dòng)式,動(dòng)力更大,爬坡能力更強(qiáng),整體性能優(yōu)勢明顯,同事底盤的設(shè)計(jì)比較合理能夠更大程度的發(fā)揮其空間,充分利用其空間結(jié)構(gòu)進(jìn)行不同模塊的添加。
3.6.1底板設(shè)計(jì)
底盤是用來支撐車體的主要部件。同時(shí)也是用來固定車子零部件的,底板上主要有電機(jī)定位安裝槽和走位孔,電池盒安裝槽位,定向輪安裝孔,電壓檢測模塊安裝槽,超聲波模塊安裝槽位以及開發(fā)板安裝槽位等拓展槽位。安裝方便,結(jié)構(gòu)可靠穩(wěn)定。
3.6.2電機(jī)與底板的連接支架設(shè)計(jì)
電機(jī)主要通過將固定片固定在底板上的,每個(gè)電機(jī)用兩塊固定片綁定固定,通過槽孔和圓孔來綁定電機(jī),利用螺絲及螺母進(jìn)行固定安裝。
首先,我們把 1 片固定片從智能小車底板電機(jī)旁接口穿入,接著再拿 1 片固定片貼在直流電機(jī)安裝孔旁并穿入 2 只長螺絲,注意固定片與電機(jī)的組裝方向。其次,我們把電機(jī)安裝到指定位置,最后,我們把 2 個(gè)螺母分別擰上即可。
3.6.3整體裝配圖
3.6.4整車材料明細(xì)
整車包括:51開發(fā)板,智能小車底板,防滑車輪,藍(lán)牙模塊,減速電動(dòng)機(jī)等組成,本次采用的雙輪+定向輪驅(qū)動(dòng)模式,結(jié)構(gòu)復(fù)雜程度適中,并有效的避免了行進(jìn)當(dāng)中的方向偏向問題。
注意事項(xiàng):5號鋰電池初次使用時(shí)請先進(jìn)行充電,注意電池極性切勿裝反,當(dāng)充電器綠燈亮起時(shí)表示電池電量已充滿。充電時(shí)必須有人值守,避免發(fā)生意外。
電池盒電源線與智能小車底板電源接口連接時(shí)請將其緩和接入 J1 端子頭,電源線的紅線在 J1 端子頭絲印為“+”一側(cè),黑線在 J1 端子頭絲印為“-”一側(cè)。
因?yàn)橹悄苄≤嚰t外發(fā)射裝置和電機(jī)等負(fù)載功耗大,所以智能小車?yán)塾?jì)行駛 10~20 分鐘后請對電池進(jìn)行充電。智能小車不使用的時(shí)請取下電池,電池長期閑置時(shí)請充滿電。當(dāng)電源電壓小于 5V 時(shí)智能小車無法正常工作,請及時(shí)給供電電池充電,配送的鋰電池電量不能用完,低于 4V 時(shí)必須充電,電量用完電池將會報(bào)廢,配送電池充滿狀態(tài)電壓為 7.2V~8V 左右。
智能小車不使用時(shí)請關(guān)閉智能小車電源,由于智能小車上紅外避障和尋跡模塊工作時(shí)功耗較大會造成電池放電量大。
單片機(jī)源程序如下:
#include <reg52.h> //51頭文件
#include <intrins.h> //包含nop等系統(tǒng)函數(shù)
#include <QXA51.h>//QX-A51智能小車配置文件
unsigned char pwm_left_val = 140;//左電機(jī)占空比值 取值范圍0-170,0最快
unsigned char pwm_right_val = 150;//右電機(jī)占空比值取值范圍0-170 ,0最快
unsigned char pwm_t;//周期
unsigned char control=0X01;//車運(yùn)動(dòng)控制全局變量,默認(rèn)開機(jī)為停車狀態(tài)
/******************************
超聲波定義
*******************************/
sbit RX = P2^0;//ECHO超聲波模塊回響端
sbit TX = P2^1;//TRIG超聲波模塊觸發(fā)端
unsigned int time = 0;//傳輸時(shí)間
unsigned long S = 0;//距離
bit flag = 0;//超出測量范圍標(biāo)志位
void Delay10us(unsigned char i) //10us延時(shí)函數(shù) 啟動(dòng)超聲波模塊時(shí)使用
{
unsigned char j;
do{
j = 10;
do{
_nop_();
}while(--j);
}while(--i);
}
void delay(unsigned int z)//毫秒級延時(shí)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
/*小車前進(jìn)*/
void forward()
{
left_motor_go; //左電機(jī)前進(jìn)
right_motor_go; //右電機(jī)前進(jìn)
}
/*小車左轉(zhuǎn)*/
void left_run()
{
left_motor_stops; //左電機(jī)停止
right_motor_go; //右電機(jī)前進(jìn)
}
/*小車右轉(zhuǎn)*/
void right_run()
{
right_motor_stops;//右電機(jī)停止
left_motor_go; //左電機(jī)前進(jìn)
}
/*PWM控制使能 小車后退*/
void backward()
{
left_motor_back; //左電機(jī)后退
right_motor_back; //右電機(jī)后退
}
/*PWM控制使能 小車高速右轉(zhuǎn)*/
void right_rapidly()
{
left_motor_go;
right_motor_back;
}
/*小車高速左轉(zhuǎn)*/
void left_rapidly()
{
right_motor_go;
left_motor_back;
}
//小車停車
void stop()
{
left_motor_stops; //左電機(jī)后退
right_motor_stops; //右電機(jī)后退
}
void keyscan()
{
for(;;) //死循環(huán)
{
if(key_s2 == 0)// 實(shí)時(shí)檢測S2按鍵是否被按下
{
delay(5); //軟件消抖
if(key_s2 == 0)//再檢測S2是否被按下
{
while(!key_s2);//松手檢測
beep = 0; //使能有源蜂鳴器
delay(200);//200毫秒延時(shí)
beep = 1; //關(guān)閉有源蜂鳴器
break; //退出FOR死循環(huán)
}
}
}
}
//初始化
void Init(void)
{
EA = 1; //開總中斷
SCON |= 0x50; // SCON: 模式1, 8-bit UART, 使能接收
T2CON |= 0x34; //設(shè)置定時(shí)器2為串口波特率發(fā)生器并啟動(dòng)定時(shí)器2
TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //設(shè)置波特率
TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;
ES= 1; //打開串口中斷
TMOD |= 0x01;//定時(shí)器0工作模塊1,16位定時(shí)模式。T0用測ECH0脈沖長度
TH0 = 0;
TL0 = 0;//T0,16位定時(shí)計(jì)數(shù)用于記錄ECHO高電平時(shí)間
ET0 = 1;//允許定時(shí)器0中斷
TMOD |= 0x20; //定時(shí)器1,8位自動(dòng)重裝模塊
TH1 = 220;
TL1 = 220; //11.0592M晶振下占空比最大比值是256,輸出100HZ
TR1 = 1;//啟動(dòng)定時(shí)器1
ET1 = 1;//允許定時(shí)器1中斷
}
/**************************************************
超聲波程序
***************************************************/
void StartModule() //啟動(dòng)超聲波模塊
{
TX=1; //啟動(dòng)一次模塊
Delay10us(2);
TX=0;
}
/*計(jì)算超聲波所測距離*/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(float)(time*1.085)*0.17; //算出來是MM
if((S>=7000)||flag==1) //超出測量范圍
{
flag=0;
}
}
/*超聲波避障*/
void Avoid()
{
if(S < 400)//設(shè)置避障距離 ,單位毫米 剎車距離
{
stop();//停車
backward();//后退
delay(100);//后退時(shí)間越長、距離越遠(yuǎn)。后退是為了留出車輛轉(zhuǎn)向的空間
do{
left_rapidly();//高速左轉(zhuǎn)
delay(90);//時(shí)間越長 轉(zhuǎn)向角度越大,與實(shí)際行駛環(huán)境有關(guān)
stop();//停車
delay(100);//時(shí)間越長 停止時(shí)間越久長
StartModule(); //啟動(dòng)模塊測距,再次判斷是否
while(!RX); //當(dāng)RX(ECHO信號回響)為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算距離
}while(S < 280);//判斷前面障礙物距離
}
else
{
forward();//前進(jìn)
}
}
//黑線尋跡
void BlackLine()
{
//為0 沒有識別到黑線 為1識別到黑線
if(left_led1 == 1 && right_led1 == 1)//左右尋跡探頭識別到黑線
{
forward();//前進(jìn)
}
else
{
if(left_led1 == 1 && right_led1 == 0)//小車右邊出線,左轉(zhuǎn)修正
{
left_run();//左轉(zhuǎn)
}
if(left_led1 == 0 && right_led1 == 1)//小車左邊出線,右轉(zhuǎn)修正
{
right_run();//右轉(zhuǎn)
}
if(left_led1 == 0 && right_led1 == 0)//左右尋跡探頭都沒識別到黑線
{
backward();//后退
}
}
}
//紅外避障
void IRAvoid()
{
//為0 識別障礙物 為1沒有識別到障礙物
if(left_led2 == 1 && right_led2 == 1)//左右都沒識別到障礙物
{
pwm_left_val = 140;//左電機(jī)占空比值 取值范圍0-170,0最快
pwm_right_val = 150;//右電機(jī)占空比值取值范圍0-170 ,0最快
forward();//前進(jìn)
}
if(left_led2 == 1 && right_led2 == 0)//小車右側(cè)識別到障礙物,左轉(zhuǎn)躲避
{
pwm_left_val = 180;//左電機(jī)占空比值 取值范圍0-170,0最快
pwm_right_val = 110;//右電機(jī)占空比值取值范圍0-170 ,0最快
left_run();//左轉(zhuǎn)
delay(40);//左轉(zhuǎn)40毫秒(實(shí)現(xiàn)左小彎轉(zhuǎn))
}
if(left_led2 == 0 && right_led2 == 1)//小車左側(cè)識別到障礙物,右轉(zhuǎn)躲避
{
pwm_left_val = 100;//左電機(jī)占空比值 取值范圍0-170,0最快
pwm_right_val = 180;//右電機(jī)占空比值取值范圍0-170 ,0最快
right_run();//右轉(zhuǎn)
delay(40);//右轉(zhuǎn)40毫秒(實(shí)現(xiàn)右小彎轉(zhuǎn))
}
if(left_led2 == 0 && right_led2 == 0) //小車左右兩側(cè)都識別到障礙物,后退掉頭
{
pwm_left_val = 150;//左電機(jī)占空比值 取值范圍0-170,0最快
pwm_right_val = 160;//右電機(jī)占空比值取值范圍0-170 ,0最快
backward();//后退
delay(100);//后退的時(shí)間影響后退的距離。后退時(shí)間越長、后退距離越遠(yuǎn)。
pwm_left_val = 140;//左電機(jī)占空比值 取值范圍0-170,0最快
pwm_right_val = 150;//右電機(jī)占空比值取值范圍0-170 ,0最快
right_rapidly();//高速右轉(zhuǎn)
delay(180);//延時(shí)時(shí)間越長,轉(zhuǎn)向角度越大。
}
}
//超聲波避障
void Ultrasonic()
{
StartModule(); //啟動(dòng)模塊測距
while(!RX); //當(dāng)RX(ECHO信號回響)為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算距離
Avoid(); //避障
delay(65); //測試周期不低于60MS
}
//紅外物體跟隨
void IRTracking()
{
//為0 識別障礙物 為1沒有識別到障礙物
if(left_led2 == 0 && right_led2 == 0)//左右識別到障礙物,前進(jìn)跟隨
{
forward();//前進(jìn)
}
if(left_led2 == 1 && right_led2 == 0)//小車右側(cè)識別到障礙物,右轉(zhuǎn)跟隨
{
right_run();//右轉(zhuǎn)
}
if(left_led2 == 0 && right_led2 == 1)//小車左側(cè)識別到障礙物,左轉(zhuǎn)跟隨
{
left_run();//左轉(zhuǎn)
}
}
void main()
{
keyscan();//等待按下S2啟動(dòng)小車
delay(1000);//延時(shí)1秒
Init();//定時(shí)器、串口初始化
while(1)
{
if(control>0X17)//如果成立,則表示接收的命令不在運(yùn)行命令內(nèi)
{
stop(); // 停車
}
switch(control)
{
case 0X02: forward(); break; //前進(jìn)
case 0X03: backward(); break; //后退
case 0X04: left_run(); break; //左轉(zhuǎn)
case 0X05: right_run(); break;//右轉(zhuǎn)
case 0X01: stop(); break;//停車
case 0X06: left_rapidly(); break;//左旋轉(zhuǎn)
case 0X07: right_rapidly(); break;//右旋轉(zhuǎn)
case 0X08: beep = 0; break;//鳴笛
case 0X09: beep = 1; break;//停止鳴笛
case 0X11: Ultrasonic(); break;//超聲波避障
case 0X12: BlackLine(); break;//黑線尋跡
case 0X13: IRAvoid(); break;//紅外避障
case 0X15: IRTracking(); break;//紅外-跟隨物體
}
}
}
//定時(shí)器0中斷
void timer0() interrupt 1
{
flag=1; //中斷溢出標(biāo)志
}
void timer1() interrupt 3 //T1中斷用來計(jì)數(shù)器溢出
{
pwm_t++;//周期計(jì)時(shí)加
if(pwm_t == 255)
pwm_t = EN1 = EN2 = 0;
if(pwm_left_val == pwm_t)//左電機(jī)占空比
EN1 = 1;
if(pwm_right_val == pwm_t)//右電機(jī)占空比
EN2 = 1;
}
/******************************************************************/
/* 串口中斷程序*/
/******************************************************************/
void UART_SER () interrupt 4
{
unsigned char n; //定義臨時(shí)變量
if(RI) //判斷是接收中斷產(chǎn)生
{
RI=0; //標(biāo)志位清零
n=SBUF; //讀入緩沖區(qū)的值
control=n;
if((n >= 51) && (n <= 150))//左電機(jī)調(diào)速0~100個(gè)檔位 手機(jī)端軟件進(jìn)行調(diào)節(jié)
pwm_left_val = 170-((n-50)*1.7);
if((n >= 151) && (n <= 250)) //右電機(jī)調(diào)速0~100個(gè)檔位 手機(jī)端軟件進(jìn)行調(diào)節(jié)
pwm_right_val = 170-((n-150)*1.7);
}
}
復(fù)制代碼
所有資料51hei提供下載:
小車程序.7z
(1.73 MB, 下載次數(shù): 50)
2020-1-20 14:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
wngqiuchang
時(shí)間:
2022-3-14 11:22
有沒有原理圖噢
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1