像頭(CAMERA或WEBCAM)又稱為電腦相機、電腦眼、電子眼等,是一種視頻輸入設備,被廣泛的運用于視頻
會議,安防系統(tǒng)??、圖像采集系統(tǒng)、?環(huán)境監(jiān)控?、工業(yè)現(xiàn)場過程控制?等方面。本實驗用TPYBoard? v102以
及PTC06?串口攝像頭模塊DIY一個簡易的照相機。
1.所用器材:
??? TPYBoard v102 ?1塊
??? PTC06?串口攝像頭模塊1個
????杜邦線若干
??? TF卡1個
????下載數(shù)據(jù)線1條
2.TPYBoard v102簡介:
TPYBoard? v102主控芯片采用STM32F405,M4的內(nèi)核,168MHZ的最高運行速度,1024KB的Flash,192KB的
RAM,內(nèi)置SD卡槽,最大支持8G內(nèi)存的內(nèi)存卡。板載四個LED燈和一個加速度傳感器。TPYBoard v102板載
30?個通用GPIO?接口、?2個?SPI?接口、2個?CAN??接口、2個I2C??接口、?5個?USART?接口、?2個ADC接
口?(精度12bit?)?、2個DAC接口、?? 1個SWD接口??膳c大部分常用傳感器模塊連接。
3. PTC06?串口攝像頭模塊簡介:
?
PTC06?串口攝像頭模塊是一款集圖像采集、拍攝控制、數(shù)據(jù)壓縮、串口傳輸于一體的工業(yè)級圖像采集?處理模
塊。其內(nèi)置的高性能數(shù)字信號處理芯片實現(xiàn)了對原始圖像的高比例壓縮。產(chǎn)品圖像輸?出采用標準?JPEG?格
式,可方便地兼容各種圖像處理軟件;采用?3?線制?TTL?電平?UART?通?信接口,可以方便地實現(xiàn)與單片機或
其他微處理器連接。
默認波特率為?115200,其它可選波特率有?9600,19200,38400?和?57600。
其中對于串口控制拍照,讀取靜態(tài)圖片的應用中,只需要用到?GND,RX,TX,VCC?這?4?個信號線。?如果是
要輸出模擬視頻的應用,才需要將?CVBS?信號。
注意:?TX?和?RX?是?3.3v?的?TTL?電平信號。
4.接線方式:
5.實驗步驟.
基本原理:TPYboard v102?通過串口與串口攝像頭模塊(PTC06)進行連接,通過按鍵控制模塊進行拍照,并
保存到TF卡中。
上電后,等待ToyBoard v102板載綠燈亮起,說明攝像頭模塊初始化完畢,按一下USR鍵,控制攝像頭進行拍
照,藍燈會閃爍,說明正在傳輸圖片數(shù)據(jù),等待藍燈熄滅后,說明傳輸完畢。文章來源:http://www.zghlxwxcb.cn/news/detail-825776.html
按一下rst鍵讓板子重新加載一下TF卡,打開TF卡就會看到一個新生成的jpeg文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-825776.html
"""
import pyb
from pyb import UART,Switch
"""
拍照的基本流程
--------------------
1.清空圖片緩存
2.發(fā)送拍照命令
3.獲取圖片的長度
4.根據(jù)長度讀取圖片數(shù)據(jù)
使用到的指令與返回的數(shù)據(jù)格式
-------------------------------
復位
0x56 0x00 0x26 0x00
返回
0x76 0x00 0x26 0x00 +DSP 版本信息+Init end
------------------------
清空圖片緩存
0x56 0x00 0x36 0x01 0x02
返回
0x76 0x00 0x36 0x00 0x00
-------------------------
拍照命令
0x56 0x00 0x36 0x01 0x00
返回
0x76 0x00 0x36 0x00 0x00
--------------------------
讀所拍圖片的長度
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ù)長度(先高位字節(jié),后低位字節(jié))
返回
76 00 32 00 00 FF D8 ....... FF D9 76 00 32 00 00
(完整的JPEG 圖片文件是以 FF D8 開始 FF D9 結(jié)尾)
"""
#-----Command---------#
initcmd=b'\x56\x00\x26\x00' #復位指令
clearcmd=b'\x56\x00\x36\x01\x02' #清除緩存
photocmd=b'\x56\x00\x36\x01\x00' #拍照
lengthcmd=b'\x56\x00\x34\x01\x00' #獲取圖片長度
readcmd=b'\x56\x00\x32\x0C\x00\x0A\x00\x00' #獲取圖片數(shù)據(jù)
responseCmd=b'\x76\x00\x32\x00\x00'#返回的圖片數(shù)據(jù)固定頭和尾
#---------------------------------#
isFlag=0#標識是否初始化
isPhoto=0#標識是否發(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進制轉(zhuǎn)為16進制字節(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ù):起始地址、讀取長度
#返回:成功返回正常數(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ù)時 禁用回調(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:
#說明接收的是復位后的信息
if data==b'Init end\r\n':
#復位完畢
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é)寫一次
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-----')
到了這里,關(guān)于micropython 自制數(shù)碼相機的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!