作品地址:http://www.3532n.com/project/33798
作者:Mak_z
項目簡介:
使用基于RT-thread操作系統的AB32VG1開發板作為主控,對ov7670攝像頭進行圖像采集,并使用串口發送圖片RGB565格式到PC供opencv進行圖像識別。原項目設想在開發板上進行采集的同時并通過簡單的二值算法和插值算法實現車牌號識別,但實踐中發現開發板的ram并不夠保存采集回來的圖像信息,與數據手冊中介紹的192k有一定差距,實現用戶能使用的ram是70k;同時原設想是帶lcd屏幕的,但最后發覺io口數量不夠,只能通過串口調試顯示,但lcd屏幕的 spi代碼仍保留在原碼中,可供參考。目前開發板通過攝像頭采集完整數據部分已經完成,并且可以通過串口uart1發送到上位機進行圖像顯示。識別號牌上位機需要另外再做。
硬件說明:
1.攝像頭ov7670帶fifo:采用csi總線的普通30w攝像頭。考慮到用模擬讀取攝像頭,io的反轉速度可能不能滿足高速采集的需要,因此保險起見,直接使用帶fifo的攝像頭。sccb總線采用全模擬的方式,跳過了所有中間層,直接操作寄存器,提高了總線的時鐘。

2.串口工具PL2302(ttl轉RS232),一款與pc通訊的串口工具,免驅。

3.總接線圖

軟件說明:
1.軟件流程圖

2.關鍵代碼
/* 攝像頭IO口采用直接操作寄存器的方式實現,極大提升io速度 *//* sccb總線的初始化并設置ov7670相應寄存器 */sccb_init();if(sccb_write_reg(0x12, 0x80) == RT_FALSE){return RT_FALSE;}rt_thread_delay(50);id1 = sccb_read_reg(0x0b);id2 = sccb_read_reg(0x0a);rt_kprintf("id1 = 0x%02x, id2 = 0x%02x\n", id1, id2);for(rt_uint16_t i = 0;i < sizeof(ov7670_init_reg_tbl) / sizeof(ov7670_init_reg_tbl[0]);i++){sccb_write_reg(ov7670_init_reg_tbl[0], ov7670_init_reg_tbl[1]);}/* 開啟攝像頭vsync掃描線程(沒有外部中斷因此改用輪詢的方式實現) */rt_thread_t thread;/* 查詢VSYNC線程 */thread = rt_thread_create("ov7670_vsync", ov7670_vsync_thread_entry, RT_NULL, 1024, 5, 100);if (thread == RT_NULL){rt_kprintf("ov7670_vsync thread create fail!\n");return RT_FALSE;}/* 啟動線程 */rt_thread_startup(thread);/* 提取hal庫實現了uart的數據發送函數 */void uart1_send(rt_uint8_t *pbuf, rt_uint32_t len){for(rt_uint32_t i = 0;i < len;i++){hal_uart_clRFlag(UART1_BASE, UART_FLAG_TXPND);hal_uart_write(UART1_BASE, pbuf);while(hal_uart_getflag(UART1_BASE, UART_FLAG_TXPND) == 0);}}/* LCD底層驅動代碼,因為引腳不夠,所以無法演示,測試可用,另外程序里也配有寄存器版本的操作代碼 */static rt_uint32_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *message){struct rt_spi_bit_ops *ops = (struct rt_spi_bit_ops *)device->user_data;rt_uint8_t tmp_buf[1024];rt_memset(tmp_buf, 0, sizeof(tmp_buf));if(message->send_buf == RT_NULL){message->send_buf = tmp_buf;}else if(message->recv_buf == RT_NULL){message->recv_buf = tmp_buf;}else{return RT_FALSE;}if (message->cs_take){ops->set_cs(ops->data, PIN_LOW);}message->length & SPI_DC ? ops->set_dc(ops->data, PIN_HIGH) : ops->set_dc(ops->data, PIN_LOW);message->length &= ~SPI_DC; /* 復原消息長度 */// rt_kprintf("message->length = %d\n", message->length);spi_rw_bytes(device, (rt_uint8_t *)message->send_buf, (rt_uint8_t *)message->recv_buf, message->length);if (message->cs_release){ops->set_cs(ops->data, PIN_HIGH);}}static const struct rt_spi_ops spi_bit_bus_ops ={RT_NULL,spi_bit_xfer};
優化思路:
1. 由于ab32vg1沒有外部中斷可以使用,ov7670的幀同步信號vsync只有500us的高電平時間,因此為了捕捉到該信號,vsync線程一直占用很多的資源;
2. 串口與上位通訊的速度目前最快只有115200bps,上位機可以接受256000bps的速度,但將驅動改為256000bps后,接收會出現亂碼,因此串口使用的圖片數據非常緩慢。
項目演示

-
RT-Thread
+關注
關注
32文章
1614瀏覽量
44887
發布評論請先 登錄
基于RT-Thread和兆易創新GD32F527系列MCU的健康監測站 | 技術集結
新疆移動攜手華為斬獲第三屆IPv6技術應用創新大賽一等獎
晶能光電斬獲2025年度江西省省長質量獎提名獎與標準項目獎一等獎
2025 RT-Thread 嵌入式大賽排名公布!作品共賞,看大獎花落誰家!
華為與廣東移動榮獲ICT中國2025案例一等獎
華為與中國移動合作榮獲第三屆“新綠杯”全國總決賽一等獎
華為榮獲第三屆“華彩杯”算力大賽北區決賽一等獎
華礪智行榮獲湖北省科學技術進步獎一等獎
喜報!康柚斬獲全國數據創新大賽一等獎,與中石油、中國移動等名企同臺載譽!
易控智駕榮獲應急管理科技創新獎一等獎
季豐電子斬獲中國儀器儀表學會科學技術獎一等獎
英諾達斬獲第四屆“創贏未來”集成電路賽道一等獎
電科網安斬獲2025數字中國創新大賽一等獎
三獲殊榮 | 經緯恒潤再獲中國港口協會科技進步獎一等獎
【一等獎】RT-Thread創新應用設計大賽作品
評論