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. 常见错误与注意事项
常见错误
  1. I2C 地址冲突

    • 错误表现:无法初始化设备或通信不稳定
    • 解决:通过 A0-A2 引脚修改地址,确保总线上地址唯一
  2. 引脚方向配置错误

    • 错误表现:无法读取输入或控制输出
    • 解决:明确设置 directionINPUTOUTPUT
  3. 中断未清除

    • 错误表现:持续触发中断
    • 解决:处理中断后调用 clear_ints() 清除标志
  4. SPI 片选引脚配置错误

    • 错误表现:SPI 通信失败
    • 解决:确保片选引脚(CS)正确初始化并传递给构造函数
注意事项
  1. 电压兼容性:MCP230xx 有 3.3V 和 5V 版本,需与主控板电压匹配
  2. 上拉电阻:输入模式下建议启用内部上拉(Pull.UP),避免悬空状态
  3. I2C 速率:默认速率为 100kHz,高速模式需额外配置
  4. 中断布线:多个芯片共享中断线时,需通过软件区分中断源
  5. 电源滤波:在噪声环境中,建议添加 0.1μF 滤波电容
  6. 引脚驱动能力:MCP230xx 每个引脚最大驱动电流为 25mA,总电流不超过 100mA

通过 adafruit-circuitpython-mcp230xx 库,开发者可以轻松扩展嵌入式设备的 I/O 能力,适用于智能家居、机器人、自动化控制等场景。使用时需注意硬件连接和地址配置,避免常见的通信问题。

《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能。《AI提示工程必知必会》主要内容包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐