Python之adafruit-circuitpython-mcp230xx包语法、参数和实际应用案例
adafruit-circuitpython-mcp230xx 是 Adafruit 开发的 CircuitPython 库,用于控制 Microchip 的 MCP230xx 系列 I/O 扩展芯片。该系列芯片通过 I2C 或 SPI 接口扩展单片机的 GPIO 引脚,适用于需要更多输入/输出接口的嵌入式项目。
Python 库 adafruit-circuitpython-mcp230xx 详解
1. 功能概述
adafruit-circuitpython-mcp230xx 是 Adafruit 开发的 CircuitPython 库,用于控制 Microchip 的 MCP230xx 系列 I/O 扩展芯片。该系列芯片通过 I2C 或 SPI 接口扩展单片机的 GPIO 引脚,适用于需要更多输入/输出接口的嵌入式项目。
支持的芯片型号包括:
- MCP23008(8 路 GPIO,I2C 接口)
- MCP23017(16 路 GPIO,I2C 接口)
- MCP23S08(8 路 GPIO,SPI 接口)
- MCP23S17(16 路 GPIO,SPI 接口)
主要功能:
- 配置引脚为输入或输出模式
- 读取输入引脚状态
- 控制输出引脚电平
- 配置内部上拉电阻
- 支持中断功能

2. 安装方法
需先安装 CircuitPython 环境,再通过 pip 安装:
pip install adafruit-circuitpython-mcp230xx
对于某些开发板(如 Raspberry Pi),可能需要额外安装依赖:
pip install adafruit-blinka # 用于在非 CircuitPython 设备上模拟 CircuitPython API
3. 基本语法与参数
3.1 初始化(以 I2C 为例)
import board
import busio
from adafruit_mcp230xx.mcp23017 import MCP23017
# 初始化 I2C 总线
i2c = busio.I2C(board.SCL, board.SDA)
# 初始化 MCP23017(地址默认为 0x20,可通过 A0-A2 引脚修改)
mcp = MCP23017(i2c, address=0x20)
3.2 引脚配置与控制
# 配置引脚为输出并设置电平
pin = mcp.get_pin(0) # 获取引脚 0
pin.direction = digitalio.Direction.OUTPUT # 设置为输出
pin.value = True # 输出高电平
# 配置引脚为输入并读取状态(启用内部上拉)
pin = mcp.get_pin(1)
pin.direction = digitalio.Direction.INPUT
pin.pull = digitalio.Pull.UP # 启用上拉电阻
print(pin.value) # 读取输入状态
3.3 关键参数
address:I2C 设备地址(默认 0x20,范围 0x20-0x27)direction:引脚方向(INPUT/OUTPUT)pull:上拉配置(UP/DOWN/NONE)value:引脚电平(True/False对应高/低电平)
4. 实际应用案例
案例 1:控制 8 路 LED 流水灯(MCP23008)
import board
import busio
import time
from adafruit_mcp230xx.mcp23008 import MCP23008
i2c = busio.I2C(board.SCL, board.SDA)
mcp = MCP23008(i2c)
# 配置所有引脚为输出
led_pins = [mcp.get_pin(i) for i in range(8)]
for pin in led_pins:
pin.direction = digitalio.Direction.OUTPUT
# 流水灯效果
while True:
for pin in led_pins:
pin.value = True
time.sleep(0.1)
pin.value = False
案例 2:读取 4x4 矩阵键盘(MCP23017)
# 行连接到 MCP23017 的引脚 0-3(输出),列连接到引脚 4-7(输入,上拉)
rows = [mcp.get_pin(i) for i in range(4)]
cols = [mcp.get_pin(i+4) for i in range(4)]
for row in rows:
row.direction = digitalio.Direction.OUTPUT
for col in cols:
col.direction = digitalio.Direction.INPUT
col.pull = digitalio.Pull.UP
keymap = [
['1', '2', '3', 'A'],
['4', '5', '6', 'B'],
['7', '8', '9', 'C'],
['*', '0', '#', 'D']
]
while True:
for r, row in enumerate(rows):
row.value = False # 拉低当前行
for c, col in enumerate(cols):
if not col.value: # 检测到按键按下
print(f"按下: {keymap[r][c]}")
time.sleep(0.2) # 消抖
row.value = True # 恢复高电平
time.sleep(0.01)
案例 3:使用中断检测按钮(MCP23017)
# 配置引脚 0 为输入并启用中断
button = mcp.get_pin(0)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
mcp.interrupt_enable = 0b00000001 # 启用引脚 0 中断
mcp.interrupt_configuration = 0b00000001 # 引脚 0 低电平触发
while True:
if mcp.interrupt_flag: # 检测到中断
print("按钮被按下!")
mcp.clear_ints() # 清除中断标志
案例 4:控制继电器模块(MCP23S17 SPI 版本)
import digitalio
from adafruit_mcp230xx.mcp23s17 import MCP23S17
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
cs = digitalio.DigitalInOut(board.D5) # 片选引脚
mcp = MCP23S17(spi, cs)
relay = mcp.get_pin(0)
relay.direction = digitalio.Direction.OUTPUT
while True:
relay.value = True # 继电器吸合
time.sleep(2)
relay.value = False # 继电器断开
time.sleep(2)
案例 5:多路传感器数据采集
# 读取 8 路光敏电阻数据(通过 ADC 转换后连接到 MCP23008)
sensors = [mcp.get_pin(i) for i in range(8)]
for sensor in sensors:
sensor.direction = digitalio.Direction.INPUT
while True:
values = [sensor.value for sensor in sensors]
print(f"传感器数据: {values}")
time.sleep(1)
案例 6:控制步进电机(通过驱动板连接 MCP23017)
# 步进电机驱动板连接到 MCP23017 引脚 0-3
coils = [mcp.get_pin(i) for i in range(4)]
for coil in coils:
coil.direction = digitalio.Direction.OUTPUT
# 四相步进序列
sequence = [
[1, 0, 0, 0],
[1, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 1, 0],
[0, 0, 1, 1],
[0, 0, 0, 1],
[1, 0, 0, 1]
]
while True:
for step in sequence:
for i, coil in enumerate(coils):
coil.value = step[i]
time.sleep(0.01)
案例 7:扩展 Raspberry Pi 的 GPIO 口
# 在 Raspberry Pi 上使用(需先安装 adafruit-blinka)
import board
import digitalio
from adafruit_mcp230xx.mcp23017 import MCP23017
i2c = board.I2C() # 自动检测 SCL/SDA 引脚
mcp = MCP23017(i2c)
# 控制扩展的 LED
led = mcp.get_pin(0)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
time.sleep(1)
案例 8:多芯片级联扩展(多个 MCP23017)
# 两个 MCP23017 共享 I2C 总线(地址分别为 0x20 和 0x21)
mcp1 = MCP23017(i2c, address=0x20)
mcp2 = MCP23017(i2c, address=0x21)
# 分别控制两个芯片的引脚
led1 = mcp1.get_pin(0)
led2 = mcp2.get_pin(0)
led1.direction = led2.direction = digitalio.Direction.OUTPUT
while True:
led1.value = True
led2.value = False
time.sleep(1)
led1.value = False
led2.value = True
time.sleep(1)
5. 常见错误与注意事项
常见错误
-
I2C 地址冲突
- 错误表现:无法初始化设备或通信不稳定
- 解决:通过 A0-A2 引脚修改地址,确保总线上地址唯一
-
引脚方向配置错误
- 错误表现:无法读取输入或控制输出
- 解决:明确设置
direction为INPUT或OUTPUT
-
中断未清除
- 错误表现:持续触发中断
- 解决:处理中断后调用
clear_ints()清除标志
-
SPI 片选引脚配置错误
- 错误表现:SPI 通信失败
- 解决:确保片选引脚(CS)正确初始化并传递给构造函数
注意事项
- 电压兼容性:MCP230xx 有 3.3V 和 5V 版本,需与主控板电压匹配
- 上拉电阻:输入模式下建议启用内部上拉(
Pull.UP),避免悬空状态 - I2C 速率:默认速率为 100kHz,高速模式需额外配置
- 中断布线:多个芯片共享中断线时,需通过软件区分中断源
- 电源滤波:在噪声环境中,建议添加 0.1μF 滤波电容
- 引脚驱动能力:MCP230xx 每个引脚最大驱动电流为 25mA,总电流不超过 100mA
通过 adafruit-circuitpython-mcp230xx 库,开发者可以轻松扩展嵌入式设备的 I/O 能力,适用于智能家居、机器人、自动化控制等场景。使用时需注意硬件连接和地址配置,避免常见的通信问题。
《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能。《AI提示工程必知必会》主要内容包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。
更多推荐


所有评论(0)