Raspberry Pi Pico+MicroPython硬件开发实战入门
2026/9/15 21:32:29 网站建设 项目流程

1. 这不是“又一本MicroPython教程”,而是一份Pico硬件开发的实操入场券

你手边那块不到5美元、只有指甲盖大小的Raspberry Pi Pico,不是玩具,也不是教学演示板——它是一台真正能跑在真实工业边缘节点、智能传感器终端、教育机器人主控、甚至小型IoT网关上的微型计算机。我从2021年Pico发布当天就焊上排针开始调试,三年间用它做过温湿度数据采集系统(连续运行478天无重启)、教室灯光自动调节模块(对接光敏电阻+PWM调光LED)、学生实验箱的交互主控(带OLED菜单+旋转编码器),也帮三所职校老师重写了嵌入式实训课的全部实验套件。这些项目里,没有一行C/C++代码是手写的寄存器操作,90%以上的逻辑都用MicroPython完成。为什么?因为Pico的RP2040芯片原生支持MicroPython固件,且其双核ARM Cortex-M0+架构+264KB SRAM+丰富的PIO外设,让Python不再只是“胶水语言”,而是能直接咬合硬件脉搏的控制中枢。

核心关键词——Raspberry Pi Pico、MicroPython、硬件开发、入门、项目实践——不是并列关系,而是递进链条:Pico是载体,MicroPython是工具,硬件开发是动作,入门是起点,项目实践才是终点。市面上太多教程卡在“点亮LED”就戛然而止,或者堆砌语法却不说清“为什么这里要用machine.Pin而不是gpio.PIN”;更常见的是把MicroPython当成简化版Python来教,结果学生一接DS18B20温度传感器就卡在单总线时序上,查文档看到“timing-critical”四个字就放弃。这门课要打破的,正是这种“伪入门”陷阱:不讲抽象概念,只拆真实电路;不背API手册,只看引脚怎么焊、信号怎么测、错误怎么抓;不写“Hello World”,先写“LED呼吸灯——但你要自己算出PWM占空比变化曲线”。

适合谁?不是零基础纯小白——如果你连USB线插哪端都犹豫,建议先花30分钟搞懂“USB-A/USB-C/USB Micro-B接口区别”和“电脑设备管理器里如何识别串口”。而是:

  • 已会写基础Python(能用for循环遍历列表、理解函数参数传递、知道import是干啥的);
  • 愿意动手焊两根线、拿万用表量电压、看懂原理图里VCC/GND标识;
  • 明白“程序烧录”不是复制粘贴文件,而是把固件写进芯片Flash特定扇区。

这门课的第一课,就是让你亲手把MicroPython固件刷进Pico,然后用REPL实时控制一个LED——但关键不在“亮灭”,而在你能否在串口输出里看到>>>提示符跳出来那一刻,听懂芯片在说什么。接下来所有内容,都围绕这个“人与芯片建立第一句对话”的瞬间展开。

2. 为什么选MicroPython而非C/C++或Arduino?——一场关于开发效率与硬件掌控力的平衡术

很多人问:“既然Pico支持C/C++ SDK,为什么还要学MicroPython?”这不是技术路线之争,而是工程决策的现场推演。我用三个真实场景对比说明:

2.1 场景一:快速验证传感器读数是否正常

某次帮农业合作社调试土壤湿度模块,客户现场提供的是国产CH451模组,文档只有中文PDF且时序图模糊。用C SDK写驱动,需先查RP2040参考手册第12章GPIO配置、第18章SPI控制器寄存器映射、再对照CH451 datasheet里的CS/CLK/MOSI时序要求,写完初始化+读取函数至少2小时。而用MicroPython,import machine, time后三行搞定:

spi = machine.SPI(0, sck=machine.Pin(18), mosi=machine.Pin(19), miso=machine.Pin(16), baudrate=1000000) cs = machine.Pin(17, machine.Pin.OUT, value=1) cs.value(0); spi.read(2); cs.value(1) # 发送读指令并接收2字节

实测耗时11分钟——重点不是代码短,而是你能立刻在REPL里逐行执行、用print()打印原始字节流,肉眼比对文档里的“0x80响应帧”,当场确认是模组故障还是接线问题。这种“所见即所得”的调试节奏,C开发需要加JTAG探针+逻辑分析仪才能勉强复现。

2.2 场景二:教育场景下的认知负荷管理

给中职学生讲ADC采样,如果用C,得先解释:

  • #include "pico/stdlib.h"背后是SDK的硬件抽象层;
  • adc_init()函数实际配置了ADC控制器的时钟分频、采样保持时间;
  • adc_read()返回值需右移4位才是12位有效数据。
    学生还没写完printf("Voltage: %d", value),已经迷失在头文件包含路径里。而MicroPython里:
import machine adc = machine.ADC(28) # 直接指定GP28引脚 value = adc.read_u16() # 返回0-65535整数 voltage = value * 3.3 / 65535 # 算电压,小学生都能看懂

他们能立刻把万用表红表笔搭在GP28上,看着voltage数值随表笔接触不同电位点跳动——知识锚定在物理世界,而非内存地址。

2.3 场景三:原型机迭代中的成本控制

去年做一款教室空气质量监测仪,需求是“一周内做出可演示样机”。若用C开发,需:

  • 配置VS Code+GCC工具链(学生电脑环境差异大,30%机器编译失败);
  • 写UART驱动对接CO2传感器(非标协议,需手动解析ASCII帧);
  • 实现OLED显示(SSD1306驱动需处理I2C ACK/NACK时序)。
    MicroPython方案:
  • 固件自带ustructframebufssd1306库;
  • uart = machine.UART(0, tx=0, rx=1, baudrate=9600)一行初始化;
  • oled.text("CO2: {}ppm".format(co2_value), 0, 10)直接显示。
    最终交付时间:3天。其中2天用于焊接PCB和校准传感器,编程仅用4小时——因为所有库函数行为可预测,错误信息直指问题(如OSError: [Errno 19] ENODEV明确提示I2C设备未响应)。

提示:MicroPython不是万能胶。它不适合:

  • 需要亚微秒级精确延时的场合(如红外遥控载波生成);
  • 内存占用超200KB的复杂算法(FFT运算建议用C加速);
  • 需要硬实时响应的电机闭环控制(此时应切换至C+FreeRTOS)。
    但对95%的物联网终端、教育实验、快速原型开发,它是当前最高效的硬件编程入口。

3. 硬件准备与固件烧录:从“砖头”到“会说话的芯片”的七步实操

Pico出厂是空白Flash状态,就像一台没装系统的电脑。让它运行MicroPython,本质是把官方编译好的固件(.uf2文件)写入芯片内置Flash。这个过程看似简单,但每一步都藏着新手易踩的坑。以下是我验证过17种不同操作系统(Win10/11、macOS 12-14、Ubuntu 20.04-23.10、树莓派OS)的通用流程,附关键原理说明。

3.1 第一步:确认你的Pico型号与接口细节

市面有Pico(RP2040)、Pico W(带WiFi)、Pico WH(带WiFi+焊盘预焊)。本课用标准Pico,但必须注意:

  • USB接口类型:Pico使用Micro-USB B口(扁平梯形),不是Type-C!很多新手买错线,用手机快充线(Type-C to Micro-B)插上后电脑无反应——因为快充线通常只通电不通数据。务必用带数据传输功能的Micro-USB线(线身印有“Data Sync”或“USB 2.0”字样)。
  • BOOTSEL按键位置:位于板子右下角,白色小圆点旁的金属弹片。按住它再插USB,Pico会进入U盘模式(此时电脑识别为“RPI-RP2”盘符)。这是烧录的前提,千万别忽略。
  • 引脚布局记忆法:Pico引脚编号按物理位置排列(从左上角开始逆时针数),但MicroPython中machine.Pin(0)对应GP0引脚(物理第1脚),machine.Pin(29)对应GP29(物理第40脚)。记不住?直接看板子丝印——每个焊盘旁都印着“GPxx”字样。

3.2 第二步:下载并验证固件文件

访问官方固件页(https://micropython.org/download/rp2-pico/),选择最新稳定版(如micropython-rp2-pico-20240602-v1.23.0.uf2)。注意:

  • 不要下载源码包.tar.gz)或Windows installer(.exe),那是给开发者编译用的;
  • UF2格式是专为Pico设计的烧录格式,它把固件二进制数据封装成FAT32文件系统,让Pico在U盘模式下能被任何操作系统识别;
  • 下载后检查文件大小:2024年版固件约1.2MB,若只有几百KB,说明下载中断,需重新获取。

注意:某些杀毒软件(尤其国内某卫士)会误报UF2文件为“可疑程序”并自动删除。遇到此情况,临时关闭实时防护或添加信任目录。

3.3 第三步:强制进入U盘模式(关键!)

这是新手失败率最高的环节。正确操作:

  1. Pico完全断电(拔掉USB线);
  2. 左手按住BOOTSEL键不放(用指尖按压,别用指甲抠);
  3. 右手插入USB线到电脑(此时BOOTSEL仍按住);
  4. 观察电脑:Windows会弹出“发现新硬件”,macOS在访达侧边栏出现“RPI-RP2”盘符,Linux在/media/xxx/RPI-RP2挂载;
  5. 松开BOOTSEL键(此时Pico已进入U盘模式,LED常亮)。

常见错误:

  • 先插线再按BOOTSEL → 无效,芯片已启动,无法进入U盘模式;
  • 按键时间太短 → 松手太快,U盘未识别;
  • 插线时USB口松动 → 接触不良导致识别失败。

实测技巧:用镊子尖端轻压BOOTSEL(比手指更稳),插线后默数3秒再松手。

3.4 第四步:拖拽烧录固件

将下载好的.uf2文件直接拖入“RPI-RP2”盘符窗口(不要解压!不要改名!)。此时Pico LED会快速闪烁(约2秒),随后自动断开U盘连接并重启。成功标志:

  • Windows设备管理器中出现“Board CDC”串口(COM3/COM4等);
  • macOS在/dev/tty.usbmodem*下生成设备文件;
  • Linux在/dev/ttyACM0/dev/ttyUSB0出现。

若拖入后无反应:

  • 检查文件是否损坏(重新下载);
  • 尝试换USB口(避开USB集线器,直连主板后置接口);
  • 重启电脑(某些Win10系统需刷新USB枚举)。

3.5 第五步:串口终端连接与REPL初体验

烧录成功后,需用串口工具连接REPL(Read-Eval-Print Loop,MicroPython交互式解释器)。推荐工具:

  • Windows/macOS/Linux通用PuTTY(轻量)、Tera Term(免费)、CoolTerm(macOS友好);
  • 开发者首选rshell(命令行工具,支持文件传输)或Thonny IDE(图形界面,一键连接)。

以Thonny为例(官网下载安装后):

  1. 打开Thonny → Tools → Options → Interpreter → 选择“MicroPython (Raspberry Pi Pico)”;
  2. 点击右下角串口选择框,自动列出可用端口(如/dev/ttyACM0);
  3. 点击“Connect”,窗口底部出现>>>提示符。

此时输入:

print("Hello from Pico!")

回车,立即看到输出——芯片第一次对你说话。

提示:若连接失败,检查串口权限(Linux/macOS需sudo usermod -a -G dialout $USER并重启);若显示乱码,确认波特率设为115200(Pico默认值)。

3.6 第六步:验证硬件功能——用REPL控制板载LED

Pico板载LED接在GP25引脚(物理第30脚),这是唯一无需外接元件就能验证的输出。在REPL中执行:

import machine led = machine.Pin(25, machine.Pin.OUT) # 创建Pin对象,设置为输出模式 led.value(1) # 点亮LED(高电平有效) led.value(0) # 熄灭LED

观察LED状态变化。若不亮:

  • 确认固件版本支持板载LED(2022年后固件均支持);
  • 检查是否误用machine.Pin(25, machine.Pin.IN)(输入模式无法驱动LED);
  • 用万用表测GP25对GND电压:点亮时应为3.3V,熄灭时为0V。

3.7 第七步:保存第一个脚本——告别REPL,走向自主运行

REPL适合调试,但项目需自动运行。将代码存为main.py

import machine import time led = machine.Pin(25, machine.Pin.OUT) while True: led.toggle() # 切换LED状态 time.sleep(0.5) # 延时500ms

在Thonny中:

  • File → New → 粘贴代码;
  • File → Save As → 选择“MicroPython device” → 保存为main.py
  • 断开USB,再重插——Pico自动运行main.py,LED开始闪烁。

原理:Pico启动时自动查找main.py,若存在则执行;否则进入REPL。这是实现“上电即运行”的关键机制。

4. MicroPython核心语法与硬件操作精要:从Python到引脚的翻译规则

MicroPython不是Python的子集,而是针对微控制器优化的实现。它删减了CPython中不适用的功能(如多线程、复杂异常链),但强化了硬件交互能力。掌握以下五类操作,就能覆盖80%的硬件开发需求。

4.1 Pin操作:理解“模式”与“电平”的物理意义

machine.Pin是硬件控制的基石。关键参数:

  • 引脚编号Pin(25)指GP25,不是物理第25脚(物理第25脚是GP22);
  • 模式Pin.OUT(输出)、Pin.IN(输入)、Pin.OPEN_DRAIN(开漏,用于I2C);
  • 驱动强度Pin.PULL_UP/Pin.PULL_DOWN(内部上下拉电阻,避免浮空);
  • 初始状态value=1表示输出高电平(点亮LED)。

典型错误:

# 错误:未指定模式,Pin默认为输入,无法驱动LED led = machine.Pin(25) led.value(1) # 无效操作,无报错但LED不亮 # 正确:显式声明输出模式 led = machine.Pin(25, machine.Pin.OUT)

实测心得:输入模式下读取按钮状态,务必加Pin.PULL_UP(按钮接地时读0)或Pin.PULL_DOWN(按钮接VCC时读1),否则引脚浮空导致读数随机。

4.2 UART通信:与传感器对话的“普通话”

UART是Pico与外部设备(GPS、CO2传感器、蓝牙模块)通信的主力。关键配置:

  • tx/rx引脚:Pico UART0默认GP0(TX)、GP1(RX),但可重映射;
  • baudrate:波特率必须与设备一致(常见9600、115200);
  • timeout:读取超时时间(毫秒),避免程序卡死。

示例:读取DHT22温湿度传感器(需专用库,此处简化):

uart = machine.UART(0, tx=machine.Pin(0), rx=machine.Pin(1), baudrate=9600, timeout=1000) uart.write(b"READ\n") # 发送读取命令 data = uart.read(10) # 读最多10字节 if data: print(data.decode()) # 解码为字符串

注意:UART是异步通信,无主从之分。发送方不管接收方是否准备好,因此timeout至关重要——若传感器未响应,uart.read()会阻塞直到超时。

4.3 ADC采样:把模拟信号变成数字世界的“货币”

Pico有4个ADC通道(GP26-29),但仅GP26-28支持12位精度(0-4095),GP29固定为3.3V基准。采样步骤:

  1. 初始化ADC对象:adc = machine.ADC(26)
  2. 读取原始值:raw = adc.read_u16()(返回0-65535,实际12位数据左对齐);
  3. 转换为电压:voltage = raw * 3.3 / 65535
  4. 若接分压电路(如光敏电阻),需用公式反推电阻值。

常见问题:

  • read_u16()返回值范围是0-65535,但有效位只有高12位(低4位为噪声),实际使用raw >> 4更准确;
  • ADC参考电压默认为VCC(3.3V),若供电不稳(如USB供电波动),读数漂移——此时应改用内部1.25V基准(adc.read_uv()返回微伏值,但需校准)。

4.4 PWM输出:用数字信号“骗过”模拟设备

Pico的PWM支持8个通道(每核4个),可生成0.1Hz-125MHz频率信号。控制LED亮度/电机转速的核心:

  • freq:载波频率(LED常用1000Hz,避免频闪);
  • duty_u16:占空比(0-65535,0=全灭,65535=全亮)。

呼吸灯实现:

pwm = machine.PWM(machine.Pin(25)) pwm.freq(1000) for i in range(0, 65535, 256): # 步进256,避免闪烁 pwm.duty_u16(i) time.sleep_ms(10) for i in range(65535, 0, -256): pwm.duty_u16(i) time.sleep_ms(10)

原理:人眼视觉暂留约0.1秒,1000Hz PWM周期(1ms)远小于暂留时间,故感知为连续亮度变化。

4.5 I2C与SPI:连接“数字外设家族”的高速公路

  • I2C(两线制:SCL/SDA):适合连接OLED、温湿度传感器(BME280)、RTC芯片。Pico默认I2C0在GP1/0,I2C1在GP3/2。
    i2c = machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000) devices = i2c.scan() # 扫描总线上设备地址(如0x3C为OLED)
  • SPI(四线制:SCK/MOSI/MISO/CS):适合高速设备(SD卡、TFT屏幕、ADC芯片)。Pico默认SPI0在GP18-21。
    spi = machine.SPI(0, sck=machine.Pin(18), mosi=machine.Pin(19), miso=machine.Pin(16), baudrate=1000000) cs = machine.Pin(17, machine.Pin.OUT, value=1) cs.value(0); spi.write(b"\x01"); cs.value(1) # 片选+发送命令

关键区别:I2C靠地址寻址(同一总线可挂多个设备),SPI靠CS引脚片选(每个设备独占CS线)。

5. 项目实践:用Pico+MicroPython实现一个“教室环境监测仪”

现在把前面所有知识点串起来,做一个真实可用的小项目:监测教室温湿度、光照强度、CO2浓度,并通过OLED屏幕本地显示,同时用串口向电脑发送JSON数据。全程无需额外库,只用MicroPython内置模块。

5.1 硬件清单与接线图

设备型号接线方式
Pico标准版主控
DHT22温湿度传感器VCC→Pico 3.3V, GND→GND, DATA→GP15
BH1750光照传感器(I2C)VCC→3.3V, GND→GND, SCL→GP1, SDA→GP0
CCS811CO2/eTVOC传感器(I2C)VCC→3.3V, GND→GND, SCL→GP1, SDA→GP0(与BH1750共用I2C总线)
SSD1306 OLED128x64屏幕(I2C)VCC→3.3V, GND→GND, SCL→GP1, SDA→GP0(三设备共用I2C)

注意:I2C总线最多挂3个设备(地址不冲突),BH1750地址0x23,CCS811地址0x5A,SSD1306地址0x3C,无冲突。

5.2 软件架构设计

采用模块化结构,便于调试:

  • main.py:主循环,协调各模块;
  • sensor_dht22.py:DHT22驱动(需处理单总线时序);
  • sensor_bh1750.py:BH1750驱动(标准I2C);
  • display_oled.py:OLED显示(使用ssd1306库);
  • data_json.py:数据打包为JSON。

所有模块通过import引入,主程序只负责调用。

5.3 关键代码实现与调试技巧

(1)DHT22单总线驱动(难点突破)

DHT22需严格时序:主机拉低80us启动,传感器响应80us低电平+80us高电平,再发40bit数据。MicroPython的time.sleep_us()精度有限(实际最小约1us),但足够应付DHT22(要求±1us)。核心代码:

# sensor_dht22.py import machine, time def read_dht22(pin_num): pin = machine.Pin(pin_num, machine.Pin.OUT) pin.value(0) time.sleep_us(20000) # 拉低20ms pin.init(machine.Pin.IN) # 切换为输入 # 等待传感器响应(80us低+80us高) time.sleep_us(80) # 读取40bit数据 data = [] for i in range(40): while pin.value() == 0: pass # 等待高电平 start = time.ticks_us() while pin.value() == 1: pass # 等待低电平 duration = time.ticks_us() - start data.append(1 if duration > 50 else 0) # >50us为1,否则0 # 解析data数组为湿度/温度 # ...(完整解析逻辑略,重点在时序控制)

调试技巧:用示波器测GP15波形,确认启动脉冲宽度为20ms,响应脉冲为80us。

(2)I2C多设备共存方案

三设备共用I2C0,需确保地址不冲突且初始化顺序合理:

# main.py from machine import I2C, Pin i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=100000) # 降低频率提升稳定性 # 先扫描确认设备在线 devices = i2c.scan() if 0x23 not in devices: print("BH1750 not found") if 0x5A not in devices: print("CCS811 not found") if 0x3C not in devices: print("OLED not found")

实测发现:I2C频率过高(400kHz)时CCS811易丢数据,降为100kHz后稳定。

(3)OLED显示优化

SSD1306库默认刷新整屏,频繁调用导致闪烁。改进方案:

# display_oled.py from ssd1306 import SSD1306_I2C oled = SSD1306_I2C(128, 64, i2c) def update_display(temp, humi, lux, co2): oled.fill(0) # 清屏 oled.text("Temp: {:.1f}C".format(temp), 0, 0) oled.text("Humi: {}%".format(humi), 0, 10) oled.text("Lux: {}".format(lux), 0, 20) oled.text("CO2: {}ppm".format(co2), 0, 30) oled.show() # 只刷新一次

oled.show()oled.display()更高效,避免重复刷新。

5.4 数据输出与电脑端接收

Pico通过UART0向电脑发送JSON:

import ujson uart = machine.UART(0, tx=Pin(0), rx=Pin(1), baudrate=115200) data = {"temp": temp, "humi": humi, "lux": lux, "co2": co2} uart.write(ujson.dumps(data) + "\n")

电脑端用Python脚本接收:

import serial, json ser = serial.Serial("COM4", 115200) # Windows端口名 while True: line = ser.readline().decode().strip() if line: data = json.loads(line) print(f"Temp: {data['temp']}C, CO2: {data['co2']}ppm")

注意:ujsonjson更省内存,适合微控制器。

5.5 实际部署与长期运行保障

  • 电源管理:教室插座电压波动大,Pico USB供电易重启。改用5V/2A适配器+AMS1117-3.3V稳压模块供电,实测72小时无重启;
  • 数据校准:DHT22湿度读数偏高,实测用酒精棉片擦拭传感器后,读数下降5%,需在代码中加修正系数humi *= 0.95
  • 故障自检:主循环加入看门狗(machine.WDT(timeout=8000)),若传感器无响应超8秒,自动重启Pico。

6. 常见问题排查与避坑指南:那些让我熬夜到凌晨三点的“幽灵错误”

在Pico+MicroPython开发中,80%的问题不是代码逻辑错误,而是硬件连接、时序、电源或工具链的隐性陷阱。以下是我在127个项目中总结的高频问题及解决方案,按发生概率排序。

6.1 “串口连不上”——从物理层到协议层的七层排查法

层级检查项现象解决方案
物理层USB线是否支持数据传输电脑识别为“未知设备”或无反应换线,用电脑自带USB口(避开集线器)
链路层BOOTSEL是否正确触发插线后无“RPI-RP2”盘符按住BOOTSEL再插线,松手前确认盘符出现
设备层串口驱动是否安装设备管理器显示“感叹号”Win10/11需手动安装rp2040_usb_serial.inf驱动
协议层波特率是否匹配连接后显示乱码Thonny中右下角波特率改为115200
权限层Linux/macOS串口权限Permission denied错误sudo chmod a+rw /dev/ttyACM0或加用户到dialout
固件层UF2文件是否损坏拖入后LED不闪,盘符消失重新下载固件,校验文件大小
硬件层Pico芯片是否损坏所有操作无效,LED不亮更换Pico(RP2040芯片极耐用,损坏率<0.1%)

实操心得:用lsusb(Linux/macOS)或USBView(Windows)查看USB设备描述符,确认VID/PID为2E8A:0003(Raspberry Pi Foundation)。

6.2 “LED不亮”——电流、电平、模式的三角验证

新手常以为“代码写了led.value(1)就该亮”,但实际涉及三重验证:

  • 电流验证:用万用表测GP25对GND电压,应为3.3V(点亮)或0V(熄灭)。若电压正常但LED不亮,LED已坏;
  • 电平验证:确认LED是“共阴极”(阳极接VCC,阴极接GP25),Pico输出高电平点亮。若LED是共阳极(阴极接GND,阳极接GP25),则需led.value(0)点亮;
  • 模式验证print(led)应显示Pin(25, mode=OUT),若显示Pin(25, mode=IN),说明初始化时未指定Pin.OUT

提示:Pico GPIO最大灌电流20mA,单颗LED限流电阻至少100Ω(3.3V/20mA=165Ω),推荐220Ω。

6.3 “I2C设备扫描不到”——地址、上拉、时序的协同故障

i2c.scan()返回空列表,原因往往不是代码错:

  • 地址错误:BH1750默认地址0x23,但部分模块跳线帽短接后变为0x5C;
  • 上拉电阻缺失:I2C总线必须有4.7kΩ上拉电阻(接VCC),Pico开发板已内置,但扩展板需自查;
  • 时序冲突:CCS811需在初始化后等待ready信号,直接scan()会失败。正确流程:
    i2c.writeto(0x5A, b"\x00") # 发送软复位命令 time.sleep_ms(100) devices = i2c.scan() # 此时再扫描

6.4 “ADC读数跳变”——电源噪声与参考电压的博弈

GP26读数在3000-4000间乱跳,非代码问题:

  • 电源滤波不足:在Pico 3.3V引脚并联10μF电解电容+0.1μF陶瓷电容;
  • 参考电压漂移:改用内部1.25V基准(adc = machine.ADC(26); adc.read_uv()),但需校准:
    # 用万用表测VCC实际电压Vcc_real,计算修正系数 # 读数 = (raw_uv * Vcc_real) / 1250000
  • 引脚干扰:GP26-29附近避免走高频信号线(如PWM输出)。

6.

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询