树莓派无原生 ADC 读取模拟传感器:阶跃响应法实战
背景知识
树莓派缺乏内置模拟输入,但这不妨碍读取模拟传感器。通过几个电阻和一个电容,即可采用简单的 阶跃响应 技术测定电阻值——适用于电位器、光敏电阻、热敏电阻等。
这种方法由 Adafruit 教程推广,并收录于 《Raspberry Pi Cookbook》,其原理是测量电容充电超过阈值所需的时间。树莓派 GPIO 引脚可检测电压超过约 1.65 V 的时刻,从而推断连接的可变电阻阻值。
所需材料
- 标准面包板和跳线
- 10 kΩ 微调电位器
- 2 × 1 kΩ 电阻
- 220 nF 电容
Python 代码
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# 引脚分配
A_PIN = 18 # 电容充放电控制
B_PIN = 23 # 电压阈值检测
def discharge():
GPIO.setup(A_PIN, GPIO.IN)
GPIO.setup(B_PIN, GPIO.OUT)
GPIO.output(B_PIN, False)
time.sleep(0.005)
def charge_time():
GPIO.setup(B_PIN, GPIO.IN)
GPIO.setup(A_PIN, GPIO.OUT)
count = 0
GPIO.output(A_PIN, True)
while not GPIO.input(B_PIN):
count += 1
return count
def analog_read():
discharge()
return charge_time()
try:
while True:
print(analog_read())
time.sleep(1)
except KeyboardInterrupt:
GPIO.cleanup()
运行脚本产生类似输出:
$ sudo python pot_step.py
101
210
101
623
435
367
728
610
512
314
317
0
拨动电位器旋钮时,读数在 10 到 170 之间波动,反映了可变电阻的变化。
工作原理
该技术依赖 RC 充电曲线。当电容连接到可变电阻时,其电压呈指数上升。GPIO 引脚在电容电压超过输入阈值(约 1.65 V)时判为逻辑高。循环迭代计数的耗时直接与电阻相关:电阻越小,充电越快,计数越小。
由于树莓派没有模数转换器,这种计时方法绕过了该限制,提供了一种低成本、可靠的方式来读取各类模拟传感器。
制造工艺
- 树莓派专业温度监测:基于 DS18B20 传感器的完整指南
- 树莓派紧凑型 DHT 温湿度扩展板:ATtiny85 + DHT22/DHT11
- 树莓派 GPIO 直连 DS1820 单总线温度传感器指南
- 树莓派传感器数据融合实战:GPS 与 MPU‑9150 IMU 的 I²C 与 UART 接入
- 树莓派 3 接 HC‑SR04 超声波测距传感器完全指南
- 树莓派单 GPIO 引脚读取模拟传感器:RC 充电法实战
- 树莓派光敏电阻日志与报警系统:低功耗光照传感器 Python 实现
- Java ME 8 在树莓派上构建物联网:第 1 部分——GPIO 传感器集成
- 树莓派读取线性霍尔传感器:Java 指南与 ADC0832 深度解析
- 树莓派 GPIO 读取按键:分步实战指南
- 树莓派配合 MCP3008 ADC 与 Zabbix 监控模拟传感器:分步指南
- 树莓派纯数字引脚实现低成本红外测距传感器:RC 计时法