手把手教你DIY自己的相机(附实物视频和制作花絮)
标签:DIY 照相机
turnipbit 发布于 2018-03-31 10:54
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_a:
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-----')
作者的最新作品
-
[Micropython]TPYBoard v202 v102+v202 家庭无线温湿度检测
2018-05-31 10:21发布
-
[Micropython]TPYBoard v202 利用单片机快速实现家庭智能控制平台
2018-05-30 10:55发布
-
手把手教你DIY自己的相机(附实物视频和制作花絮)
2018-03-31 10:54发布
-
TPYBoard v102 DIY照相机(制作流程和视频)
2018-03-26 11:13发布
阅读数: 10045