手把手教你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-----')

 


 

作者

turnipbit

山东,潍坊

1粉丝 4作品 12随笔
  关注 私信


阅读数: 10341