循跡避障一體小車 一) 小車功能實現描述 利用光電傳感(紅外對射管,紅外發射與接收二極管組成)檢測黑白線,實現小車能跟著白線(或黑線)行走,同時也可避開障礙物,即小車尋跡過程中,若遇障礙物可自行繞開,繞開后繼續尋跡。 二) 電路詳細分析 1. 光電傳感 循跡光電傳感器原理,利用黑白線對紅外線不同的反射能力。然后通過光敏二極管或光敏三極管,接收反射回的不同光強信號,把不同光強轉換為電流信號,最后通過電阻,轉換為單片機可識別的高低電平。光電傳感器實現循跡的基本電路如下圖所示
循跡傳感器基本電路 電路解釋:TC端是傳感器工作控制端,為高電平時,發光二極管不工作,傳感器休眠,為低電平時,傳感器啟動。Signal端為檢測信號輸出,當遇到黑線,黑線吸收大量的紅外線,反射的紅外線很弱,光敏三極管不導通,signal輸出高電平,當遇到白線,與黑線相反,反射的紅外線很強,使光敏三極管導通,signal輸出低電平。 尋跡部分 調整左右傳感器之間的距離,兩探頭距離約等于白線寬度最合適,一般白線寬度選擇范圍為3 – 5 厘米比較合適。注意:該傳感器的靈敏度是可調的,偶爾傳感器遇到白線卻不能送出相應的信號,通過調節傳感器上的可調電阻,適當的增大或減小靈敏度。另外,循跡傳感器的安放也算是比較有講究的,有兩種方法,一種是兩個都是放置在白線內側但緊貼白線邊緣,第二種是都放置在白線的外側,同樣緊貼白線邊緣。我們通常采用第二種方法。 編寫程序使小車遇白線時,小車跟著白線走。當小車先前前進時,如果向左偏離了白線。那么右邊傳感器會產生一個低電平,單片機判斷這個信號,然后向右拐。回到白線后。兩傳感器輸出信號為高電平。小車前進。如果小車向右偏離白線,左邊傳感器產生一個低電平,單片機判斷這個信號,然后向左拐。如此如此,小車必不偏離白線。若小車的兩對光電傳感器同時輸出的信號為高電平(黑底)或低電平(白底),即單片機判斷的都為高電平或低電平,小車向前直走,在此過程中(直走)小車若遇白線,小車又重復上面動作跟著白線走。 避障部分 當小車在尋跡(沿著白線走或直走)過程中遇障礙物,小車亦可自行轉彎,轉彎動作完成后,又繼續尋跡。
2. 電機驅動電路 電機驅動芯片采用L298N,是一款承受高壓大電流的全橋型直流/步進電壓驅動器,如下圖
電機控制芯片L298N的引腳排列 L298N引腳編號與功能
L298N內部原理圖 電機驅動A/B的控制邏輯如下表所示 電機驅動A/B的工作原理 電機控制邏輯如下:以電機A為例,當使能端A為高電平是,如果輸入端M1 Direction引腳為高電平,三極管導通,輸入引腳1為低電平而輸入引腳2為高電平,電機A反轉;如果輸入端M1 Direction引腳為底電平,三極管截止,輸入引腳1為高電平而輸入引腳2為低電平,電機A正轉。
電機驅動原理圖
帶中文字庫的128X64是一種具有4位/8位并行、2線或3線串行多種接口方式,內部含有國標一級、二級簡體中文字庫的點陣圖形液晶顯示模塊。其顯示分辨率為128×64, 內置8192個16*16點漢字,和128個16*8點ASCII字符集。利用該模塊靈活的接口方式和簡單、方便的操作指令,可構成全中文人機交互圖形界面。可以顯示8×4行16×16點陣的漢字,也可完成圖形顯示。具有低電壓低功耗特點。由該模塊構成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬件電路結構或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。 基本特性: 低電源電壓(VDD:+3.0--+5.5V)
顯示分辨率:128×64點
內置漢字字庫,提供8192個16×16點陣漢字(簡繁體可選)
內置 128個16×8點陣字符
2MHZ時鐘頻率
顯示方式:STN、半透、正顯
驅動方式:1/32DUTY,1/5BIAS
視角方向:6點
背光方式:側部高亮白色LED,功耗僅為普通LED的1/5—1/10
通訊方式:串行、并口可選
內置DC-DC轉換電路,無需外加負壓
無需片選信號,簡化軟件設計
工作溫度: 0℃- +55℃ ,存儲溫度: -20℃ -+60℃
模塊接口說明:
*注:1:如在實際應用中僅使用并口通訊模式,可將PSB接固定高電平,也可以將模塊上的J8和“VCC”用焊錫短接;2:模塊內部接有上電復位電路,因此在不需要經常復位的場合可將該端懸空;3:如背光和模塊共用一個電源,可以將模塊上的JA、JK用焊錫短接。 引腳控制信號應用 D/I,R/W的配合選擇決定控制界面的4種模式: D/I | R/W | 功能說明 | L | L | MPU寫指令到指令暫存器(IR) | L | H | 讀出忙標志(BF)及地址記數器(AC)的狀態 | H | L | MPU寫入數據到數據暫存器(DR) | H | H | MPU從數據暫存器(DR)中讀出數據 |
E信號操作: E狀態 | 執行動作 | 結果 | 高——>低 | I/O緩沖——>DR | 配合/W進行寫數據或指令 | 高 | DR——>I/O緩沖 | 配合R進行讀數據或指令 | 低/低——>高 | 無動作 | |
內部寄存器信號 ● 忙標志:BF
BF標志提供內部工作情況,BF=1表示模塊在進行內部操作,此時模塊不接受外部指令和數據。BF=0時,模塊為準備狀態,隨時可接受外部指令和數據。利用STATUS RD 指令,可以將BF讀到DB7總線,從而檢驗模塊之工作狀態。 ●字型產生ROM(CGROM)
字型產生ROM(CGROM)提供8192個此觸發器是用于模塊屏幕顯示開和關的控制。DFF=1為開顯示(DISPLAY ON),DDRAM的內容就顯示在屏幕上,DFF=0為關顯示(DISPLAY OFF)。DFF 的狀態是指令DISPLAY ON/OFF和D/IT信號控制的。 ● 顯示數據RAM(DDRAM)
模塊內部顯示數據RAM提供64×2個位元組的空間,最多可控制4行16字(64個字)的中文字型顯示,當寫入顯示數據RAM時,可分別顯示CGROM與CGRAM的字型;此模塊可顯示三種字型,分別是半角英數字型(16*8)、CGRAM字型及CGROM的中文字型,三種字型的選擇,由在DDRAM中寫入的編碼選擇,在此階段0000H—0006H的編碼中(其代碼分別是0000、0002、0004、0006共4個)將選擇CGRAM的自定義字型,02H—7FH的編碼中將選擇半角英數字的字型,至于A1以上的編碼將自動的結合下一個位元組,組成兩個位元組的編碼形成中文字型的編碼BIG5(A140—D75F),GB(A1A0-F7FFH)。 ●字型產生RAM(CGRAM)
字型產生RAM提供圖象定義(造字)功能,可以提供四組16×16點的自定義圖象空間,使用者可以將內部字型沒有提供的圖象字型自行定義到CGRAM中,便可和CGROM中的定義一樣地通過DDRAM顯示在屏幕中。 ● 地址計數器AC
地址計數器AC地址計數器是用來貯存DDRAM/CGRAM之一的地址,它可由設定指令暫存器來改變,之后只要讀取或是寫入DDRAM/CGRAM的值時,地址計數器的值就會自動加一,當D/I為“0”時而R/W為“1”時,地址計數器的值會被讀取到DB6——DB0中。 ●光標/閃爍控制電路
此模塊提供硬體光標及閃爍控制電路,由地址計數器的值來指定DDRAM中的光標或閃爍位置。 指令操作 模塊控制芯片提供兩套控制命令,基本指令和擴充指令如下: 指令表1:(RE=0:基本指令) 指令 | 指 令 碼 | 功 能 | D/I | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 清除 顯示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 將DDRAM填滿"20H",并且設定DDRAM的地址計數器(AC)到"00H" | 地址 歸位 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 設定DDRAM的地址計數器(AC)到"00H",并且將游標移到開頭原點位置;這個指令不改變DDRAM 的內容 | 顯示狀態
開/關 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | D=1: 整體顯示 ON C=1: 游標ON B=1:游標位置反白允許 | 進入點設定 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 指定在數據的讀取與寫入時,設定游標的移動方向及指定顯示的移位 | 游標或顯示移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | X | X | 設定游標的移動與顯示的移位控制位;這個指令不改變DDRAM 的內容 | 功能
設定 | 0 | 0 | 0 | 0 | 1 | DL | X | RE | X | X | DL=0/1:4/8位數據 RE=1: 擴充指令操作 RE=0: 基本指令操作 | 設定CGRAM地址 | 0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 設定CGRAM 地址 | 設定DDRAM地址 | 0 | 0 | 1 | 0 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 設定DDRAM 地址(顯示位址) 第一行:80H-87H 第二行:90H-97H | 讀取忙標志和地址 | 0 | 1 | BF | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 讀取忙標志(BF)可以確認內部動作是否完成,同時可以讀出地址計數器(AC)的值 | 寫數據到RAM | 1 | 0 | 數據 | 將數據D7——D0寫入到內部的RAM (DDRAM/CGRAM/IRAM/GRAM) | 讀出RAM的值 | 1 | 1 | 數據 | 從內部RAM讀取數據D7——D0(DDRAM/CGRAM/IRAM/GRAM) |
指令表2:(RE=1:擴充指令) 指令 | 指 令 碼 | 功 能 | D/I | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 待命
模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 進入待命模式,執行其他指令都終止 | 卷動地址開關開啟 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SR | SR=1:允許輸入垂直卷動地址 SR=0:允許輸入IRAM和CGRAM地址 | 反白
選擇 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | R1 | R0 | 選擇2行中的任一行作反白顯示,并可決定反白與否。初始值R1R0=00,第一次設定為反白顯示,再次設定變回正常 | 睡眠
模式 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SL | X | X | SL=0:進入睡眠模式
SL=1:脫離睡眠模式 | 擴充功能設定 | 0 | 0 | 0 | 0 | 1 | CL | X | RE | G | 0 | CL=0/1:4/8位數據 RE=1: 擴充指令操作 RE=0: 基本指令操作 G=1/0:繪圖開關 | 設 定
繪圖RAM
地 址 | 0 | 0 | 1 | 0 AC6 | 0 AC5 | 0 AC4 | AC3 AC3 | AC2 AC2 | AC1 AC1 | AC0 AC0 | 設定繪圖RAM
先設定垂直(列)
AC6AC5…AC0
再設定水平(行)地址AC3AC2AC1AC0
將以上16位地址連續寫入即可 |
注:當IC1在接受指令前,微處理器必須先確認其內部處于非忙碌狀態,即讀取BF標志時,BF需為零,方可接受新的指令;如果在送出一個指令前并不檢查BF標志,那么在前一個指令和這個指令中間必須延長一段較長的時間,即是等待前一個指令確實執行完成。 三、顯示應用 1、字符顯示 帶中文字庫的128X64-0402B每屏可顯示4行8列共32個16×16點陣的漢字,每個顯示RAM可顯示1個中文字符或2個16×8點陣全高ASCII碼字符,即每屏最多可實現32個中文字符或64個ASCII碼字符的顯示。帶中文字庫的128X64-0402B內部提供128×2字節的字符顯示RAM緩沖區(DDRAM)。字符顯示是通過將字符顯示編碼寫入該字符顯示RAM實現的。根據寫入內容的不同,可分別在液晶屏上顯示CGROM(中文字庫)、HCGROM(ASCII碼字庫)及CGRAM(自定義字形)的內容。三種不同字符/字型的選擇編碼范圍為:0000~0006H(其代碼分別是0000、0002、0004、0006共4個)顯示自定義字型,02H~7FH顯示半寬ASCII碼字符,A1A0H~F7FFH顯示8192種GB2312中文字庫字形。字符顯示RAM在液晶模塊中的地址80H~9FH。字符顯示的RAM的地址與32個字符顯示區域有著一一對應的關系,其對應關系如下表所示。 80H | 81H | 82H | 83H | 84H | 85H | 86H | 87H | 90H | 91H | 92H | 93H | 94H | 95H | 96H | 97H | 88H | 89H | 8AH | 8BH | 8CH | 8DH | 8EH | 8FH | 98H | 99H | 9AH | 9BH | 9CH | 9DH | 9EH | 9FH |
其中,C語言編譯器具有直接把中文轉換成ASCII碼字符功能。對照下面原理圖,編譯程序示例,并下載到實驗板上,觀測現象。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RM1=P0^0;
sbit RM2=P0^1;//右電機
sbit LM1=P0^2;
sbit LM2=P0^3;//左電機
sbit bzh=P2^6;
sbit RAD=P0^6;//紅外接收右電機轉
sbit LBD=P0^7;//紅外接收左電機轉
sbit rs=P3^5;// LCD的RS
sbit rw=P3^6;// LCD的R/W
sbit en=P3^7;// LCD的E
void lcd_string(uchar *strpoint);
void delay(uint a)
{ uint b,c;
for(b=a;b>0;b--)
for(c=120;c>0;c--);
}
uchar i=0;
void checkbusy()//檢查LCD忙
{ uchar dat;
rs=0; //rs=1為數據,=0為命令.
rw=1; //rw=1為讀,=0為寫.
do
{
P1=0x00;
en=1; //E信號下降沿鎖存DB7~DBO
dat=P1; //讀入P1的值
en=0; //鎖存
dat=0x80 & dat; //BUSY:1內部在工作,0正常狀態
}while(!(dat==0x00));rw=0;
}
void sentcom(uchar com)
{ checkbusy(); //檢查Busy
rs=0;
en=0;
P1=com;
delay(5);
en=1;
delay(5);
en=0;
}
void sentdata(uchar date) //寫數據
{
checkbusy();
rs=1;
en=0;
P1=date;
delay(5);
en=1;
delay(5);
en=0;
}
//初始化 LCM
void lcd_init()
{
sentcom(0x38);//功能設置,一次送8位數據,基本指令集
sentcom(0x0C);//0000,1100 整體顯示,游標off,游標位置off
sentcom(0x01);//0000,0001 清DDRAM
sentcom(0x02);//0000,0010 DDRAM地址歸位
sentcom(0x80);//1000,0000 設定DDRAM 7位地址000,0000到地址計數器AC
}
void lcd_string(char*strpoint)//在當前顯示位置顯示LCD字符串
{ register i=0;
while(strpoint[ i]!=0){
sentdata(strpoint[ i]);
i++;
}
}
void stop()
{
lcd_init();
sentcom(0x80);
lcd_string("現代創新實訓室 ");//C編譯系統本省也具有轉換功能,所以也可以這樣寫
sentcom(0x90);
lcd_string("尋跡避障一體小車");
sentcom(0x88);
lcd_string("--指導:");
sentcom(0x98);
lcd_string("--設計: ");
}
void tracing()
{
sentcom(0x80);
lcd_string("現代創新實訓室 ");
sentcom(0x90);
lcd_string("--指導:");
sentcom(0x88);
lcd_string("--設計: ");
sentcom(0x98);
lcd_string(" 小車尋跡中---");
}
void bypass()
{
sentcom(0x80);
lcd_string("現代創新實訓室 ");
sentcom(0x90);
lcd_string("--指導:");
sentcom(0x88);
lcd_string("--設計: ");
sentcom(0x98);
lcd_string(" 小車避障中---");
}
void find()
{tracing();
while(bzh==1)
{ if(LBD&&RAD==1)
{
RM1=1;LM1=1;
RM2=0;LM2=0;
}
if(RAD==0)
{
RM1=0;LM1=1;
RM2=0;LM2=0;
if(LBD==0)
{
RM1=1;LM1=1;
RM2=0;LM2=0;
delay(i);
}
}
if(LBD==0)
{
RM1=1;LM1=0;
RM2=0;LM2=0;
if(RAD==0)
{
RM1=1;LM1=1;
RM2=0;LM2=0;
delay(i);
}
}
}
}
void bizhan()
{ bypass();
if(bzh==0)
{
RM1=1;LM1=0;
RM2=0;LM2=1;
delay(100);
}
}
void main()
{ stop();
delay(2000);
while(1)
{
find();
bizhan();
}
}
以上內容的Word格式文檔51黑下載地址:
尋跡避障一體小車.doc
(390.5 KB, 下載次數: 43)
2021-7-24 10:18 上傳
點擊文件名下載附件
|