【C51开发应用】基于C51单片机开发的循迹灭火机器人
基于C51單片機開發的循跡滅火機器人
- 一、作品摘要
- 二、系統設計步驟
- 三、方案設計
- 3.1???小車主體設計
- 3.1.1???購買玩具小車進行改裝
- 3.1.2???自己設計小車主體結構
- 3.2???電機驅動模塊
- 3.2.1???使用MOSFET構成H橋式驅動電路
- 3.2.2???使用直流電機驅動芯片L298N
- 3.3???紅外循跡模塊
- 3.4???火焰識別模塊
- 3.4.1???使用紫外傳感器識別火焰
- 3.4.2???使用紅外傳感器識別火焰
- 3.5??? 滅火模塊
- 3.5.1???用水滅火
- 3.5.2???用風扇滅火
- 3.6??? 滅火模塊
- 四、機器人的設計與組成
- 4.1??? 1路循跡模塊
- 4.2??? 火焰傳感器
- 4.3??? L298N驅動模塊
- 4.4??? 舵機
- 4.5??? 風機
- 4.6??? 開發系統
- 4.7??? 直流繼電器
- 五、編程思路
- 5.1??? 循跡部分
- 5.2??? 火焰識別部分
- 5.3??? 滅火部分
- 六、程序
- 6.1??? 循跡滅火機器人.c
- 6.2??? duoji.h
一、作品摘要
???????本設計由電機驅動模塊、紅外循跡模塊、火焰識別模塊、滅火模塊以及MCU 控制模塊五大部分構成。本設計采用深圳宏晶科技有限公司的STC89C52RC單片機作為小車的控制核心,實現對各個模塊的通訊和控制。循跡部分由集成式紅外探頭組成,將采集到的數據處理后反饋至單片機。尋火部分由火焰傳感器模塊組成。滅火部分由升壓電路和風扇組成。電機由以L298N為核心部件的電路驅動。該小車具有按照指定的軌跡巡線,發現火源進行滅火的功能。基于穩定的硬件電路設計以及精確可靠的軟件算法,小車能夠實現預期功能。
二、系統設計步驟
(1)根據設計要求,確定控制方案;
(2)將各個模塊進行組裝并進行簡單調試;
(3)畫出程序流程圖,使用C語言進行編程;
(4)將程序燒錄到單片機內;
(5)進行調試以實現控制功能。
?
三、方案設計
3.1???小車主體設計
3.1.1???購買玩具小車進行改裝
???????采用玩具小車來改裝,加入自己的控制系統即可,這樣的優勢是,省去了制作車體的功夫。另外小車主體布局也比較合理,可以較好地完成任務。
3.1.2???自己設計小車主體結構
???????自己設計制造小車主體結構,能夠按照布局設計思路來完成小車主體結構的調整,保證電路部分和機械部分的全面協,可以合理地安放傳感器。但是自己設計的小車難免會外表粗糙,費時費力。
???????綜合考慮各種利弊,兼顧小車制作周期問題,選擇了購買小車主體結構,從而縮短小車的制作周期。
?
3.2???電機驅動模塊
???????鑒于價格和功能的考慮,我們選擇了直流電機,通過PWM控制小車的速度以及方向。電機驅動部分有以下兩種方案:
3.2.1???使用MOSFET構成H橋式驅動電路
???????利用PWM波形來控制小車的速度,再用單片機兩個I/O口控制電機旋轉方向,此電路驅動功率比較大,小車的轉速比較快。
3.2.2???使用直流電機驅動芯片L298N
???????L298N作為集成芯片,一塊芯片能夠輸出兩路PWM波形,控制兩個電機,而且還帶有控制使能端。用該芯片作為電機驅動,操作方便,穩定性好,性能優良。相對于由MOSFET構成的H橋式驅動電路來說具有電路焊接簡單,焊接完成后不易出差錯的優點。二者價格上差別不大,所以我們優先選擇了方案(2)。
?
3.3???紅外循跡模塊
???????每一路的傳感器的紅外發射管不斷發射紅外線,當發射出的紅外線沒有被反射回來或被反射回來但強度不夠大時,紅外接收管一直處于關斷狀態,此時模塊的TTL輸出端為高電平,相應指示二極管一直處于熄滅狀態;當被檢測物體出現在檢測范圍內時,紅外線被反射回來且強度足夠大,紅外接收管導通,此時模塊的TTL輸出端為低電平,指示二極管被點亮。黑線檢測電路,可以將紅外探頭放在車的底盤上,這樣檢測比較精準。在連接電路時,要做成可以調節探測距離的電路,完成之后調節傳感器使得小車能夠準確探測到黑線,從而做出正確的動作。
???????鑒于各種循跡模塊均大同小異,選擇采用性價比較高的FC-123紅外循跡傳感器。
?
3.4???火焰識別模塊
???????火焰檢測有溫度傳感器、煙霧傳感器、紅外傳感器、紫外傳感器以及CCD傳感器。綜合論證這幾種傳感器,因本設計使用蠟燭模擬火源,對環境溫度影響小,煙霧少,排除了溫度傳感器、煙霧傳感器。考慮到易用性,排除了CCD傳感器,從而主要考慮以下兩種方案。
3.4.1???使用紫外傳感器識別火焰
???????紫外線傳感器只對185~260NM狹窄范圍內的紫外線進行響應,而對其它頻譜范圍的光線不敏感,利用它可以對火焰中的紫外線進行檢測。具有靈敏度高,檢測及時準確、抗干擾性強的特點。主要缺點是價格是紅外傳感器的8-10倍。
3.4.2???使用紅外傳感器識別火焰
???????紅外火焰傳感器可以用來探測火源或其它一些波長在700納米~1000納米范圍內的熱源。利用它可以對燃燒時發出大量紅外光進行檢測。價格低廉,但是容易受到外界光的干擾。綜合考慮,采用紅外傳感器識別火焰,并采取相應措施排除干擾。
???????綜合考慮各種因素,兼顧火焰識別模塊的成本問題,選擇用紅外傳感器識別火焰。
?
3.5??? 滅火模塊
3.5.1???用水滅火
???????水可以很好的將蠟燭澆滅。但是不管是擠壓噴水還是使用水泵噴水,在噴水的遠近和廣度難以控制,并且使用大電流電機對電源的沖擊相當大,難以保證系統的穩定性。
3.5.2???用風扇滅火
???????雖然風能助長火勢,但是在火源比較小的情況下,風將可燃物的溫度降到燃點之下,實現滅火。
???????采用風扇已經可以滿足模擬滅火需求,而且選用風扇在硬件制作和軟件編程上更簡單、更容易操控。
?
3.6??? 滅火模塊
???????電源部分,可以使用幾節5號電池串聯,但是這樣電池使用效率比較低,而且5號電池功率不夠大,容量也太小,不能長時間供電,最后決定使用4節鋰電池(3.7V 18650鋰電池串聯而成),為電機和風扇供電,再利用降壓模塊來產生5V的直流電壓,為電路中的各個芯片提供正常工作電壓。
?
四、機器人的設計與組成
4.1??? 1路循跡模塊
???????TCRT5000傳感器的紅外發射二極管不斷發射紅外線,當發射出的紅外線沒有被反射回來或被反射回來但強度不夠大時,紅外接收管一直處于關斷狀態,此時模塊的輸出端為低電平,指示二極管一直處于熄滅狀態;被檢測物體出現在檢測范圍內時,紅外線被反射回來且強度足夠大,紅外接收管飽和,此時模塊的輸出端為高電平,指示二極管被點亮。
圖4.1???1路循跡模塊4.2??? 火焰傳感器
???????火焰傳感器對太陽光有反應,并且對火焰光特別敏感。可檢測一定范圍內的光源,探測角度為60度左右,可用于火焰預警、火焰識別。
???????公共端、常閉、常開三個端口相當于一個雙控開關。繼電器線圈有電時,公共端與常開端導通;無電時,公共端與常閉端導通。
???????可以通過調節電位器來設定傳感器對火焰感應的強度。當火焰超過閥定值,繼電器吸合,公共端與常開端導通;當火焰低于閥定值,繼電器斷開,公共端與常閉端導通。
4.3??? L298N驅動模塊
???????L298N作為集成芯片,一塊芯片能夠輸出兩路PWM波形,控制兩個電機,而且還帶有控制使能端。用該芯片作為電機驅動,操作方便,穩定性好,性能優良。
???????具備大容量濾波電容,續流保護二極管,可以提高可靠性。
???????采用標準邏輯電平信號控制;具有兩個使能控制端,在不受輸入信號影響的情況下允許或禁止器件工作有一個邏輯電源輸入端,使內部邏輯電路部分在低電壓下工作。
4.4??? 舵機
???????主要是由外殼、電路板、驅動馬達、減速器與位置檢測元件所構成,如滾轉運動等都是靠舵機相互配合完成的。轉動角度:0-180°。
圖4.4???舵機4.5??? 風機
???????采用8cm×8cm規格的風機,以簡單的風機轉動,達到利用空氣熄滅蠟燭火焰的效果。轉速參考:4000±10%RPM,噪音參考:18DB,風量參考:18.17-25.97CFM。
圖4.5???風機4.6??? 開發系統
???????具備了DC取電口/ISP下載口/RS232串口/USB轉串口等這幾個必需的實驗接口;8路LED燈,紅外線接收頭可用于紅外遙控解碼;已集成USB轉串口電路,可用一根USB線就可完成下載燒寫及供電,即可當STC編程器使用。具備51/AVR雙復位電路,以及18B20單總線溫度傳感器接口。
圖4.6???開發系統4.7??? 直流繼電器
???????這是由手工焊制而成的直流繼電器模塊,可以控制并驅動12V直流風機。
???????特點:1.采用松樂—繼電器控制;2.信號輸入端有低電平信號時,公共端和常開端會導通;3.繼電器可以直接控制各種設備和負載;4.有一個常開和一個常閉觸點。
?
五、編程思路
圖5.0.1???程序控制示意圖5.1??? 循跡部分
???????循跡主要解決以下幾種情況:(左右情況剛好相反,現以其中一種情況為例介紹說明)
| 圖1??情況一 | 圖2??情況二 | 圖3??情況三 |
5.2??? 火焰識別部分
???????因為火源位于軌跡兩側,所以火焰識別模塊只需布置在小車兩側即可滿足尋火。同時在每一側各布置3個并排的火焰識別模塊,這樣可以提高小車滅火的容錯性,從而達到 滅火要求。
圖5.2.1???火焰識別部分結構示意圖5.3??? 滅火部分
???????舵機安裝在紅色部分的位置,當任意一側的任一個或多個火焰識別模塊檢測到火源時,舵機會根據信號反饋轉向檢測到的方向,同時繼電器常開端吸合,風機打開,開始滅火。當火源被撲滅后,由于火焰識別模塊未檢測到火源,繼電器常開端斷開,風機停止工作,舵機復位,小車繼續循跡。
圖5.3.1???滅火部分結構示意圖六、程序
6.1??? 循跡滅火機器人.c
#include <AT89X52.H> #include <duoji.h> #define uint unsigned int #define uchar unsigned char//火焰識別模塊輸入I/O口 sbit relay1=P2^0; sbit relay2=P2^1; sbit relay3=P2^2; sbit relay4=P2^3; sbit relay5=P2^4; sbit relay6=P2^5;sbit fan=P2^7;//風扇+繼電器信號端 sbit duoji=P2^6;//舵機信號端//定義小車驅動模塊輸入IO口 sbit EN1=P0^5; sbit IN1=P0^1; sbit IN2=P0^2; sbit IN3=P0^3; sbit IN4=P0^4; sbit EN2=P0^0;#define Left_1_led P1_3 // 左傳感器 #define Left_2_led P1_2 // 左傳感器 #define Right_2_led P1_0 //右傳感器 #define Right_1_led P1_1 //右傳感器 #define Left_moto_pwm P0_5 //PWM信號端 #define Right_moto_pwm P0_0 //PWM信號端#define Left_moto_go {IN1=0,IN2=1;} //左電機向前走 #define Left_moto_back {IN1=1,IN2=0;} //左邊電機向后轉 #define Left_moto_Stop {EN2=0;} //左邊電機停轉 #define Right_moto_go {IN3=0,IN4=1;} //右邊電機向前走 #define Right_moto_back {IN3=1,IN4=0;} //右邊電機向后走 #define Right_moto_Stop {EN1=0;} //右邊電機停轉 uchar pwm_val_left =0;//變量定義 uchar push_val_left =0;//左電機占空比N/20 uchar pwm_val_right =0; uchar push_val_right=0;//右電機占空比N/20bit Right_moto_stop=1; bit Left_moto_stop =1; uint time=0;/************************************************************************/ //延時函數 void delay(uint k) { uint x,y;for(x=0;x<k;x++) for(y=0;y<2000;y++); }/************************************************************************/ //前速前進 void run(void) {push_val_left=3.5; //速度調節變量 0-20。。。0最小,20最大push_val_right=3.5;Left_moto_go ; //左電機往前走Right_moto_go ; //右電機往前走delay(1); }//后退函數 void backrun(void) {push_val_left=3.5; //速度調節變量 0-20。。。0最小,20最大push_val_right=3.5;Left_moto_back; //左電機往前走Right_moto_back; //右電機往前走 }//左轉 void leftrun(void) { // push_val_left=5;push_val_right=3.5;Right_moto_go ; //右電機往前走Left_moto_Stop ; //左電機停止 }void leftrun1(void) { // push_val_left=5;push_val_right=4;Right_moto_go ; //右電機往前走Left_moto_Stop ; //左電機停止 }void leftrun2(void) { // push_val_left=5;push_val_right=5;Right_moto_go ; //右電機往前走Left_moto_Stop ; //左電機停止 }void leftrun3(void) { // push_val_left=5;push_val_right=5.5;Right_moto_go ; //右電機往前走Left_moto_Stop ; //左電機停止 }//右轉 void rightrun(void) { push_val_left=3.5; // push_val_right=6;Left_moto_go ; //左電機往前走Right_moto_Stop ; //右電機 }void rightrun1(void) { push_val_left=4; // push_val_right=6;Left_moto_go; //左電機往前走Right_moto_Stop; //右電機 }void rightrun2(void) { push_val_left=5; // push_val_right=6;Left_moto_go ; //左電機往前走Right_moto_Stop ; //右電機 }void rightrun3(void) { push_val_left=5.5; // push_val_right=6;Left_moto_go ; //左電機往前走Right_moto_Stop; //右電機 }//停止函數 void stop(void) { fan=0; Right_moto_Stop; //右電機Left_moto_Stop; //左電機停止 }/************************************************************************/ /* PWM調制電機轉速 */ /************************************************************************/ /* 左電機調速 */ /*調節push_val_left的值改變電機轉速,占空比 */ void pwm_out_left_moto(void) { if(Left_moto_stop){if(pwm_val_left<=push_val_left){Left_moto_pwm=1; // Left_moto_pwm1=1; }else {Left_moto_pwm=0; // Left_moto_pwm1=0; }if(pwm_val_left>=20)pwm_val_left=0;}else {Left_moto_pwm=0; // eft_moto_pwm1=0; } }void xunji()//循跡函數 {fan=1;//有信號為0 沒有信號為1if(Left_1_led==1&&Left_2_led==1&&Right_2_led==1&&Right_1_led==1) //檢測信號1111run(); //調用前進函數else{ if(Left_1_led==1&&Left_2_led==0&&Right_2_led==0&&Right_1_led==1) //檢測信號1001run(); //調用前進函數if(Left_1_led==1&&Left_2_led==1&&Right_2_led==0&&Right_1_led==1) //右邊檢測到紅外信號1101rightrun(); //調用小車右轉函數if(Left_1_led==1&&Left_2_led==1&&Right_2_led==0&&Right_1_led==0) //右邊檢測到紅外信號1100rightrun1(); //調用小車右轉函數1if(Left_1_led==1&&Left_2_led==1&&Right_2_led==1&&Right_1_led==0) //右邊檢測到紅外信號1110rightrun2(); //調用小車右轉函數2if(Left_1_led==1&&Left_2_led==0&&Right_2_led==0&&Right_1_led==0) //右邊檢測到紅外信號1000rightrun3(); //調用小車右轉函數3 if(Left_1_led==1&&Left_2_led==0&&Right_2_led==1&&Right_1_led==1) //左邊檢測到紅外信號1011 leftrun(); //調用小車左轉函數if(Left_1_led==0&&Left_2_led==0&&Right_2_led==1&&Right_1_led==1) //左邊檢測到紅外信號0011 leftrun1(); //調用小車左轉函數1if(Left_1_led==0&&Left_2_led==1&&Right_2_led==1&&Right_1_led==1) //左邊檢測到紅外信號0111 leftrun2(); //調用小車左轉函數2if(Left_1_led==0&&Left_2_led==0&&Right_2_led==0&&Right_1_led==1) //左邊檢測到紅外信號0001 leftrun3(); //調用小車左轉函數3if(Left_1_led==0&&Left_2_led==0&&Right_2_led==0&&Right_1_led==0) //檢測信號0000 stop(); //調用小車停止函數//run(); //調用前進函數} }void xunhuo()//滅火函數 {if(relay1==0||relay2==0||relay3==0||relay4==0||relay5==0||relay6==0){djmain();if(relay1==0||relay2==0||relay3==0){angle=9; }if(relay4==0||relay5==0||relay6==0){angle=3; }stop();TR1=0;}else { angle=6; xunji();} }void init() {fan=1;TMOD=0X01;TH0= 0XFc; //1ms定時TL0= 0X18;TR0= 1;ET0= 1;EA = 1; //開總中斷 }/******************************************************************/ /* 右電機調速 */ void pwm_out_right_moto(void) { if(Right_moto_stop){ if(pwm_val_right<=push_val_right){Right_moto_pwm=1; // Right_moto_pwm1=1; }else {Right_moto_pwm=0; // Right_moto_pwm1=0; }if(pwm_val_right>=20)pwm_val_right=0;}else {Right_moto_pwm=0; // Right_moto_pwm1=0; } }/***************************************************/ ///*TIMER0中斷服務子函數產生PWM信號*/ void timer0()interrupt 1 using 2 {TH0=0XFc; //1Ms定時TL0=0X18;time++;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto(); }void main()//主函數 { init();while(1) //無限循環{ xunhuo(); } }6.2??? duoji.h
#include <AT89X52.H> #define uint unsigned int #define uchar unsigned charsbit dj=P3^6; //與舵機相連的信號口 uchar djpwm; //舵機的pwm uchar angle=6; //控制舵機角度的變量,默認為45度,范圍2到10,對應0到180度//***********************************************************************************///* void djdelay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}*/void Timer1_Init(void) {TMOD=0x20;TH1=6; //設定為0.25觸發一次定時器中斷TL1=6;ET1=1;EA=1;TR1=1; }//主函數 void djmain() {Timer1_Init(); //定時器一中斷初始化 } //***********************************************************************************// //定時器1中斷 void Time1_Isr() interrupt 3 {djpwm++; //判斷自加if(djpwm==angle) //與角度變量比較{dj=0; //接舵機IO置0}if(djpwm==80) //0.25*80=20ms???{djpwm=0; //清零dj=1; //接舵機IO置一} }總結
以上是生活随笔為你收集整理的【C51开发应用】基于C51单片机开发的循迹灭火机器人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps 证件照替换背景色
- 下一篇: oppo怎么广告接入_oppo信息流广告