|
攝像頭循跡原理:
通過對ov7670采集的數(shù)據(jù)進(jìn) 行相關(guān)寄存器配罝得到底片色(黑線為白線,白底為黑 色)處理•如圖•因?yàn)榧拇?器配罝的黑白色自己一直沒的到自己想要的結(jié)果!然而 通過RGB565數(shù)據(jù)做相應(yīng)處理后雖然得到了黑白照片,但 是存在一定開銷。
采集三塊像素點(diǎn)的數(shù)據(jù)塊(每塊20個(gè)像素點(diǎn)),如圖。算法.•當(dāng)2的白底個(gè)數(shù)小于13 (用于濾波的數(shù)字根據(jù)自己的定義選擇)時(shí),返回stop。當(dāng)2的白大于13.且數(shù)據(jù)塊1,3的黑點(diǎn)大于13向前。左側(cè)檢測到白線向右右倆檢測到白線向左
stm32單片機(jī)源碼預(yù)覽:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "ov7670.h"
- #include "exti.h"
- #include "motor.h"
- u8 ov_sta; //在exit.c里面定義
- MOTOR GmLeft = {MOTOR_STOP,MOTOR_GOAHEAD,0,0,0};//定義并初始化左電機(jī)狀態(tài)
- MOTOR GmRight = {MOTOR_STOP,MOTOR_GOAHEAD,0,0,0};//定義并初始化右電機(jī)狀態(tài)
- u16 Array[60] ={
- /*采集像素點(diǎn)矩陣【(46,150),(49,154)】 320列*/
- 14870,14871,14872,14873,14874,
- 15190,15191,15192,15193,15194,
- 15510,15511,15512,15513,15514,
- 15830,15831,15832,15833,15834,
- /*采集像素點(diǎn)矩陣【(100,10),(104,13)】 320列*/
- 32010,32011,32012,32013,
- 32330,32331,32332,32333,
- 32650,32651,32652,32653,
- 32970,32971,32972,32973,
- 33290,33291,33292,33293,
- /*采集像素點(diǎn)矩陣【(165,150),(168,154)】 320列 */
- 52950,52951,52952,52953,52954,
- 53270,53271,53272,53273,53274,
- 53590,53591,53592,53593,53594,
- 53910,53911,53912,53913,53914,
- };
- //更新LCD顯示
- u8 camera_refresh(void)
- {
- u32 j;
- u8 k = 0;
- u16 color;
- u8 whitepoint = 0;
- u8 leftblackpoint = 0;
- u8 rightblackpoint = 0;
- u8 JudgeFlag = 0;
-
-
- if(ov_sta==2)
- {
- LCD_Scan_Dir(U2D_L2R); //從上到下,從左到右
- LCD_SetCursor(0x00,0x0000); //設(shè)置光標(biāo)位置
- LCD_WriteRAM_Prepare(); //開始寫入GRAM
- OV7670_RRST=0; //開始復(fù)位讀指針
- OV7670_RCK=0;
- OV7670_RCK=1;
- OV7670_RCK=0;
- OV7670_RRST=1; //復(fù)位讀指針結(jié)束
- OV7670_RCK=1;
-
- for(j=0;j<76800;j++)
- {
- GPIOB->CRL=0X88888888;
- OV7670_RCK=0;
- color=GPIOB->IDR&0x00FF; //讀數(shù)據(jù)
- OV7670_RCK=1;
- color<<=8;
- OV7670_RCK=0;
- color|=GPIOB->IDR&0x00FF; //讀數(shù)據(jù)
- OV7670_RCK=1;
- GPIOB->CRL=0X33333333;
- LCD_WR_DATA(color);
- // EXTI_ClearITPendingBit(EXTI_Line15);
- if(j == Array[k]&&(k<=60))//init(k) = 0 -=
- {
- if(k < 20)
- {
-
- if(!(color&0x8000)) //檢測底片 黑,如果bit15為0,則黑點(diǎn)
- leftblackpoint++;
-
- }
- else if(k < 40)
- {
- if(color&0x8000)
- whitepoint++; //測得白點(diǎn)
-
- }
- else if(k < 60)
- {
- if(!(color&0x8000)) //檢測底片 黑,如果bit15為0,則黑點(diǎn)
- rightblackpoint++;
-
- }
- k++;
- }
- }
-
- ov_sta=0; //開始下一次采集
- // LCD_Scan_Dir(DFT_SCAN_DIR); //恢復(fù)默認(rèn)掃描方向
- k=0;
- if(whitepoint<=13) //中間端未檢測到白色則停止
- {
- JudgeFlag = 0;// stop
- }
- else
- {
- if((whitepoint>13)&&(leftblackpoint>13)&&(rightblackpoint>13))//如果左端塊黑色 中端塊白色 右端塊黑色 則前進(jìn)
- {
- JudgeFlag = 1;
- }
-
- if(leftblackpoint <= 13 && rightblackpoint >13) //左端白色 右端黑色 則向往右
- {
- JudgeFlag = 2; //rihgt
- }
- if(leftblackpoint > 13 && rightblackpoint <= 13) //右端白色 左端黑色 則向往左
- {
- JudgeFlag = 3; //left
- }
- }
- }
-
- return JudgeFlag;
- }
- int main(void)
- {
-
- delay_init(); //延時(shí)函數(shù)初始化
- uart_init(9600); //串口初始化為9600
- LED_Init(); //LED端口初始化
- LCD_Init();
- Motor_Init();
-
- POINT_COLOR=RED;//設(shè)置字體為紅色
- LCD_ShowString(60,110,200,16,16,"OV7670 Init...");
-
- while(OV7670_Init())//初始化OV7670
- {
- LCD_ShowString(60,230,200,16,16,"OV7670 Error!!");
- delay_ms(200);
- LCD_Fill(60,230,239,246,WHITE);
- delay_ms(200);
- }
- LCD_ShowString(60,110,200,16,16,"OV7670 Init OK");
- delay_ms(1500);
- EXTI15_Init();
- OV7670_Special_Effects(1);
- OV7670_Light_Mode(2);
- ov_sta=0;
- OV7670_CS=0;
-
- while(1)
- {
- u8 flag ;
- flag = camera_refresh();
- /*LED0 red \ LED1 green */
- switch(flag)
- {
- case 0:Motor_Stop();break; //0 stop
- case 1:Motor_GOStraight();delay_ms(500);break; //每一TIMER(20ms),走20step,
- case 2:Motor_GORight();delay_ms(500);break; //2 往右 左步進(jìn)電機(jī)轉(zhuǎn)動 LED1= 1
- case 3:Motor_GOLeft();delay_ms(500);break; //3 往左 右步進(jìn)電機(jī)轉(zhuǎn)動
- default:break;
- }
- }
- }
復(fù)制代碼 全部資料下載地址:
攝像頭循跡V1.0.rar
(663.22 KB, 下載次數(shù): 588)
2017-8-2 22:54 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|