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

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接口。可与大部分常用传感器模块连接。

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

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

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

4.接线方式:

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.  
  8. import pyb
  9. from pyb import UART,Switch
  10.  
  11. """
  12. 拍照的基本流程
  13. --------------------
  14. 1.清空图片缓存
  15. 2.发送拍照命令
  16. 3.获取图片的长度
  17. 4.根据长度读取图片数据
  18.  
  19. 使用到的指令与返回的数据格式
  20. -------------------------------
  21. 复位
  22. 0x56 0x00 0x26 0x00
  23. 返回
  24. 0x76 0x00 0x26 0x00 +DSP 版本信息+Init end
  25. ------------------------
  26. 清空图片缓存
  27. 0x56 0x00 0x36 0x01 0x02
  28. 返回
  29. 0x76 0x00 0x36 0x00 0x00
  30. -------------------------
  31. 拍照命令
  32. 0x56 0x00 0x36 0x01 0x00
  33. 返回
  34. 0x76 0x00 0x36 0x00 0x00
  35. --------------------------
  36. 读所拍图片的长度
  37. 56 00 34 01 00
  38. 返回
  39. 0x76 0x00 0x34 0x00 0x04 0x00 0x00 XX YY
  40. (XX 为高位字节,YY 为低位字节)
  41. --------------------------
  42. 读取图片数据
  43. 0x56 0x00 0x32 0x0C 0x00 0x0A 0x00 0x00 AA BB 0x00 0x00 XX YY 0x00 0xFF
  44. AA BB:起始地址(先高位字节,后低位字节.必须是8的倍数)
  45. XX YY:本次读的数据长度(先高位字节,后低位字节)
  46. 返回
  47. 76 00 32 00 00 FF D8 ....... FF D9 76 00 32 00 00
  48. (完整的JPEG 图片文件是以 FF D8 开始 FF D9 结尾)
  49. """
  50. #-----Command---------#
  51. initcmd=b'\x56\x00\x26\x00' #复位指令
  52. clearcmd=b'\x56\x00\x36\x01\x02' #清除缓存
  53. photocmd=b'\x56\x00\x36\x01\x00' #拍照
  54. lengthcmd=b'\x56\x00\x34\x01\x00' #获取图片长度
  55. readcmd=b'\x56\x00\x32\x0C\x00\x0A\x00\x00' #获取图片数据
  56. responseCmd=b'\x76\x00\x32\x00\x00'#返回的图片数据固定头和尾
  57. #---------------------------------#
  58. isFlag=0#标识是否初始化
  59. isPhoto=0#标识是否发送拍照命令
  60. num=1
  61. f_name='/sd/photo%s.jpeg'#保存的文件名称
  62. nBytes=512#每次读取的字节数
  63. #---------------------------------#
  64. uart=UART(4,115200,timeout=100)#串口4 TX-X1 RX-X2
  65.  
  66. #------将10进制转为16进制字节数组--------#
  67. def convert_Data(num):
  68. if num>255:
  69. num_h=hex(num)
  70. if len(num_h)<6:
  71. num_h_a=num_h[:3]
  72. num_h_b='0x'+num_h[3:]
  73. else:
  74. num_h_a=num_h[:4]
  75. num_h_b='0x'+num_h[4:]
  76. byte_num=bytes([int(num_h_a,16),int(num_h_b,16)])
  77. else:
  78. byte_num=b'\x00'+bytes([num])
  79. return byte_num
  80. #---------------------------------
  81. #函数名:get_photo
  82. #描述:获取图片数据
  83. #参数:起始地址、读取长度
  84. #返回:成功返回正常数据,失败返回0
  85. #---------------------------------/
  86. def get_photo(add,readlen):
  87. global readcmd,responseCmd
  88.  
  89. cmd=readcmd+add+b'\x00\x00'+readlen+b'\x00\xFF'
  90. uart.write(cmd)
  91. while uart.any()<=0:
  92. continue
  93. data=uart.read()
  94. #print('data:',data)
  95. #print('data[0:5]:',data[0:5])
  96. #print('data[-5:]:',data[-5:])
  97. if data[0:5]==responseCmd and data[-5:]==responseCmd:
  98. revdata=data[5:-5]
  99. print('revdata:',revdata)
  100. else:
  101. revdata=0
  102. return revdata
  103. #---------------------------------
  104. #函数名:test
  105. #描述:USR按键的回调函数。
  106. #按键每按1次拍照1次
  107. #---------------------------------/
  108. def test():
  109. global num,isPhoto
  110. pyb.delay(30)
  111. if(sw()):
  112. sw.callback(None)#正在获取数据时 禁用回调
  113. isPhoto=0
  114. num+=1
  115. pyb.LED(3).on()
  116. #清除缓存
  117. uart.write(clearcmd)
  118. #等待模块上电完毕
  119. print('wait......')
  120. pyb.delay(2800)
  121. print('init start.......')
  122. uart.write(initcmd)
  123. sw=Switch()
  124. sw.callback(test)
  125. while True:
  126. if uart.any()>0:
  127. data=uart.read()
  128. print('revdata:',data)
  129. if isFlag==0:
  130. #说明接收的是复位后的信息
  131. if data==b'Init end\r\n':
  132. #复位完毕
  133. print('init ok.......')
  134. pyb.delay(2000)
  135. isFlag=1
  136. pyb.LED(2).on()
  137. else:
  138. if len(data)>=5:
  139. if data[0]==118:#0x76
  140. if data[2]==54:#0x36
  141. if isPhoto==0:
  142. #清除缓存返回
  143. print('-----clear buffer ok----')
  144. isPhoto=1
  145. uart.write(photocmd)
  146. else:
  147. #拍照返回
  148. print('-----taking pictures ok----')
  149. uart.write(lengthcmd)
  150. if data[2]==52:#0x34
  151. print('photo length:',data[7],'-',data[8])
  152. tlen=data[7]*256+data[8]
  153. t_c=tlen//nBytes
  154. t_y=tlen%nBytes
  155. add=0
  156. #256=[0x01,0x00] 512=[0x02,0x00]
  157. length=convert_Data(nBytes)
  158. name=f_name % str(num)
  159. print('filename:',name)
  160. for i in range(0,t_c):
  161. add=convert_Data(i*nBytes)
  162. #每512字节写一次
  163. revdata=get_photo(add,length)
  164. if revdata!=0:
  165. f=open(name,'a')
  166. f.write(revdata)
  167. f.close()
  168. pyb.LED(4).toggle()
  169. print('-------------',i)
  170. pyb.delay(100)
  171. add=convert_Data(t_c*nBytes)
  172. revdata=get_photo(add,convert_Data(t_y))
  173. if revdata!=0:
  174. f=open(name,'a')
  175. f.write(revdata)
  176. f.close()
  177. pyb.LED(3).off()
  178. pyb.LED(4).off()
  179. pyb.delay(100)
  180. print('*========================================*')
  181. sw.callback(test)
  182. else:
  183. print('-----data length error-----')

[Micropython]TPYBoard v102 DIY照相机的更多相关文章

  1. TPYBoard v102 DIY照相机(视频和制作流程)

    前段时间的帖子,利用TPYBoard v102做的DIY照相机,周末实物终于做出来了,加了两个按键模块和一个5110,做的有点糙啊----望大家勿怪,哈哈哈.拍出来图片还算清晰,串口摄像头模块用的30 ...

  2. MicroPython TPYBoard v102 无线红外遥控舵机(基于红外解/编码模块)

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 红外解码/编码模块介绍 模块上搭载了红外接收头.红外 ...

  3. [MicroPython]TPYBoard v102炫彩跑马灯WS2812B

    一.实验目的 了解ws2812b的工作原理 学习ws2812b的驱动方法 二.实验器材 TPYBoard v102 1块 ws2812b RGB-Ring-8 1个 micro USB数据线 1条 杜 ...

  4. Micropython TPYBoard v102 温湿度短信通知器(基于SIM900A模块)

    前言 前段时间看了追龙2,感受就是如果你是冲着追龙1来看追龙2的话,劝你还是不要看了,因为追龙2跟追龙1压根没什么联系,给我的感觉就像是看拆弹专家似的,估计追龙2这个名字就是随便蹭蹭追龙1的热度来的. ...

  5. MicroPython之TPYBoard v102开发板控制OLED显示中文

    转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 0x00前言 之前看到一篇文章是关于TPYBoardv102控制OLED屏显示的,看到之后就想尝试一下使用OLED屏来显示中文.最近 ...

  6. MicroPython开发板:TPYBoard v102 播放音乐实例

    0x00前言 前段时间看到TPYBoard的技术交流群(群号:157816561,)里有人问关于TPYBoard播放音乐的问题.最近抽空看了一下文档介绍,着手做了个实验.更多MicroPython的教 ...

  7. [TPYBoard - Micropython 之会python就能做硬件 9] 五分种学会用TPYBoard V102 制作避障小车(升级版)

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 感谢山东萝卜电子科技公司授权   一.实验器材 1.TPYboard V102板 ...

  8. MicroPython教程之TPYBoard v102 CAN总线通信

    0x00前言 CAN是控制器局域网络(ControllerAreaNetwork,CAN)的简称,是ISO国际标准化的串行通信协议.CAN总线结构简单,只需2根线与外部相连,并且内部集成了错误探测和管 ...

  9. [MicroPython]TPYBoard开发板DIY小型家庭气象站

    对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度. BMP180是一直常 ...

随机推荐

  1. "BLAME" is out.

    The latest feature animation film "BLAME" is watchable on the Netflix. Rendering was done ...

  2. 「客户成功故事」OneAPM 助力网上办事大厅构建阳光、高效、安全的政务服务平台

    (一) 项目背景: 网上办事大厅是由省信息中心承建的电子政务核心业务系统,致力于为全省民众提供一站式网上办事服务,实现了政务信息网上公开.法人及个人事项网上办理.公共决策网上互动.政府效能网上监督五大 ...

  3. [20181116]18c DML 日志优化.txt

    [20181116]18c DML 日志优化.txt 1.环境:xxxxxxxx> select banner_full from v$version;BANNER_FULL---------- ...

  4. 如何使用Web3在浏览器中与智能合约进行交互

    2018-4-20 技术文章 Web3.js是以太坊官方的Javascript API,可以帮助智能合约开发者使用HTTP或者IPC与本地的或者远程的以太坊节点交互.实际上就是一个库的集合,主要包括下 ...

  5. MySQL Host is blocked because of many connection errors 解决方法

    应用日志提示错误:create connection error, url: jdbc:mysql://10.45.236.235:3306/db_wang?useUnicode=true&c ...

  6. c/c++ 标准库 map set 大锅炖

    标准库 map set 大锅炖 一,关联容器有哪些 按关键字有序保存元素 map 保存key和value set 只保存key mulutimap key可以重复出现 multiset key可以重复 ...

  7. c/c++拷贝构造函数和关键字explicit

    c/c++拷贝构造函数和关键字explicit 关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象:不加就可以隐式初始化对象: 下面的代码是可以正常编译执行的,但 ...

  8. SpringBoot整合模板引擎

    一.SpringBoot整合freemarker: 1.引入freemarker模板依赖: <dependency> <groupId>org.springframework. ...

  9. 对Can We Make Operating Systems Reliable and Secure 的翻译

    摘要:微内核-相对于大内核(monolithic kernels)来说,由于它的 lower performance,长期以来被认为是不可接受的.而现在,由于它潜 在的高可靠性(higher reli ...

  10. 注入攻击(SQL注入防御)

    正确的防御SQL注入 sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全. 例如 mysql_real_escape_string()函 ...