|
基于單片機(jī)的智能小車的設(shè)計(jì),還包括小車源碼,功能齊全
硬件組成:電機(jī)模塊是智能小車的整個(gè)動(dòng)力系統(tǒng),智能上車上搭載了一顆L293D雙H橋路電機(jī)驅(qū)動(dòng)芯片及2個(gè)減速電機(jī),車輪為65mm防滑車輪。
工作原理:通過(guò)開(kāi)發(fā)板輸出控制信號(hào)給L293D,由L293D驅(qū)動(dòng)左右2個(gè)減速馬達(dá)正傳或反轉(zhuǎn)來(lái)實(shí)現(xiàn)小車的前后左右行駛動(dòng)作。
將我們準(zhǔn)備好的 6P 杜邦線接頭按照排線原有顏色順序整理成一排,一端接插至智能小車底板 J10 排針上,另一端根據(jù) J10 排針標(biāo)注的引腳絲印對(duì)應(yīng)順序接插至開(kāi)發(fā)板的 P12~P17排針。
3.4藍(lán)牙模塊設(shè)計(jì)
藍(lán)牙模塊主要為了實(shí)現(xiàn)數(shù)據(jù)傳輸,本設(shè)計(jì)是通過(guò)藍(lán)牙轉(zhuǎn)串口模塊,實(shí)現(xiàn)無(wú)線通訊功能,所以本質(zhì)上使用的是單片機(jī)串口通信。
藍(lán)牙模塊支持短距離無(wú)線傳輸,可以通過(guò)手機(jī)與藍(lán)牙模塊的配對(duì)實(shí)現(xiàn)對(duì)小車的無(wú)線控制。本小車采用的是BT-06藍(lán)牙芯片,在BT-06藍(lán)牙芯片,在BT-06芯片里已經(jīng)將藍(lán)牙協(xié)議封裝好,只需要通過(guò)串口通信實(shí)現(xiàn)上位機(jī)(手機(jī))與下位機(jī)(51單片機(jī))的無(wú)線通信。
串行通信的特點(diǎn)是:數(shù)據(jù)按比特順序傳輸,至少可以通過(guò)一條傳輸線即可完成,成本低,傳輸速度慢。串行通信的范圍可以從幾米到幾公里。根據(jù)信息傳輸?shù)姆较颍型ㄐ趴梢赃M(jìn)一步分為三中類型:?jiǎn)巍腚p工和全雙工。信息智能單向傳輸?shù)臑閱喂ぃ荒茈p向傳遞但不能同時(shí)雙向傳送的稱為半雙工;信息能夠同時(shí)雙向傳送則成為全雙工。串行通信可分為異步通信和同步通信。在單片機(jī)中,主要采用異步通信。
3.5PCB圖設(shè)計(jì)
在電路原理圖設(shè)計(jì)完成后,根據(jù)布線原理布置元件,布線,最后布置銅和撕裂。
焊接芯片的步驟:
1.將芯片平放在PCB板上,將芯片引腳對(duì)準(zhǔn)焊盤然后用手指按住;
2.將芯片的兩個(gè)對(duì)角焊牢;
3.在芯片的四周上適量焊錫;
4.將PCB板向著焊接引腳的方向下傾斜45度,用松香去掉烙鐵頭端多余的焊錫;
5.把粘有松香的焊鐵頭放在焊錫的部分;
6.來(lái)回拖動(dòng)烙鐵,將焊錫均勻的布在芯片的引腳上;
7.重復(fù)上述步驟焊接芯片的另外的引腳,如果發(fā)現(xiàn)引腳間有多余的焊錫就用吸錫絲將多余的焊錫吸掉。
3.6智能車結(jié)構(gòu)分析
在本次設(shè)計(jì)中,小車使用雙驅(qū)動(dòng),采用雙輪+定向輪式的結(jié)構(gòu),來(lái)驅(qū)動(dòng)小車做出相應(yīng)的指令,定向輪有效的防止了方向偏移的問(wèn)題,且雙驅(qū)動(dòng)兩輪驅(qū)動(dòng)式,動(dòng)力更大,爬坡能力更強(qiáng),整體性能優(yōu)勢(shì)明顯,同事底盤的設(shè)計(jì)比較合理能夠更大程度的發(fā)揮其空間,充分利用其空間結(jié)構(gòu)進(jìn)行不同模塊的添加。
3.6.1底板設(shè)計(jì)
底盤是用來(lái)支撐車體的主要部件。同時(shí)也是用來(lái)固定車子零部件的,底板上主要有電機(jī)定位安裝槽和走位孔,電池盒安裝槽位,定向輪安裝孔,電壓檢測(cè)模塊安裝槽,超聲波模塊安裝槽位以及開(kāi)發(fā)板安裝槽位等拓展槽位。安裝方便,結(jié)構(gòu)可靠穩(wěn)定。
3.6.2電機(jī)與底板的連接支架設(shè)計(jì)
電機(jī)主要通過(guò)將固定片固定在底板上的,每個(gè)電機(jī)用兩塊固定片綁定固定,通過(guò)槽孔和圓孔來(lái)綁定電機(jī),利用螺絲及螺母進(jìn)行固定安裝。
首先,我們把 1 片固定片從智能小車底板電機(jī)旁接口穿入,接著再拿 1 片固定片貼在直流電機(jī)安裝孔旁并穿入 2 只長(zhǎng)螺絲,注意固定片與電機(jī)的組裝方向。其次,我們把電機(jī)安裝到指定位置,最后,我們把 2 個(gè)螺母分別擰上即可。
3.6.3整體裝配圖
3.6.4整車材料明細(xì)
整車包括:51開(kāi)發(fā)板,智能小車底板,防滑車輪,藍(lán)牙模塊,減速電動(dòng)機(jī)等組成,本次采用的雙輪+定向輪驅(qū)動(dòng)模式,結(jié)構(gòu)復(fù)雜程度適中,并有效的避免了行進(jìn)當(dāng)中的方向偏向問(wèn)題。
注意事項(xiàng):5號(hào)鋰電池初次使用時(shí)請(qǐng)先進(jìn)行充電,注意電池極性切勿裝反,當(dāng)充電器綠燈亮起時(shí)表示電池電量已充滿。充電時(shí)必須有人值守,避免發(fā)生意外。
電池盒電源線與智能小車底板電源接口連接時(shí)請(qǐng)將其緩和接入 J1 端子頭,電源線的紅線在 J1 端子頭絲印為“+”一側(cè),黑線在 J1 端子頭絲印為“-”一側(cè)。
因?yàn)橹悄苄≤嚰t外發(fā)射裝置和電機(jī)等負(fù)載功耗大,所以智能小車?yán)塾?jì)行駛 10~20 分鐘后請(qǐng)對(duì)電池進(jìn)行充電。智能小車不使用的時(shí)請(qǐng)取下電池,電池長(zhǎng)期閑置時(shí)請(qǐng)充滿電。當(dāng)電源電壓小于 5V 時(shí)智能小車無(wú)法正常工作,請(qǐng)及時(shí)給供電電池充電,配送的鋰電池電量不能用完,低于 4V 時(shí)必須充電,電量用完電池將會(huì)報(bào)廢,配送電池充滿狀態(tài)電壓為 7.2V~8V 左右。
智能小車不使用時(shí)請(qǐng)關(guān)閉智能小車電源,由于智能小車上紅外避障和尋跡模塊工作時(shí)功耗較大會(huì)造成電池放電量大。
單片機(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)開(kāi)機(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;//超出測(cè)量范圍標(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)//毫秒級(jí)延時(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í)檢測(cè)S2按鍵是否被按下
- {
- delay(5); //軟件消抖
- if(key_s2 == 0)//再檢測(cè)S2是否被按下
- {
- while(!key_s2);//松手檢測(cè)
- beep = 0; //使能有源蜂鳴器
- delay(200);//200毫秒延時(shí)
- beep = 1; //關(guān)閉有源蜂鳴器
- break; //退出FOR死循環(huán)
- }
- }
- }
- }
- //初始化
- void Init(void)
- {
- EA = 1; //開(kāi)總中斷
- 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; //打開(kāi)串口中斷
- TMOD |= 0x01;//定時(shí)器0工作模塊1,16位定時(shí)模式。T0用測(cè)ECH0脈沖長(zhǎng)度
- 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ì)算超聲波所測(cè)距離*/
- void Conut(void)
- {
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
-
- S=(float)(time*1.085)*0.17; //算出來(lái)是MM
- if((S>=7000)||flag==1) //超出測(cè)量范圍
- {
- flag=0;
- }
- }
- /*超聲波避障*/
- void Avoid()
- {
- if(S < 400)//設(shè)置避障距離 ,單位毫米 剎車距離
- {
- stop();//停車
- backward();//后退
- delay(100);//后退時(shí)間越長(zhǎng)、距離越遠(yuǎn)。后退是為了留出車輛轉(zhuǎn)向的空間
- do{
- left_rapidly();//高速左轉(zhuǎn)
- delay(90);//時(shí)間越長(zhǎng) 轉(zhuǎn)向角度越大,與實(shí)際行駛環(huán)境有關(guān)
- stop();//停車
- delay(100);//時(shí)間越長(zhǎng) 停止時(shí)間越久長(zhǎng)
- StartModule(); //啟動(dòng)模塊測(cè)距,再次判斷是否
- while(!RX); //當(dāng)RX(ECHO信號(hào)回響)為零時(shí)等待
- TR0=1; //開(kāi)啟計(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 沒(méi)有識(shí)別到黑線 為1識(shí)別到黑線
- if(left_led1 == 1 && right_led1 == 1)//左右尋跡探頭識(shí)別到黑線
- {
- 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)//左右尋跡探頭都沒(méi)識(shí)別到黑線
- {
- backward();//后退
- }
- }
- }
- //紅外避障
- void IRAvoid()
- {
- //為0 識(shí)別障礙物 為1沒(méi)有識(shí)別到障礙物
- if(left_led2 == 1 && right_led2 == 1)//左右都沒(méi)識(shí)別到障礙物
- {
- 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è)識(shí)別到障礙物,左轉(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è)識(shí)別到障礙物,右轉(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è)都識(shí)別到障礙物,后退掉頭
- {
- pwm_left_val = 150;//左電機(jī)占空比值 取值范圍0-170,0最快
- pwm_right_val = 160;//右電機(jī)占空比值取值范圍0-170 ,0最快
- backward();//后退
- delay(100);//后退的時(shí)間影響后退的距離。后退時(shí)間越長(zhǎng)、后退距離越遠(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í)間越長(zhǎng),轉(zhuǎn)向角度越大。
- }
- }
- //超聲波避障
- void Ultrasonic()
- {
- StartModule(); //啟動(dòng)模塊測(cè)距
- while(!RX); //當(dāng)RX(ECHO信號(hào)回響)為零時(shí)等待
- TR0=1; //開(kāi)啟計(jì)數(shù)
- while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
- TR0=0; //關(guān)閉計(jì)數(shù)
- Conut(); //計(jì)算距離
- Avoid(); //避障
- delay(65); //測(cè)試周期不低于60MS
- }
- //紅外物體跟隨
- void IRTracking()
- {
- //為0 識(shí)別障礙物 為1沒(méi)有識(shí)別到障礙物
- if(left_led2 == 0 && right_led2 == 0)//左右識(shí)別到障礙物,前進(jìn)跟隨
- {
- forward();//前進(jìn)
- }
- if(left_led2 == 1 && right_led2 == 0)//小車右側(cè)識(shí)別到障礙物,右轉(zhuǎn)跟隨
- {
- right_run();//右轉(zhuǎn)
- }
- if(left_led2 == 0 && right_led2 == 1)//小車左側(cè)識(shí)別到障礙物,左轉(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中斷用來(lái)計(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)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|