🍓 第九章 Raspberry Pi Pico 开发板与 MicroPython 语言
📄 一句话概括

MicroPython = 被塞进单片机里的 Python 3——语法和你第六章学的一样,不一样的是【运行环境】:没有操作系统、没有 pip、内存以 KB 计,多出一组管硬件的 machine 模块。

📝 本节和前面几节的关系

第六章花六节建立的 Python 功底(变量、流程控制、函数模块、列表字符串)在这里几乎原封不动地可用——这正是 MicroPython 的卖点。6-5 讲过【装第三方库要绕 PEP 668】,MicroPython 连 pip 都没有,库要么固件自带、要么把 .py 文件拷进板子。8-3 的 Arduino 程序是【编译后烧进芯片】;MicroPython 是【解释器常驻芯片、你的脚本是数据】——架构完全不同,这一节把这个区别讲透。

一、MicroPython 是什么:一条引脚上的 Python

MicroPython 是澳大利亚程序员 Damien George 2013 年在 Kickstarter 上众筹的项目:把一个精简的 Python 3 解释器写进单片机的 Flash 里,让你用 Python 语法直接操作硬件。后来它长成了一个开源项目,而树莓派基金会干脆把 MicroPython 设为 Pico 的官方语言——出厂支持、文档围绕它写。

三个关键词定位它:

二、和电脑版 Python(第六章的环境)差在哪

对比项 电脑版(树莓派上的 python3) MicroPython(Pico 上)
解释器 系统自带 Python 3.13 固件里烧好的精简解释器(当前 v1.28)
内存 GB 级 520 KB(Pico 2)/264 KB(一代)
装库 apt/pip/venv 没有 pip——固件自带,或拷 .py 进板子
标准库 全套 精简版(json、math、random 在;requests 等大件没有)
硬件控制 要 gpiozero 这类库 machine 模块直接管
交互方式 终端里 python3 进 REPL USB 串口就是 REPL(9-3 连)
文件存放 microSD 卡的大文件系统 板载 Flash 里的小文件系统(存 main.py 等)

最重要的心智模型:电脑版里【操作系统养着 Python】;MicroPython 里【解释器就是整个系统】——通电,解释器启动,去找 Flash 里有没有 main.py,有就跑它,没有就停在 REPL 等你敲命令。

三、三个必认的模块

machine(硬件总入口):

from machine import Pin, PWM, ADC, UART, Timer
# Pin 管数字输入输出、PWM 管脉宽调制、ADC 管模拟输入
# UART 管串口、Timer 管定时器 —— 9-4 全都要用

time(时间):

import time
time.sleep(1)        # 睡 1 秒(和第六章一样)
time.sleep_ms(100)   # 睡 100 毫秒 —— 单片机世界的常用粒度
time.ticks_ms()      # 开机以来的毫秒数(对照 Arduino 的 millis())

rp2(本机专属):Pico 芯片那套【可编程 I/O 状态机】(PIO)的入口——用一小段汇编让硬件自己生成波形,是 Pico 的独门绝技。本课只点名认识,进阶时再回来。

四、代码的三种存在形态

MicroPython 的代码可以有三种活法,后面两节都会用到:

  1. REPL 里直接敲——一行一行算,适合试探硬件(【这根针有没有反应】这种问题)
  2. 临时脚本——Thonny 里写好按运行,跑一次;断电即忘(只存在于运行中)
  3. main.py——存进板子 Flash 的这个文件名是魔法名:每次通电自动执行。想让项目脱离电脑独立运行,就把它存成 main.py

对照 8-3:Arduino 的【上传】是把编译好的机器码替换芯片里的程序;MicroPython 的【保存 main.py】只是往小文件系统里放了一个文本文件,解释器每次开机读它。前者是换程序,后者是换数据——所以 MicroPython 改代码不需要【编译】这一步。

五、阻塞模型:单线程 + 睡眠

第六章的程序从头跑到尾就结束;MicroPython 的 main.py 从头跑到尾也不该结束——结束就等于【程序退出了,芯片停在 REPL 等人】。所以硬件项目的标准骨架是:

import time
from machine import Pin

led = Pin(25, Pin.OUT)
while True:          # 和 Arduino 的 loop() 是同一个思想
    led.on()
    time.sleep(0.5)
    led.off()
    time.sleep(0.5)

time.sleep 是阻塞式的:睡着的那 0.5 秒里芯片什么都不做。要【同时】做两件事,要么轮询 ticks_ms()(8-5 的 millis() 思路原样可用),要么用 Timer/中断——进阶内容,先记住【没有 while True 的硬件程序多半是写错了】。

六、动手 Demo:在 REPL 里试三件事

固件怎么刷、Thonny 怎么连是下一节的内容;如果你还没刷过固件,先看 9-3 做完前两步再回来,不影响理解。

连上 REPL 后(提示符 >>>),依次敲:

>>> 2 ** 10
1024
>>> 1 / 2
0.5
>>> import sys
>>> sys.platform
'rp2'
>>> import machine
>>> dir(machine)
['__name__', 'Pin', 'PWM', 'ADC', 'UART', 'Timer', 'I2C', 'SPI', ...]

看到什么算成功:sys.platform 打出 rp2(RP2 = 这块芯片家族的代号),dir(machine) 列出一堆硬件类名。

读结果:

七、30 秒实验:探一探内存

在 REPL 里敲:

>>> import gc
>>> gc.mem_free()

你会看到一个十几万级的数字(单位字节)——这就是还剩多少 SRAM。对照:第六章在树莓派上你从没操心过内存,在这里一个几百 KB 的列表就能把芯片吃撑。这就是【内存以 KB 计】的直观感受,也解释了为什么 MicroPython 要砍掉那么多标准库。

八、常见误区

  1. 【MicroPython 是简化版,语法和 Python 不一样】 —— 语法几乎完全一样(第六章原样可用);不一样的是库和运行环境(没有 pip、标准库精简、多了 machine)。
  2. 【能 pip install 装库】 —— 没有 pip。库要么固件自带(如 machine),要么把 .py 源文件拷进板子(Thonny 里另存到板子即可)。
  3. 【脚本跑完程序就结束了很正常】 —— 硬件程序的正形是 while True 常驻;跑完就退出意味着芯片闲下来了,多半是忘了循环。
  4. 【REPL 断了=板子坏了】 —— REPL 只是【有人连着它】,拔掉 USB 板子照常按 main.py 独立运行;再插上又能连。
自测三问(点开对答案) 1. MicroPython 和电脑版 Python 语法上的差别大吗?差别主要在哪? 2. `main.py` 有什么特殊之处? 3. 想让一段代码【每隔 100 毫秒做一次】,用什么睡眠函数最合适? **参考答案** 1. **不大,语法几乎一致**;差别在运行环境——没有操作系统、没有 pip、标准库精简、内存 KB 级、多一个管硬件的 `machine` 模块。 2. **它是开机自动执行的魔法文件名**——存在板子 Flash 里,每次通电解释器先跑它;相当于 Arduino 的【烧进芯片的程序】的数据版。 3. **`time.sleep_ms(100)`**——单片机世界毫秒级是常用粒度,`sleep(0.1)` 也行但语义不如前者直白。

相关笔记