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、定时器、总线等)的直接和无限制的访问和控制。
machine模块的主要特点是:
它包含了一些与重置、中断、电源、内存等系统功能相关的函数,可以实现对设备的低级管理和控制。
它包含了一些与I/O引脚、信号、ADC、PWM、UART、SPI、I2C、I2S、RTC、定时器、WDT、SD卡等硬件设备相关的类,可以实现对这些设备的配置和操作。
它尽可能地与普通Python兼容,让用户可以轻松地将代码从桌面传输到微控制器或嵌入式系统。
它针对不同的硬件平台进行了优化和定制,因此在不同的端口上可能有不同的可用性和行为。
machine模块的应用场景是:
在MicroPython中实现与硬件设备的交互,如控制LED灯、电机、传感器等。
在MicroPython中实现基于硬件设备的应用,如物联网设备、远程控制、消息推送等。
在MicroPython中实现对系统性能和功耗的优化,如调整CPU频率、进入低功耗模式等。
machine模块需注意事项是:
使用machine模块时要注意硬件设备的规格和限制,避免造成电路板故障、锁定、崩溃或硬件损坏。
使用machine模块时要注意中断处理函数的编写,避免在中断上下文中执行过长或过复杂的代码,影响系统正常运行。
使用machine模块时要注意不同端口之间的差异和兼容性问题,避免在移植代码时出现错误或异常。
以下是MicroPython的machine几个实际运用程序案例:
案例一:使用machine.Pin类控制LED灯闪烁。
import machine
import time
# 创建一个Pin对象,连接到GPIO2引脚,并设置为输出模式
led = machine.Pin(2, machine.Pin.OUT)
# 循环10次
for i in range(10):
# 将引脚输出设置为高电平,点亮LED灯
led.value(1)
# 延时0.5秒
time.sleep(0.5)
# 将引脚输出设置为低电平,熄灭LED灯
led.value(0)
# 延时0.5秒
time.sleep(0.5)
案例二:使用machine.ADC类读取光敏电阻的模拟值。
import machine
# 创建一个ADC对象,连接到GPIO34引脚,并设置为12位分辨率
adc = machine.ADC(machine.Pin(34))
adc.atten(machine.ADC.ATTN_11DB) # 设置衰减为11dB,输入范围为0~3.6V
adc.width(machine.ADC.WIDTH_12BIT) # 设置宽度为12位,输出范围为0~4095
# 读取ADC对象的值,并打印
value = adc.read()
print(value)
案例三:使用machine.PWM类控制舵机角度。
import machine
# 创建一个PWM对象,连接到GPIO18引脚,并设置频率为50Hz
pwm = machine.PWM(machine.Pin(18))
pwm.freq(50)
# 定义一个函数,根据角度计算占空比(百分比)
def duty(angle):
return int((angle / 180) * 1023 + 40)
# 设置PWM对象的占空比为0度对应的值
pwm.duty(duty(0))
# 延时1秒
time.sleep(1)
# 设置PWM对象的占空比为90度对应的值
pwm.duty(duty(90))
# 延时1秒
time.sleep(1)
# 设置PWM对象的占空比为180度对应的值
pwm.duty(duty(180))
# 延时1秒
time.sleep(1)
案例四:控制LED灯:
from machine import Pin
import time
# 将LED连接到GPIO引脚
led_pin = Pin(2, Pin.OUT)
# 循环控制LED灯的亮灭
while True:
led_pin.on()
time.sleep(1)
led_pin.off()
time.sleep(1)
在这个例子中,我们使用machine模块的Pin类将LED连接到GPIO引脚。我们指定了引脚号和引脚模式(输出)。然后,我们使用on()方法将LED点亮,使用off()方法将LED熄灭。通过使用time.sleep()函数,我们可以控制LED的亮灭间隔时间。
案例五:读取温度传感器数据:
from machine import ADC
# 将温度传感器连接到ADC引脚
temp_sensor_pin = ADC(0)
# 读取温度传感器数据
sensor_value = temp_sensor_pin.read()
# 转换为摄氏度
temperature = (sensor_value * 3.3 / 1024 - 0.5) * 100
print("当前温度:", temperature, "℃")
在这个例子中,我们使用machine模块的ADC类将温度传感器连接到ADC引脚。我们指定了引脚号。然后,我们使用read()方法读取ADC引脚的值。根据温度传感器的特性,我们可以通过一些转换公式将读取到的值转换为摄氏度温度。最后,我们打印出当前的温度。
案例六:控制舵机:
from machine import Pin, PWM
# 将舵机连接到GPIO引脚
servo_pin = Pin(5)
servo_pwm = PWM(servo_pin)
# 设置舵机的位置
servo_pwm.duty(512)
# 控制舵机旋转
servo_pwm.duty(256) # 逆时针旋转
time.sleep(1)
servo_pwm.duty(768) # 顺时针旋转
time.sleep(1)
servo_pwm.duty(512) # 停止旋转
在这个例子中,我们使用machine模块的Pin类和PWM类将舵机连接到GPIO引脚。我们指定了引脚号和引脚模式(输出)。然后,我们使用duty()方法设置舵机的位置。通过调整duty值,我们可以控制舵机的旋转方向和速度。在这个例子中,我们将舵机旋转到中间位置(512),然后逆时针旋转(256),顺时针旋转(768),最后停止旋转(512)。
案例七:控制 LED 灯闪烁
import time
from machine import Pin
led_pin = Pin(2, Pin.OUT) # 使用 GPIO 2 控制 LED 灯
while True:
led_pin.on() # 点亮 LED
time.sleep(1) # 延时 1 秒
led_pin.off() # 熄灭 LED
time.sleep(1) # 延时 1 秒
在这个例子中,我们使用 machine.Pin 类创建了一个引脚对象 led_pin,并将 GPIO 2 设置为输出模式控制 LED 灯。在一个无限循环中,通过调用 on() 方法点亮 LED,然后使用 time.sleep() 方法进行延时,再调用 off() 方法熄灭 LED,再进行延时,从而实现 LED 灯的闪烁效果。
案例八:读取模拟传感器的数值
from machine import ADC
adc_pin = ADC(0) # 使用 ADC 0 引脚读取模拟传感器的数值
while True:
sensor_value = adc_pin.read() # 读取模拟传感器的数值
print("Sensor value:", sensor_value)
在这个例子中,我们使用 machine.ADC 类创建了一个 ADC 对象 adc_pin,并将 ADC 0 引脚用于读取模拟传感器的数值。在一个无限循环中,通过调用 read() 方法读取模拟传感器的数值,并使用 print() 方法打印数值到终端。
案例九:使用定时器控制任务执行
import time
from machine import Timer
def task(timer):
print("Task executed")
timer = Timer(-1) # 创建一个定时器对象
# 每隔 1 秒执行一次任务
timer.init(period=1000, mode=Timer.PERIODIC, callback=task)
while True:
time.sleep(1)
在这个例子中,我们使用 machine.Timer 类创建了一个定时器对象 timer。然后,定义了一个任务函数 task,该函数会在定时器触发时执行。通过调用 init() 方法初始化定时器,设置定时周期为 1 秒,并指定任务回调函数为 task。在一个无限循环中,使用 time.sleep() 方法进行延时。
这些案例展示了 MicroPython 中 machine 模块的一些实际应用,用于控制硬件设备、读取传感器数据和调度任务执行。