阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。
如需转载请附上本文源链接!

今天咱来讲讲一件超好玩的事:如何用 Python 来控制 Raspberry Pi(树莓派)设备。这篇文章既适合刚上手的小白,也能给做物联网/边缘 AI 的朋友一些实战技巧——从 GPIO、PWM、I²C、SPI、传感器、相机,到网络化控制与上电启动、运维安全,力求把能落地的代码和注意事项都给你。
先说结论:树莓派超级适合做硬件原型与边缘设备,Python 生态完整、学习成本低,但操控硬件要尊重物理规则(电压、电流、拉电阻、防反接),并把软件做成稳健的长周期服务。
一、开箱准备(软硬件小清单)
- Raspberry Pi(提议 3B+/4/Zero2W)
- microSD(提议 16GB+,用 Raspberry Pi Imager 刷入 Raspberry Pi OS)
- 电源(稳定 5V/3A)
- 若接外设:面包板、杜邦线、限流电阻 220Ω、NPN/PNP 三极管或 MOSFET、外部 5V 电源为伺服/马达供电
- 推荐软件包:python3-venv, pip, gpiozero(高层),RPi.GPIO(底层),smbus2, spidev, Adafruit_DHT,opencv-python / picamera2(摄像头),paho-mqtt, flask/fastapi 等。
安装基础环境(示例):
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv git
python3 -m venv ~/pi-env
source ~/pi-env/bin/activate
pip install gpiozero RPi.GPIO smbus2 spidev paho-mqtt flask opencv-python
安全提醒:GPIO 是 3.3V,切勿直接接 5V 信号;驱动马达/舵机请用外供电并共地。
二、GPIO 基础:点亮 LED(最短路径)
用 gpiozero 写最少代码就能跑。gpiozero 内部用 gpiod/RPi.GPIO,对新手超级友善。
# blink.py
from gpiozero import LED
from signal import pause
led = LED(17) # BCM 17 (物理针脚 11)
led.blink(on_time=0.5, off_time=0.5) # 反复闪烁
pause() # 阻塞,直到 Ctrl+C
如果想用底层 RPi.GPIO(更细粒度控制):
import RPi.GPIO as GPIO, time
LED = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)
try:
while True:
GPIO.output(LED, True)
time.sleep(0.5)
GPIO.output(LED, False)
time.sleep(0.5)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
小技巧:gpiozero 可以在非 root 下运行(使用 /dev/gpiomem),而 RPi.GPIO 传统上需 root。
三、PWM 与伺服:用 Python 控制角度
伺服电机需要 PWM,推荐用 pigpio(精度高、可远程)或 gpiozero 的 AngularServo。并且伺服需外供电。
# servo_sweep.py
from gpiozero import AngularServo
from time import sleep
servo = AngularServo(18, min_pulse_width=0.0005, max_pulse_width=0.0025)
try:
while True:
servo.angle = -90
sleep(0.5)
servo.angle = 90
sleep(0.5)
except KeyboardInterrupt:
pass
注意:实际参数(pulse_width)需按具体型号微调;若抖动,用 pigpio + 独立电源。
四、传感器:读取温湿度、ADC、I²C 设备
DHT22(温湿度) 示例(注意库依赖、最好在虚拟环境下安装):
import Adafruit_DHT
sensor = Adafruit_DHT.DHT22
pin = 4 # BCM
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
print(f"T={temperature:.1f}C H={humidity:.1f}%")
SPI:读取 MCP3008 ADC(模拟量转数字):
import spidev
spi = spidev.SpiDev()
spi.open(0, 0) # bus 0, device 0
spi.max_speed_hz = 1350000
def read_channel(ch):
r = spi.xfer2([1, (8+ch)<<4, 0])
return ((r[1]&3)<<8) + r[2]
print(read_channel(0))
I²C:扫描总线(查看已连接地址):
from smbus2 import SMBus
with SMBus(1) as bus:
for addr in range(0x03, 0x78):
try:
bus.read_byte(addr)
print(hex(addr), "found")
except:
pass
对于 OLED、BMP、BME 类模块提议直接用 Adafruit 的 CircuitPython 库,封装更好。
五、摄像头:抓帧与简单服务化
Pi Camera 在新系统里推荐使用 picamera2 + libcamera,或者 OpenCV 的 VideoCapture(如果已配置)。示例:用 Flask 提供 mjpeg 流:
# camera_server.py
from flask import Flask, Response
import cv2
app = Flask(__name__)
cap = cv2.VideoCapture(0)
def gen():
while True:
ok, frame = cap.read()
if not ok: continue
ret, buf = cv2.imencode('.jpg', frame)
yield (b'--frame
Content-Type: image/jpeg
' + buf.tobytes() + b'
')
@app.route('/video')
def video():
return Response(gen(), mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8000)
注意:摄像头和网络流的延迟与 CPU 有关;在 Pi4 上体验最好。
六、网络化控制:MQTT / WebSocket / REST
把设备暴露为可远程控制的服务,常见方案:
MQTT 控制 LED:
import paho.mqtt.client as mqtt
from gpiozero import LED
led = LED(17)
def on_connect(c, u, f, rc): c.subscribe("pi/control/led")
def on_message(c, u, msg):
if msg.payload.decode() == "ON": led.on()
else: led.off()
c = mqtt.Client(); c.on_connect=on_connect; c.on_message=on_message
c.connect("broker.hivemq.com",1883,60); c.loop_forever()
WebSocket 异步控制(低延迟):
import asyncio, websockets
from gpiozero import LED
led = LED(17)
async def h(ws, p):
async for m in ws:
if m=="on": led.on()
elif m=="off": led.off()
start = websockets.serve(h, '0.0.0.0', 8765)
asyncio.get_event_loop().run_until_complete(start); asyncio.get_event_loop().run_forever()
REST(Flask/FastAPI)适合管理面板、定时命令;MQTT 适合解耦与多设备广播;WebSocket 则能做到即时控制。
七、可靠启动与运维:systemd、日志、守护
把脚本做成 systemd 服务能保证开机自启与崩溃重启:
/etc/systemd/system/my-pi.service:
[Unit]
Description=My Pi Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/myapp.py
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload
sudo systemctl enable --now my-pi.service
日志提议用 systemd 或 logrotate 管理,关键指标推到 Prometheus 或 MQTT 做聚焦监控。
八、安全与硬件防护(必读)
- 改默认密码,使用 SSH key,关闭无用端口。
- 使用 ufw + fail2ban 防止暴力登录。
- 对外 API 做鉴权(JWT / API key),不要把 Pi 直接暴露到公网。
- 电路上使用限流电阻、TVS、光耦或电平转换器保护 GPIO。
- 给舵机/马达用独立电源并共地,避免电源噪声重置 Pi。
九、我的一点体会
我做边缘项目多年,最常见的两个坑:
- 硬件损坏最常见:电压接错、短路、伺服拉电导致 SD 卡损坏。多做硬件保护可以省超级多工时。
- 软件单点脚本:写了个 while True 的脚本跑一周就掉线了。把关键程序做成 systemd 服务 + 日志 + 健康检查几乎是运维入门必备。