摘要:基于單片機(jī)的智能小車控制就是其中的一個(gè)體現(xiàn)。本設(shè)計(jì)實(shí)現(xiàn)了一種基于單片機(jī)的自動(dòng)避障智能模型車系統(tǒng),通過紅外傳感器采集路況信息,通過對檢測信息的分析,自動(dòng)控制轉(zhuǎn)向電機(jī)轉(zhuǎn)向,改變行駛路徑,繞過障礙物,從而實(shí)現(xiàn)車穩(wěn)定避障。
Hi,大家好,這里是丹成學(xué)長,今天向大家介紹一個(gè) 單片機(jī)項(xiàng)目
基于單片機(jī)的智能小車
大家可用于 課程設(shè)計(jì) 或 畢業(yè)設(shè)計(jì)
技術(shù)解答、畢設(shè)幫助、開題指導(dǎo)print("Q 746876041")
智能化作為現(xiàn)代電子產(chǎn)品的新趨勢, 是今后的電子產(chǎn)業(yè)的發(fā)展方向。智能化設(shè)計(jì)的電子產(chǎn)品可以按照預(yù)先設(shè)定的模式在一個(gè)環(huán)境里自動(dòng)運(yùn)作, 不需要人為的管理, 可應(yīng)用于科學(xué)勘探、 環(huán)境監(jiān)測、 智能家居等方面。 基于單片機(jī)的智能小車控制就是其中的一個(gè)體現(xiàn)。 本設(shè)計(jì)實(shí)現(xiàn)了一種基于 51 單片機(jī)的自動(dòng)避障智能模型車系統(tǒng), 通過紅外傳感器采集路況信息, 通過對檢測信息的分析, 自動(dòng)控制轉(zhuǎn)向電機(jī)轉(zhuǎn)向, 改變行駛路徑, 繞過障礙物, 從而實(shí)現(xiàn)車穩(wěn)定避障。
本設(shè)計(jì)學(xué)長采用直流減速電機(jī), 電機(jī)專用驅(qū)動(dòng)芯片L298N進(jìn)行電機(jī)驅(qū)動(dòng)控制, 主控芯片為STC89C52, 測距部分采用超聲波模塊, 控制器采用24L01無線電通信模塊, 自動(dòng)避障部分采用紅外收發(fā)模塊。
這個(gè)設(shè)計(jì)雖然只是學(xué)長的一個(gè)演示模型, 但是具有充分的科學(xué)性和實(shí)用性。 首先我們根據(jù)交通路面的復(fù)雜情況, 按照適當(dāng)?shù)谋壤谱鞒鲆粋€(gè)路況模型, 包括彎道、直道以及路面上設(shè)置的障礙物等。 在彎、 直道上, 小車沿著預(yù)定軌道自由行使,當(dāng)小車遇到障礙物時(shí), 脈沖調(diào)制的紅外線傳感器將檢測到的信號(hào)發(fā)送給單片機(jī),單片機(jī)根據(jù)程序發(fā)出相應(yīng)的控制信號(hào)控制小車自動(dòng)避開障礙物。 由無線模塊控制小車進(jìn)行倒車、 前進(jìn)、 左轉(zhuǎn)、 右轉(zhuǎn)等動(dòng)作。
小車的無線通信模塊采用紅外遙控, 紅外收發(fā)遙控是目前大部份遙控小車采用的遙控手段, 紅外遙控具有代碼簡單, 操作性強(qiáng)的特點(diǎn)。 如圖為紅外遙控模塊實(shí)物圖。
小車的通信模塊采用無線電 NRF24L01 模塊, NRF24L01 是一款工作在 2. 4~2. 5GHz, 世界通用 ISM 頻段的單片無線收發(fā)器芯片。 無線收發(fā)器包括:頻率發(fā)生器、 增強(qiáng)型 SchockburstTM 模式控制器、 功率放大器、 晶體振蕩器、 調(diào)制器、 解調(diào)器。 輸出功率、 頻道選擇和協(xié)議的設(shè)置可以通過 SPI 接口進(jìn)行設(shè)置。如下圖為 NRF24L01 無線模塊實(shí)物圖。
小車的電機(jī)驅(qū)動(dòng)部分采用自己搭建的 9012 三極管電路來實(shí)行小車的驅(qū)動(dòng), 9012 三極管電路具有電路簡單, 操作方便的等特點(diǎn)。
小車的電機(jī)驅(qū)動(dòng)部分采用 L298N 芯片直流電機(jī)驅(qū)動(dòng)模塊, 該模塊具有較大的驅(qū)動(dòng)帶載能力, 驅(qū)動(dòng)部分端子供電范圍 Vs: +5V~+35V, 并且另外自帶了 5V、 3V 的輸出端口。
方案論證
本設(shè)計(jì)為 4 輪驅(qū)動(dòng)的小車, 對于小車驅(qū)動(dòng)部分要求能夠有較大的帯載能力, 并且在小車的實(shí)際設(shè)計(jì)過程中, 需要不同的輸出電壓來提供給小車的各個(gè)模塊。 因此綜上所述采用方案二, 小車的電機(jī)驅(qū)動(dòng)部分使用 L298N 芯片直流電機(jī)驅(qū)動(dòng)模塊。
本設(shè)計(jì)主要分為兩部分: 遙控部分和小車部分。 遙控部分主要由電源電路,單片機(jī)最小系統(tǒng), 無線電模塊組成, 遙控部分的系統(tǒng)框圖如圖所示。
小車部分由電源電路, 單片機(jī)最小系統(tǒng), 顯示電路, 無線電木塊, 報(bào)警電路,超聲波電路等電路模塊組成, 小車部分的系統(tǒng)框圖如圖所示。
注意這里學(xué)長設(shè)計(jì)的是藍(lán)牙通信方式的小車
1.4wd小車一臺(tái),包含馬達(dá),兩個(gè)底盤,和螺絲等(要自己組裝)
L298N電機(jī)驅(qū)動(dòng)模塊兩個(gè),用來控制馬達(dá)的轉(zhuǎn)速,方向,停止與否。
51單片機(jī)最小系統(tǒng)板一個(gè)和STC89C52RC芯片一個(gè)
HC-05藍(lán)牙模塊一個(gè)(藍(lán)牙遙控)和usb轉(zhuǎn)TTL轉(zhuǎn)接模塊一個(gè)(用于設(shè)置和調(diào)試藍(lán)牙模塊)
路紅外循跡模塊(黑白循跡)
8650電池四個(gè)和18650電池盒和杜邦線若干。
1.先把四個(gè)馬達(dá)和車輪裝在一起,組裝成一個(gè)小車框架。
2.L298N電機(jī)的接線
一個(gè)L298N有四個(gè)輸出口(out1,out2,out3,out4)接馬達(dá),每兩個(gè)輸出口控制一個(gè)馬達(dá),因此可以控制兩個(gè)馬達(dá),12v接口接電源正極,5v接口是給最小系統(tǒng)板供電,所以5v接系統(tǒng)板5v口。
四個(gè)IO輸入口(in1,in2,in3,in4)通過芯片控制輸出口。兩個(gè)使能端口(A,B),只有高電平時(shí)電機(jī)才有有效,低電平時(shí)電機(jī)不轉(zhuǎn)轉(zhuǎn)。因?yàn)橛袃蓚€(gè)電機(jī)只有一個(gè)供電源所以兩個(gè)電機(jī)要并聯(lián)連接在一起。
下面是電機(jī)的控制表,當(dāng)使能端位低電平(0)時(shí)電機(jī)處于停止?fàn)顟B(tài),當(dāng)輸出口為(00或11)時(shí)處于制動(dòng)狀態(tài),阻止電機(jī)轉(zhuǎn)動(dòng)。
L298N無效,無法驅(qū)動(dòng)馬達(dá)的原因(1.電壓不夠,起碼要7v以上。2.使能端沒有處于高電平狀態(tài) 。3.L298N或馬達(dá)壞了).
藍(lán)牙的接線
藍(lán)牙接在最小系統(tǒng)板,藍(lán)牙的TXD(發(fā)送口)口接系統(tǒng)板的RXD(接收口)口,RXD口接TXD口也就是交叉連接,發(fā)送口對接收口。
在接在系統(tǒng)板之前,要對藍(lán)牙進(jìn)行一些設(shè)置(名稱,密碼,波特率),這時(shí)就要用到usb轉(zhuǎn)TTL模塊。
接在電腦上,打開串口調(diào)試助手(軟件在后面的鏈接),進(jìn)入AT模式 (進(jìn)入方法,藍(lán)牙模塊上面有個(gè)按鈕,在usb口插入電腦前,長按不放,插入電腦即可,如果看到藍(lán)牙模塊上的燈在快速閃爍,說明已經(jīng)進(jìn)入AT模式,慢閃是工作模式)。
紅外的接線
紅外模塊的接線很簡單,按照引腳上的說明,一一對應(yīng)接在系統(tǒng)板上即可。
遙控部分主程序流程圖如圖所示。 程序從主函數(shù)開始執(zhí)行, 無線藍(lán)牙模塊初始化, 同時(shí)在主函數(shù)中定義單片機(jī)口對應(yīng)的按鍵按下時(shí)所發(fā)出的函數(shù)值。接下來判斷是否有按鍵按下, 如果有按鍵按下, 則發(fā)送相應(yīng)的按鍵對應(yīng)的函數(shù)值,接著判斷是否又有按鍵按下。 如果未發(fā)現(xiàn)按鍵按下則在主函數(shù)中循環(huán)判斷是否有按鍵按下。
小車部分主程序流程圖如圖所示。
程序從主函數(shù)開始執(zhí)行, 藍(lán)牙無線模塊初始化, 液晶顯示模塊初始化, 藍(lán)牙無線電模塊初始化, 超聲波模塊初始化。
各個(gè)模塊初始化完畢后, 單片機(jī)判斷是否接受到了信號(hào), 如果接收到信號(hào),則判斷相應(yīng)的按鍵值, 如果沒有接收到按鍵值則返回繼續(xù)判斷是否接受到信號(hào)。接收到信號(hào)后, 小車開始執(zhí)行鍵值對應(yīng)的相應(yīng)的命令。 而超聲波測距, 并在液晶上顯示相應(yīng)距離, 危險(xiǎn)距離報(bào)警都是貫穿在整個(gè) while(1) 的語句中的。
/************************************************ 作者:丹成學(xué)長,Q746876041************************************************/#include #include sbit LEA=P1^0;//左邊輪的使能端Asbit LEB=P1^1;//左邊輪的使能端B//左前輪sbit LIN1=P1^2;//sbit LIN2=P1^3;////左后輪sbit LIN3=P1^4;sbit LIN4=P1^5;sbit REA=P3^2;//右邊輪使能端Asbit REB=P3^3;//右邊輪使能端B//右前輪sbit RIN1=P3^4;sbit RIN2=P3^5;//右后輪sbit RIN3=P3^6;sbit RIN4=P3^7;//方向控制void delay(int time);//延時(shí)函數(shù)void forward();//前進(jìn)void back();//后退void stop();//停止void start();//啟動(dòng)void turnLeft();//左轉(zhuǎn)void turnRight();//右轉(zhuǎn)//藍(lán)牙模塊//定時(shí)器1用作串口發(fā)生器,用于與藍(lán)牙通信void time1Init();//定時(shí)器1的初始化void processMsg();//處理藍(lán)牙接收到的信息//紅外模塊//從右到左//in1是最右邊的紅外燈sbit in1=P2^0;sbit in2=P2^1;sbit in3=P2^2;sbit in4=P2^3;int isTrace=0;//是否開啟循跡功能void trace();//紅外循跡//PWM調(diào)速//通過控制使能端高低電平輸出的時(shí)間從而控制速度int count=0; //用于計(jì)數(shù)int pwm=20; //表示啟動(dòng)的時(shí)間,20表示啟動(dòng)20msvoid time0Init();//定時(shí)器0的初始化. //用于控制高低電平的時(shí)間 //定時(shí)器比較準(zhǔn)確void go();//啟動(dòng) 使能端為高電平 1void pause();//停止 使能端為低電平 0void time0Fun();//定時(shí)器0的中斷函數(shù)int main(){ EA=1;//打開總中斷 time1Init();//定時(shí)器1初始化 time0Init();//定時(shí)器0初始化 start();//使車的方向一開始向前 while(1) { if(isTrace) trace(); if(count>=100) //100ms一個(gè)周期 count=0; if(count<pwm) //pwm表示啟動(dòng)的時(shí)間 //pwm越大 速度越快 go(); else if(count>=pwm) pause(); } return 0;}void delay(int time)//延時(shí)函數(shù){ int i; for(i=0;i<time;i++) { _nop_();//在晶振12M下 //一個(gè)nop函數(shù)延時(shí)1us }}void forward()//前進(jìn){ //前進(jìn),所有輪正轉(zhuǎn) LIN1=0; LIN2=1; LIN3=0; LIN4=1; RIN1=0; RIN2=1; RIN3=0; RIN4=1;}void back()//后退{ //前進(jìn),所有輪反轉(zhuǎn) LIN1=1; LIN2=0; LIN3=1; LIN4=0; RIN1=1; RIN2=0; RIN3=1; RIN4=0;}void turnLeft()//左轉(zhuǎn){ //左轉(zhuǎn) 左邊的輪正轉(zhuǎn),右邊輪反轉(zhuǎn) LIN1=0; LIN2=1; LIN3=0; LIN4=1; RIN1=1; RIN2=0; RIN3=1; RIN4=0; delay(5000);//延時(shí)5ms 控制轉(zhuǎn)彎的角度}void turnRight()//右轉(zhuǎn){ //右轉(zhuǎn),左邊輪反轉(zhuǎn),右邊輪正轉(zhuǎn) LIN1=1; LIN2=0; LIN3=1; LIN4=0; RIN1=1; RIN2=0; RIN3=1; RIN4=0; delay(5000);//延時(shí)5ms 控制轉(zhuǎn)彎的角度}void stop()//停止{ //停止,全部高電平或低電平 LIN1=0; LIN2=0; LIN3=0; LIN4=0; RIN1=0; RIN2=0; RIN3=0; RIN4=0;}void start(){ forward();//一開始,前進(jìn)方向}//定時(shí)器1用作串口發(fā)生器,用于與藍(lán)牙通信void time1Init()//定時(shí)器1的初始化{ TMOD=0x20;//定時(shí)器1,工作模式2,8位自動(dòng)重裝模式 TH1=0xfd;//9600波特率,要與藍(lán)牙的一致 TL1=0xfd; //串口通信方式1 SM0=0; SM1=1; PCON=0x00;//波特率不加倍 SCON=0x50;//工作方式一 REN=1;//允許接收 ES=1;//開啟串口中斷 TR1=1;//啟動(dòng)定時(shí)1}void processMsg() interrupt 4 //中斷4//處理藍(lán)牙接收到的信息{ char ch; //等待接收完畢 while(!RI)//當(dāng)RI為0時(shí)沒有接收完畢 ; //為1時(shí)接收完畢 //信息存存在sbuf中 ch=SBUF;//獲取接收的信息 switch(ch) { case "f": //前進(jìn) forward(); break; case "b": //后退 back(); break; case "l": //左轉(zhuǎn) turnLeft(); break; case "r": //右轉(zhuǎn) turnRight(); break; case "s": //停止 stop(); break; case "o": start(); break;//啟動(dòng) case "t": //開啟循跡功能 isTrace=1; break; case "1": //一檔 pwm=20; break; case "2": //二檔 pwm=60; break; case "3": //三檔 pwm=100; break; default: break; }}void trace()//紅外循跡{ //當(dāng)紅外遇到黑線時(shí)吸收紅外光,輸出高電平 //遇到白線時(shí)反射紅外,輸出低電平 int dir=0;//0表示直走 //1 代表左轉(zhuǎn) //2 代表右轉(zhuǎn) //0 0 0 0 if(in1==0&&in2==0&&in3==0&&in4==0) dir=0; //1 0 0 0 else if (in1==1&&in2==0&&in3==0&&in4==0) dir=2; //1 1 0 0 else if (in1==1&&in2==1&&in3==0&&in4==0) dir=2; //1 1 1 0 else if (in1==1&&in2==1&&in3==1&&in4==0) dir=0; //1 1 1 1 else if (in1==1&&in2==1&&in3==1&&in4==1) dir=0; //0 1 0 0 else if (in1==0&&in2==1&&in3==0&&in4==0) dir=2; //0 1 1 0 else if (in1==0&&in2==1&&in3==1&&in4==0) dir=0; //0 1 1 1 else if (in1==0&&in2==1&&in3==1&&in4==1) dir=1; //0 0 1 0 else if (in1==0&&in2==0&&in3==1&&in4==0) dir=1; //0 0 1 1 else if (in1==0&&in2==0&&in3==1&&in4==1) dir=1; //1 0 1 0 else if (in1==1&&in2==0&&in3==1&&in4==0) dir=1; //1 1 1 0 else if (in1==1&&in2==1&&in3==1&&in4==0) dir=2; //1 0 1 1 else if (in1==1&&in2==0&&in3==1&&in4==1) dir=0; //1 0 0 1 else if (in1==1&&in2==0&&in3==0&&in4==1) dir=0; //0 0 0 1 else if (in1==0&&in2==0&&in3==0&&in4==1) dir=1; //1 1 0 1 else if (in1==1&&in2==1&&in3==0&&in4==1) dir=0; switch(dir) { case 0: forward(); break; case 1: turnLeft(); break; case 2: turnRight(); break; }}void time0Init()//定時(shí)器0的初始化. //用于控制高低電平的時(shí)間 //定時(shí)器比較準(zhǔn)確{ TMOD|=0x01;//工作方式一 //用或運(yùn)算是為了不改變 //定時(shí)器1對應(yīng)位的值。 TH0=0xfc; TL0=0x66; //定時(shí)1ms ET0=1;//開啟定時(shí)器0的中斷 TR0=1;//啟動(dòng)定時(shí)器0}void go()//啟動(dòng) 使能端為高電平 1{ LEA=1; LEB=1; REA=1; REB=1;}void pause()//停止 使能端為低電平 0{ LEA=0; LEB=0; REA=0; REB=0;}void time0Fun() interrupt 1{ TH0=0xfc; TL0=0x66; //1ms 中斷一次,count加一 count++;}/*******************************************************************篇幅有限,只展示部分代碼作者:丹成學(xué)長,Q746876041********************************************************************/
技術(shù)解答、畢設(shè)幫助、開題指導(dǎo)print("Q 746876041")
單片機(jī)畢設(shè)項(xiàng)目大全:
https://blog.csdn.net/huawei123444/article/details/119822845
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/123692.html
摘要:本文在充分理解考勤系統(tǒng)原則和目標(biāo)的基礎(chǔ)上,采用單片機(jī)對考勤進(jìn)行硬件設(shè)計(jì)并采用面向?qū)ο蟮乃枷脒M(jìn)行上位機(jī)管理系統(tǒng)的設(shè)計(jì)。該芯片共內(nèi)置個(gè)中文漢字,個(gè)字符的碼字符庫及點(diǎn)陣顯示。單片機(jī)指紋考勤系統(tǒng)參數(shù)設(shè)定流程如圖所示。 ...
摘要:信息的安全性可控性已成為錄音系統(tǒng)的重要研究內(nèi)容。系統(tǒng)設(shè)計(jì)系統(tǒng)架構(gòu)通過單片機(jī)與語音功能集成芯片,以及液晶芯片進(jìn)行設(shè)計(jì),由單片機(jī)控制來實(shí)現(xiàn)語音的錄制存儲(chǔ)以及播放清除等功能。 ...
摘要:門禁系統(tǒng)可有效管理門的開啟關(guān)閉對出入人員進(jìn)行監(jiān)控管理?;诘拈T禁系統(tǒng)通過對射頻卡的識(shí)別,保證那些持有相應(yīng)證件的人員能自由進(jìn)出,阻止外來人員或無法提供證件的人員進(jìn)入。 ...
閱讀 2683·2021-11-24 09:39
閱讀 1693·2021-11-24 09:38
閱讀 656·2021-11-22 14:44
閱讀 1920·2021-11-18 10:02
閱讀 2669·2021-11-18 10:02
閱讀 1184·2021-10-14 09:43
閱讀 4311·2021-09-29 09:35
閱讀 583·2021-07-30 15:30