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.IR模块提供了红外(IR)通信功能,可以通过红外信号实现与其他设备的通信。下面将详细解释其主要特点、应用场景以及需要注意的事项。
主要特点:
红外通信:pyb.IR模块支持红外通信协议,可以发送和接收红外信号。通过编写MicroPython代码,可以实现与其他支持红外通信的设备之间的数据传输和交互。
多种红外协议:OpenMV Cam的pyb.IR模块支持多种常见的红外通信协议,例如红外遥控器常用的NEC、SONY、RC-5等协议。这使得它能够与各种红外设备进行兼容和通信。
简化开发:MicroPython编程语言简单易学,适合初学者和教育领域使用。OpenMV Cam提供了友好的编程接口和示例代码,使得红外通信的开发和调试变得更加简单和便捷。
应用场景:
红外遥控:pyb.IR模块可以用于构建红外遥控系统,通过编写适当的代码,将OpenMV Cam作为红外遥控器使用。这可以应用于家庭娱乐设备、智能家居控制等场景。
红外数据传输:通过pyb.IR模块,OpenMV Cam可以与其他支持红外通信的设备进行数据传输。例如,可以将OpenMV Cam与红外传感器、红外通信模块等设备配合使用,实现数据的无线传输。
教学和科研:pyb.IR模块可以用于教学和科研项目。学生和研究人员可以利用OpenMV Cam进行实验和研究,探索红外通信、无线控制等相关领域的知识。
需要注意的事项:
红外协议兼容性:在使用pyb.IR模块时,需要确保所选红外协议与目标设备的红外协议兼容。不同设备使用不同的红外通信协议,所以在进行通信前,需要了解目标设备所使用的红外协议,并相应地进行配置。
通信距离和障碍物:红外通信的传输距离一般较短,且对于障碍物比较敏感。在设计红外通信系统时,需要考虑通信距离和障碍物对信号传输的影响,并合理安排设备的位置和布局。
红外干扰:在使用红外通信时,可能会受到其他红外设备的干扰。为了确保通信的稳定性,需要避免与其他红外设备的频率冲突,并尽量消除干扰源。
总结来说,MicroPython的OpenMV Cam的pyb.IR模块提供了红外通信功能,可用于与其他设备进行红外数据传输和交互。它具有多种红外协议支持、简化开发等特点,适用于红外遥控、红外数据传输以及教学和科研等场景。在使用时需要注意红外协议兼容性、通信距离和障碍物以及红外干扰等因素,并根据具体需求和场景进行参数配置和优化。
案例一:简单的红外遥控器控制LED
import pyb
from pyb import IR
led = pyb.LED(1) # 初始化LED引脚
ir = IR(pin='X1') # 初始化红外接收引脚
while(True):
if ir.decode() == 0xFF629D: # 如果接收到特定红外信号
led.toggle() # 切换LED状态
要点解读:
首先初始化LED引脚和红外接收引脚。在一个无限循环中,使用ir.decode()函数解码接收到的红外信号。如果接收到特定红外信号(这里是0xFF629D),则切换LED状态。使用toggle()函数切换LED状态。
案例二:使用红外遥控器控制电机
import pyb
from pyb import IR, PWM
motor1 = PWM(pyb.Pin('X1'), freq=100) # 初始化电机1引脚为PWM输出,频率为100Hz
motor2 = PWM(pyb.Pin('X2'), freq=100) # 初始化电机2引脚为PWM输出,频率为100Hz
ir = IR(pin='X3') # 初始化红外接收引脚
while(True):
if ir.decode() == 0xFF629D: # 如果接收到特定红外信号
motor1.duty(1000) # 左电机前进
motor2.duty(0) # 右电机停止
elif ir.decode() == 0xFFA25D: # 如果接收到另一个特定红外信号
motor1.duty(0) # 左电机停止
motor2.duty(1000) # 右电机前进
else: # 如果没有接收到特定红外信号
motor1.duty(0) # 左电机停止
motor2.duty(0) # 右电机停止
要点解读:
首先初始化电机引脚和红外接收引脚。在一个无限循环中,使用ir.decode()函数解码接收到的红外信号。如果接收到特定红外信号(这里是0xFF629D和0xFFA25D),则控制电机前进或停止。如果没有接收到特定红外信号,则两个电机都停止。使用duty()函数设置电机的占空比。
案例三:使用红外遥控器控制机器人移动方向
import pyb
from pyb import IR, PWM
motor1 = PWM(pyb.Pin('X1'), freq=100) # 初始化电机1引脚为PWM输出,频率为100Hz
motor2 = PWM(pyb.Pin('X2'), freq=100) # 初始化电机2引脚为PWM输出,频率为100Hz
ir = IR(pin='X3') # 初始化红外接收引脚
speed = 1000 # 设置电机速度,这里是1000(占空比)
while(True):
if ir.decode() == 0xFF629D: # 如果接收到特定红外信号
motor1.duty(speed) # 左电机前进
motor2.duty(speed) # 右电机前进,机器人向前移动
elif ir.decode() == 0xFFA25D: # 如果接收到另一个特定红外信号
motor1.duty(-speed) # 左电机后退
motor2.duty(speed) # 右电机前进,机器人向右转弯
elif ir.decode() == 0xFFC23D: # 如果接收到另一个特定红外信号
motor1.duty(speed) # 左电机前进
motor2.duty(-speed) # 右电机后退,机器人向左转弯
else: # 如果没有接收到特定红外信号
motor1.duty(0) # 左电机停止
motor2.duty(0) # 右电机停止,机器人停止移动
要点解读:
首先初始化电机引脚和红外接收引脚。设置电机速度,这里是1000(占空比)。在一个无限循环中,使用ir.decode()函数解码接收到的红外信号。如果接收到特定红外信号(这里是0xFF629D、0xFFA25D和0xFFC23D),则控制机器人移动方向。如果没有接收到特定红外信号,则机器人停止移动。使用duty()函数设置电机的占空比,正数表示前进,负数表示后退。
案例四:读取红外接收器的值
import sensor, image, time
sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为QVGA
sensor.skip_frames(time = 2000) # 等待2秒,让红外接收器稳定
while(True):
img = sensor.snapshot() # 获取一帧图像
red_values = img.get_regression([(255, 0, 0)], robust=True) # 获取红色像素的回归值
ir_value = red_values[-1] # 获取红外接收器的值
print("IR Value: ", ir_value)
time.sleep(1000) # 每隔1秒读取一次红外接收器的值
要点解读:首先导入 sensor、image 和 time 模块。然后初始化传感器并设置像素格式和帧大小。接着等待2秒,让红外接收器稳定。在 while 循环中,不断获取红外接收器的值并打印出来。
案例五:控制红外发射器发送信号
import sensor, image, time
from pyb import UART
uart = UART(3, 9600) # 初始化UART,波特率为9600
def send_ir():
uart.write('r') # 发送'r'表示红外发射器启动
time.sleep(1) # 等待1秒,确保红外发射器启动成功
uart.write('m') # 发送'm'表示红外发射器向左转
time.sleep(1) # 等待1秒,确保红外发射器转向成功
uart.write('l') # 发送'l'表示红外发射器向右转
time.sleep(1) # 等待1秒,确保红外发射器转向成功
uart.write('f') # 发送'f'表示红外发射器向前转
time.sleep(1) # 等待1秒,确保红外发射器转向成功
uart.write('r') # 发送'r'表示红外发射器停止
time.sleep(1) # 等待1秒,确保红外发射器停止成功
uart.write('q') # 发送'q'表示退出程序
send_ir() # 调用send_ir函数发送红外信号
要点解读:首先导入 sensor、image 和 time 模块以及 pyb 模块中的 UART。然后初始化 UART,设置波特率为9600。定义一个 send_ir 函数,用于控制红外发射器发送信号。在函数中,通过 UART 发送不同的指令来控制红外发射器的方向和停止。最后调用 send_ir 函数发送红外信号。
案例六:使用红外传感器进行距离测量
import sensor, image, time
from pyb import UART
uart = UART(3, 9600) # 初始化UART,波特率为9600
def measure_distance():
img = sensor.snapshot() # 获取一帧图像
height, width = img.size() # 获取图像的尺寸
distance = ((width / 2) * (height / 2)) - 240 # 根据图像尺寸计算距离
return distance
distance = measure_distance() # 调用measure_distance函数测量距离
uart.write('d') # 发送'd'表示距离测量开始
uart.write(str(distance).encode()) # 发送距离值
uart.write('q') # 发送'q'表示退出程序
要点解读:首先导入 sensor、image 和 time 模块以及 pyb 模块中的 UART。然后初始化 UART,设置波特率为9600。定义一个 measure_distance 函数,用于测量距离。在函数中,获取图像的尺寸并根据尺寸计算距离。最后调用 measure_distance 函数测量距离,并通过 UART 发送距离值和退出指令。
案例七:接收红外信号并输出:
import pyb
ir = pyb.IR(1, pyb.IR.RECV, pyb.Pin.board.P7)
while True:
if ir.recv():
print("Received IR signal:", ir.data())
要点解读:
该程序使用OpenMV Cam的pyb.IR模块接收红外信号并输出。
使用pyb.IR(1, pyb.IR.RECV, pyb.Pin.board.P7)初始化红外接收器,其中1表示红外接收器编号,pyb.IR.RECV表示接收模式,pyb.Pin.board.P7表示连接红外接收器的引脚。
在一个无限循环中,使程序持续执行以下操作:
使用ir.recv()检测是否接收到红外信号。
如果接收到信号,使用ir.data()获取接收到的红外信号数据,并使用print()输出。
案例八:发送红外信号:
import pyb
ir = pyb.IR(2, pyb.IR.SEND, pyb.Pin.board.P8)
while True:
ir.send("Hello, IR!")
pyb.delay(1000)
要点解读:
该程序使用OpenMV Cam的pyb.IR模块发送红外信号。
使用pyb.IR(2, pyb.IR.SEND, pyb.Pin.board.P8)初始化红外发射器,其中2表示红外发射器编号,pyb.IR.SEND表示发送模式,pyb.Pin.board.P8表示连接红外发射器的引脚。
在一个无限循环中,使程序持续执行以下操作:
使用ir.send(“Hello, IR!”)发送红外信号,发送的内容为"Hello, IR!"。
使用pyb.delay(1000)延迟1秒,控制发送频率。
案例九:接收红外信号并执行不同操作:
import pyb
ir = pyb.IR(1, pyb.IR.RECV, pyb.Pin.board.P7)
while True:
if ir.recv():
data = ir.data()
if data == "CMD1":
print("Executing command 1...")
# 执行命令1的操作
elif data == "CMD2":
print("Executing command 2...")
# 执行命令2的操作
else:
print("Unknown command:", data)
要点解读:
该程序使用OpenMV Cam的pyb.IR模块接收红外信号,并根据接收到的信号执行不同的操作。
使用pyb.IR(1, pyb.IR.RECV, pyb.Pin.board.P7)初始化红外接收器,其中1表示红外接收器编号,pyb.IR.RECV表示接收模式,pyb.Pin.board.P7表示连接红外接收器的引脚。
在一个无限循环中,使程序持续执行以下操作:
使用ir.recv()检测是否接收到红外信号。
如果接收到信号,使用ir.data()获取接收到的红外信号数据,并将其存储在变量data中。
使用条件语句判断data的值,根据不同的值执行不同的操作。
如果data等于"CMD1",输出"Executing command 1…“并执行命令1的操作。
如果data等于"CMD2”,输出"Executing command 2…"并执行命令2的操作。
如果data不等于任何已知命令,输出"Unknown command:"和data。
这些示例代码提供了使用MicroPython和OpenMV Cam的pyb.IR模块的基本框架。你可以根据自己的需求修改和扩展这些代码,例如添加更多的条件判断、执行不同的操作,或与其他传感器或模块进行交互等。
请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。确保正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。