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(用于按键下拉)
软件环境设置
- 启动树莓派并完成初始配置。
- 打开终端,更新系统:
sudo apt update && sudo apt upgrade -y - 确认 Python3 已安装(通常预装):
python3 --version - 安装 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_width 和 max_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 官方文档提供了大量现成类,如
DistanceSensor、LightSensor、Motor等,可直接调用。