忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1951 | 回复: 0

[其它] Micropython实例之TPYBoardv102开发板DIY照相机 [复制链接]

论坛徽章:
0
发表于 2018-06-22 16:33 |显示全部楼层
    摄像头(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简介:

    TPYBoard  v102主控芯片采用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-----')
复制代码


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

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP