用 Python 驾驭 Raspberry Pi:从点亮灯到远程硬件大脑

内容分享1周前发布
0 0 0

阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。

如需转载请附上本文源链接!

用 Python 驾驭 Raspberry Pi:从点亮灯到远程硬件大脑

今天咱来讲讲一件超好玩的事:如何用 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。

九、我的一点体会

我做边缘项目多年,最常见的两个坑:

  1. 硬件损坏最常见:电压接错、短路、伺服拉电导致 SD 卡损坏。多做硬件保护可以省超级多工时。
  2. 软件单点脚本:写了个 while True 的脚本跑一周就掉线了。把关键程序做成 systemd 服务 + 日志 + 健康检查几乎是运维入门必备。
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...