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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
MicroPython的内置模块machine是一个用于控制和操作硬件的模块,它可以用来访问和控制系统上的硬件块,如CPU、定时器、总线、引脚、信号、ADC、PWM、UART、SPI、I2C、I2S、RTC、WDT、SD卡等。它的主要特点是:
1、它可以创建和操作各种硬件相关的对象,如Pin, Signal, ADC, PWM, UART, SPI, I2C, I2S, RTC, Timer, WDT, SD等,以实现对硬件的配置和控制。
2、它可以使用reset(), soft_reset(), bootloader(), reset_cause(), wake_reason()等方法来重置或唤醒设备,或获取重置或唤醒的原因。
3、它可以使用disable_irq(), enable_irq()等方法来禁用或启用中断请求,以提高性能或安全性。
4、它可以使用freq(), idle(), sleep(), lightsleep(), deepsleep()等方法来调节或查询CPU的频率,或使设备进入低功耗模式。
5、它可以使用mem8, mem16, mem32等对象来读写内存中的字节,以实现底层的内存访问。
6、它可以使用unique_id(), time_pulse_us(), rng()等方法来获取设备的唯一标识符,测量引脚上的脉冲时间,或生成随机数。
machine模块的应用场景有:
1、用于与外部设备或传感器进行通信或控制,例如LED灯,电机,温度计,陀螺仪,加速度计等。
2、用于实现一些特定的功能或效果,例如闪烁灯光,播放音乐,显示图形,读写SD卡等。
3、用于学习或教授一些硬件相关的知识或技能,例如数字电路,模拟电路,信号处理,嵌入式系统等。
machine模块的注意事项有:
1、machine模块依赖于特定板子上的硬件特性和资源,不同的MicroPython板子可能有不同的可用功能和参数范围1234,需要查看具体的文档来确定支持的功能和使用方法。
2、machine模块提供了对硬件的直接和不受限制的访问和控制,使用不当可能会导致设备故障,锁定,崩溃,在极端情况下还可能导致硬件损坏。使用时需要谨慎并遵循相关的规范和指南。
3、machine模块使用的回调函数是在中断上下文中执行的1234,需要尽量简短和快速,避免执行复杂或耗时的操作,以免影响系统性能和稳定性。
以下是MicroPython的内置模块machine几个实际运用程序案例:
案例一:使用PWM对象控制LED灯的亮度
# 导入machine模块
import machine
# 创建一个PWM对象,连接到板载蓝色LED灯
pwm = machine.PWM(machine.Pin(4))
# 设置PWM对象的频率为1000赫兹
pwm.freq(1000)
# 循环10次
for i in range(10):
# 逐渐增加占空比从0到100
for duty in range(0, 101):
# 设置PWM对象的占空比
pwm.duty(duty)
# 等待10毫秒
time.sleep_ms(10)
# 逐渐减少占空比从100到0
for duty in range(100, -1, -1):
# 设置PWM对象的占空比
pwm.duty(duty)
# 等待10毫秒
time.sleep_ms(10)
案例二:使用UART对象与串口设备通信
# 导入machine模块
import machine
# 创建一个UART对象,连接到UART2,波特率为115200
uart = machine.UART(2, 115200)
# 向串口设备发送一条消息
uart.write('Hello, world!\r\n')
# 等待串口设备的回应
while not uart.any():
pass
# 读取串口设备的回应,并打印结果
response = uart.read()
print(response)
案例三:使用Timer对象创建一个定时器
# 导入machine模块
import machine
# 定义一个回调函数,在定时器触发时执行
def blink(timer):
# 获取板载蓝色LED灯的引脚对象
led = machine.Pin(4, machine.Pin.OUT)
# 切换引脚的输出状态
led.toggle()
# 创建一个Timer对象,编号为0,模式为周期性
timer = machine.Timer(0, mode=machine.Timer.PERIODIC)
# 初始化Timer对象,设置时间间隔为1秒,设置回调函数为blink
timer.init(period=1000, callback=blink)
这个程序可以实现使用Timer对象创建一个定时器的功能,即每隔1秒钟切换一次板载蓝色LED灯的亮灭状态。你可以尝试修改period参数来改变定时器的时间间隔。
案例四:控制GPIO引脚的输出:
from machine import Pin
# 初始化GPIO引脚
led_pin = Pin(2, Pin.OUT)
# 控制引脚输出
led_pin.value(1) # 输出高电平
在这个示例中,我们使用machine模块的Pin类来初始化一个GPIO引脚对象。通过传递引脚编号和引脚模式(Pin.OUT表示输出模式),我们创建了一个控制LED的引脚对象led_pin。然后,我们使用value()方法将引脚输出设置为高电平(1)。这样可以控制LED灯的点亮。
案例五:读取和控制ADC引脚的输入:
from machine import ADC
# 初始化ADC引脚
adc_pin = ADC(0)
# 读取ADC引脚的值
adc_value = adc_pin.read()
# 输出ADC值
print("ADC Value:", adc_value)
在这个示例中,我们使用machine模块的ADC类来初始化一个ADC引脚对象。通过传递引脚编号,我们创建了一个用于读取模拟信号的ADC引脚对象adc_pin。然后,我们使用read()方法读取ADC引脚的模拟值,并将其存储在变量adc_value中。最后,我们打印出读取到的ADC值。
案例六:控制PWM引脚的输出:
from machine import Pin, PWM
# 初始化PWM引脚
pwm_pin = Pin(5)
pwm = PWM(pwm_pin)
# 设置PWM参数
pwm.freq(1000) # 设置频率为1kHz
pwm.duty(512) # 设置占空比为50%
# 启动PWM输出
pwm.deinit() # 先停止PWM输出
pwm.init() # 再启动PWM输出
在这个示例中,我们使用machine模块的Pin类和PWM类来初始化一个PWM引脚对象。通过传递引脚编号,我们创建了一个用于控制PWM信号的引脚对象pwm_pin和PWM对象pwm。然后,我们使用freq()方法设置PWM的频率为1kHz,使用duty()方法设置PWM的占空比为50%。接着,我们通过先调用deinit()方法停止PWM输出,再调用init()方法启动PWM输出。这样可以控制PWM信号的频率和占空比。
案例七:控制 GPIO 引脚
from machine import Pin
# 初始化 GPIO 引脚
led_pin = Pin(2, Pin.OUT)
# 控制引脚输出高电平
led_pin.on()
# 等待一段时间
machine.delay(1000)
# 控制引脚输出低电平
led_pin.off()
在这个例子中,我们导入了 machine 模块的 Pin 类,并使用它初始化一个 GPIO 引脚。我们将引脚号(例如2)和引脚模式(例如输出模式)作为参数传递给 Pin 构造函数。然后,我们使用 on() 方法将引脚设置为高电平,等待一段时间,然后使用 off() 方法将引脚设置为低电平。这个例子展示了如何使用 machine.Pin 控制 GPIO 引脚的状态。
案例八:访问内置的定时器
from machine import Timer
# 定时器回调函数
def timer_callback(timer):
print("定时器触发")
# 初始化定时器
timer = Timer(-1)
# 每隔1秒触发定时器
timer.init(period=1000, mode=Timer.PERIODIC, callback=timer_callback)
在这个例子中,我们导入了 machine 模块的 Timer 类,并使用它初始化一个内置的定时器。我们指定定时器的周期(例如1秒)和模式(例如周期性触发),并提供一个回调函数。每当定时器触发时,回调函数将被调用。这个例子展示了如何使用 machine.Timer 访问和配置内置的定时器。
案例九:控制蜂鸣器
from machine import Pin, PWM
# 初始化蜂鸣器引脚
buzzer_pin = Pin(4, Pin.OUT)
# 初始化 PWM
buzzer_pwm = PWM(buzzer_pin)
# 设置 PWM 频率和占空比
buzzer_pwm.freq(1000) # 设置频率为1kHz
buzzer_pwm.duty(512) # 设置占空比为50%
# 等待一段时间
machine.delay(2000)
# 停止 PWM
buzzer_pwm.deinit()
在这个例子中,我们导入了 machine 模块的 Pin 和 PWM 类,并使用它们初始化蜂鸣器引脚和 PWM。我们设置 PWM 的频率(例如1kHz)和占空比(例如50%),以控制蜂鸣器的声音。然后,我们等待一段时间,最后使用 deinit() 方法停止 PWM。这个例子展示了如何使用 machine.Pin 和 machine.PWM 控制蜂鸣器的音频输出。
这些示例展示了在 MicroPython 中使用 machine 模块的实际应用。machine 模块提供了许多功能,用于与硬件交互,如控制 GPIO 引脚、访问定时器、配置 PWM 等。通过利用 machine 模块,你可以在 MicroPython 中与硬件进行交互和控制。