树莓派传感器与执行器控制实战:加速度计、舵机与数据流
大多数开发者习惯处理静态文件或简单图形,但物理计算打开了与现实世界交互的大门。通过读取传感器数据并驱动执行器,你可以构建能够感知、决策并在物理世界中行动的系统。
目标
使用树莓派读取加速度计数值并控制舵机电机,演示物理计算的核心概念。
关键概念
- 树莓派 — 一款 35 美元的 Linux 单板计算机,拥有 HDMI、以太网、两个 USB 端口,最重要的是 GPIO 引脚,可用于发送和接收信号。
- GPIO 引脚 — 通用输入/输出引脚,充当二进制开关。你可以将引脚设为 HIGH(3.3V)或 LOW(0V)来驱动执行器,或读取其状态以获取传感器数据。
本文通过四个实用的 Python 项目展示树莓派的硬件能力:
- 点亮 LED
- 读取电位器
- 网络数据流传输
- 控制舵机电机
点亮 LED
LED(发光二极管)在电流单向流动时发光。为保护树莓派和 LED,需串联 500Ω 至 1.5kΩ 的电阻。电阻值可用 R = (V_s - V_d) / I 计算,但上述范围适用于大多数套件。
import time
from itertools import cycle
import RPi.GPIO as io
io.setmode(io.BCM)
io.setup(12, io.OUT)
for state in cycle([1, 0]):
io.output(12, state)
time.sleep(0.5)
代码将引脚 12 设为输出,每 0.5 秒切换一次,使 LED 闪烁。
读取电位器
电位器是可变电阻,将旋钮位置转换为电压。由于 GPIO 为数字引脚,我们需要模数转换器(ADC)。MCP3008 提供八个 10 位通道,将 0–3.3V 映射为 0–1023 的整数值。
安装 spidev 以通过 SPI 与 MCP3008 通信:
pip install spidev
运行以下脚本读取通道 0 的值:
import spidev
import time
spi = spidev.SpiDev()
spi.open(0, 0)
def readadc(adcnum):
if not 0 <= adcnum <= 7:
return -1
r = spi.xfer2([1, (8 + adcnum) << 4, 0])
adcout = ((r[1] & 3) << 8) + r[2]
return adcout
while True:
val = readadc(0)
print(val)
time.sleep(0.5)
使用 ØMQ 进行数据流传输
ØMQ 通过高性能消息库简化网络编程。使用 REQUEST/REPLY 模式,可在 Python 中构建轻量级服务端和客户端。
服务端
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind('tcp://*:1980')
while True:
message = socket.recv()
print(message)
socket.send(b"I'm here")
客户端
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect('tcp://192.168.1.6:1980')
for _ in range(10):
socket.send(b'You home?')
message = socket.recv()
print(message)
结合 traits 和 enaml,可创建响应式 UI 以可视化流式数据。详见 acc_plot 演示。
控制舵机电机
舵机通过脉宽调制(PWM)实现精确定位。典型舵机将 0.5ms 脉宽视为最小角度,2.5ms 为最大角度,周期 20ms。
在通用操作系统中实现精确时序很难。ServoBlaster 是一个内核模块,将 PWM 生成卸载给 DMA 控制器,暴露简单的 /dev/servoblaster 接口。
我将其封装为一个小型面向对象库:RobotBrain。下例演示将舵机从 0% 移动到 100% 占空比。
import time
import numpy as np
from robot_brain.servo import Servo
# 初始化引脚 4 上的舵机,自定义最小/最大脉宽(微秒)
servo = Servo(0, min=60, max=200)
for val in np.arange(0, 1, 0.05):
servo.set(val)
time.sleep(0.1)
在 GitHub 上使用 servo_slider 演示查看如何通过网络控制舵机。
深入了解树莓派传感器与执行器控制,请参考原始文档或社区教程。
制造工艺
- NodeMCU DHT22接入树莓派3B+ MQTT Broker:无缝物联网集成指南
- 树莓派+$5 I²C传感器打造温度记录仪
- 树莓派多路DS18B20 1-Wire温度监测:接线与编程全指南
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- 树莓派自制气象站:每日邮件推送温湿雨数据
- 树莓派 3 接 HC‑SR04 超声波测距传感器完全指南
- 树莓派 PIR 运动传感器控制 LED 实战指南
- 树莓派低成本土壤湿度传感器:智能灌溉 DIY 指南
- 树莓派读取线性霍尔传感器:Java 指南与 ADC0832 深度解析
- 树莓派多传感器温度光照监测系统:DS18B20 实战构建
- 基于树莓派的卫生间占用传感器:通过 Twilio 实现语音与短信提醒
- 树莓派 + DHT11 + ThingSpeak:打造你的第一个物联网项目