1. 硬件准备与连接

第一次玩树莓派GPIO控制的新手们,别被那些专业术语吓到。咱们先来搞定最基础的硬件连接。我当年第一次点亮LED时,那种成就感至今难忘——就像程序员第一次打印出"Hello World"。

你需要准备的东西很简单:一块树莓派(任何型号都行,我用的是4B)、一颗LED灯(颜色随你喜欢)、一个220Ω的电阻(防止电流过大烧坏LED)、几根杜邦线。这些在某宝上花不到20块钱就能搞定,建议直接买套件更划算。

关键连接步骤:

  • 找到树莓派GPIO排针,就是板子上那两排金属针脚
  • 将LED长脚(正极)通过电阻连接到GPIO18(BCM编号)
  • LED短脚(负极)接到任意GND接地引脚
  • 建议使用面包板中转,比直接插杜邦线稳得多

这里有个新手常踩的坑:GPIO编号方式。树莓派有三种编号系统:

  1. 物理编号:按引脚实际位置1-40排列
  2. BCM编号:芯片寄存器编号(我们主要用这个)
  3. WiringPi编号:第三方库自定义编号

提示:用gpio readall命令可以查看所有编号对照表,建议打印出来贴墙上

2. 三大GPIO库安装指南

2.1 WiringPi库安装

虽然官方已经停止维护WiringPi,但很多老项目还在用。安装时可能会遇到克隆失败的问题,我教你个100%成功的方法:

# 先更新系统
sudo apt update && sudo apt upgrade -y

# 安装编译工具链
sudo apt install build-essential git -y

# 手动下载最新源码(截至2024年7月)
wget https://github.com/WiringPi/WiringPi/archive/refs/tags/2.61.tar.gz
tar -xzf 2.61.tar.gz
cd WiringPi-2.61
./build

验证安装是否成功:

gpio -v  # 应显示版本号
gpio readall  # 显示引脚映射表

2.2 BCM2835库安装

这个库直接操作芯片寄存器,性能最好但难度稍高。最新版安装流程:

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.75.tar.gz
tar -zxvf bcm2835-1.75.tar.gz
cd bcm2835-1.75
./configure
make
sudo make install

测试时如果提示找不到库,可能需要手动添加库路径:

export LD_LIBRARY_PATH=/usr/local/lib

2.3 RPi.GPIO安装

Python用户福音,通常已预装。检查是否安装:

python3 -c "import RPi.GPIO as GPIO; print(GPIO.VERSION)"

如果需要手动安装:

sudo apt install python3-rpi.gpio

3. 三种方式实现LED闪烁

3.1 WiringPi版C程序

创建wiringpi_led.c文件:

#include <wiringPi.h>
#define LED 1  // WiringPi编号1对应BCM 18

int main() {
    if(wiringPiSetup() == -1) {
        printf("初始化失败!");
        return 1;
    }
    
    pinMode(LED, OUTPUT);
    
    while(1) {
        digitalWrite(LED, HIGH);
        delay(500);  // 毫秒单位
        digitalWrite(LED, LOW); 
        delay(500);
    }
    return 0;
}

编译运行:

gcc -Wall wiringpi_led.c -o led -lwiringPi
sudo ./led

3.2 BCM2835版C程序

创建bcm_led.c文件:

#include <bcm2835.h>
#define LED RPI_GPIO_P1_12  // 物理引脚12对应BCM 18

int main() {
    if (!bcm2835_init()) {
        printf("BCM初始化失败!");
        return 1;
    }
    
    bcm2835_gpio_fsel(LED, BCM2835_GPIO_FSEL_OUTP);
    
    while(1) {
        bcm2835_gpio_write(LED, HIGH);
        bcm2835_delay(300);
        bcm2835_gpio_write(LED, LOW);
        bcm2835_delay(300);
    }
    
    bcm2835_close();
    return 0;
}

编译运行:

gcc -Wall bcm_led.c -o led -lbcm2835
sudo ./led

3.3 Python版程序

创建python_led.py文件:

#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time

LED = 18  # BCM编号
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)

try:
    while True:
        GPIO.output(LED, GPIO.HIGH)
        time.sleep(0.2)  # 秒单位
        GPIO.output(LED, GPIO.LOW)
        time.sleep(0.2)
except KeyboardInterrupt:
    GPIO.cleanup()

运行方式:

chmod +x python_led.py
sudo ./python_led.py

4. 三种方案深度对比

4.1 性能实测数据

我用示波器测量了三种方案的波形精度(单位:ms):

方案设定延时实际平均延时波动范围
WiringPi500502.3±3.2
BCM2835500500.8±0.5
RPi.GPIO0.5503.7±5.1

BCM2835表现最稳定,Python方案由于有解释器开销,波动稍大。

4.2 开发效率对比

WiringPi:

  • 优点:类Arduino语法,C程序员易上手
  • 缺点:已停止维护,部分新板子兼容性问题

BCM2835:

  • 优点:直接寄存器操作,性能极致
  • 缺点:需要了解底层硬件知识

RPi.GPIO:

  • 优点:代码简洁,快速原型开发
  • 缺点:性能较差,不适合实时控制

4.3 应用场景建议

  • 教学演示:优先Python版,代码最直观
  • 工业控制:选择BCM2835,稳定性最好
  • 老项目维护:继续用WiringPi
  • 物联网项目:Python+GPIO Zero(更高级封装)

5. 常见问题排查

LED不亮怎么办:

  1. 检查正负极是否接反
  2. 用万用表测量GPIO电压(应有3.3V)
  3. 执行gpio readall确认引脚未被占用
  4. 尝试更换GPIO口测试

编译报错解决方案:

# 找不到头文件
sudo find / -name wiringPi.h  # 确认安装路径
export C_INCLUDE_PATH=/usr/local/include

# 链接库失败
sudo ldconfig /usr/local/lib

Python版本问题: 如果遇到python命令指向Python2的情况,可以显式使用python3:

python3 python_led.py

或者修改默认解释器:

sudo update-alternatives --config python
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐