znlgis 博客

GIS开发与技术分享

第25章:常见问题与故障排除

本章总结在使用 KE3036 套件过程中常见的问题及解决方法。


25.1 硬件问题

25.1.1 传感器无输出

症状:传感器读数始终为 0 或最大值

排查步骤

  1. 检查电源连接(VCC、GND)
  2. 检查信号线连接(S 端)
  3. 确认 GPIO 引脚号正确
  4. 使用万用表测量电压
# 快速诊断
from machine import ADC, Pin

# 测试数字引脚
test_pin = Pin(16, Pin.IN, Pin.PULL_UP)
print(f"数字值: {test_pin.value()}")

# 测试模拟引脚
test_adc = ADC(26)
print(f"ADC值: {test_adc.read_u16()}")

25.1.2 I2C 设备扫描不到

可能原因

  • 接线错误(SDA/SCL 接反)
  • 缺少上拉电阻
  • 设备地址错误
  • 设备损坏

解决方法

from machine import I2C, Pin

# 尝试不同频率
for freq in [100000, 400000]:
    i2c = I2C(0, sda=Pin(20), scl=Pin(21), freq=freq)
    devices = i2c.scan()
    print(f"频率 {freq}: 发现 {devices}")

25.1.3 舵机抖动

原因

  • 电源不稳定
  • PWM 频率不准确
  • 负载过大

解决方法

  • 使用独立电源供电
  • 增加滤波电容
  • 减轻负载

25.1.4 电机不转

排查步骤

  1. 检查电源电压(需要足够电流)
  2. 检查驱动芯片连接
  3. 测试 PWM 输出
# 测试 PWM 输出
from machine import Pin, PWM
import time

pwm = PWM(Pin(14))
pwm.freq(1000)
pwm.duty_u16(32768)  # 50%
time.sleep(2)
pwm.duty_u16(0)

25.2 软件问题

25.2.1 程序无法上传

解决方法

  1. 按住 BOOTSEL 按钮重新连接
  2. 重新安装 MicroPython 固件
  3. 尝试不同的 USB 数据线
  4. 检查串口是否被其他程序占用

25.2.2 程序运行后无响应

排查步骤

  1. 添加 print 语句调试
  2. 使用 try-except 捕获异常
  3. 检查无限循环中的 sleep
try:
    # 你的代码
    sensor.measure()
except Exception as e:
    print(f"错误: {e}")

25.2.3 内存不足

错误信息MemoryError

解决方法

  • 释放不用的变量
  • 使用 gc 模块
  • 减少全局变量
import gc

# 查看内存
gc.collect()
print(f"可用内存: {gc.mem_free()} 字节")

25.2.4 导入模块失败

错误信息ImportError

解决方法

  1. 确认库文件已上传到 Pico
  2. 检查文件名拼写
  3. 确认文件在正确目录
import os
print(os.listdir())  # 查看当前目录文件

25.3 传感器特定问题

25.3.1 DHT11 读取失败

# 增加重试机制
def read_dht_safe(sensor, retries=5):
    for _ in range(retries):
        try:
            sensor.measure()
            return sensor.temperature(), sensor.humidity()
        except OSError:
            time.sleep(0.5)
    return None, None

25.3.2 ADC 读数不稳定

# 使用滤波
def read_adc_filtered(adc, samples=10):
    values = [adc.read_u16() for _ in range(samples)]
    values.sort()
    return values[samples // 2]  # 中值

25.3.3 DS18B20 找不到设备

import onewire
import ds18x20

# 检查设备
ow = onewire.OneWire(Pin(3))
print(f"单总线设备: {ow.scan()}")

25.3.4 红外接收不稳定

  • 避免日光直射
  • 远离荧光灯
  • 调整接收角度

25.4 电源问题

25.4.1 USB 供电不足

症状

  • 连接多个模块时异常
  • 电机启动时重启

解决方法

  • 使用外部电源
  • 减少同时工作的模块

25.4.2 电压不匹配

注意

  • Pico 是 3.3V 逻辑
  • 某些传感器需要 5V 供电但输出 3.3V
  • 使用电平转换器连接 5V 设备

25.5 调试技巧

25.5.1 使用 LED 调试

led = Pin(25, Pin.OUT)

# 指示程序运行
led.toggle()

# 错误闪烁
def error_blink(times=3):
    for _ in range(times):
        led.value(1)
        time.sleep(0.1)
        led.value(0)
        time.sleep(0.1)

25.5.2 串口日志

import sys

def log(level, msg):
    print(f"[{level}] {msg}")
    sys.stdout.write("")  # 刷新缓冲

log("INFO", "系统启动")
log("ERROR", "传感器读取失败")

25.5.3 定时重启

from machine import WDT

# 看门狗定时器(8秒)
wdt = WDT(timeout=8000)

while True:
    # 主循环
    wdt.feed()  # 喂狗,防止重启

25.6 性能优化

25.6.1 减少延时

# 使用 sleep_us 代替 sleep_ms
import utime
utime.sleep_us(100)  # 微秒级延时

25.6.2 使用中断

# 使用中断代替轮询
button = Pin(15, Pin.IN, Pin.PULL_UP)

def callback(pin):
    print("按钮按下")

button.irq(trigger=Pin.IRQ_FALLING, handler=callback)

25.6.3 预分配内存

# 预分配数组
buffer = bytearray(100)
# 而不是反复创建新数组

25.7 安全须知

25.7.1 电气安全

  • 避免短路
  • 正确连接电源极性
  • 不超过额定电压/电流

25.7.2 静电防护

  • 触摸电路板前先释放静电
  • 避免在地毯上操作
  • 使用防静电手环

25.7.3 激光安全

  • 激光模块勿对眼睛照射
  • 勿对反射面照射

25.8 本章小结

本章总结了常见问题:

  1. 硬件问题:接线、供电、驱动
  2. 软件问题:导入、内存、异常
  3. 传感器问题:特定故障排除
  4. 调试技巧:LED、日志、看门狗

希望本教程能帮助你顺利完成 Raspberry Pi Pico 项目开发!


附录:参考资源