【雕爷学编程】MicroPython手册之 OpenMV Cam 定时器

在这里插入图片描述
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 上使用更专业的镜头,你可以轻松购买并自行安装。

在这里插入图片描述
案例1:控制OpenMV Cam的LED灯闪烁

import sensor, image, time
from machine import Pin, PWM

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

# 启动摄像头
sensor.run(1)

# 设置LED灯颜色为红色
red_led = PWM(Pin(2))
red_led.freq(50)
red_led.duty_u16(255)

# 设置定时器,每隔1秒触发一次中断,LED灯闪烁
def blink_led():
    global red_led
    red_led.duty(255)
    time.sleep_ms(500)
    red_led.duty(0)
    time.sleep_ms(500)

timer = Timer(-1)
timer.init(period=1000, mode=Timer.PERIODIC, callback=blink_led)

while True:
    img = sensor.snapshot()
    img.compress(quality=80, optimize=True)
    time.sleep(1/30)  # 每30帧进行一次白平衡校准

要点解读:这个程序演示了如何使用MicroPython控制OpenMV Cam的LED灯闪烁。首先,需要初始化摄像头并设置图像格式和分辨率。然后,通过run方法启动摄像头。接着,在一个无限循环中,不断获取摄像头的图像,并将其保存到本地文件中。需要注意的是,在使用OpenMV Cam进行视频流传输时,需要确保数据传输的正确性和完整性。因此,在发送数据前需要等待接收方准备好,并在读取数据时需要注意数据的完整性和正确性。在这个程序中,我们使用了PWM模块来控制LED灯的颜色,并将LED灯设置为红色。然后,我们定义了一个名为blink_led的函数,该函数会在每次触发外部中断时被调用。最后,我们使用Timer类创建了一个定时器对象,并设置了定时器的周期和回调函数。当定时器到达设定的时间间隔时,会触发回调函数,从而控制LED灯的闪烁。

案例2:控制OpenMV Cam的麦克风录音

import sensor, image, time
from machine import Pin, UART

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

# 启动摄像头
sensor.run(1)

# 设置麦克风为输入模式
mic = Pin(0, Pin.IN)

# 设置串口通信,用于将录音数据发送到电脑
uart = UART(1, 9600)

# 设置定时器,每隔1秒触发一次中断,开始录音
def start_recording():
    global mic, uart
    uart.init(9600, bits=8, parity=None, stop=1)
    while True:
        if mic.value() == 1:
            data = mic.read()
            uart.write(data)
            time.sleep_ms(100)

timer = Timer(-1)
timer.init(period=1000, mode=Timer.PERIODIC, callback=start_recording)

while True:
    img = sensor.snapshot()
    img.compress(quality=80, optimize=True)
    time.sleep(1/30)  # 每30帧进行一次白平衡校准

要点解读:这个程序演示了如何使用MicroPython控制OpenMV Cam的麦克风录音。首先,需要初始化摄像头并设置图像格式和分辨率。然后,通过run方法启动摄像头。接着,在一个无限循环中,不断获取摄像头的图像,并将其保存到本地文件中。需要注意的是,在使用OpenMV Cam进行视频流传输时,需要确保数据传输的正确性和完整性。

案例3:周期性执行任务:

import pyb

# 定义定时器回调函数
def timer_callback(timer):
    print("Timer expired!")

# 初始化定时器
tim = pyb.Timer(1, freq=1)  # 定时器1,频率为1Hz
tim.callback(timer_callback)

# 主循环
while True:
    pass

要点解读:
使用pyb.Timer()初始化定时器对象,参数包括定时器号和频率。
pyb.Timer()的第一个参数为定时器号,可以是1、2或3,用于选择不同的定时器。
freq参数用于设置定时器的频率,这里设置为1Hz,即每秒触发一次定时器中断。
定义一个定时器回调函数timer_callback(),在定时器到期时执行特定的代码。
在主循环中使用pass保持程序运行。
这个示例展示了如何使用MicroPython在OpenMV Cam上实现一个周期性执行任务的定时器。定时器每秒触发一次中断,并执行定时器回调函数中的代码。

案例4:延时触发任务:

import pyb

# 定义定时器回调函数
def timer_callback(timer):
    print("Timer expired!")

# 初始化定时器
tim = pyb.Timer(2, prescaler=83, period=5000)  # 定时器2,频率为10Hz
tim.callback(timer_callback)

# 主循环
while True:
    pass

要点解读:
使用pyb.Timer()初始化定时器对象,参数包括定时器号、预分频器和周期。
pyb.Timer()的第一个参数为定时器号,可以是1、2或3,用于选择不同的定时器。
prescaler参数用于设置预分频器的值,这里设置为83,将系统时钟分频为84MHz/84=1MHz。
period参数用于设置定时器周期的值,这里设置为5000,即定时器每5ms触发一次中断。
定义一个定时器回调函数timer_callback(),在定时器到期时执行特定的代码。
在主循环中使用pass保持程序运行。
这个示例展示了如何使用MicroPython在OpenMV Cam上实现一个延时触发任务的定时器。定时器每5毫秒触发一次中断,并执行定时器回调函数中的代码。

案例5:定时测量脉冲宽度:

import pyb

# 定义定时器回调函数
def timer_callback(timer):
    pulse_width = timer.pulse_width()
    print("Pulse width:", pulse_width, "us")

# 初始化定时器
tim = pyb.Timer(3, mode=pyb.Timer.IC, prescaler=83)  # 定时器3,输入捕获模式
tim.callback(timer_callback)

# 主循环
while True:
    pass

要点解读:
使用pyb.Timer()初始化定时器对象,参数包括定时器号、模式和预分频器。
pyb.Timer()的第一个参数为定时器号,可以是1、2或3,用于选择不同的定时器。
mode参数用于设置定时器的工作模式,这里设置为输入捕获模式(IC)。
prescaler参数用于设置预分频器的值,这里设置为83,将系统时钟分频为84MHz/84=1MHz。
定义一个定时器回调函数timer_callback(),在定时器捕获脉冲时执行特定的代码。
使用timer.pulse_width()方法获取捕获脉冲的宽度,并打印出来。
在主循环中使用pass保持程序运行。这个示例展示了如何使用MicroPython在OpenMV Cam上实现定时器来测量脉冲宽度。定时器以输入捕获模式运行,当捕获到脉冲时触发定时器中断,并通过定时器回调函数获取脉冲宽度并打印出来。

案例6:使用定时器控制LED灯的闪烁

import pyb  
import time  
  
led = pyb.Pin('X1', pyb.Pin.OUT_PP) # 将X1引脚配置为输出模式,用于控制LED灯  
timer = pyb.Timer(4, freq=1) # 创建一个定时器对象,使用定时器4,频率为1Hz  
  
def timer_callback(timer):  
    led.toggle() # 切换LED灯的状态  
  
timer.callback(timer_callback) # 设置定时器的回调函数为timer_callback  
timer.start() # 启动定时器  
  
while True:  
    # 循环等待,防止程序退出  
    pass

要点解读:此代码使用OpenMV Cam的MicroPython运行时来使用定时器控制LED灯的闪烁。代码中,我们首先使用pyb.Pin()函数将X1引脚配置为输出模式,用于控制LED灯。然后创建一个定时器对象timer,使用定时器4,频率为1Hz。接着定义了一个timer_callback()函数作为定时器的回调函数,该函数切换LED灯的状态。最后使用timer.callback()方法设置定时器的回调函数为timer_callback(),并使用timer.start()方法启动定时器。在主循环中,我们使用一个无限循环来防止程序退出。当定时器触发时,会执行回调函数timer_callback(),从而控制LED灯的闪烁。需要注意的是,在OpenMV Cam中,可以使用pyb模块来进行通用硬件控制。

案例7:使用定时器实现定时拍照功能

import pyb  
import sensor  
import image  
import time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.GRAYSCALE) # 设置摄像头像素格式为灰度图像  
sensor.set_framesize(sensor.QVGA) # 设置摄像头帧大小为QVGA  
sensor.skip_frames(time=2000) # 等待摄像头稳定工作  
  
timer = pyb.Timer(4, freq=5) # 创建一个定时器对象,使用定时器4,频率为5Hz  
count = 0 # 初始化计数器为0  
  
def capture_callback(timer):  
    global count  
    img = sensor.snapshot() # 拍照并获取图像对象  
    img.save('capture' + str(count) + '.jpg') # 保存图像到文件系统中,文件名以计数器的值命名  
    count += 1 # 计数器加1  
    print('Capture image saved.') # 打印保存成功的提示信息  
  
timer.callback(capture_callback) # 设置定时器的回调函数为capture_callback  
timer.start() # 启动定时器  
  
while True:  
    # 循环等待,防止程序退出  
    pass

要点解读:此代码使用OpenMV Cam的MicroPython运行时来使用定时器实现定时拍照功能。代码中,我们首先使用sensor模块初始化摄像头并设置相关参数。然后创建一个定时器对象timer,使用定时器4,频率为5Hz。接着定义了一个capture_callback()函数作为定时器的回调函数,该函数拍照并获取图像对象,将图像保存到文件系统中,并以计数器的值命名文件。最后使用timer.callback()方法设置定时器的回调函数为capture_callback(),并使用timer.start()方法启动定时器。在主循环中,我们使用一个无限循环来防止程序退出。当定时器触发时,会执行回调函数capture_callback(),从而实现定时拍照功能。需要注意的是,在OpenMV Cam中,可以使用sensor和image模块来进行摄像头控制和图像处理。

案例8:使用定时器实现倒计时功能

import pyb  
import time  
  
# 初始化舵机和超声波传感器引脚  
servo_pin = pyb.Pin('X1', pyb.Pin.OUT_PP)  
ultrasonic_pin = pyb.Pin('X2', pyb.Pin.IN)  
  
# 定义舵机转动函数  
def set_servo_angle(angle):  
    pulse_width = 500 + 100 * angle / 180  
    servo_pin.value(1)  
    time.sleep_us(pulse_width)  
    servo_pin.value(0)  
    time.sleep_us(20000 - pulse_width)  
  
# 定义获取距离函数  
def get_distance():  
    ultrasonic_pin.value(1)  
    time.sleep_us(10)  
    ultrasonic_pin.value(0)  
    time.sleep_us(50)  
    return (ultrasonic_pin.value() == 1) * 34 / 2  
  
# 主程序循环  
while True:  
    # 获取距离  
    distance = get_distance()  
      
    # 根据距离控制舵机转动角度  
    if distance < 10:  
        angle = int(math.atan2(10 - distance, 3) * 180 / math.pi)  
        set_servo_angle(angle)  
        time.sleep_ms(100)  
    else:  
        set_servo_angle(90)  
        time.sleep_ms(100)

在案例三中,我们使用舵机和超声波传感器实现了避障功能。首先,我们初始化了舵机和超声波传感器的引脚。然后,我们定义了set_servo_angle()函数用于控制舵机的转动角度,get_distance()函数用于获取超声波传感器测量的距离。在主程序循环中,我们不断获取距离并根据距离的大小来控制舵机的转动角度,以实现避障功能。如果距离小于10厘米,则转动舵机避障,否则保持舵机不动。需要注意的是,程序中使用的超声波传感器型号为HC-SR04,其测量距离为2-400厘米,精度为3毫米。

这些示例程序展示了如何在OpenMV Cam上使用MicroPython实现定时器的不同应用场景。其中包括周期性执行任务、延时触发任务和定时测量脉冲宽度。对于每个示例,我们使用pyb.Timer()初始化定时器对象,并定义一个定时器回调函数,在定时器触发时执行特定的代码。可以根据具体需求调整定时器的频率、周期、工作模式和预分频器等参数来实现不同的定时功能。

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

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值