引言
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(0x40, 0x00, 2) # 从地址 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
是通信模式参数,sck
、mosi
和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
模块,开发者可以充分利用微控制器的硬件能力,构建各种有趣的项目。