現在在做一個硬件項目,主要是用“高端的”51單片機連一個攝像頭完成二維碼識別的問題。
目錄:
一、解決方案
二、詳細分析
一、解決方案:
現在的需求是:給出二維碼(可能存在圖像偏移、旋轉等問題),輸出一個解碼的字符串
解決方案目前是這樣設計的:
這裏有幾個點:
1. 選什麼攝像頭
2. 攝像頭怎麼連開發板
3. 開發版上面怎麼編程?怎麼獲取io信息
4. 怎麼輸出
當然,本項目最關鍵的還是其中的識別過程。
一、選什麼攝像頭
基本上所有的OV系列的攝像頭都差不多,選擇了一款比較常規的ov7670攝像頭
二、攝像頭怎麼連接開發板
這個目前打算用杜邦線解決
三、開發版上面怎麼編程?怎麼獲取io信息
這也是本項目的難點,因爲一直是做深度學習算法,對於硬件開發根本不會。本節也記錄學習歷程。
首先,瞭解一下51單片機的原理:
51單片機是由存儲器、控制器、io組成的微型計算機。
所有的引腳可以分爲電源、時鐘、控制、IO這幾種,51單片機屬於8位單片機。
單片機基礎補充:
(1)電平特性:高電平(5V)低電平(0V)
(2)進制
(3)邏輯運算:0 1
與或非、異或
串口與並口:串口就是速度快的一種直線型傳輸,並口是指8根通道齊發由於數據間會存在干擾,所以速度會慢。
(4)編程語言
基本上使用C與彙編
上拉電阻?
就是一種用來控制空電極的東西?這個還沒弄懂
晶振
通過晶體振動提供頻率信號
回到主題,怎麼在單片機上編程呢?這裏使用的是keil,安裝教程如下:https://blog.csdn.net/qq_41639829/article/details/81813992
二、詳細分析:
第一個問題就是資源佔用問題,圖像從攝像頭弄到板子上需要的是數據空間,對圖像數據進行處理,也需要計算空間,那麼這些東西究竟需要多少資源呢?
除了以上的問題,還有問題就在於,哪些是在rom上進行,哪些是在ram上進行。
我們先弄清楚哪些在rom上進行,哪些是ram上進行的。
ram(數據存儲器)、rom(程序存儲器)--------------------確定
那麼我們的程序放在rom裏。
(插一句,我們的rom和ram分別有多大呢?
說明文檔說了T5L芯片是片內64KB的RAM,ROM是32KB)
好,現在能確定的是代碼的編碼需要存在ROM裏面,運算可以在MDU(數學運算單元)中進行。那麼現在問題就在於每一幀的圖片以及如何選取計算的量應該就是在RAM中進行了。無疑問題就在於我們的圖片輸出多大。接下來就是ov7060攝像頭的研究分析了。
ov7060攝像頭
YUV4:2:2
這個是個啥?就是輸出的碼流,她每一次都會輸出Y,每隔一次輸出U\V,對於一個這樣的[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3],輸出是這樣的Y0 U0 Y1 V1 Y2 U2 Y3 V3
但是我們需要知道他輸出的分辨率,圖像的大小,與這個無關,繼續看。
他反覆提到一個感光陣列(640X480)這個長得很像像素,那麼感光陣列是個啥?瞭解完畢,就是像素。
那麼我們又能更新一條有用信息:攝像頭的輸出是30萬像素的。
那麼對於空間資源的最後一個問題就是,需要多少RAM來處理這30萬像素?
如圖所示,圖片是進到這個數據寄存器裏面,就是那額256KB