1. GPIO基础概念与硬件准备
1.1 什么是GPIO?
GPIO(General Purpose Input/Output)即通用输入输出接口,是嵌入式系统和单片机开发中最基础也最重要的功能模块之一。简单来说,它就像开发板上的"开关"和"传感器"——既能输出高低电平信号控制外部设备,也能读取外部信号状态。
在树莓派2B开发板上,GPIO引脚以40针双排插针的形式排列(早期型号为26针)。每个引脚都有特定功能:
- 电源引脚:3.3V(标记为3V3)、5V、GND(地线)
- 通用GPIO:可编程控制的数字输入输出引脚
- 特殊功能引脚:支持I2C、SPI、UART等通信协议
重要提示:不同型号树莓派的GPIO引脚排列可能不同,务必通过
pinout命令或官方文档确认当前板子的引脚定义。
1.2 点亮LED的硬件清单
要完成这个基础实验,你需要准备以下材料:
- 树莓派2B(或其他型号,需注意引脚差异)
- LED灯:建议使用红色/绿色普通LED(压降约2V)
- 限流电阻:100Ω色环电阻(如果没有,可用220Ω替代)
- 计算示例:树莓派GPIO输出电压3.3V,LED压降2V,所需电阻=(3.3-2)/0.01=130Ω
- 杜邦线:公对母2根(连接开发板与面包板)
- 面包板:用于免焊接搭建电路
安全警告:不接电阻直接连接LED可能导致:
- 树莓派GPIO过流损坏(最大输出电流约16mA)
- LED因过流烧毁(普通LED持续电流应<20mA)
2. 电路连接与引脚配置
2.1 物理连接步骤
按照以下顺序搭建电路:
- 将树莓派USB接口朝向自己,引脚排列如下:
code复制前排:1(3V3) 3(GP2) 5(GP3) ... 39(GND) 后排:2(5V) 4(GP4) 6(GP17) ... 40(GP21) - 连接GND:
- 使用黑色杜邦线,母头接第6或第39引脚(均为GND)
- 公头插入面包板负极排孔
- 连接信号线:
- 使用彩色杜邦线,母头接第40引脚(GPIO21)
- 公头插入面包板任意行孔
- LED连接:
- 长脚(正极)接电阻一端
- 电阻另一端接GPIO21杜邦线
- 短脚(负极)直接接GND杜邦线
2.2 引脚模式设置
在树莓派终端中操作GPIO有两种主流方式:
-
raspi-gpio工具(推荐):
bash复制# 设置GPIO21为输出模式 raspi-gpio set 21 op # 输出高电平点亮LED raspi-gpio set 21 dh # 输出低电平熄灭LED raspi-gpio set 21 dl -
sysfs接口(传统方式):
bash复制echo 21 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio21/direction echo 1 > /sys/class/gpio/gpio21/value
调试技巧:使用
raspi-gpio get 21可实时查看引脚状态,包括当前模式、电平和上下拉配置。
3. Python控制GPIO实战
3.1 基础控制脚本
创建一个led_control.py文件,内容如下:
python复制import os
from time import sleep
LED_PIN = 21 # 使用BCM编号的GPIO21
def gpio_setup():
os.system(f'raspi-gpio set {LED_PIN} op') # 设置为输出模式
def led_control(state):
if state in ['on', '1']:
os.system(f'raspi-gpio set {LED_PIN} dh')
elif state in ['off', '0']:
os.system(f'raspi-gpio set {LED_PIN} dl')
if __name__ == '__main__':
gpio_setup()
try:
while True:
led_control('on')
sleep(1)
led_control('off')
sleep(1)
except KeyboardInterrupt:
led_control('off')
os.system(f'raspi-gpio set {LED_PIN} ip') # 释放引脚
3.2 可调频率闪烁程序
改进版支持频率调节的LED控制器:
python复制from os import system
from time import sleep
import signal
import sys
LED_PIN = 21
system(f'raspi-gpio set {LED_PIN} op') # 初始化
def signal_handler(sig, frame):
system(f'raspi-gpio set {LED_PIN} ip')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler) # 捕获Ctrl+C
def blink(hz, duration_sec):
period = 1.0 / hz
cycles = int(duration_sec * hz)
for _ in range(cycles):
system(f'raspi-gpio set {LED_PIN} dh')
sleep(period/2)
system(f'raspi-gpio set {LED_PIN} dl')
sleep(period/2)
while True:
try:
freq = float(input("Enter blink frequency (Hz): "))
blink(freq, 5) # 每次闪烁5秒
except ValueError:
print("Please enter a valid number")
性能说明:使用os.system调用命令行工具会有约10ms延迟,如需精确时序控制建议使用RPi.GPIO库。
4. 常见问题与进阶技巧
4.1 典型问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| LED不亮 | 极性接反 | 确认LED长脚接正极 |
| 接触不良 | 检查杜邦线与面包板连接 | |
| 引脚错误 | 重新确认GPIO编号 | |
| LED微亮 | 电阻过大 | 更换为100Ω以下电阻 |
| 树莓派重启 | 短路保护 | 检查是否有引脚直接碰触GND |
4.2 专业开发建议
-
引脚编号标准:
- BCM编号:GPIO21(编程常用)
- 物理编号:对应板载引脚位置(如Pin40)
- 使用
gpio readall可查看完整映射
-
替代开发方案:
python复制# 使用RPi.GPIO库(需sudo权限) import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(21, GPIO.OUT) GPIO.output(21, GPIO.HIGH) -
扩展实验建议:
- 尝试PWM调光(
raspi-gpio set 21 pn) - 结合按钮实现互动控制
- 使用多线程实现复杂灯光效果
- 尝试PWM调光(
在实际项目中,我发现使用gpiozero库更为简洁:
python复制from gpiozero import LED
led = LED(21)
led.blink(background=True) # 后台持续闪烁
最后提醒:完成实验后务必执行raspi-gpio set 21 ip将引脚恢复为输入模式,避免意外短路损坏硬件。
