MicroPython 的 machine 模块:掌控硬件的利器

文摘   2025-01-07 00:01   湖南  

引言

MicroPython 作为一种精简的 Python 版本,专门为微控制器设计,其 machine 模块为开发者提供了强大的硬件控制能力。通过 machine 模块,你可以直接访问硬件资源,例如 GPIO 引脚、定时器、ADC、I2C、SPI 等,从而实现各种功能,例如控制 LED 灯、读取传感器数据、与其他设备通信等。

1. GPIO 控制:点亮硬件世界

GPIO(通用输入输出)引脚是微控制器连接外部设备的桥梁。machine 模块提供了一系列函数用于控制 GPIO 引脚,例如:

  • • machine.Pin(pin_number, mode=machine.Pin.OUT) 创建一个 GPIO 引脚对象,并设置其模式为输出。

  • • pin.value(1) 设置引脚为高电平,例如点亮 LED 灯。

  • • pin.value(0) 设置引脚为低电平,例如熄灭 LED 灯。

  • • pin.high() 设置引脚为高电平。

  • • pin.low() 设置引脚为低电平。

示例:

from machine import Pin

led = Pin(2, Pin.OUT)  # 创建一个连接到引脚 2 的 LED 对象

while True:
    led.value(1)  # 点亮 LED
    time.sleep(0.5)  # 延迟 0.5 秒
    led.value(0)  # 熄灭 LED
    time.sleep(0.5)  # 延迟 0.5 秒

2. 定时器:精准控制时间

定时器是微控制器中重要的组件,用于实现周期性任务、延迟操作等。machine 模块提供了 machine.Timer 类来管理定时器。

  • • machine.Timer(timer_id) 创建一个定时器对象,其中 timer_id 是定时器的编号。

  • • timer.init(mode=machine.Timer.PERIODIC, period=1000, callback=callback_function) 初始化定时器,其中 mode 指定定时器模式(周期性或单次),period 指定周期时间(以毫秒为单位),callback 指定定时器触发时执行的回调函数。

示例:

from machine import Timer, Pin

led = Pin(2, Pin.OUT)  # 创建一个连接到引脚 2 的 LED 对象

def blink(timer):
    led.value(not led.value())  # 翻转 LED 状态

timer = Timer(0)  # 创建一个定时器对象
timer.init(period=500, callback=blink)  # 每 500 毫秒翻转 LED 状态

3. ADC:读取模拟信号

ADC(模拟数字转换器)用于将模拟信号转换为数字信号,例如读取传感器数据。machine 模块提供了 machine.ADC 类来管理 ADC。

  • • machine.ADC(pin_number) 创建一个 ADC 对象,其中 pin_number 是连接到 ADC 的引脚编号。

  • • adc.read() 读取 ADC 的当前值。

示例:

from machine import ADC

adc = ADC(0)  # 创建一个连接到引脚 0 的 ADC 对象

while True:
    value = adc.read()  # 读取 ADC 值
    print(value)  # 打印 ADC 值

4. I2C:与其他设备通信

I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于微控制器与其他设备(例如传感器、显示屏)之间的通信。machine 模块提供了 machine.I2C 类来管理 I2C 通信。

  • • machine.I2C(id=0, scl=Pin(5), sda=Pin(4), freq=400000) 创建一个 I2C 对象,其中 id 是 I2C 控制器编号,scl 和 sda 分别是时钟和数据引脚,freq 是通信频率。

  • • i2c.readfrom_mem(address, register, n) 从指定地址的设备的指定寄存器读取 n 个字节的数据。

  • • i2c.writeto_mem(address, register, data) 向指定地址的设备的指定寄存器写入数据。

示例:

from machine import I2C

i2c = I2C(scl=Pin(5), sda=Pin(4))  # 创建一个 I2C 对象

# 读取温度传感器数据
temperature = i2c.readfrom_mem(0x400x002)  # 从地址 0x40 的传感器读取 2 个字节数据
temperature = (temperature[0] << 8) | temperature[1]  # 将字节数据转换为整数
print(temperature)  # 打印温度值

5. SPI:高速数据传输

SPI(Serial Peripheral Interface)是一种高速串行通信协议,用于微控制器与其他设备(例如 SD 卡、显示屏)之间的通信。machine 模块提供了 machine.SPI 类来管理 SPI 通信。

  • • machine.SPI(id=0, baudrate=1000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=Pin(4)) 创建一个 SPI 对象,其中 id 是 SPI 控制器编号,baudrate 是通信速率,polarity 和 phase 是通信模式参数,sckmosi 和 miso 分别是时钟、数据输出和数据输入引脚。

  • • spi.read(n) 从 SPI 设备读取 n 个字节数据。

  • • spi.write(data) 向 SPI 设备写入数据。

示例:

from machine import SPI

spi = SPI(baudrate=1000000, sck=Pin(2), mosi=Pin(3), miso=Pin(4))  # 创建一个 SPI 对象

# 向 SD 卡写入数据
data = b"Hello, world!"  # 要写入的数据
spi.write(data)  # 向 SD 卡写入数据

6. 其他功能

除了上述功能外,machine 模块还提供了其他功能,例如:

  • • machine.unique_id() 获取微控制器的唯一 ID。

  • • machine.reset() 重启微控制器。

  • • machine.sleep() 使微控制器进入休眠状态。

  • • machine.soft_reset() 软重启微控制器。

总结

machine 模块是 MicroPython 中重要的模块,它提供了丰富的硬件控制功能,使开发者能够直接访问和控制微控制器的各种硬件资源,从而实现各种功能,例如控制 LED 灯、读取传感器数据、与其他设备通信等。通过 machine 模块,开发者可以充分利用微控制器的硬件能力,构建各种有趣的项目。

小白这样学Python
专注Python编程开发知识分享!
 最新文章