micropython 自制数码相机

这篇具有很好参考价值的文章主要介绍了micropython 自制数码相机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

像头(CAMERA或WEBCAM)又称为电脑相机、电脑眼、电子眼等,是一种视频输入设备,被广泛的运用于视频

会议,安防系统  、图像采集系统、 环境监控 、工业现场过程控制 等方面。本实验用TPYBoard  v102以

及PTC06 串口摄像头模块DIY一个简易的照相机。

1.所用器材:

   TPYBoard v102  1块

   PTC06 串口摄像头模块1个

   杜邦线若干

   TF卡1个

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

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文件。文章来源地址https://www.toymoban.com/news/detail-825776.html

"""

 
import pyb
from pyb import UART,Switch
 
"""
拍照的基本流程
--------------------
1.清空图片缓存
2.发送拍照命令
3.获取图片的长度
4.根据长度读取图片数据
 
使用到的指令与返回的数据格式
-------------------------------
复位
0x56 0x00 0x26 0x00
返回
0x76 0x00 0x26 0x00 +DSP 版本信息+Init end
------------------------
清空图片缓存 
0x56 0x00 0x36 0x01 0x02
返回
0x76 0x00 0x36 0x00 0x00
-------------------------
拍照命令
0x56 0x00 0x36 0x01 0x00
返回
0x76 0x00 0x36 0x00 0x00
--------------------------
读所拍图片的长度
56 00 34 01 00
返回
0x76 0x00 0x34 0x00 0x04 0x00 0x00 XX YY
(XX 为高位字节,YY 为低位字节)
--------------------------
读取图片数据
0x56 0x00 0x32 0x0C 0x00 0x0A 0x00 0x00 AA BB 0x00 0x00 XX YY 0x00 0xFF
AA BB:起始地址(先高位字节,后低位字节.必须是8的倍数)
XX YY:本次读的数据长度(先高位字节,后低位字节)
返回
76 00 32 00 00 FF D8 ....... FF D9 76 00 32 00 00
(完整的JPEG 图片文件是以 FF D8 开始 FF D9 结尾)
"""
#-----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=1
f_name='/sd/photo%s.jpeg'#保存的文件名称
nBytes=512#每次读取的字节数
#---------------------------------#
uart=UART(4,115200,timeout=100)#串口4 TX-X1 RX-X2
 
#------将10进制转为16进制字节数组--------#
def convert_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
#---------------------------------
#函数名:get_photo
#描述:获取图片数据
#参数:起始地址、读取长度
#返回:成功返回正常数据,失败返回0
#---------------------------------/
def get_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 and data[-5:]==responseCmd:
        revdata=data[5:-5]
        print('revdata:',revdata)
    else:
        revdata=0
    return revdata
#---------------------------------
#函数名:test
#描述:USR按键的回调函数。
#按键每按1次拍照1次
#---------------------------------/
def test():
    global num,isPhoto
    pyb.delay(30)
    if(sw()):
        sw.callback(None)#正在获取数据时 禁用回调
        isPhoto=0
        num+=1
        pyb.LED(3).on()
        #清除缓存
        uart.write(clearcmd)
#等待模块上电完毕       
print('wait......')
pyb.delay(2800)
print('init start.......')
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()
        else:
            if len(data)>=5:
                if data[0]==118:#0x76
                    if data[2]==54:#0x36
                        if isPhoto==0:
                            #清除缓存返回
                            print('-----clear buffer ok----')
                            isPhoto=1
                            uart.write(photocmd)
                        else:
                            #拍照返回
                            print('-----taking pictures ok----')
                            uart.write(lengthcmd)
                    if data[2]==52:#0x34
                        print('photo length:',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)
                        for i in range(0,t_c):
                            add=convert_Data(i*nBytes)
                            #每512字节写一次
                            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('*========================================*')
                        sw.callback(test)
            else:
                print('-----data length error-----')

到了这里,关于micropython 自制数码相机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python pyglet 自制3D引擎入门(二) -- 绘制立体心形,动画和相机控制

    Python作为目前较广泛的编程语言, 用于制作3D游戏可谓得心应手。本文讲解使用Python pyglet库自制简易3D引擎的方法技巧。 上篇:Python pyglet 自制3D引擎入门(一) – 绘制几何体、创建3D场景 先放效果图: pyglet.window 部分用于实现窗口操作, pyglet.gl 以及 pyglet.gl.glu 模块包含了OpenGL的

    2024年02月10日
    浏览(29)
  • [micropython k210] 基于 Socket 实现 MicroPython 的 HTTP 上传文件(multipart/form-data)

    下述内容需要具备 HTTP 的基础知识,如果不知道的可以过一遍 HTTP 协议详解 继上次在 K210 实现 HTTP Download 文件(https 也支持辣),现在就来说说直接基于 socket 的上传文件实现吧。 首先准备一个 Server 文件服务器的 CPython 代码,这个是再简单不过了。 可以看到实现处理了一个

    2024年02月08日
    浏览(40)
  • MicroPython VSCode开发环境搭建

    本文中,使用的是 ESP32模块的开发板,下面的例子都是以ESP32开发板作为例子进行说明,如果你用的是其它的MicroPython开发板,只需要下载相应的固件和工具进行操作,大同小异。 操作系统使用的Windwos,如果你使用的Mac或者Linux,可能在下载或安装一些工具的时候会有差别,

    2024年02月04日
    浏览(35)
  • 自制Breadcrumb 面包屑

    使用场景: 当系统拥有超过两级以上的层级结构时 当需要告知用户『你在哪里』时 当需要向上导航的功能时

    2024年01月19日
    浏览(42)
  • 自制游戏引擎

    这是一个玩具 SmallEngine是引擎的核心模块,封装渲染功能和场景管理功能等 Editor是编辑器,类似unity和ue编辑器,能够动态添加对象和组件 Sandbox是游戏播放器,能够运行游戏 参考 https://www.bilibili.com/video/BV1KE41117BD/?spm_id_from=333.788.recommend_more_video.0vd_source=be4b42409fb0d5ad1e1bd5a5715b7da0 引

    2024年02月13日
    浏览(33)
  • pygame自制小游戏

    pygame——游戏视频 简单的来写一个pygame小游戏,我的画面比较卡哇伊各位可以自己换图片哈。 就是一个最基本的pygame小游戏,可以控制人物,攻击敌人,打到敌人使敌人消失,如果敌人到达边缘仍然没有被消灭,游戏就会失败。 1.鼠标移动人物跟随移动,播放背景音乐,可以摁下

    2024年02月11日
    浏览(37)
  • 自制课程表小程序

    微信开发者工具:稳定版 Stable Build 根据自己电脑的系统下载对应的版本 完整代码连接: https://pan.baidu.com/s/1VbgPOS6CUOae8vg2axhGIg?pwd=hk9e 提取码:hk9e 先把完整代码的压缩包解压,并记住这个路径,后面要用 1.打开下载好的微信开发工具, 注意不要用游客登录 ,我一开始就是游客

    2024年02月09日
    浏览(60)
  • 自制手写机器人

    写字机器人模拟在画图板上写字效果  写了一套写字机器人代码,有多种字体可供选择,需要的朋友私信获取代码和软件    

    2024年02月12日
    浏览(17)
  • 函数——自制函数(c++)

    今天进入自制函数。 自制函数,需要自己定义其功能。比如,设置一个没有参数没有返回值的积木,叫“aaa”。那么,如果想要运行“aaa”,就需要以下代码: void aaa();                      告诉系统有“aaa”这个积木。 aaa();                           执行aaa的内容

    2024年02月01日
    浏览(26)
  • 自制Nuget包(C#)

    自制C# Nuget包。 生成一个可以通过Nuget管理自动应用的包,生成效果如图: 整个制作过程分为两步:第一步制作Nuget包,第二步上传Nuget包到Nuget网站(地址:https://www.nuget.org) No1:采用Vs2012及以上版本,新建类库如图: No2:鼠标移动到类项目名称上,点击鼠标右键,选择属

    2024年02月15日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包