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支持ADC(模数转换)功能,可以实现模拟信号的转换为数字信号。下面将以专业的眼界、教师的视角详细解释MicroPython的OpenMV Cam ADC的主要特点、应用场景以及需要注意的事项。
主要特点:
模数转换功能:OpenMV Cam的ADC功能可以将模拟信号转换为数字信号。通过采样和量化模拟信号,ADC可以将其转换为对应的数字值,以便进行数字信号处理和分析。
多通道支持:OpenMV Cam通常支持多个ADC通道,可以同时采集多个模拟信号。这种多通道支持能力使得OpenMV Cam可以同时获取多个模拟信号的数据,满足多路信号采集的需求。
精度和分辨率:ADC通常具有可调的精度和分辨率。精度指ADC的输出结果与输入信号的真实值之间的误差程度,而分辨率则是指ADC能够区分的最小单位。OpenMV Cam的ADC功能通常可以根据需求进行相应的配置,以获得所需的精度和分辨率。
应用场景:
传感器数据采集:ADC功能广泛应用于传感器数据采集领域。通过连接传感器到OpenMV Cam的ADC引脚,可以将传感器输出的模拟信号转换为数字信号,并进行后续的数据处理和分析。
环境监测:ADC功能可以用于环境监测应用。例如,通过连接温度传感器或湿度传感器到OpenMV Cam的ADC引脚,可以实时获取环境参数的模拟信号,并进行数据记录或报警等操作。
电池电压监测:ADC功能还可以用于电池电压监测。通过连接电池电压分压器到OpenMV Cam的ADC引脚,可以实时获取电池电压的模拟信号,从而监测电池状态并进行电量管理。
需要注意的事项:
引脚选择:在使用ADC功能时,需要选择支持ADC输入的合适引脚。要确保选择的引脚支持ADC功能,并且与其他功能或设备的引脚冲突。
采样率:在使用ADC功能时,需要根据具体应用需求设置适当的采样率。采样率决定了ADC对模拟信号的采样频率,需要根据信号的变化速度和所需精度进行合理的设置。
参考电压:ADC通常需要一个参考电压来进行模拟信号的量化。在使用ADC功能时,需要正确配置参考电压,以确保模拟信号的正确转换。
总之,MicroPython的OpenMV Cam ADC功能具有模数转换、多通道支持和可调的精度分辨率等特点,适用于传感器数据采集、环境监测和电池电压监测等应用场景。在使用ADC功能时,需要注意选择合适的引脚、设置适当的采样率以及配置正确的参考电压。通过合理利用OpenMV Cam的ADC功能,可以实现对模拟信号的准确转换和处理。
案例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)
while True:
img = sensor.snapshot()
img.compress(quality=80, optimize=True)
time.sleep(1/30) # 每30帧进行一次白平衡校准
要点解读:这个程序演示了如何使用MicroPython控制OpenMV Cam的LED灯颜色。首先,需要初始化摄像头并设置图像格式和分辨率。然后,通过run方法启动摄像头。接着,在一个无限循环中,不断获取摄像头的图像,并将其保存到本地文件中。需要注意的是,在使用OpenMV Cam进行视频流传输时,需要确保数据传输的正确性和完整性。
案例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)
while True:
if mic.value() == 1:
data = mic.read()
uart.write(data)
time.sleep_ms(100)
要点解读:这个程序演示了如何使用MicroPython控制OpenMV Cam的麦克风录音。首先,需要初始化摄像头并设置图像格式和分辨率。然后,通过run方法启动摄像头。接着,在一个无限循环中,不断获取摄像头的图像,并将其保存到本地文件中。需要注意的是,在使用OpenMV Cam进行视频流传输时,需要确保数据传输的正确性和完整性。
案例3:读取光敏电阻的值:
import pyb
# 初始化ADC对象
adc = pyb.ADC("P7") # 使用P7引脚
# 主循环
while True:
# 读取ADC值
value = adc.read()
# 打印ADC值
print("ADC value:", value)
# 延时
pyb.delay(1000)
要点解读:
使用pyb.ADC()初始化ADC对象,参数为ADC引脚号。
pyb.ADC()的参数为ADC引脚号,可以选择P0 ~ P7。
在主循环中使用adc.read()读取ADC的值。
使用print()打印ADC的值。
使用pyb.delay()进行延时,这里延时1秒。
这个示例展示了如何使用MicroPython在OpenMV Cam上读取光敏电阻的值。通过初始化ADC对象并指定引脚号,可以读取ADC的值。在主循环中,使用adc.read()读取ADC的值,然后使用print()打印出来。通过调整延时的时间,可以控制读取ADC的频率。
案例4:读取电压值并进行转换:
import pyb
# 初始化ADC对象
adc = pyb.ADC("P6") # 使用P6引脚
# 设置ADC参考电压
adc.reference(3.3) # 参考电压为3.3V
# 主循环
while True:
# 读取ADC值
value = adc.read()
# 转换为电压值
voltage = value * 3.3 / 4095
# 打印电压值
print("Voltage:", voltage)
# 延时
pyb.delay(1000)
要点解读:
使用pyb.ADC()初始化ADC对象,参数为ADC引脚号。
pyb.ADC()的参数为ADC引脚号,可以选择P0 ~ P7。
使用adc.reference()设置ADC的参考电压,这里设置为3.3V。
在主循环中使用adc.read()读取ADC的值。
将ADC值转换为电压值,公式为 voltage = value * 3.3 / 4095,其中4095是ADC的最大值。
使用print()打印电压值。
使用pyb.delay()进行延时,这里延时1秒。
这个示例展示了如何使用MicroPython在OpenMV Cam上读取电压值并进行转换。通过初始化ADC对象并设置参考电压,可以读取ADC的值并将其转换为电压值。在主循环中,使用adc.read()读取ADC的值,然后使用转换公式将其转换为电压值。通过调整延时的时间,可以控制读取电压值的频率。
案例5:使用中断读取ADC值:
import pyb
# 初始化ADC对象
adc = pyb.ADC("P7") # 使用P7引脚
# 中断回调函数
def adc_callback(timer):
value = adc.read()
print("ADC value:", value)
# 初始化定时器对象
timer = pyb.Timer(4, freq=10) # 频率为10Hz
# 设置定时器中断回调函数
timer.callback(adc_callback)
# 主循环
while True:
pass
要点解读:
使用pyb.ADC()初始化ADC对象,参数为ADC引脚号。
pyb.ADC()的参数为ADC引脚号,可以选择P0 ~ P7。
定义一个中断回调函数adc_callback,在该函数中读取ADC的值并打印。
使用pyb.Timer()初始化定时器对象,参数为定时器号和频率。
pyb.Timer()的参数为定时器号和频率,这里使用定时器4,频率为10Hz。
使用timer.callback()设置定时器的中断回调函数为adc_callback。
在主循环中使用pass保持程序运行。
这个示例展示了如何使用中断来读取ADC的值。通过初始化ADC对象和定时器对象,并设置中断回调函数,可以在固定的频率下读取ADC的值。在中断回调函数中,使用adc.read()读取ADC的值,并通过print()打印出来。通过调整定时器的频率,可以控制读取ADC的速度。
案例6:读取模拟传感器数据
import pyb
import time
adc = pyb.ADC(pyb.Pin('X1')) # 将X1引脚配置为ADC输入模式
while True:
value = adc.read() # 读取ADC值
print(value) # 输出ADC值
time.sleep_ms(500) # 延时500ms
要点解读:此代码使用OpenMV Cam的MicroPython运行时来读取模拟传感器数据。代码中,我们首先使用pyb.ADC()函数将X1引脚配置为ADC输入模式。然后在主循环中,使用adc.read()方法读取ADC值,并将其输出到控制台。需要注意的是,adc.read()方法返回的是一个整数,表示ADC的采样值。根据传感器的不同,可能需要对采样值进行进一步的处理才能得到实际的物理量。
案例7:使用ADC实现电位器控制LED亮度
import pyb
import time
adc = pyb.ADC(pyb.Pin('X1')) # 将X1引脚配置为ADC输入模式
led = pyb.Pin('X2', pyb.Pin.OUT_PP) # 将X2引脚配置为输出模式,用于控制LED灯
while True:
value = adc.read() # 读取ADC值
duty_cycle = value / 4095 * 100 # 计算占空比
pwm = pyb.PWM(timer=pyb.Timer(4), freq=100, channel=1, pin=led, pulse_width=duty_cycle) # 创建PWM对象控制LED亮度
time.sleep_ms(50) # 延时50ms,等待LED亮度变化
要点解读:此代码使用OpenMV Cam的MicroPython运行时来使用ADC实现电位器控制LED亮度。代码中,我们首先使用pyb.ADC()函数将X1引脚配置为ADC输入模式,并使用pyb.Pin()函数将X2引脚配置为输出模式,用于控制LED灯。然后在主循环中,使用adc.read()方法读取ADC值,并根据ADC值计算占空比。接着创建一个PWM对象pwm,使用定时器4,频率为100Hz,通道1,绑定到X2引脚,并根据计算得到的占空比设置脉冲宽度。最后延时50ms,等待LED亮度变化。需要注意的是,电位器的阻值变化会引起ADC采样值的变化,从而改变计算得到的占空比,进而控制LED的亮度。
案例9:使用ADC实现温度传感器测量温度
import pyb import time import math adc =
pyb.ADC(pyb.Pin('X1')) # 将X1引脚配置为ADC输入模式 def
read_temperature():
value = adc.read() # 读取ADC值
voltage = value / 4095 * 3.3 # 计算电压值
temperature = (voltage - 0.5) * 100 / 0.43 + 25 # 根据公式计算温度值
return temperature while True:
temperature = read_temperature() # 读取温度值
print(temperature) # 输出温度值
time.sleep_ms(500) # 延时500ms
要点解读:此代码使用OpenMV Cam的MicroPython运行时来使用ADC实现温度传感器测量温度。代码中,我们首先使用pyb.ADC()函数将X1引脚配置为ADC输入模式。然后定义一个read_temperature()函数,用于读取温度值。在该函数中,首先使用adc.read()方法读取ADC值,并根据ADC值计算电压值。然后根据传感器输出的电压与温度之间的关系,通过公式计算得到温度值。接着在主循环中,调用read_temperature()函数读取温度值,并将其输出到控制台。需要注意的是,温度传感器的输出电压与温度之间的关系需要根据具体的传感器型号和规格进行确定。在本例中,我们使用的是一个常用的温度传感器型号,其输出电压与温度之间的关系可以通过公式进行计算。
这些示例程序展示了如何在OpenMV Cam上使用MicroPython实现ADC的不同应用场景。通过初始化ADC对象并设置引脚号,可以读取ADC的值。可以通过设置参考电压来进行电压值的转换,并可以使用中断来实现定时读取ADC的值。这些功能可以用于各种传感器的数据采集和监测应用中。
请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。确保正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。