查看: 1797|回复: 0

Micropython实例之TPYBoardv102 DIY照相机

[复制链接]
  • TA的每日心情
    慵懒
    2018-1-6 09:01
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2018-6-21 10:06:57 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 酥小小酥 于 2018-6-21 10:08 编辑

        摄像头(CAMERA或WEBCAM)又称为电脑相机、电脑眼、电子眼等,是一种视频输入设备,被广泛的运用于视频会议,安防系统  、图像采集系统、 环境监控 、工业现场过程控制 等方面。本实验用TPYBoard  v102以及PTC06 串口摄像头模块DIY一个简易的照相机。

    0.png
      


        1.所用器材:
        l   TPYBoard v102  1块
        l   PTC06 串口摄像头模块1个
        l   杜邦线若干
        l   TF卡1个
        l   下载数据线1条

        2.TPYBoard v102简介:
        TPYBoardv102主控芯片采用STM32F405,M4的内核,168MHZ的最高运行速度,1024KB的Flash,192KB的RAM,内置SD卡槽,最大支持8G内存的内存卡。板载四个LED灯和一个加速度传感器。TPYBoard v102板载30个通用GPIO接口、 2个SPI接口、2个CAN接口、2个I2C接口、 5个USART 接口、 2个ADC接口(精度12bit )、2个DAC接口、1个SWD接口。可与大部分常用传感器模块连接。

    1.png
        3. PTC06 串口摄像头模块简介:
        PTC06 串口摄像头模块是一款集图像采集、拍摄控制、数据压缩、串口传输于一体的工业级图像采集处理模块。其内置的高性能数字信号处理芯片实现了对原始图像的高比例压缩。产品图像输 出采用标准 JPEG 格式,可方便地兼容各种图像处理软件;采用 3 线制 TTL 电平 UART 通 信接口,可以方便地实现与单片机或其他微处理器连接。

        默认波特率为 115200,其它可选波特率有 9600,19200,38400 和 57600。

    2.png
        其中对于串口控制拍照,读取静态图片的应用中,只需要用到 GND,RX,TX,VCC 这 4 个信号线。 如果是要输出模拟视频的应用,才需要将 CVBS 信号。注意: TX 和 RX 是 3.3v 的 TTL 电平信号。

        4.接线方式:
    3.png

        5.实验步骤.
        基本原理:TPYboard v102 通过串口与串口摄像头模块(PTC06)进行连接,通过按键控制模块进行拍照,并保存到TF卡中。上电后,等待ToyBoard v102板载绿灯亮起,说明摄像头模块初始化完毕,按一下USR键,控制摄像头进行拍照,蓝灯会闪烁,说明正在传输图片数据,等待蓝灯熄灭后,说明传输完毕。按一下rst键让板子重新加载一下TF卡,打开TF卡就会看到一个新生成的jpeg文件。

        6.源代码:
    1. """
    2. #TPYBoard v102 驱动串口摄像头PTC06 拍照并保存到TF卡
    3. #------------------------------------------------------
    4. #作者:山东萝卜电子科技有限公司
    5. #时间:2018年03月15日
    6. """

    7. import pyb
    8. from pyb import UART,Switch

    9. """
    10. 拍照的基本流程
    11. --------------------
    12. 1.清空图片缓存
    13. 2.发送拍照命令
    14. 3.获取图片的长度
    15. 4.根据长度读取图片数据

    16. 使用到的指令与返回的数据格式
    17. -------------------------------
    18. 复位
    19. 0x56 0x00 0x26 0x00
    20. 返回
    21. 0x76 0x00 0x26 0x00 +DSP 版本信息+Init end
    22. ------------------------
    23. 清空图片缓存
    24. 0x56 0x00 0x36 0x01 0x02
    25. 返回
    26. 0x76 0x00 0x36 0x00 0x00
    27. -------------------------
    28. 拍照命令
    29. 0x56 0x00 0x36 0x01 0x00
    30. 返回
    31. 0x76 0x00 0x36 0x00 0x00
    32. --------------------------
    33. 读所拍图片的长度
    34. 56 00 34 01 00
    35. 返回
    36. 0x76 0x00 0x34 0x00 0x04 0x00 0x00 XX YY
    37. (XX 为高位字节,YY 为低位字节)
    38. --------------------------
    39. 读取图片数据
    40. 0x56 0x00 0x32 0x0C 0x00 0x0A 0x00 0x00 AA BB 0x00 0x00 XX YY 0x00 0xFF
    41. AA BB:起始地址(先高位字节,后低位字节.必须是8的倍数)
    42. XX YY:本次读的数据长度(先高位字节,后低位字节)
    43. 返回
    44. 76 00 32 00 00 FF D8 ....... FF D9 76 00 32 00 00
    45. (完整的JPEG 图片文件是以 FF D8 开始 FF D9 结尾)
    46. """
    47. #-----Command---------#
    48. initcmd=b'\x56\x00\x26\x00' #复位指令
    49. clearcmd=b'\x56\x00\x36\x01\x02' #清除缓存
    50. photocmd=b'\x56\x00\x36\x01\x00' #拍照
    51. lengthcmd=b'\x56\x00\x34\x01\x00' #获取图片长度
    52. readcmd=b'\x56\x00\x32\x0C\x00\x0A\x00\x00' #获取图片数据
    53. responseCmd=b'\x76\x00\x32\x00\x00'#返回的图片数据固定头和尾
    54. #---------------------------------#
    55. isFlag=0#标识是否初始化
    56. isPhoto=0#标识是否发送拍照命令
    57. num=1
    58. f_name='/sd/photo%s.jpeg'#保存的文件名称
    59. nBytes=512#每次读取的字节数
    60. #---------------------------------#
    61. uart=UART(4,115200,timeout=100)#串口4 TX-X1 RX-X2

    62. #------将10进制转为16进制字节数组--------#
    63. def convert_Data(num):
    64.     if num>255:
    65.         num_h=hex(num)
    66.         if len(num_h)<6:
    67.             num_h_a=num_h[:3]
    68.             num_h_b='0x'+num_h[3:]
    69.         else:
    70.             num_h_a=num_h[:4]
    71.             num_h_b='0x'+num_h[4:]
    72.         byte_num=bytes([int(num_h_a,16),int(num_h_b,16)])
    73.     else:
    74.         byte_num=b'\x00'+bytes([num])
    75.     return byte_num
    76. #---------------------------------
    77. #函数名:get_photo
    78. #描述:获取图片数据
    79. #参数:起始地址、读取长度
    80. #返回:成功返回正常数据,失败返回0
    81. #---------------------------------/
    82. def get_photo(add,readlen):
    83.     global readcmd,responseCmd
    84.    
    85.     cmd=readcmd+add+b'\x00\x00'+readlen+b'\x00\xFF'
    86.     uart.write(cmd)
    87.     while uart.any()<=0:
    88.         continue
    89.     data=uart.read()
    90.     #print('data:',data)
    91.     #print('data[0:5]:',data[0:5])
    92.     #print('data[-5:]:',data[-5:])
    93.     if data[0:5]==responseCmd and data[-5:]==responseCmd:
    94.         revdata=data[5:-5]
    95.         print('revdata:',revdata)
    96.     else:
    97.         revdata=0
    98.     return revdata
    99. #---------------------------------
    100. #函数名:test
    101. #描述:USR按键的回调函数。
    102. #按键每按1次拍照1次
    103. #---------------------------------/
    104. def test():
    105.     global num,isPhoto
    106.     pyb.delay(30)
    107.     if(sw()):
    108.         sw.callback(None)#正在获取数据时 禁用回调
    109.         isPhoto=0
    110.         num+=1
    111.         pyb.LED(3).on()
    112.         #清除缓存
    113.         uart.write(clearcmd)
    114. #等待模块上电完毕      
    115. print('wait......')
    116. pyb.delay(2800)
    117. print('init start.......')
    118. uart.write(initcmd)
    119. sw=Switch()
    120. sw.callback(test)
    121. while True:
    122.     if uart.any()>0:
    123.         data=uart.read()
    124.         print('revdata:',data)
    125.         if isFlag==0:
    126.             #说明接收的是复位后的信息
    127.             if data==b'Init end\r\n':
    128.                 #复位完毕
    129.                 print('init ok.......')
    130.                 pyb.delay(2000)
    131.                 isFlag=1
    132.                 pyb.LED(2).on()
    133.         else:
    134.             if len(data)>=5:
    135.                 if data[0]==118:#0x76
    136.                     if data[2]==54:#0x36
    137.                         if isPhoto==0:
    138.                             #清除缓存返回
    139.                             print('-----clear buffer ok----')
    140.                             isPhoto=1
    141.                             uart.write(photocmd)
    142.                         else:
    143.                             #拍照返回
    144.                             print('-----taking pictures ok----')
    145.                             uart.write(lengthcmd)
    146.                     if data[2]==52:#0x34
    147.                         print('photo length:',data[7],'-',data[8])
    148.                         tlen=data[7]*256+data[8]
    149.                         t_c=tlen//nBytes
    150.                         t_y=tlen%nBytes
    151.                         add=0
    152.                         #256=[0x01,0x00] 512=[0x02,0x00]
    153.                         length=convert_Data(nBytes)
    154.                         name=f_name % str(num)
    155.                         print('filename:',name)
    156.                         for i in range(0,t_c):
    157.                             add=convert_Data(i*nBytes)
    158.                             #每512字节写一次
    159.                             revdata=get_photo(add,length)
    160.                             if revdata!=0:
    161.                                 f=open(name,'a')
    162.                                 f.write(revdata)
    163.                                 f.close()
    164.                             pyb.LED(4).toggle()
    165.                             print('-------------',i)
    166.                             pyb.delay(100)
    167.                         add=convert_Data(t_c*nBytes)   
    168.                         revdata=get_photo(add,convert_Data(t_y))
    169.                         if revdata!=0:
    170.                             f=open(name,'a')
    171.                             f.write(revdata)
    172.                             f.close()
    173.                         pyb.LED(3).off()
    174.                         pyb.LED(4).off()
    175.                         pyb.delay(100)
    176.                         print('*========================================*')
    177.                         sw.callback(test)
    178.             else:
    179.                 print('-----data length error-----')
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-17 07:48 , Processed in 0.116805 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.