|
攝像頭(CAMERA或WEBCAM)又稱為電腦相機(jī)、電腦眼、電子眼等,是一種視頻輸入設(shè)備,被廣泛的運(yùn)用于視頻會(huì)議,安防系統(tǒng) 、圖像采集系統(tǒng)、 環(huán)境監(jiān)控 、工業(yè)現(xiàn)場(chǎng)過(guò)程控制 等方面。本實(shí)驗(yàn)用TPYBoard v102以及PTC06 串口攝像頭模塊DIY一個(gè)簡(jiǎn)易的照相機(jī)。
1.所用器材:
l TPYBoard v102 1塊
l PTC06 串口攝像頭模塊1個(gè)
l 杜邦線若干
l TF卡1個(gè)
l 下載數(shù)據(jù)線1條
2.TPYBoard v102簡(jiǎn)介:
TPYBoardv102主控芯片采用STM32F405,M4的內(nèi)核,168MHZ的最高運(yùn)行速度,1024KB的Flash,192KB的RAM,內(nèi)置SD卡槽,最大支持8G內(nèi)存的內(nèi)存卡。板載四個(gè)LED燈和一個(gè)加速度傳感器。TPYBoard v102板載30個(gè)通用GPIO接口、 2個(gè)SPI接口、2個(gè)CAN接口、2個(gè)I2C接口、 5個(gè)USART 接口、 2個(gè)ADC接口(精度12bit )、2個(gè)DAC接口、1個(gè)SWD接口?膳c大部分常用傳感器模塊連接。
3. PTC06 串口攝像頭模塊簡(jiǎn)介:
PTC06 串口攝像頭模塊是一款集圖像采集、拍攝控制、數(shù)據(jù)壓縮、串口傳輸于一體的工業(yè)級(jí)圖像采集處理模塊。其內(nèi)置的高性能數(shù)字信號(hào)處理芯片實(shí)現(xiàn)了對(duì)原始圖像的高比例壓縮。產(chǎn)品圖像輸 出采用標(biāo)準(zhǔn) JPEG 格式,可方便地兼容各種圖像處理軟件;采用 3 線制 TTL 電平 UART 通 信接口,可以方便地實(shí)現(xiàn)與單片機(jī)或其他微處理器連接。
默認(rèn)波特率為 115200,其它可選波特率有 9600,19200,38400 和 57600。
其中對(duì)于串口控制拍照,讀取靜態(tài)圖片的應(yīng)用中,只需要用到 GND,RX,TX,VCC 這 4 個(gè)信號(hào)線。 如果是要輸出模擬視頻的應(yīng)用,才需要將 CVBS 信號(hào)。注意: TX 和 RX 是 3.3v 的 TTL 電平信號(hào)。
4.接線方式:
5.實(shí)驗(yàn)步驟.
基本原理:TPYboard v102 通過(guò)串口與串口攝像頭模塊(PTC06)進(jìn)行連接,通過(guò)按鍵控制模塊進(jìn)行拍照,并保存到TF卡中。上電后,等待ToyBoard v102板載綠燈亮起,說(shuō)明攝像頭模塊初始化完畢,按一下USR鍵,控制攝像頭進(jìn)行拍照,藍(lán)燈會(huì)閃爍,說(shuō)明正在傳輸圖片數(shù)據(jù),等待藍(lán)燈熄滅后,說(shuō)明傳輸完畢。按一下rst鍵讓板子重新加載一下TF卡,打開(kāi)TF卡就會(huì)看到一個(gè)新生成的jpeg文件。
6.源代碼:
- """
- #TPYBoard v102 驅(qū)動(dòng)串口攝像頭PTC06 拍照并保存到TF卡
- #------------------------------------------------------
- #作者:山東蘿卜電子科技有限公司
- #時(shí)間:2018年03月15日
- """
- import pyb
- from pyb import UART,Switch
- """
- 拍照的基本流程
- --------------------
- 1.清空?qǐng)D片緩存
- 2.發(fā)送拍照命令
- 3.獲取圖片的長(zhǎng)度
- 4.根據(jù)長(zhǎng)度讀取圖片數(shù)據(jù)
- 使用到的指令與返回的數(shù)據(jù)格式
- -------------------------------
- 復(fù)位
- 0x56 0x00 0x26 0x00
- 返回
- 0x76 0x00 0x26 0x00 +DSP 版本信息+Init end
- ------------------------
- 清空?qǐng)D片緩存
- 0x56 0x00 0x36 0x01 0x02
- 返回
- 0x76 0x00 0x36 0x00 0x00
- -------------------------
- 拍照命令
- 0x56 0x00 0x36 0x01 0x00
- 返回
- 0x76 0x00 0x36 0x00 0x00
- --------------------------
- 讀所拍圖片的長(zhǎng)度
- 56 00 34 01 00
- 返回
- 0x76 0x00 0x34 0x00 0x04 0x00 0x00 XX YY
- (XX 為高位字節(jié),YY 為低位字節(jié))
- --------------------------
- 讀取圖片數(shù)據(jù)
- 0x56 0x00 0x32 0x0C 0x00 0x0A 0x00 0x00 AA BB 0x00 0x00 XX YY 0x00 0xFF
- AA BB:起始地址(先高位字節(jié),后低位字節(jié).必須是8的倍數(shù))
- XX YY:本次讀的數(shù)據(jù)長(zhǎng)度(先高位字節(jié),后低位字節(jié))
- 返回
- 76 00 32 00 00 FF D8 ....... FF D9 76 00 32 00 00
- (完整的JPEG 圖片文件是以 FF D8 開(kāi)始 FF D9 結(jié)尾)
- """
- #-----Command---------#
- initcmd=b'\x56\x00\x26\x00' #復(fù)位指令
- clearcmd=b'\x56\x00\x36\x01\x02' #清除緩存
- photocmd=b'\x56\x00\x36\x01\x00' #拍照
- lengthcmd=b'\x56\x00\x34\x01\x00' #獲取圖片長(zhǎng)度
- readcmd=b'\x56\x00\x32\x0C\x00\x0A\x00\x00' #獲取圖片數(shù)據(jù)
- responseCmd=b'\x76\x00\x32\x00\x00'#返回的圖片數(shù)據(jù)固定頭和尾
- #---------------------------------#
- isFlag=0#標(biāo)識(shí)是否初始化
- isPhoto=0#標(biāo)識(shí)是否發(fā)送拍照命令
- num=1
- f_name='/sd/photo%s.jpeg'#保存的文件名稱
- nBytes=512#每次讀取的字節(jié)數(shù)
- #---------------------------------#
- uart=UART(4,115200,timeout=100)#串口4 TX-X1 RX-X2
- #------將10進(jìn)制轉(zhuǎn)為16進(jìn)制字節(jié)數(shù)組--------#
- def convert_Data(num):
- if num>255:
- num_h=hex(num)
- if len(num_h)<6:
- num_h_a=num_h[:3]
- num_h_b='0x'+num_h[3:]
- else:
- num_h_a=num_h[:4]
- num_h_b='0x'+num_h[4:]
- byte_num=bytes([int(num_h_a,16),int(num_h_b,16)])
- else:
- byte_num=b'\x00'+bytes([num])
- return byte_num
- #---------------------------------
- #函數(shù)名:get_photo
- #描述:獲取圖片數(shù)據(jù)
- #參數(shù):起始地址、讀取長(zhǎng)度
- #返回:成功返回正常數(shù)據(jù),失敗返回0
- #---------------------------------/
- def get_photo(add,readlen):
- global readcmd,responseCmd
-
- cmd=readcmd+add+b'\x00\x00'+readlen+b'\x00\xFF'
- uart.write(cmd)
- while uart.any()<=0:
- continue
- data=uart.read()
- #print('data:',data)
- #print('data[0:5]:',data[0:5])
- #print('data[-5:]:',data[-5:])
- if data[0:5]==responseCmd and data[-5:]==responseCmd:
- revdata=data[5:-5]
- print('revdata:',revdata)
- else:
- revdata=0
- return revdata
- #---------------------------------
- #函數(shù)名:test
- #描述:USR按鍵的回調(diào)函數(shù)。
- #按鍵每按1次拍照1次
- #---------------------------------/
- def test():
- global num,isPhoto
- pyb.delay(30)
- if(sw()):
- sw.callback(None)#正在獲取數(shù)據(jù)時(shí) 禁用回調(diào)
- isPhoto=0
- num+=1
- pyb.LED(3).on()
- #清除緩存
- uart.write(clearcmd)
- #等待模塊上電完畢
- print('wait......')
- pyb.delay(2800)
- print('init start.......')
- uart.write(initcmd)
- sw=Switch()
- sw.callback(test)
- while True:
- if uart.any()>0:
- data=uart.read()
- print('revdata:',data)
- if isFlag==0:
- #說(shuō)明接收的是復(fù)位后的信息
- if data==b'Init end\r\n':
- #復(fù)位完畢
- print('init ok.......')
- pyb.delay(2000)
- isFlag=1
- pyb.LED(2).on()
- else:
- if len(data)>=5:
- if data[0]==118:#0x76
- if data[2]==54:#0x36
- if isPhoto==0:
- #清除緩存返回
- print('-----clear buffer ok----')
- isPhoto=1
- uart.write(photocmd)
- else:
- #拍照返回
- print('-----taking pictures ok----')
- uart.write(lengthcmd)
- if data[2]==52:#0x34
- print('photo length:',data[7],'-',data[8])
- tlen=data[7]*256+data[8]
- t_c=tlen//nBytes
- t_y=tlen%nBytes
- add=0
- #256=[0x01,0x00] 512=[0x02,0x00]
- length=convert_Data(nBytes)
- name=f_name % str(num)
- print('filename:',name)
- for i in range(0,t_c):
- add=convert_Data(i*nBytes)
- #每512字節(jié)寫(xiě)一次
- revdata=get_photo(add,length)
- if revdata!=0:
- f=open(name,'a')
- f.write(revdata)
- f.close()
- pyb.LED(4).toggle()
- print('-------------',i)
- pyb.delay(100)
- add=convert_Data(t_c*nBytes)
- revdata=get_photo(add,convert_Data(t_y))
- if revdata!=0:
- f=open(name,'a')
- f.write(revdata)
- f.close()
- pyb.LED(3).off()
- pyb.LED(4).off()
- pyb.delay(100)
- print('*========================================*')
- sw.callback(test)
- else:
- print('-----data length error-----')
復(fù)制代碼
|
|