Raspberry Pi 树莓派项目:Python 与 GPIO 控制

FreeGuideOnline 最新 2026-06-15

Raspberry Pi 树莓派项目:Python 与 GPIO 控制

简介

GPIO(通用输入输出)引脚让树莓派能与物理世界交互。通过 Python,你可以轻松控制 LED、读取按钮、驱动电机,构建自己的物联网原型。本教程从零开始,带你掌握 GPIO 控制的核心方法。

准备工作

所需硬件

  • 树莓派(任意型号,推荐 3B+ 或更新)
  • MicroSD 卡(已刷写 Raspberry Pi OS)
  • 面包板 + 跳线(公对母)
  • LED ×1(任何颜色)
  • 330 Ω 电阻 ×1
  • 轻触按键 ×1
  • 10 kΩ 电阻 ×1(用于按键下拉)

软件环境设置

  1. 启动树莓派并完成初始配置。
  2. 打开终端,更新系统:
    sudo apt update && sudo apt upgrade -y
    
  3. 确认 Python3 已安装(通常预装):
    python3 --version
    
  4. 安装 GPIO 控制库。推荐使用 gpiozero(入门更友好),同时保留系统内置的 RPi.GPIO 作为备选:
    sudo apt install python3-gpiozero python3-rpi.gpio -y
    

认识 GPIO 引脚

  • 树莓派引脚采用 BCM 编号物理 BOARD 编号 两种命名体系。本教程统一使用 GPIO 编号 (BCM)
  • 引脚功能:电源(3.3V、5V)、地(GND)、I/O 引脚(可配置输入输出)。
  • 绝对不要接超过 3.3V 的信号,否则会永久损坏芯片。
  • 常用引脚参考图(执行 pinout 命令可查看终端版脚位图)。

项目一:控制 LED 亮灭

电路连接

  • LED 正极(长脚) → 330 Ω 电阻 → GPIO 17(第11脚)
  • LED 负极(短脚) → GND(如第9脚)

Python 代码(使用 gpiozero)

from gpiozero import LED
from time import sleep

led = LED(17)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

保存为 blink.py,运行 python3 blink.py,LED 将以 1 秒间隔闪烁。按 Ctrl+C 停止。

替代方案(RPi.GPIO)

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

while True:
    GPIO.output(17, GPIO.HIGH)
    time.sleep(1)
    GPIO.output(17, GPIO.LOW)
    time.sleep(1)

使用 RPi.GPIO 时需手动清理:GPIO.cleanup() 在程序结束时调用。gpiozero 会自动释放资源。

项目二:按钮输入控制 LED

电路连接

  • 按键一脚 → GPIO 2(第3脚)
  • 按键另一脚 → GND
  • 同侧可并联一个 10 kΩ 下拉电阻到 GND(防止引脚浮空),或利用 gpiozero 的内部上拉/下拉。

代码:按下亮灯,松开熄灭

from gpiozero import LED, Button

led = LED(17)
button = Button(2, pull_up=False)  # 默认使用内部下拉

while True:
    if button.is_pressed:
        led.on()
    else:
        led.off()

更优雅的方式,使用事件驱动:

button.when_pressed = led.on
button.when_released = led.off
# 需要保持程序运行
from signal import pause
pause()
  • pull_up=False 表示使用下拉,当按键按下时引脚读到高电平。若按键连接方式不同,可调整为 pull_up=True 或使用外部上下拉。

项目三:呼吸灯(PWM 控制亮度)

PWM(脉宽调制)可模拟模拟输出,控制 LED 亮度或电机速度。

代码:渐亮渐灭

from gpiozero import PWMLED
from time import sleep

led = PWMLED(17)

while True:
    # 渐亮
    for duty in range(0, 101, 1):
        led.value = duty / 100.0
        sleep(0.02)
    # 渐灭
    for duty in range(100, -1, -1):
        led.value = duty / 100.0
        sleep(0.02)

led.value 的取值范围为 0~1。也可以直接使用 led.pulse() 方法实现呼吸灯效果。

使用 RPi.GPIO 的 PWM

pwm = GPIO.PWM(17, 100)  # 频率 100 Hz
pwm.start(0)
pwm.ChangeDutyCycle(50)  # 占空比 50%

项目四:舵机控制

舵机广泛应用在机器人、云台等项目中,通常通过 PWM 信号控制角度。

连接方式

  • 舵机信号线(橙色/白色) → GPIO 18(第12脚)
  • 电源(红色) → 外部 5V 电源(树莓派 5V 引脚可驱动小功率舵机,但为避免压降建议外接)
  • 地线(黑色) → 外部电源 GND + 树莓派 GND(共地)

代码(gpiozero)

from gpiozero import AngularServo
from time import sleep

servo = AngularServo(18, min_angle=-90, max_angle=90)

while True:
    servo.angle = -90
    sleep(1)
    servo.angle = 0
    sleep(1)
    servo.angle = 90
    sleep(1)

若舵机抖动,可调整 min_pulse_widthmax_pulse_width 参数。

常见问题与调试

LED 不亮?

  • 检查正负极是否接反。
  • 测量电阻是否过大(330 Ω 是安全值)。
  • 更换 GPIO 引脚测试(注意代码同步更改)。

按钮无反应?

  • 确认引脚连接正确,上拉/下拉配置是否与电路匹配。
  • 使用 gpio readall 命令查看引脚状态(需安装 wiringpi,但推荐用 pinout 验证脚号)。
  • 在代码中添加打印语句监测按钮状态:print(button.is_pressed)

权限问题

  • 若提示无权限访问 /dev/gpiomem,将用户加入 gpio 组:sudo usermod -a -G gpio $USER,然后注销重新登录。

电路安全提醒

  • 任何 GPIO 引脚最大输出电流不可超过 16 mA,总电流不要超过 50 mA。
  • 驱动大电流设备(继电器、电机)务必使用驱动模块(如 ULN2003、L298N),切勿直接连接 GPIO。
  • 外接传感器时确认工作电压,3.3V 与 5V 混接可能导致损坏。

下一步扩展方向

  • 传感器读取:DHT11 温湿度、HC-SR04 超声波测距。
  • 通讯协议:I2C(连接 OLED 屏幕)、SPI(驱动 LED 点阵屏)。
  • 远程控制:结合 Flask 搭建 Web 端控制界面,或使用 MQTT 实现物联网互动。
  • 案例库资源:gpiozero 官方文档提供了大量现成类,如 DistanceSensorLightSensorMotor 等,可直接调用。