手把手教你DIY自己的相机(附实物视频和制作花絮)

手把手教你DIY自己的相机(附实物视频和制作花絮)

TPYBoard v102主控芯片采用STM32F405,M4的内核,168MHZ的最高运行速度,1024KB的Flash,192KB的RAM,内置SD卡槽,最大支持8G内存的内存卡。 简而言之,TPYBoard通过Python脚本语言实现单片机的控制。

TPYBoard v102 1块

PTC06 串口摄像头模块1个

5110显示屏1个

按键模块2个

杜邦线若干

TF内存卡1个

热干胶1个

USB数据线1条

移动电源1块

废旧纸盒1个

一次性纸杯1个

将一次性纸杯从中部剪开,用作相机探头,如下图:

根据自己的喜好将废旧纸盒裁剪, 制作成简易相机模样,预留两个按键模块孔洞,一个5110显示屏孔洞,一个一次性纸杯孔洞(PTC06 串口摄像头模块放于一次性纸杯内作为相机摄像头),裁剪拼装过程中用热干胶要实现。这样简单的照相机模型就出来了。

PTC06 串口摄像头模块简介:

PTC06 串口摄像头模块是一款集图像采集、拍摄控制、数据压缩、串口传输于一体的图像采集 处理模块。其内置的高性能数字信号处理芯片实现了对原始图像的高比例压缩。产品图像输 出采用标准 JPEG 格式,方便地兼容各种图像处理软件;采用 3 线制 TTL 电平 UART 通 信接口,可以方便地实现与单片机或其他微处理器连接。默认波特率为 115200,其它可选波特率有 9600,19200,38400 和 57600。 其中对于串口控制拍照,读取静态图片的应用中,只需要用到 GND,RX,TX,VCC 这 4 个信号线。 如果是要输出模拟视频的应用,才需要将 CVBS 信号。 注意: TX 和 RX 是 3.3v 的 TTL 电平信号。

TPYBoard v102 和PTC06 串口摄像头模块,具体接线方式如下表:

TPYBoard v102

摄像头模块

VIN

5V

GND

GND

X1(UART 4 TX)

RX

X2(UART 4 RX)

TX

本照相机加了两个按键模块,一个控制拍照另一个控制复位。将TPYBoard v102上面的两个板子按键RST、USR引出。由于板子按键初始化默认为低电平。所以接按键模块时,需要将正负极反过来接。

具体接线方式如下表:

TPYBoard v102

按键模块黑色(复位键)

3.3V

GND

GND

VCC

RST

OUT

TPYBoard v102

按键模块黄色(拍摄键)

GND

VCC

3.3V

GND

X17

OUT

本照相机5110显示屏并不是为了显示图片,而是显示相机当前状态。相机连接电源,当5110显示屏显示OK时,即表示相机已准备就绪,可以进行拍摄,然后我们按下黄色拍摄按键,5110显示屏会显示吃豆小人,此时表示相片正在传输,当小人完全吃豆完成就可以查看照片了。

5110显示屏与TPYBoard v102接线方式如下表:

TPYBoard v102

5110显示屏

Y12

RST

Y11

CE

Y10

DC

Y9

LIGHT

Y8

DIN

Y6

CLK

3.3V

VIN

GND

GND

此时所有器件已连接完毕,只需要给我们核心板TPYBoard v102 编写代码,并

导入fond.py 和upcd8544.py就可以运行了。fond.py 和upcd8544.py下载地址:

https://github.com/TPYBoard/developmentBoard/tree/master/TPYBoard-v10x-

master/06.%E9%A9%B1%E5%8A%A8LCD5110%E6%98%BE%E7%A4%BA

6x8%E5%AD%97%E7%AC%A6(此地址main.py非此实验代码 main.py代码如下)

成品相机视频地址:https://v.qq.com/x/page/w0612m16tnw.html

制作花絮视频地址:https://aimeike.tv/video/l7w0c

实物图:

贴纸装扮后:

import pyb

from pyb importUART,Switch

import upcd8544

#-----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'#获取图片数据

responseCmd=b'\x76\x00\x32\x00\x00'#返回的图片数据固定头和尾

#---------------------------------#

isFlag=0#标识是否初始化

isPhoto=0#标识是否发送拍照命令

num=0

f_name='/sd/photo%s.jpeg'

nBytes=2048#每次读取的字节数

#---------------------------------#

uart=UART(4,115200,timeout=100)#X1(UART4 TX) X2(UART 4 RX)

#-------十进制转16进制------------#

defconvert_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

defget_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 anddata[-5:]==responseCmd:

revdata=data[5:-5]

print('revdata:',revdata)

else:

revdata=0

return revdata

def test():

global num,isPhoto

pyb.delay(30)

if(sw()):

sw.callback(None)

isPhoto=0

num+=1

pyb.LED(3).on()

#清除缓存

uart.write(clearcmd)

#-------LCD5110Init-----------#

SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK

RST = pyb.Pin('Y12')

CE = pyb.Pin('Y11')

DC = pyb.Pin('Y10')

LIGHT = pyb.Pin('Y9')

lcd_5110 =upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)

lcd_5110.lcd_write_bmp()

#------------------------------#

print('wait......')

pyb.delay(2800)

print('initstart.......')

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()

lcd_5110.lcd_write_bmp(0)

else:

if len(data)>=5:

if data[0]==118:#0x76

if data[2]==54:#0x36

if isPhoto==0:

#清除缓存返回

print('-----clearbuffer ok----')

isPhoto=1

uart.write(photocmd)

lcd_5110.clear()

lcd_5110.lcd_write_bmp(1)

else:

#拍照返回

print('-----takingpictures ok----')

uart.write(lengthcmd)

if data[2]==52:#0x34

print('photolength:',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)

offset=0

for i in range(0,t_c):

offset_a=i//4

ifoffset

offset=offset_a

lcd_5110.clear()

lcd_5110.lcd_write_bmp(1,offset)

add=convert_Data(i*nBytes)

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('*========================================*')

lcd_5110.clear()

lcd_5110.lcd_write_bmp(2)

sw.callback(test)

else:

print('-----data lengtherror-----')

相关推荐

酒管FIFA卡塔尔世界杯主题系列营销活动正式启动
正在阅读:手机迅雷番号怎么使用 手机迅雷番号使用方法手机迅雷番号怎么使用 手机迅雷番号使用方法
如何进行宏观营销环境分析(宏观营销环境PEST分析法)
荷花象征意义是什么?荷花在文化中代表了哪些美好寓意?

本文标签