用树莓派Pico和电位计式传感器,5分钟做个简易角度测量仪(附完整Python代码)

张开发
2026/5/19 13:12:34 15 分钟阅读
用树莓派Pico和电位计式传感器,5分钟做个简易角度测量仪(附完整Python代码)
用树莓派Pico和电位计式传感器打造高精度角度测量仪在创客和电子爱好者的世界里快速原型开发能力往往决定了创意落地的速度。今天我们要探讨的是如何利用最常见的电位计式角度传感器和树莓派Pico微控制器在短短几分钟内搭建一个实用角度测量系统。这个项目不仅成本低廉整套材料不超过100元而且完全开源你可以自由修改代码来适应各种应用场景——从机器人关节角度监测到智能家居控制面板甚至是DIY游戏控制器。1. 硬件准备与连接指南1.1 核心组件选择电位计式角度传感器是这个项目的心脏部件。市场上常见的型号通常具有270°或300°的旋转范围价格在20-50元之间。我推荐使用ALPS或Bourns品牌的单圈电位器它们以耐用性和线性度著称。选购时注意三个关键参数阻值10kΩ是最通用的选择旋转角度根据应用需求选择270°或300°线性度至少达到±5%的规格树莓派Pico的优势在于其内置的ADC模数转换器和极低的价格仅40元左右。相比ArduinoPico的12位ADC能提供更高的分辨率这意味着角度测量会更精确。以下是完整的材料清单组件规格数量备注树莓派PicoRP20401建议使用带焊接排针的版本电位计式传感器10kΩ线性1旋转角度根据需求选择面包板400孔1方便快速原型搭建杜邦线公对公3建议使用不同颜色区分电阻10kΩ1可选用于下拉保护USB数据线Micro-B1供电和编程使用1.2 电路连接详解连接电路只需要三个步骤整个过程不超过2分钟电源连接将传感器的VCC引脚连接到Pico的3.3V输出引脚36GND引脚连接到Pico的任意GND如引脚38信号线连接传感器的信号输出端通常为中间引脚连接到Pico的GP26ADC0引脚31可选保护电路在信号线和GND之间添加一个10kΩ下拉电阻防止开路时读数漂移提示使用不同颜色的杜邦线可以显著降低接错线的概率。建议采用红-电源、黑-地、黄-信号的标准配色方案。连接完成后你的电路应该看起来像这样Pico 3.3V → 传感器VCC Pico GND → 传感器GND → 10kΩ电阻 → 传感器信号 传感器信号 → Pico GP26 (ADC0)2. 软件开发环境配置2.1 Thonny IDE设置Thonny是树莓派官方推荐的Python IDE特别适合Pico开发。以下是针对Windows用户的快速设置指南Mac/Linux类似从官网下载并安装最新版Thonny首次启动时进入工具→选项→解释器选择MicroPython (Raspberry Pi Pico)作为解释器连接Pico时按住BOOTSEL按钮然后插入USB线在Thonny中点击安装MicroPython按钮选择最新固件验证安装是否成功可以在Shell中输入import machine machine.freq() # 应该返回125000000125MHz2.2 关键库安装虽然这个项目主要使用内置库但建议安装以下扩展库提升开发效率# 在Thonny的Shell中执行 import upip upip.install(micropython-urequests) # 用于未来网络功能扩展3. 核心代码实现与解析3.1 ADC读取与角度转换电位计传感器的本质是一个可变电阻Pico通过ADC将其阻值变化转换为数字信号。以下是完整的角度测量代码from machine import ADC, Pin import utime # 初始化ADC pot ADC(Pin(26)) # GP26作为ADC输入 MAX_ADC 65535 # Pico的ADC是16位分辨率 ANGLE_RANGE 300 # 根据你的传感器调整这个值 def read_angle(): raw_value pot.read_u16() # 读取原始ADC值 angle (raw_value / MAX_ADC) * ANGLE_RANGE return round(angle, 1) # 保留一位小数 while True: current_angle read_angle() print(当前角度: {}°.format(current_angle)) utime.sleep(0.1) # 100ms刷新一次这段代码的核心逻辑是pot.read_u16()获取原始ADC值0-65535将ADC值按比例映射到传感器的角度范围通过循环持续输出当前角度3.2 数据平滑处理实战原始传感器数据往往存在噪声我们可以通过移动平均滤波来获得更稳定的读数。修改后的代码from machine import ADC, Pin import utime pot ADC(Pin(26)) SAMPLE_SIZE 5 # 采样窗口大小 readings [0] * SAMPLE_SIZE # 初始化采样数组 def smooth_angle(): global readings # 移除最旧读数并添加新读数 readings.pop(0) readings.append(pot.read_u16()) # 计算平均值 avg sum(readings) / SAMPLE_SIZE angle (avg / 65535) * 300 return round(angle, 1) while True: print(平滑后角度: {}°.format(smooth_angle())) utime.sleep(0.05) # 更快的采样频率这个改进版本具有以下优势有效抑制随机噪声响应速度仍然很快5个样本的延迟几乎不可感知算法简单不消耗大量计算资源4. 高级功能扩展4.1 OLED屏幕实时显示添加一个SSD1306 OLED屏幕约30元可以让项目脱离电脑独立工作。接线方式Pico 3.3V → OLED VCC Pico GND → OLED GND Pico GP0 (引脚1) → OLED SDA Pico GP1 (引脚2) → OLED SCL更新后的代码from machine import ADC, Pin, I2C import utime import ssd1306 # 需要提前上传ssd1306.py到Pico # 初始化硬件 pot ADC(Pin(26)) i2c I2C(0, sclPin(1), sdaPin(0), freq400000) oled ssd1306.SSD1306_I2C(128, 64, i2c) def display_angle(angle): oled.fill(0) oled.text(Angle Meter, 15, 5) oled.text(Current:, 15, 25) oled.text(str(angle) °, 50, 45) oled.show() while True: angle (pot.read_u16() / 65535) * 300 display_angle(round(angle)) utime.sleep(0.2)4.2 角度阈值报警系统为项目添加一个蜂鸣器引脚连接GP15当角度超过设定范围时发出警报from machine import ADC, Pin, PWM import utime pot ADC(Pin(26)) buzzer PWM(Pin(15)) MIN_ANGLE 20 MAX_ANGLE 280 def check_alarm(angle): if angle MIN_ANGLE or angle MAX_ANGLE: buzzer.freq(1000) # 1kHz频率 buzzer.duty_u16(32768) # 50%占空比 else: buzzer.duty_u16(0) # 关闭蜂鸣器 while True: angle (pot.read_u16() / 65535) * 300 check_alarm(angle) utime.sleep(0.1)5. 常见问题与性能优化5.1 校准技巧提升精度电位计传感器通常存在两端非线性问题可以通过两点校准法改善将传感器旋转到最小角度记录ADC值如min_adc 1200旋转到最大角度记录ADC值如max_adc 64200修改角度计算公式# 替换原来的角度计算 angle ((raw_value - min_adc) / (max_adc - min_adc)) * ANGLE_RANGE5.2 电源噪声抑制方案如果发现读数不稳定可以尝试在Pico的3.3V和GND之间添加一个100μF电容使用电池供电代替USB电源在代码中增加更复杂的滤波算法如卡尔曼滤波5.3 机械安装建议长期使用时应注意避免传感器轴承受径向力使用联轴器连接旋转部件定期检查电位计磨损情况这个项目最令我惊喜的是它的扩展性——上周我就用它改造了家里的老式调光台灯现在可以通过手机APP精确控制亮度角度。整个改造过程只用了不到一小时成本几乎可以忽略不计。

更多文章