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