51單片機自動壁障小車設計,附原理圖程序全套製作資料

51單片機自動壁障小車設計,附原理圖程序全套製作資料

在科學探索及緊急搶險中經常要對一些危險或人類不能直接到達的地域進行探測,這就需要用機器人來完成。而機器人在複雜地形行進時自動避障是一項必不可少也是最基本的功能。避障功能在日常生活中也是比較常見的,像是風靡一時的自動清掃機器人,只需放在地上一會就可以將你的屋子打掃乾淨,這裡面的最基本功能也是避障,當它檢測到前方有障礙就會繞開。這樣就可以躲避傢俱將你的地板清理乾淨了。因此,自動避障系統的研發就應運而生。

51單片機自動壁障小車設計,附原理圖程序全套製作資料

MCS-51《單片機原理及接口技術》是中職院校電氣自動化專業開設的 一門必修課程,該課程主要是通過對單片機的內部結構、相關外圍電路及編程語言的學習,使學生掌握用單片機進行開發設計一些實用電子電路的能力,自動避障小車就是基於這一系統開發而成的。自動避障小車可以作為地域探索機器人和緊急搶險機器人的運動系統,讓機器人在行進中自動避過障礙物。

一、本設計任務和主要內容

本設計是對以單片機STC89C52RC為核心的系統根據感測模塊傳輸的前方路面信息,控制小車行駛走向的軟、硬件設計開發。系統要能夠做到準確及時監測前方路面信息並傳輸給主控模塊,做到根據前方路面信息及時調整小車的走向,做到顯示小車的走向和小車已經行駛過的路程。

壁障小車的主要功能是:

① 感測模塊實時監測路面情況並及時將障礙物的位置傳輸給單片機;

② 單片機核心模塊根據感測模塊給予的信息控制小車兩電機轉動;

③ 電機驅動模塊驅動兩電機轉動,實現轉向與行走。

二、系統主要硬件電路設計

根據設計要求,我們的自動避障小車主要由五個模塊構成:車體框架、電源及穩壓模塊、主控模塊、探測模塊、電機驅動模塊組成。 各模塊分述如下:

51單片機自動壁障小車設計,附原理圖程序全套製作資料

圖1 系統模塊組成框圖

2.1 小車避障原理分析

小車車頭處裝有三個紅外探頭,中間一個光電開關對向正前方,兩側的紅外探頭向兩邊各分開30度,(如圖2所示)。小車在行進過程中由紅外探頭向前方發射出紅外線,當紅外線遇到障礙物時發生漫反射,反射光被光電開關接收。小車根據三個探頭接受信號的情況來判斷前方障礙物的分佈並做出相應的動作。

51單片機自動壁障小車設計,附原理圖程序全套製作資料

圖2 自動避障小車車體及避障原理圖

紅外探頭選用的是E12-D15NK型紅外避障傳感器,這是一種集發射與接收於一體的光電傳感器,發射光經過調製後發出,接收頭對反射光進行解調輸出。有效的避免了可見光的干擾。分別探測正前方,前右側,前左側障礙物信息,在特殊地形(如障礙物密集地形)可將正前方的光電開關移置後方進行探測。E12-D15NK光電開關平均有效探測距離0~30cm可調,且抗外界背景光干擾能力強,可在日光下正常工作(理論上應避免日光和強光源的直接照射)。我們小車換檔調速後的最大制動距離不超過30cm,一般在10~20cm左右,因而探測距離滿足我們的小車需求示意圖如下:

51單片機自動壁障小車設計,附原理圖程序全套製作資料

51單片機自動壁障小車設計,附原理圖程序全套製作資料

圖4 紅外避障傳感器原理圖

電氣特性:

紅色:VCC;黑色:GND;黃色:信號輸出;白色:和紅線一起外接電位器。

工作電壓:5VDC

工作電流:10-15mA

驅動電流:100mA

感應距離:1-15CM

機械特性:

顏色:橙黃色

直徑:12MM

長度:35MM

引線長度:25CM(不含接頭)

2.2電源模塊

方案一:採用交流電經直流穩壓處理後供電 採用交流電提供直流穩壓電源,電流驅動能力及電壓穩定性最好,且負載對電源影響也最小。但由於需要電線對小車供電,極大影響了壁障小車行動的靈活性及地形的適應能力。而且壁障小車極易把拖在地上的電線識別為障礙物,人為增加了不必要的障礙。故我放棄了這一方案。

方案二:採用蓄電池供電 蓄電池具有較強的電流驅動能力和較好的電壓穩定性能,且成本低廉。可採用蓄電池經7812芯片穩壓後給電機供電,再經過降壓接7805芯片給單片機及其他邏輯單元供電。但蓄電池體積相對龐大,且重量過大,造成電機負載過大,不適合我們採用的小車車架(玩具電動車車架)。故我放棄了這一方案。

方案三:採用乾電池組進行供電 採用四節乾電池降壓至5V後給單片機及其他邏輯單元供電,另取六節乾電池為電機及光電開關供電。這樣電機啟動及制動時的短暫電壓干擾不會影響到邏輯單元和單片機的工作。乾電池用電池盒封裝,體積和重量較小,同時玩具車底座可以安裝四節乾電池,正好可為單片機及其他邏輯單元供電。在穩壓方面,起始時考慮使用7805芯片對6V的電池電壓進行降壓穩壓。但考慮到這樣使得7805芯片消耗大量能量,降低電池壽命;同時,由於STC89C51、光電開關、小車電機對於供電電壓要求並不苛刻,故我們將6V電池電壓接一個二極管降壓後直接給單片機及其他邏輯單元供電。而電機和光電開關的電源不做穩壓處理。這樣只需在小車主板上加兩個調速按鈕,根據電池電量選擇合適功率即可,甚至於可直接在軟件裡設置自動換擋。 綜合考慮,我採用方案三。

2.3主控模塊 3.1、STC89C52RC單片機最小系統

我採用的是STC公司的51內核單片機STC89C52RC,單片機最小系統及概述如下:STC89C52RC單片機介紹

STC89C52RC單片機是宏晶科技推出的新一代高速/低功耗/超強抗干擾的單片機,指令代碼完全兼容傳統8051單片機,12時鐘/機器週期和6時鐘/機器週期可以任意選擇。

主要特性如下:

1. 增強型8051單片機,6時鐘/機器週期和12時鐘/機器週期可以任意選擇,指令代碼完全兼容傳統8051.

2. 工作電壓:5.5V~3.3V(5V單片機)/3.8V~2.0V(3V單片機)

3. 工作頻率範圍:0~40MHz,相當於普通8051的0~80MHz,實際工作頻率可達48MHz

4. 用戶應用程序空間為8K字節

5. 片上集成512字節RAM

6. 通用I/O口(32個),復位後為:P1/P2/P3/P4是準雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為I/O口用時,需加上拉電阻。

7. ISP(在系統可編程)/IAP(在應用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數秒即可完成一片

8. 具有EEPROM功能

9. 具有看門狗功能

10. 共3個16位定時器/計數器。即定時器T0、T1、T2

11. 外部中斷4路,下降沿中斷或低電平觸發電路,Power Down模式可由外部中斷低電平觸發中斷方式喚醒

12. 通用異步串行口(UART),還可用定時器軟件實現多個UART

13. 工作溫度範圍:-40~+85℃(工業級)/0~75℃(商業級)

14. PDIP封裝

在探測模塊和單片機中斷接口之間、獨立按鍵與單片機中斷接口之間,需要經過電平的邏輯處理進行連接。主要涉及到一個三輸入或非門和一個二輸入與門。這兩個邏輯關係我們直接選用74HC系列的集成芯片實現。 由於三輸入或非門在市場上很難購買到,我們採用了兩個二輸入或非門和一個二輸入與門完成了三輸入或非門。由於我們採用的74HC08(四二輸入與門)、74HC02(四二輸入或非門)均為四二輸入的,各提供四個二輸入與門和四個二輸入或非門,我們用各用一片芯片即可實現所需邏輯功能。

2.4電機驅動模塊

本系統採用了L298N芯片來驅動電機 ,L298N是一個具有高電壓大電流的全橋驅動芯片,輸出電壓最高可達50V,可以直接通過電源來調節輸出電壓;可以直接用單片機的IO口提供信號,而且帶有使能端,方便PWM調速,電路簡單,性能穩定,使用比較方便。L298N芯片可以驅動兩個二相電機,也可以驅動一個四相電機,正好符合我們小車兩個二相電機的驅動要求。 綜合考慮,我採用L298N芯片驅動小車電機。

最終方案如下: 使用乾電池組對系統供電,改造玩具電動車作為小車底座,採用STC89C52RC作為主控芯片,採用E12-D15NK光電開關進行障礙物探測,使用L298N驅動直流電機。邏輯關係處理使用74HC系列芯片完成。

2.5 總電路圖

51單片機自動壁障小車設計,附原理圖程序全套製作資料

圖5 總電路圖設計

三、系統軟件設計

3.1程序流程圖

本系統設計流程圖如下

51單片機自動壁障小車設計,附原理圖程序全套製作資料

圖6 系統軟件主流程圖

3.2系統程序清單

#include

#define uchar unsigned char

#define uintunsigned int

/********************

端口定義

*********************/

sbit IN1=P1^0; //P10與電機驅動IN1相連

sbit IN2=P1^1 //P11與電機驅動IN2相連

sbit IN3=P1^2; //P12與電機驅動IN3相連

sbit IN4=P1^3; //P13與電機驅動IN4相連

uchar INS=P2; //P2端口的^0、P2^1、P2^2分別與左、中、右紅外模塊輸出信號線線相連

uint D=200;//定義延遲函數的參數

/************************

各個子函數定義

***********************/

void Go(void)

{

IN1=0;

IN2=0;

IN3=1;

IN4=0;

}

void Back(void)

{

IN1=0;

IN2=0;

IN3=0;

IN4=1;

}

void Go_left(void)

{

IN1=1;

IN2=0;

IN3=1;

IN4=0;

}

void Go_right(void)

{

IN1=0;

IN2=1;

IN3=1;

IN4=0;

}

void Stop(void)

{

IN1=IN2=IN3=IN4=0;

}

/***

void Back_left(void)

{

IN1=1;

IN2=0;

IN3=0;

IN4=1;

}

void Back_right(void)

{

IN1=0;

IN2=1;

IN3=0;

IN4=1;

}

***/

void Delay(uint n)

{

uint i,j;

i=j=n;

for(;i>0;i--)

for(;j>0;j--);

}

void Be_move(void)

{

uchar temp;

temp=INS&0x07;

switch(temp)

{

case 0x01:Go_right();Go();Delay(D);break;

case 0x02:

case 0x03:

case 0x07:Back();Delay(D);Go_right();Go();Delay(D);break;

case 0x06:Back();Delay(D);Go_left();Go();Delay(D);break;

case 0x04:Go_left();Go();Delay();break;

case 0x05:Go();Delay();break;

default:Stop();Delay();break;

}

}

void main()

{

uchar temp;

while(1)

{

temp=INS&0x07;

if(temp==0x00) Go();

else Be_move();

}

}


分享到:


相關文章: