{"skill":{"slug":"raspberry-pi-gpio","displayName":"raspberry-pi-gpio","summary":"在树莓派中配置和使用GPIO. 何时触发: 需要对 LED, Button 这类简单外设进行控制时, 需要对 Servo, Motors 进行简单控制时, 或需要直接控制GPIO时. 不要触发: 当硬件载体不是树莓派时, 当需要精确控制 Servo, Motors时.","description":"---\nname: raspberry-pi-gpio\ndescription: \"在树莓派中配置和使用GPIO. 何时触发: 需要对 LED, Button 这类简单外设进行控制时, 需要对 Servo, Motors 进行简单控制时, 或需要直接控制GPIO时. 不要触发: 当硬件载体不是树莓派时, 当需要精确控制 Servo, Motors时.\"\n---\n\n# Raspberry Pi GPIO Skill\n\n如果需要了解有关 GPIO 硬件的信息, 请参阅 [GPIO 硬件](references/raspberry-pi-gpio.md).\n\n使用 gpiozero 库可以轻松地用 Python 控制 GPIO 设备.  \ngpiozero 是其他 GPIO 库（RPi.GPIO, pigpio, lgpio）的封装。它提供了一个通用的 API，这样就可以使用任何适合的后端库，而无需更改代码。\n\n随着树莓派硬件(特别是 Raspberry Pi 5)的架构演变, lgpio 正在逐渐取代 RPi.GPIO 成为新的标准.  \n自 Release 2.0 (2023-09-12) 起, lgpio 是 gpiozero 的默认后端.\n\nRPi.GPIO 是树莓派早期的经典 GPIO 库, 直接通过访问硬件寄存器（/dev/mem）来控制引脚.  \n而 lgpio 是基于现代 Linux 内核的 gpiochip 接口开发的库, 不依赖特定的硬件地址.\n\n## 首次使用前检查\n\n### gpiozero \n\ngpiozero 在树莓派操作系统中已经默认安装.  \n如果发现没有安装, 则执行下列命令进行安装: \n\n```bash\nsudo apt update\nsudo apt install python3-gpiozero\n```\n\n### rpi-lgpio\n\nrpi-lgpio 在莓派操作系统中已经默认安装.  \n如果发现没有安装, 则需要检查 RPi.GPIO 是否已经安装了。\n**因为不能在同一 Python 环境中同时安装 rpi-lgpio 和 rpi-gpio, 因为这两个包都试图安装一个名为 RPi.GPIO 的模块**\n\n如果硬件是 **Raspberry Pi 5** 之前的系列, 可以直接使用 RPi.GPIO.  \n否则需要先卸载 RPi.GPIO: \n\n```bash\nsudo apt remove python3-rpi.gpio\n```\n\n再执行下列命令进行安装 rpi-lgpio: \n\n```bash\nsudo apt update\nsudo apt install python3-rpi-lgpio\n```\n\n### RPi.GPIO\n\n如果硬件是 **Raspberry Pi 5** 或之后的系列, 则 RPi.GPIO 已经不能使用, 必须需要安装 rpi-lgpio\n\nRPi.GPIO 在旧版的莓派操作系统中已经默认安装. \n\n如果发现没有安装, 因为 RPi.GPIO 已经不推荐使用，如果 Linux 内核支持 gpiochip, 则直接安装 rpi-lgpio.  \n否则执行下列命令进行安装 RPi.GPIO: \n\n```bash\nsudo apt update\nsudo apt install python3-rpi.gpio\n```\n\n## 使用 gpiozero\n\ngpiozero 是一个用于树莓派 GPIO 设备的简单接口.  \n该库包含了许多简单日常组件的接口，还有一些更复杂的东西，比如传感器、模数转换器、全彩 LED、机器人套件等等.\n\n### GPIO输入 - 读取按钮\n\n```python\nfrom gpiozero import Button\nfrom time import sleep\n\nbutton = Button(17, pull_up=True)\n\nwhile True:\n    if button.is_pressed:\n        print(\"按钮被按下！\")\n    sleep(0.1)\n```\n\n### GPIO输出 - 控制LED\n\n```python\nfrom gpiozero import LED\nfrom time import sleep\n\nled = LED(18)\n\n# LED闪烁\ntry:\n    while True:\n        led.on()\n        sleep(0.5)\n        led.off()\n        sleep(0.5)\nexcept KeyboardInterrupt:\n    pass\n```\n\n### 事件处理 - 按钮回调\n\n```python\nfrom gpiozero import Button, LED\nfrom signal import pause\n\nbutton = Button(17)\nled = LED(18)\n\n# 按下开灯，松开关灯\nbutton.when_pressed = led.on\nbutton.when_released = led.off\n\npause()  # 保持程序运行，等待事件\n```\n\n### PWM控制\n\n```python\nfrom gpiozero import PWMLED, Servo\nfrom time import sleep\n\n# LED亮度渐变\nled = PWMLED(18)\nfor b in range(0, 101, 5):\n    led.value = b / 100\n    sleep(0.1)\n\n# 舵机控制\nservo = Servo(18)\nservo.value = -1   # 0度\nsleep(0.5)\nservo.value = 0    # 90度\nsleep(0.5)\nservo.value = 1    # 180度\nservo.detach()  # 停止脉冲\n```\n\n## 使用 lgpio\n\nlgpio 是树莓派的现代GPIO库, 使用 `/dev/gpiochip` Linux标准接口, 是gpiozero的默认后端.  \n仅当遇到 gpiozero 实现不了的复杂需求时, 才能使用它. \n\n### GPIO基础操作\n\n```python\nimport lgpio\n\n# 打开 gpiochip0\nh = lgpio.gpiochip_open(0)\n\n# 配置GPIO12为输出\nlgpio.gpio_claim_output(h, 12)\nlgpio.gpio_write(h, 12, 1)  # 高电平\nlgpio.gpio_write(h, 12, 0)  # 低电平\n\n# 配置GPIO17为输入（带内部上拉）\nlgpio.gpio_claim_input(h, 17, lgpio.SET_PULL_UP)\nvalue = lgpio.gpio_read(h, 17)\n\n# 释放资源\nlgpio.gpio_free(h, 12)\nlgpio.gpiochip_close(h)\n```\n\n### PWM控制\n\n```python\nimport lgpio\n\nh = lgpio.gpiochip_open(0)\n\n# 在GPIO12上启动PWM: 50Hz, 7.5%占空比\nlgpio.tx_pwm(h, 12, 50, 7.5)\n\n# 停止PWM\nlgpio.tx_pwm(h, 12, 0, 0)\n\nlgpio.gpiochip_close(h)\n```\n\n### 舵机控制\n\n```python\nimport lgpio\nimport time\n\nh = lgpio.gpiochip_open(0)\n\n# 脉宽对应角度: 500us=0°, 1500us=90°, 2500us=180°\nlgpio.tx_servo(h, 12, 1500)   # 90度\ntime.sleep(1)\nlgpio.tx_servo(h, 12, 500)    # 0度\ntime.sleep(1)\nlgpio.tx_servo(h, 12, 2500)   # 180度\n\n# 停止发送脉冲\nlgpio.tx_servo(h, 12, 0)\nlgpio.gpiochip_close(h)\n```\n\n⚠️ **注意**: `tx_servo` 使用软件定时，会有轻微抖动，仅适合测试。长期使用建议配置硬件PWM。\n\n### 中断/回调\n\n```python\nimport lgpio\n\ndef callback(chip, gpio, level, timestamp):\n    \"\"\"\n    中断回调函数\n    level: 0=低电平, 1=高电平, 2=边沿变化\n    \"\"\"\n    print(f\"GPIO {gpio} 状态变为 {level}\")\n\nh = lgpio.gpiochip_open(0)\n\n# 配置GPIO17为输入\nlgpio.gpio_claim_input(h, 17, lgpio.SET_PULL_UP)\n\n# 添加边沿检测回调\n# BOTH_EDGES: 双边沿触发\n# RISING_EDGE: 上升沿触发\n# FALLING_EDGE: 下降沿触发\ncb = lgpio.callback(h, 17, lgpio.BOTH_EDGES, callback)\n\n# 程序运行中...\n# 停止回调: cb.cancel()\n\nlgpio.gpiochip_close(h)\n```\n\n## 更多示例与故障排错\n\n- 尝试通过 `web_search` 获取更多信息\n- 尝试通过 `web_fetch` 访问官方文档来获取精确信息\n\n参考文档:\n\n- [gpiozero](https://gpiozero.readthedocs.io)\n- [rpi-lgpio](https://rpi-lgpio.readthedocs.io)","tags":{"latest":"1.0.0"},"stats":{"comments":0,"downloads":853,"installsAllTime":0,"installsCurrent":0,"stars":0,"versions":1},"createdAt":1773142003342,"updatedAt":1778491807445},"latestVersion":{"version":"1.0.0","createdAt":1773142003342,"changelog":"Initial release of raspberry-pi-gpio skill.\n\n- Provides comprehensive instructions for configuring and using GPIO on Raspberry Pi, focusing on LED, Button, Servo, and simple peripherals.\n- Covers the use of gpiozero as the main library, now defaulting to the modern lgpio backend (especially for Raspberry Pi 5 and later).\n- Explains installation and compatibility of gpiozero, rpi-lgpio, and RPi.GPIO.\n- Includes example code for GPIO input/output, events, PWM, servo control, and interrupts with both gpiozero and lgpio.\n- Notes important hardware/library compatibility and troubleshooting tips for GPIO on various Raspberry Pi models.","license":"MIT-0"},"metadata":null,"owner":{"handle":"cld1994","userId":"s176kfn77th5avbe3me5ygw01d845v6f","displayName":"CLD1994","image":"https://avatars.githubusercontent.com/u/10044266?v=4"},"moderation":null}