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 3 语法:
if/for/def/f-string/列表推导——第六章学的都算数 - 跑在芯片上:没有 Linux、没有进程调度,你的脚本就是【全部的世界】
machine模块:管引脚、PWM、ADC、串口的入口——这是和【电脑版 Python】最大的新增面
二、和电脑版 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 的代码可以有三种活法,后面两节都会用到:
- REPL 里直接敲——一行一行算,适合试探硬件(【这根针有没有反应】这种问题)
- 临时脚本——Thonny 里写好按运行,跑一次;断电即忘(只存在于运行中)
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) 列出一堆硬件类名。
读结果:
2 ** 10得1024——幂运算符**在这里照常工作(第六章 6-3 学的)1 / 2得0.5——真除法返回小数,和电脑版 Python 一致(对照 C++ 的 int 除法)sys.platform是'rp2'——证明这段代码跑在 Pico 芯片上,不是树莓派的 Linuxdir(machine)能看到Pin/PWM/ADC——9-4 要用的三件兵器全部在列
七、30 秒实验:探一探内存
在 REPL 里敲:
>>> import gc
>>> gc.mem_free()
你会看到一个十几万级的数字(单位字节)——这就是还剩多少 SRAM。对照:第六章在树莓派上你从没操心过内存,在这里一个几百 KB 的列表就能把芯片吃撑。这就是【内存以 KB 计】的直观感受,也解释了为什么 MicroPython 要砍掉那么多标准库。
八、常见误区
- 【MicroPython 是简化版,语法和 Python 不一样】 —— 语法几乎完全一样(第六章原样可用);不一样的是库和运行环境(没有 pip、标准库精简、多了
machine)。 - 【能 pip install 装库】 —— 没有 pip。库要么固件自带(如
machine),要么把 .py 源文件拷进板子(Thonny 里另存到板子即可)。 - 【脚本跑完程序就结束了很正常】 —— 硬件程序的正形是
while True常驻;跑完就退出意味着芯片闲下来了,多半是忘了循环。 - 【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)` 也行但语义不如前者直白。- ☐ 下一节(9-3 使用 Thonny 建立 MicroPython 程序)
相关笔记
- 认识 Python 语言 —— 本节的语法基础全部来自第六章,忘了就回去翻
- Python 函数与模块 —— 【模块是什么】的出处;MicroPython 连 pip 都没有,装库方式更原始
- 使用 Arduino IDE 建立 Arduino 程序 —— 【编译烧录 vs 解释执行】的对照面
- 认识 Raspberry Pi Pico 开发板 —— 上一节:
machine模块管的那些硬件长什么样 - 🍓 树莓派 · 索引 —— 全课路线图