【雕爷学编程】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 上使用更专业的镜头,你可以轻松购买并自行安装。

在这里插入图片描述
MicroPython的OpenMV Cam支持外部中断功能,可以通过编程来实现对外部信号的中断响应和处理。下面将以专业的视角详细解释MicroPython的OpenMV Cam外部中断的主要特点、应用场景以及需要注意的事项。

主要特点:

中断触发:OpenMV Cam的外部中断功能可以通过配置引脚的中断触发条件来响应外部信号的变化。可以根据需要选择上升沿、下降沿、边沿或电平触发等方式来触发外部中断。

高响应速度:OpenMV Cam的外部中断功能具有快速的响应能力。当外部信号满足中断触发条件时,OpenMV Cam能够快速中断当前执行的程序,并执行相应的中断处理程序。

异步处理:外部中断是一种异步事件,即它可以随时发生,不受程序的控制。OpenMV Cam的外部中断功能允许在程序执行过程中,根据外部信号的变化进行中断处理,从而实现异步事件的响应。

应用场景:

按键触发:OpenMV Cam的外部中断功能适用于按键触发应用。通过配置外部中断引脚为上升沿触发或下降沿触发,可以实现对按键的触发响应,例如捕捉按钮按下或释放的事件,从而实现按键控制功能。

传感器触发:外部中断还可以应用于传感器触发应用。例如,当传感器检测到某种事件或条件发生时,可以通过触发外部中断来实现相应的处理,如数据采集、报警通知等。

通信协议:外部中断功能还可以用于通信协议的实现。例如,在串口通信中,可以通过配置外部中断引脚为边沿触发,当接收到特定的通信信号时,触发中断并处理接收到的数据。

需要注意的事项:

引脚选择:在使用外部中断功能时,需要选择合适的引脚作为中断引脚。要确保选择的引脚支持外部中断功能,并且与其他功能或设备的引脚冲突。

中断处理程序:在编程时,需要编写合适的中断处理程序来处理中断事件。中断处理程序应该简洁高效,尽量避免在中断处理程序中执行复杂的操作,以保证中断的响应速度。

中断优先级:如果同时存在多个中断源,需要考虑中断的优先级问题。在编程时,可以设置中断的优先级,以确保高优先级的中断能够及时响应并处理。

总之,MicroPython的OpenMV Cam外部中断功能具有中断触发、高响应速度和异步处理等特点,适用于按键触发、传感器触发和通信协议等应用场景。在使用外部中断功能时,需要注意选择合适的引脚、编写合适的中断处理程序以及处理中断优先级等事项。通过合理利用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)

# 设置外部中断,当触发中断时,LED灯闪烁
def blink_led():
    global red_led
    red_led.duty(255)
    time.sleep_ms(500)
    red_led.duty(0)
    time.sleep_ms(500)

sensor.register_irq(trigger=Pin(2), handler=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的函数,该函数会在每次触发外部中断时被调用。最后,我们使用register_irq方法注册了一个外部中断,当触发中断时,会调用blink_led函数来控制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)

# 设置外部中断,当触发中断时,开始录音
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)

sensor.register_irq(trigger=Pin(0), handler=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 button_interrupt(line):
    print("Button pressed!")

# 初始化外部中断
extint = pyb.ExtInt('P1', pyb.ExtInt.IRQ_RISING_FALLING, pyb.Pin.PULL_UP, button_interrupt)

# 主循环
while True:
    pyb.delay(1000)

要点解读:
使用pyb.ExtInt()初始化外部中断对象,参数包括中断引脚号、中断触发条件、引脚上拉/下拉设置和中断回调函数。
中断触发条件可以是pyb.ExtInt.IRQ_RISING(上升沿触发)、pyb.ExtInt.IRQ_FALLING(下降沿触发)或pyb.ExtInt.IRQ_RISING_FALLING(上升沿和下降沿触发)。
使用pyb.Pin.PULL_UP设置引脚为上拉模式,也可以选择pyb.Pin.PULL_DOWN设置为下拉模式。
定义一个中断回调函数button_interrupt(),在中断触发时执行特定的代码。
在主循环中使用pyb.delay()进行延时,以保持程序运行。
这个示例展示了如何使用MicroPython在OpenMV Cam上通过按钮触发外部中断,并在中断触发时执行特定的代码。

案例4:检测传感器触发外部中断:

import pyb

# 定义外部中断回调函数
def sensor_interrupt(line):
    print("Sensor triggered!")

# 初始化外部中断
extint = pyb.ExtInt('P2', pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_DOWN, sensor_interrupt)

# 主循环
while True:
    pyb.delay(1000)

要点解读:
使用pyb.ExtInt()初始化外部中断对象,参数包括中断引脚号、中断触发条件、引脚上拉/下拉设置和中断回调函数。
中断触发条件可以是pyb.ExtInt.IRQ_RISING(上升沿触发)、pyb.ExtInt.IRQ_FALLING(下降沿触发)或pyb.ExtInt.IRQ_RISING_FALLING(上升沿和下降沿触发)。
使用pyb.Pin.PULL_DOWN设置引脚为下拉模式,也可以选择pyb.Pin.PULL_UP设置为上拉模式。
定义一个中断回调函数sensor_interrupt(),在中断触发时执行特定的代码。
在主循环中使用pyb.delay()进行延时,以保持程序运行。
这个示例展示了如何使用MicroPython在OpenMV Cam上通过传感器触发外部中断,并在中断触发时执行特定的代码。

案例5:编码器触发外部中断:

import pyb

# 定义外部中断回调函数
def encoder_interrupt(line):
    print("Encoder triggered!")

# 初始化外部中断
extint1 = pyb.ExtInt('P3', pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_NONE, encoder_interrupt)
extint2 = pyb.ExtInt('P4', pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_NONE, encoder_interrupt)

# 主循环
while True:
    pyb.delay(1000)

要点解读:
使用pyb.ExtInt()初始化外部中断对象,参数包括中断引脚号、中断触发条件、引脚上拉/下拉设置和中断回调函数。
中断触发条件可以是pyb.ExtInt.IRQ_RISING(上升沿触发)、pyb.ExtInt.IRQ_FALLING(下降沿触发)或pyb.ExtInt.IRQ_RISING_FALLING(上升沿和下降沿触发)。
使用pyb.Pin.PULL_NONE禁用引脚的上拉/下拉设置。
定义一个中断回调函数encoder_interrupt(),在中断触发时执行特定的代码。
在主循环中使用pyb.delay()进行延时,以保持程序运行。
这个示例展示了如何使用MicroPython在OpenMV Cam上通过编码器触发外部中断,并在中断触发时执行特定的代码。

案例6:使用外部中断控制LED灯的亮灭

import pyb  
  
led = pyb.Pin('X1', pyb.Pin.OUT_PP) # 将X1引脚配置为输出模式,用于控制LED灯  
button = pyb.Pin('X2', pyb.Pin.IN) # 将X2引脚配置为输入模式,用于接收按键信号  
button.irq(trigger=pyb.Pin.IRQ_FALLING, handler=lambda p: led.toggle()) # 设置外部中断,触发方式为下降沿,中断处理函数为led.toggle()

要点解读:此代码使用OpenMV Cam的MicroPython运行时来使用外部中断控制LED灯的亮灭。代码中,我们首先使用pyb.Pin()函数将X1和X2引脚配置为输出模式和输入模式,分别用于控制LED灯和接收按键信号。然后使用button.irq()方法设置外部中断,触发方式为下降沿,中断处理函数为led.toggle(),即切换LED灯的状态。当按键按下时,会触发外部中断,执行中断处理函数,从而控制LED灯的亮灭。需要注意的是,在OpenMV Cam中,可以使用pyb模块来进行通用硬件控制。

案例7:使用外部中断实现计数功能

import pyb  
  
button = pyb.Pin('X2', pyb.Pin.IN) # 将X2引脚配置为输入模式,用于接收按键信号  
count = 0 # 初始化计数器为0  
  
def count_callback(p):  
    global count  
    count += 1 # 计数器加1  
    print('Count:', count) # 打印计数器值  
  
button.irq(trigger=pyb.Pin.IRQ_FALLING, handler=count_callback) # 设置外部中断,触发方式为下降沿,中断处理函数为count_callback

要点解读:此代码使用OpenMV Cam的MicroPython运行时来使用外部中断实现计数功能。代码中,我们首先使用pyb.Pin()函数将X2引脚配置为输入模式,用于接收按键信号。然后定义了一个count_callback()函数作为中断处理函数,该函数将计数器加1并打印计数器值。最后使用button.irq()方法设置外部中断,触发方式为下降沿,中断处理函数为count_callback()。当按键按下时,会触发外部中断,执行中断处理函数,从而实现计数功能。需要注意的是,在中断处理函数中使用了全局变量count来实现计数功能。

案例8:使用外部中断实现定时拍照功能

import pyb  
import sensor  
import image  
import time  
  
button = pyb.Pin('X2', pyb.Pin.IN) # 将X2引脚配置为输入模式,用于接收按键信号  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.GRAYSCALE) # 设置摄像头像素格式为灰度图像  
sensor.set_framesize(sensor.QVGA) # 设置摄像头帧大小为QVGA  
sensor.skip_frames(time=2000) # 等待摄像头稳定工作  
  
def capture_callback(p):  
    img = sensor.snapshot() # 拍照并获取图像对象  
    img.save('capture.jpg') # 保存图像到文件系统中  
    print('Capture image saved.') # 打印保存成功的提示信息  
  
button.irq(trigger=pyb.Pin.IRQ_FALLING, handler=capture_callback) # 设置外部中断,触发方式为下降沿,中断处理函数为capture_callback

要点解读:此代码使用OpenMV Cam的MicroPython运行时来使用外部中断实现定时拍照功能。代码中,我们首先使用pyb.Pin()函数将X2引脚配置为输入模式,用于接收按键信号。然后使用sensor模块初始化摄像头并设置相关参数。接着定义了一个capture_callback()函数作为中断处理函数,该函数拍照并获取图像对象,将图像保存到文件系统中,并打印保存成功的提示信息。最后使用button.irq()方法设置外部中断,触发方式为下降沿,中断处理函数为capture_callback()。当按键按下时,会触发外部中断,执行中断处理函数,从而实现定时拍照功能。需要注意的是,在OpenMV Cam中,可以使用sensor和image模块来进行摄像头控制和图像处理。

这些示例程序展示了如何在OpenMV Cam上使用MicroPython实现外部中断的不同应用场景。其中包括通过按钮触发中断、通过传感器触发中断和通过编码器触发中断。对于每个示例,我们使用pyb.ExtInt()初始化外部中断对象,并定义一个中断回调函数,在中断触发时执行特定的代码。

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

在这里插入图片描述

猜你喜欢

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