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

在这里插入图片描述
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.LED功能,可以控制板载LED灯的状态和行为。下面将详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

灵活性:OpenMV Cam的pyb.LED功能提供了灵活的LED控制接口,可以通过编写MicroPython代码来实现各种LED状态和行为的定制。您可以控制LED的亮度、闪烁频率、颜色等,以适应不同的需求。

可视化指示:板载LED灯可以用于提供可视化指示,例如表示设备状态、工作模式、错误提示等。通过控制LED的亮灭和闪烁,可以方便用户了解设备当前的工作状态。

节能设计:OpenMV Cam的LED模块采用节能设计,可以根据需要控制LED的亮度和闪烁频率,以减少能源消耗。

应用场景:

计算机视觉项目:在计算机视觉项目中,LED灯可以用于指示图像处理和视觉算法的状态。例如,在对象检测项目中,LED可以指示是否检测到目标对象,或者表示检测到的目标数量。

教育和科研项目:OpenMV Cam作为教育和科研的工具,通过控制LED灯可以进行各种实验和示范。例如,可以利用LED灯演示信号处理、通信协议、状态机等知识。

嵌入式系统开发:在嵌入式系统开发中,LED灯可以用作状态指示器,方便开发者调试和测试。例如,LED可以指示系统的启动状态、通信状态、错误状态等。

需要注意的事项:

电源消耗:控制LED灯的亮度和闪烁频率会消耗一定的电源能量。在使用LED功能时,需要考虑电源消耗和系统的电池寿命,避免过度使用LED导致能源不足。

光线干扰:在某些应用场景中,强光可能会对LED指示效果产生干扰。例如,在户外环境中,强烈的阳光可能使LED灯变得不够明显。在设计和应用中,需要考虑光线干扰因素,选择合适的亮度和颜色。

用户体验:LED灯的状态和行为应该设计得易于理解和识别。在应用中,需要考虑用户的视觉感知和认知能力,以提供清晰、准确的指示。

总结来说,MicroPython的OpenMV Cam的pyb.LED功能提供了灵活的LED控制接口,可以控制板载LED灯的状态和行为。它在计算机视觉项目、教育和科研项目以及嵌入式系统开发中具有广泛应用。在使用时,需要注意电源消耗、光线干扰和用户体验等方面的事项,以确保LED指示的准确性和有效性。

案例一:控制LED闪烁

import sensor, image, time
from pyb import LED

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

led = LED(1) # 初始化LED,连接到引脚1

while True:
    img = sensor.snapshot() # 捕获一帧图像
    if img.is_dark(): # 如果图像较暗
        led.off() # 关闭LED
    else:
        led.on() # 打开LED
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序首先导入了sensor、image、time和pyb.LED模块。然后初始化摄像头,设置像素格式为RGB565,帧大小为320x240,并等待设置生效,延时2秒。接着初始化LED,连接到引脚1。在while循环中,不断捕获摄像头的图像,如果图像较暗,就关闭LED;否则,打开LED。每次操作后延时100毫秒。

案例二:控制多个LED闪烁

import sensor, image, time
from pyb import LED

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

leds = [LED(i) for i in range(8)] # 初始化8个LED,分别连接到引脚0-7

while True:
    img = sensor.snapshot() # 捕获一帧图像
    if img.is_dark(): # 如果图像较暗
        for led in leds: # 遍历所有LED
            led.off() # 关闭LED
    else:
        for led in leds: # 遍历所有LED
            led.on() # 打开LED
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序与第一个案例类似,只是将一个LED改为了多个LED,并将它们分别连接到引脚0-7。其他部分保持不变。在while循环中,不断捕获摄像头的图像,如果图像较暗,就关闭所有LED;否则,打开所有LED。每次操作后延时100毫秒。

案例三:使用pyb.Timer定时控制LED闪烁

import sensor, image, time
from pyb import LED, Timer

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

led = LED(1) # 初始化LED,连接到引脚1
timer = Timer() # 初始化定时器

def blink_led():
    if led.is_on(): # 如果LED已打开
        led.off() # 关闭LED
    else: # 如果LED已关闭
        led.on() # 打开LED
    timer.schedule_once(blink_led, 1000) # 每隔1000毫秒(1秒)执行一次blink_led函数

timer.init(period=1000, mode=Timer.PERIODIC, callback=blink_led) # 设置定时器,周期为1000毫秒(1秒),并在每次到达周期时执行blink_led函数
timer.start() # 启动定时器

while True:
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序与前两个案例类似,只是使用了pyb.Timer模块来实现定时功能。在程序开始时,初始化摄像头、LED和定时器。定义了一个名为blink_led的函数,用于控制LED的闪烁。在主循环中,延时100毫秒。定时器每隔1000毫秒(1秒)执行一次blink_led函数,并启动定时器。

案例四:使用pyb.LED显示摄像头状态

import sensor, image, time, pyb  
  
led = pyb.LED(1) # 初始化LED  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
while(True):  
    if sensor.snapshot() is not None: # 如果拍摄照片成功  
        led.on() # 打开LED  
    else: # 如果拍摄照片失败  
        led.off() # 关闭LED  
    time.sleep(100) # 延时100ms

要点解读:
首先初始化LED和摄像头,设置像素格式和帧大小。
在一个无限循环中,拍摄照片并检查是否成功。
如果拍摄照片成功,则打开LED,否则关闭LED。
使用time.sleep()函数延时100ms,以减少CPU的使用率。

案例五:使用pyb.LED显示QR码扫描状态

import sensor, image, time, pyb  
  
led = pyb.LED(2) # 初始化LED  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    res = img.find_qrcodes() # 查找QR码  
    if len(res) > 0: # 如果找到了QR码  
        led.on() # 打开LED  
    else: # 如果没有找到QR码  
        led.off() # 关闭LED  
    time.sleep(100) # 延时100ms

要点解读:
首先初始化LED和摄像头,设置像素格式和帧大小。
在一个无限循环中,拍摄照片并查找QR码。
如果找到了QR码,则打开LED,否则关闭LED。
使用time.sleep()函数延时100ms,以减少CPU的使用率。

案例六:使用pyb.LED实现呼吸灯效果

import pyb, time

led = pyb.LED(3) # 初始化LED  
pwm = pyb.PWM(pyb.Pin('X5'), freq=100) # 初始化PWM引脚  
pwm.duty(0) # 初始占空比为0  
  
while True:  
    for i in range(0, 101, 5): # 占空比从0增加到100,步长为5  
        pwm.duty(i) # 设置占空比  
        time.sleep_ms(20) # 延时20ms  
    for i in range(100, -1, -5): # 占空比从100减少到0,步长为-5  
        pwm.duty(i) # 设置占空比  
        time.sleep_ms(20) # 延时20ms

要点解读:
首先初始化LED和PWM引脚,设置PWM频率为100Hz,初始占空比为0。
在一个无限循环中,使用两个for循环实现呼吸灯效果。第一个for循环将占空比从0增加到100,第二个for循环将占空比从100减少到0。每次循环都设置新的占空比并延时20ms,以实现呼吸灯效果。

案例七:控制LED闪烁:

import pyb
import time

led = pyb.LED(1)

while True:
    led.on()
    time.sleep(500)
    led.off()
    time.sleep(500)

要点解读:
该程序使用pyb.LED类控制OpenMV Cam上的LED。
使用pyb.LED(1)创建一个LED对象,参数1指定要控制的LED编号(这里使用编号1)。
在一个无限循环中,使程序持续执行以下操作:
使用led.on()将LED打开。
使用time.sleep(500)延迟500毫秒,即LED保持亮500毫秒。
使用led.off()将LED关闭。
使用time.sleep(500)延迟500毫秒,即LED保持灭500毫秒。
这样,LED会以500毫秒的间隔闪烁。

案例八:使用按钮控制LED开关:

import pyb

led = pyb.LED(1)
button = pyb.Switch()

while True:
    if button():
        led.toggle()
        pyb.delay(200)

要点解读:
该程序使用pyb.LED类和pyb.Switch类实现通过按钮控制LED的开关。
使用pyb.LED(1)创建一个LED对象,参数1指定要控制的LED编号(这里使用编号1)。
使用pyb.Switch()创建一个Switch对象,用于读取按钮状态。
在一个无限循环中,使程序持续执行以下操作:
使用button()检测按钮是否被按下,如果被按下则返回True,否则返回False。
如果按钮被按下,使用led.toggle()切换LED的状态(开关)。
使用pyb.delay(200)延迟200毫秒,以避免过快地切换LED状态。

案例九:使用循环改变LED的亮度:

import pyb

led = pyb.LED(1)

for intensity in range(256):
    led.intensity(intensity)
    pyb.delay(10)

要点解读:
该程序使用pyb.LED类的intensity()方法循环改变LED的亮度。
使用pyb.LED(1)创建一个LED对象,参数1指定要控制的LED编号(这里使用编号1)。
使用for循环从0到255遍历亮度值。
在循环中,使用led.intensity(intensity)设置LED的亮度,参数intensity表示亮度值(0-255)。
使用pyb.delay(10)延迟10毫秒,以在每次改变亮度后给LED一定的时间显示。

这些实际运用程序示例展示了如何使用MicroPython和OpenMV Cam的pyb.LED类来控制LED的闪烁、开关和亮度。第一个示例演示了简单的LED闪烁效果,通过循环调用led.on()和led.off()方法实现LED的闪烁。第二个示例展示了如何使用按钮来控制LED的开关,通过检测按钮状态并调用led.toggle()方法来切换LED的状态。第三个示例展示了如何使用循环逐渐改变LED的亮度,通过循环调用led.intensity()方法并传入不同的亮度值来改变LED的亮度。根据您的具体需求,您可以根据这些示例进行修改和扩展,以实现更复杂的LED控制功能和应用。

在这里插入图片描述

猜你喜欢

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