【雕爷学编程】MicroPython手册之 OpenMV Cam pyb.delay

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
OpenMV Cam 是一款小型、低功耗的微控制器板,可以让你在现实世界中使用机器视觉轻松实现应用程序。你可以使用高级 Python 脚本(由 MicroPython 操作系统提供)而不是 C/C++ 对 OpenMV Cam 进行编程。OpenMV Cam 的技术参数包括以下几个方面:

1、处理器:OpenMV Cam H7 Plus 使用 STM32H743II ARM Cortex M7 处理器,运行频率为 480 MHz,具有 32MB SDRAM + 1MB SRAM 和 32 MB 外部闪存 + 2 MB 内部闪存。OpenMV Cam M4 V2 使用 STM32F427VG ARM Cortex M4 处理器,运行频率为 180 MHz,具有 256KB RAM 和 1 MB 闪存。
2、图像传感器:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都使用 OV7725 图像传感器,能够在分辨率高于 320x240 时以 75 FPS 拍摄 320x240 8 位灰度图像或 320x240 16 位 RGB565 图像,在分辨率低于 320x240 时能够以 150 FPS 拍摄。
3、I/O 接口:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都具有以下 I/O 接口:
(1)全速 USB (12Mbs) 接口,连接到电脑。当插入 OpenMV Cam 后,你的电脑会出现一个虚拟 COM 端口和一个“U盘”。
(2)μSD 卡槽能够进行 100Mbs 读/写,使你的 OpenMV Cam 能够录制视频,并把机器视觉的素材从 μSD 卡提取出来。
(3)SPI 总线的运行速度高达 54Mbs,使你可以简单地把图像流数据传给 LCD 扩展板、WiFi 扩展板,或者其他控制器。
(4)I2C 总线(高达 1Mb/s)、CAN 总线(高达 1Mb/s)和异步串行总线(TX/RX,高达 7.5Mb/s),用于与其他控制器或传感器连接。
(5)一个 12 位 ADC 和一个 12 位 DAC。
(6)所有 I/O 引脚上都有中断和 PWM(板上有 9 或者10个 I/O 引脚)。
4、LED:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了一个 RGB LED(三色)和两个高亮的 850nm IR LED(红外)。
5、镜头:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了标准 M12 镜头接口和一个默认的 2.8 毫米镜头。如果你想在 OpenMV Cam 上使用更专业的镜头,你可以轻松购买并自行安装。

在这里插入图片描述
MicroPython的OpenMV Cam的pyb.delay函数用于在程序中添加延迟,即暂停执行一段时间。下面将详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

精确的延迟控制:pyb.delay函数可以提供精确的延迟控制,以毫秒为单位。通过指定延迟的时间参数,可以让程序在执行到pyb.delay函数时暂停指定的时间,然后再继续执行后续代码。

简单易用:MicroPython是一种简单易学的编程语言,而pyb.delay函数是OpenMV Cam提供的内置函数之一。它的使用方法简单明了,只需在代码中调用该函数并指定延迟时间即可,无需复杂的配置和设置。

精确的时间控制:pyb.delay函数可以提供较为精确的时间控制,适用于对时间要求不是非常严格的场景。它可以用于控制程序的执行速度、时间间隔以及定时任务等。

应用场景:

任务调度和时间控制:pyb.delay函数可以用于任务调度和时间控制。在编写程序时,可以利用pyb.delay函数控制任务之间的时间间隔,实现定时执行、定时触发事件等功能。

传感器采样:OpenMV Cam通常与各种传感器配合使用,用于采集环境数据。在传感器采样过程中,可能需要在不同的时间间隔内进行数据采集,这时可以使用pyb.delay函数控制采样的时间间隔。

教学和学习:pyb.delay函数是MicroPython编程的基础知识之一,对于初学者来说,学习和理解延迟的概念和应用场景是很重要的。在教学过程中,可以通过使用pyb.delay函数来演示和实践延迟的概念和应用。

需要注意的事项:

延迟时间单位:pyb.delay函数的延迟时间参数是以毫秒为单位的整数值。在使用时,需要根据具体需求和实际情况合理设置延迟时间。

延迟过长导致阻塞:如果在程序中使用了过长的延迟时间,可能会导致程序在延迟期间无法响应其他任务或事件,出现阻塞的情况。因此,在设计程序时,需要根据实际需求合理设置延迟时间,避免延迟过长导致的不必要问题。

精确性考虑:pyb.delay函数提供的延迟时间并非绝对精确,可能会受到系统和硬件的影响。在对时间要求较为严格的应用场景下,可能需要采用其他更精确的时间控制方法,如使用硬件定时器等。

总结来说,MicroPython的OpenMV Cam的pyb.delay函数是用于在程序中添加延迟的函数,具有精确的延迟控制和简单易用的特点。它适用于任务调度、时间控制、传感器采样以及教学和学习等场景。使用时需要注意延迟时间单位、延迟过长导致阻塞以及精确性考虑等因素,并根据具体需求和应用场景合理设置和使用延迟函数。

案例一:使用pyb.delay()实现延时拍照

解析:在这个案例中,我们将使用pyb.delay()函数来实现延时拍照功能。首先,我们需要导入OpenMV Cam模块,然后设置摄像头的分辨率和帧率。接着,我们将使用一个循环来不断捕获图像,并在每次捕获后调用pyb.delay()函数来实现延时。最后,我们将捕获到的图像保存到文件中。

代码:

import sensor, image, time

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 捕获图像并延时
while True:
    img = sensor.snapshot()
    print("拍照中...")
    time.sleep(1000)  # 延时1秒
    img.save("photo_{}.jpg".format(time.time()))

案例二:使用pyb.delay()实现延时录像

解析:在这个案例中,我们将使用pyb.delay()函数来实现延时录像功能。首先,我们需要导入OpenMV Cam模块,然后设置摄像头的分辨率和帧率。接着,我们将使用一个循环来不断捕获图像,并在每次捕获后调用pyb.delay()函数来实现延时。最后,我们将捕获到的图像保存到文件中。

代码:

import sensor, image, time

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 捕获图像并延时
video = sensor.snapshot()
while video is not None:
    img = video.snapshot()
    print("录像中...")
    time.sleep(1000)  # 延时1秒
    img.save("video_{}.avi".format(time.time()))
    video = None

案例三:使用pyb.delay()实现延时移动目标跟踪

解析:在这个案例中,我们将使用pyb.delay()函数来实现延时移动目标跟踪功能。首先,我们需要导入OpenMV Cam模块,然后设置摄像头的分辨率和帧率。接着,我们将使用一个循环来不断捕获图像,并在每次捕获后调用pyb.delay()函数来实现延时。同时,我们需要检测图像中的移动目标,并在目标消失后重新开始计时。

代码:

import sensor, image, time

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 初始化目标位置和计时器
target_pos = [(100, 100)]
target_timer = 0

# 捕获图像并处理
while True:
    img = sensor.snapshot()
    # 检测目标位置变化
    if target_timer > 0:
        new_pos = (img.find_blob(target_pos[0], scale=3, threshold=0.8)[0].rect())
        if new_pos != target_pos:
            target_timer = 0
            target_pos = new_pos
        else:
            target_timer -= 1
    else:
        target_timer = 5  # 设置目标跟踪延时时间(单位:秒)
    print("跟踪中...")
    time.sleep(1)  # 延时1秒
    img.save("image_{}.jpg".format(time.time()))

案例四:控制电机转动时间

import pyb  
from pyb import PWM, delay  
  
motor = PWM(pyb.Pin('X1'), freq=100) # 初始化电机引脚为PWM输出,频率为100Hz  
  
for i in range(10): # 控制电机转动10次  
    motor.duty(1000) # 设置电机占空比为1000  
    delay(500) # 延时500毫秒,即0.5秒  
    motor.duty(0) # 停止电机转动  
    delay(500) # 延时500毫秒,即0.5秒

要点解读:
首先初始化电机引脚为PWM输出,并设置频率为100Hz。在一个循环中,控制电机转动10次。每次转动时,设置电机占空比为1000,即最大速度,然后延时500毫秒,即0.5秒,停止电机转动,再延时500毫秒。通过pyb.delay函数控制电机的转动时间,从而实现精确控制电机的转动角度和速度。

案例五:延时拍照

import sensor, image, time, pyb  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
for i in range(10): # 拍摄10张照片  
    img = sensor.snapshot() # 拍摄照片  
    delay(1000) # 延时1000毫秒,即1秒

要点解读:
首先初始化摄像头,设置像素格式和帧大小。在一个循环中,拍摄10张照片。每次拍摄时,使用snapshot()函数拍摄照片,然后延时1000毫秒,即1秒。通过pyb.delay函数延时拍照,从而避免摄像头在拍照时受到抖动或光线变化的影响。

案例六:延时执行

import pyb, machine  
  
led = machine.Pin('X2', machine.Pin.OUT) # 初始化LED引脚为输出模式  
delay(5000) # 延时5000毫秒,即5秒  
led.on() # 打开LED灯  
delay(5000) # 延时5000毫秒,即5秒  
led.off() # 关闭LED灯

要点解读:
首先初始化LED引脚为输出模式。然后延时5000毫秒,即5秒。在延时期间,程序会暂停执行。延时结束后,打开LED灯,再延时5000毫秒,然后关闭LED灯。通过pyb.delay函数实现延时执行,从而在某些情况下等待一段时间后再执行某些操作。

案例七:延时拍摄照片:

import sensor
import image
import lcd
import time
import pyb

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

while True:
    pyb.delay(5000)  # 5秒延时
    img = sensor.snapshot()
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor模块和lcd模块进行延时拍摄照片并显示在LCD上。
使用lcd.init()初始化LCD显示屏。
使用sensor.reset()重置摄像头传感器。
使用sensor.set_pixformat(sensor.RGB565)设置图像像素格式为RGB565。
使用sensor.set_framesize(sensor.QVGA)设置图像帧大小为QVGA(320x240)。
使用sensor.run(1)开始摄像头图像流。
在一个无限循环中,使程序持续执行以下操作:
使用pyb.delay(5000)函数进行5秒的延时。
使用sensor.snapshot()捕获摄像头图像,并将其存储在变量img中。
使用lcd.display(img)在LCD显示屏上显示图像。

案例八:延时触发外部设备:

import pyb

trigger_pin = pyb.Pin('P0', pyb.Pin.OUT)

while True:
    trigger_pin.value(1)  # 触发外部设备
    pyb.delay(1000)  # 1秒延时
    trigger_pin.value(0)  # 停止触发
    pyb.delay(5000)  # 5秒延时

要点解读:
该程序使用OpenMV Cam的pyb模块控制外部设备的延时触发。
创建一个名为trigger_pin的输出引脚对象,将其连接到外部设备。
在一个无限循环中,使程序持续执行以下操作:
使用trigger_pin.value(1)将引脚置为高电平,触发外部设备。
使用pyb.delay(1000)函数进行1秒的延时。
使用trigger_pin.value(0)将引脚置为低电平,停止触发。
使用pyb.delay(5000)函数进行5秒的延时。

案例九:按钮延时控制:

import pyb

button_pin = pyb.Pin('P1', pyb.Pin.IN)
led_pin = pyb.Pin('P2', pyb.Pin.OUT)

while True:
    if button_pin.value() == 1:  # 按钮被按下
        led_pin.value(1)  # 点亮LED
        pyb.delay(5000)  # 5秒延时
        led_pin.value(0)  # 熄灭LED
    else:
        led_pin.value(0)  # 熄灭LED

要点解读:
该程序使用OpenMV Cam的pyb模块控制按钮延时控制LED的亮灭。
创建一个名为button_pin的输入引脚对象,连接到按钮。
创建一个名为led_pin的输出引脚对象,连接到LED。
在一个无限循环中,使程序持续执行以下操作:
如果按钮被按下(button_pin.value() == 1):
使用led_pin.value(1)点亮LED。
使用pyb.delay(5000)函数进行5秒的延时。
使用led_pin.value(0)熄灭LED。
否则,即按钮未被按下:
使用led_pin.value(0)熄灭LED。
这些示例代码展示了如何使用pyb.delay()函数在MicroPython和OpenMV Cam中进行延时操作。你可以根据自己的需求和具体的硬件配置进行修改和扩展这些示例代码。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。确保正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133578757