树莓派纯数字引脚实现低成本红外测距传感器:RC 计时法
树莓派 GPIO 的模拟输入缺失问题
树莓派基于 Broadcom BCM2835 处理器,提供 26 个通用输入输出(GPIO)引脚。虽有 RPi.GPIO 等 Python 库让控制引脚变得简单,但与 Arduino 相比的一大限制是缺乏真正的模拟输入。GPIO 引脚严格为数字:设为输出时只能给 0 V(低)或 3.3 V(高);设为输入时,低于 0.8 V 判为低,高于 1.3 V 判为高。
许多现实应用——温度监测、测距、光强感知——底层信号本质是连续的。仅靠二元 “开/关” 输出往往不够。典型变通是外接模数转换器(ADC)如 MCP3008、TLC549、MCP23017,走 SPI 或 I²C。这些芯片单买不贵,但配合商用传感器总成本可达 20–30 美元且体积庞大——对需多传感器的机器人项目是个问题。
幸好,一种简单有效的方法能省去外接 ADC。将模拟测量转为基于时间的信号,树莓派数字引脚即可间接采样连续数据。时间天然是模拟量,该技术依赖经典 RC(电阻-电容)充电原理。
DIY 红外测距传感器设计
电路仅用廉价元件:若干红外 LED、光敏三极管、2N3904 NPN 三极管、100 nF 陶瓷电容和低功耗电阻。具体型号可互换,关键是保持正确电气特性。
关键元件提示: 100 nF 电容可用低轮廓陶瓷或一类陶瓷/薄膜电容以获最佳稳定性。
硬件搭建
- 供电:+5 V 和 GND 接外部 5 V 电源。GND 与树莓派地相连。
- GPIO 分配:选一 GPIO(如
PIN_A)作触发输出,另一 GPIO(如PIN_B)作测量输入。
测量原理
PIN_A 驱动高电平时,红外 LED 照亮目标表面。反射光激活光敏三极管,产生与反射强度成正比的电流。该电流经 2N3904 三极管给电容充电。电容电压跨过树莓派 PIN_B 数字阈值所需时间,与光敏三极管电流成反比,故与反射物体距离成正比。
Python 控制流程
# 1. 确保电容完全放电
GPIO.setup(PIN_B, GPIO.OUT)
GPIO.output(PIN_B, 0)
time.sleep(0.01) # 10 ms 超过 200×RC(约 0.00005 s)
# 2. 切换 PIN_B 为输入模式
GPIO.setup(PIN_B, GPIO.IN)
# 3. 触发红外 LED
GPIO.setup(PIN_A, GPIO.OUT)
GPIO.output(PIN_A, 1)
# 4. 测量 PIN_B 低电平持续时间
counter = 0
start_time = time.time() * 1000 # 毫秒
while GPIO.input(PIN_B) == 0 and counter < 1e4:
counter += 1
elapsed = time.time() * 1000 - start_time # elapsed(毫秒)≈ k × 距离
使用 4.3 kΩ 电阻和 100 nF 电容,RC 时间常数为 0.43 ms。2N3904 将光敏三极管电流放大约 150 倍,使 LED 激活时各吸取约 50 mA。由此产生的时间延迟 elapsed 与距离线性相关,实现了无需专用 ADC 硬件的模拟量到时间转换。
该方法为传统 ADC 类测距传感器提供了紧凑、低成本的替代方案,适合嵌入式机器人、爱好者项目和教学演示。
制造工艺
- 树莓派多路DS18B20 1-Wire温度监测:接线与编程全指南
- 树莓派 GPIO 直连 DS1820 单总线温度传感器指南
- 树莓派传感器数据融合实战:GPS 与 MPU‑9150 IMU 的 I²C 与 UART 接入
- 树莓派 3 接 HC‑SR04 超声波测距传感器完全指南
- 树莓派接 KY‑033 循迹/门状态传感器:简易 Python 实现
- 树莓派单 GPIO 引脚读取模拟传感器:RC 充电法实战
- 树莓派 DIY 红外运动传感器:从原理到代码的完整指南
- 树莓派无原生 ADC 读取模拟传感器:阶跃响应法实战
- 树莓派接入 DS18B20 单总线数字温度计:分步实战指南
- 树莓派读取线性霍尔传感器:Java 指南与 ADC0832 深度解析
- 树莓派盖革计数器 DIY:开源硬件辐射传感器教程
- 树莓派自动化气雾栽培系统:湿度传感器智能控制