2、Raspberry Pi基础:树莓派型号选择、系统安装、SSH远程连接、GPIO引脚布局与电气特性
树莓派(Raspberry Pi)作为物联网数据采集的核心硬件平台,其选型、系统部署与GPIO(通用输入输出)操作直接决定了传感器数据采集项目的稳定性与开发效率。本章将围绕四个关键环节展开:首先分析不同型号树莓派的适用场景,其次讲解操作系统安装与SSH远程登录的标准化流程,然后深入解析40针GPIO的引脚布局与电气特性,最后通过一个温湿度传感器接入的实战案例,串联全部知识点。需要特别强调的是,GPIO的3.3V逻辑电平与传感器供电隔离是初学者最容易忽略的硬件风险点,本章将给出明确的规避方案。
2.1 树莓派型号选择:性能、功耗与接口的权衡
树莓派家族目前主流在售型号包括Zero 2 W、3B+、4B(1/2/4/8GB)以及最新的5代(4/8/16GB)。对于物联网传感器数据采集场景,选型核心指标并非算力,而是外设接口丰富度、GPIO复用能力、功耗与长期稳定性。以数据采集频率为例,若每秒采样10次以内的温湿度、气压等慢变信号,Zero 2 W即可胜任;但若涉及摄像头图像采集、多路ADC同步采样或本地运行轻量级数据库,则需4B或5代提供更充裕的内存与USB 3.0带宽。
| 型号 | CPU/内存 | GPIO特性 | 推荐场景 | 注意事项 |
|---|---|---|---|---|
| Zero 2 W | 4核A53/512MB | 40针,无PoE | 单传感器、低功耗 | Micro-HDMI,需转接头 |
| 3B+ | 4核A53/1GB | 40针,千兆以太网 | 多传感器+网络存储 | 功耗约5W,需5V/2.5A |
| 4B (2GB) | 4核A72/2GB | 40针,USB3.0 | 图像+数据采集 | 发热量大,需散热片 |
| 5 (8GB) | 4核A76/8GB | 40针,PCIe接口 | 边缘计算+多路采集 | 需专用电源(5V/5A) |
选型时还需注意GPIO复用冲突。例如,树莓派4B的GPIO 14/15默认用于UART调试串口,若需使用该串口连接GPS模块,则需通过config.txt禁用系统串口控制台功能。此外,所有型号的GPIO均支持3.3V逻辑输出,但总输出电流有限制——所有GPIO同时输出高电平时,最大总电流不超过50mA,单个引脚不超过16mA。这意味着直接驱动继电器或电机必须使用外部驱动芯片(如ULN2003)或光耦隔离。
2.2 系统安装与SSH远程连接:从镜像烧录到无头启动
树莓派官方推荐使用Raspberry Pi Imager工具烧录系统。该工具支持预配置SSH、Wi-Fi凭据和用户密码,极大简化了无头(Headless)模式部署流程。具体操作步骤如下:
- 下载Raspberry Pi Imager(支持Windows/macOS/Linux),选择操作系统为“Raspberry Pi OS (64-bit) Lite”——该版本无桌面环境,占用资源少,适合服务器化运行。
- 点击设置按钮(齿轮图标),预先启用SSH服务,设置用户名(如
pi)和强密码,并配置Wi-Fi SSID与密码(若使用无线连接)。 - 将Micro SD卡(推荐Class 10/A2,容量16GB以上)插入读卡器,选择目标存储设备后开始烧录。烧录完成后,系统会自动挂载SD卡的
boot分区,可手动编辑config.txt添加enable_uart=1以启用串口调试。 - 将SD卡插入树莓派,接通电源。等待约1-2分钟完成首次启动。通过路由器管理界面或手机App(如Fing)查找树莓派的IP地址。
- 在PC终端执行
ssh pi@<IP地址>,输入密码即可登录。建议使用SSH密钥认证替代密码,提高安全性。
# 生成SSH密钥(在PC端执行)
ssh-keygen -t ed25519 -C "pi@raspberrypi"
# 复制公钥到树莓派
ssh-copy-id pi@192.168.1.100
# 登录后建议立即更新系统
sudo apt update && sudo apt full-upgrade -y
SSH连接失败时,优先检查网络连通性(ping命令)、SSH服务状态(systemctl status ssh)以及防火墙规则。树莓派默认开启SSH服务,但若使用非官方镜像,需手动执行sudo raspi-config开启。另外,若使用Windows系统,建议使用Windows Terminal或MobaXterm作为SSH客户端,避免使用老旧的PuTTY(虽然可用,但复制粘贴体验较差)。
/etc/rc.local中添加开机自启脚本,或使用systemd服务管理Python采集程序。同时,配置日志轮转(logrotate)避免SD卡被日志写满。SD卡寿命有限,可考虑启用log2ram将日志写入内存。
2.3 GPIO引脚布局与电气特性:40针接口的完整解析
树莓派40针GPIO排针遵循特定布局,物理引脚编号(Board编号)从1到40,而软件编程通常使用BCM(Broadcom)编号。两者对应关系必须牢记,否则极易接错线。以下为关键引脚分布:
- 电源引脚:Pin 2/4(5V)、Pin 1/17(3.3V)、Pin 6/9/14/20/25/30/34/39(GND)。5V引脚直接连接USB输入电源,可用于给传感器供电,但需注意总电流不超过3A(4B)或5A(5代)。
- I2C接口:Pin 3(BCM 2/SDA)、Pin 5(BCM 3/SCL),默认复用为I2C-1总线,地址范围0x03-0x77。板载1.8kΩ上拉电阻至3.3V。
- SPI接口:Pin 19(BCM 10/MOSI)、Pin 21(BCM 9/MISO)、Pin 23(BCM 11/SCLK)、Pin 24(BCM 8/CE0)、Pin 26(BCM 7/CE1)。SPI速率最高可达125MHz,适合高速ADC或显示屏。
- UART接口:Pin 8(BCM 14/TXD)、Pin 10(BCM 15/RXD),默认用于Linux控制台,需禁用串口控制台后才能作为普通串口使用。
- PWM与中断:BCM 12/13/18/19支持硬件PWM,所有GPIO均可通过
gpiozero库启用软件中断(边沿检测)。
| 电气参数 | 最小值 | 典型值 | 最大值 | 说明 |
|---|---|---|---|---|
| 输入高电平阈值 | 1.8V | 3.3V | 3.6V | 超过3.6V可能损坏引脚 |
| 输入低电平阈值 | 0V | 0V | 0.8V | 低于0.8V视为低电平 |
| 输出高电平 | 2.7V | 3.3V | 3.3V | 驱动能力约2mA(推荐) |
| 输出低电平 | 0V | 0V | 0.4V | 灌电流能力约3mA |
| GPIO总输出电流 | - | - | 50mA | 所有引脚总和 |
电气特性中最关键的是电平匹配问题。树莓派GPIO为3.3V逻辑,而许多工业传感器(如5V供电的超声波模块HC-SR04)输出5V高电平。直接连接会超出GPIO最大输入电压,长期运行可能导致引脚烧毁。解决方案包括:使用电阻分压(5V→3.3V需串联1kΩ与2kΩ电阻)、使用电平转换模块(如TXS0108E)或选择3.3V供电的传感器版本。此外,GPIO引脚内部无保护二极管,静电放电(ESD)可能造成永久损坏,操作前应触摸接地金属释放静电。
2.4 实战案例:DHT22温湿度传感器接入与数据读取
本案例将完整演示从硬件连接、Python编程到远程数据获取的闭环流程。DHT22是一款数字温湿度传感器,单总线通信,测量范围-40~80℃,精度±0.5℃。其工作电压为3.3-5.5V,但数据引脚输出电平与供电电压相同,因此采用3.3V供电以确保逻辑电平匹配。
硬件连接:将DHT22的VCC接Pin 1(3.3V),GND接Pin 6(GND),DATA接Pin 7(BCM 4)。在DATA与VCC之间需外接10kΩ上拉电阻(部分模块已内置)。连接完成后,使用gpio readall命令验证引脚状态。
# 安装必要的库
sudo apt install python3-pip
pip3 install adafruit-circuitpython-dht
sudo apt install libgpiod2
# 编写采集脚本 dht22_read.py
import time
import board
import adafruit_dht
dht = adafruit_dht.DHT22(board.D4)
try:
while True:
temperature = dht.temperature
humidity = dht.humidity
print(f"Temp: {temperature:.1f}°C, Humidity: {humidity:.1f}%")
time.sleep(2)
except KeyboardInterrupt:
pass
finally:
dht.exit()
运行脚本后,每2秒输出一次温湿度数据。若需远程获取数据,可在树莓派上运行Flask或FastAPI服务,将数据以JSON格式暴露给局域网内其他设备。以下为最小化API示例:
from flask import Flask, jsonify
import threading
app = Flask(__name__)
latest_data = {"temp": 0.0, "humidity": 0.0}
def read_sensor():
global latest_data
while True:
try:
latest_data["temp"] = dht.temperature
latest_data["humidity"] = dht.humidity
except RuntimeError:
pass
time.sleep(2)
@app.route("/data")
def get_data():
return jsonify(latest_data)
if __name__ == "__main__":
threading.Thread(target=read_sensor, daemon=True).start()
app.run(host="0.0.0.0", port=5000)
通过浏览器访问http://<树莓派IP>:5000/data即可获取实时数据。该案例中,DHT22的采样间隔为2秒,这是由传感器本身特性决定的——DHT22每次读取间隔需大于1.5秒,否则返回校验错误。若需更高采样率,应选用BME280(I2C接口)或SHT30(I2C接口),它们支持每秒数十次采样。
gpiozero库的InputDevice类进行调试,观察引脚电平变化。
2.5 常见误区与总结复盘
通过本章学习,需重点规避以下误区:
- 误区一:认为所有传感器都能直接连接GPIO。实际上,模拟信号传感器(如土壤湿度模块)需外接ADC(如MCP3008),因为树莓派GPIO不具备模拟输入功能。
- 误区二:忽略GPIO复用冲突。例如,使用音频输出(I2S)会占用BCM 18/19/20/21,与SPI或PWM冲突。在
config.txt中启用dtoverlay时需仔细核对引脚占用。 - 误区三:使用5V给3.3V传感器供电。部分传感器模块(如RC522 RFID)标注5V兼容,但其逻辑电平可能为5V,需确认是否内置电平转换。
- 误区四:SSH连接时使用默认密码不修改。树莓派默认用户
pi密码raspberry,暴露在公网极易被暴力破解。务必修改密码或禁用密码登录。