NodeMCU 开发板刷入 MicroPython 固件并通过 Atom 进行编程

MicroPython 是对 Python 3 语言的一种精简的实现,主要是为了在微控制器这种硬件资源受限的环境中可以高效地运行,因此做了很多针对性的优化。
它类似于一个小型的 Python 操作系统,可以通过串口与内置的 Python 解释器直接交互,也可以上传程序文件在开机上电后自动运行。
MicroPython 支持多种开发板,包括价格很实惠的基于 ESP8266 芯片的 NodeMCU

一、刷入固件

我这里使用的开发板是从网上购买的 NodeMCU ,出厂时预先刷好了基于 Lua 语言编程的固件。
为了使用 MicroPython ,需要先对该开发板重新刷写固件。
NodeMCU

1. 准备工作

首先进入 MicroPython 官方的下载页面,下载最新版的针对 ESP8266 硬件的固件包。
我这里使用的是 esp8266-20180511-v1.9.4.bin

刷写软件可以使用支持多种操作系统的命令行工具 esptool。对于已经装好 Python 环境的电脑,直接使用 pip 命令安装即可:
pip install esptool

2. 刷入固件

首先将 NodeMCU 开发板连接至电脑,Mac 系统可以使用 ls /dev/tty.usbserial* 命令查看当前系统已经检测到的 USB 串口:

1
2
$ ls /dev/tty.usbserial*
/dev/tty.usbserial-14110

使用 esptool.py -p <SerialPort> flash_id 命令确认该串口是否能成功检测到 ESP8266 设备:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$  esptool.py -p /dev/tty.usbserial-14110 flash_id
esptool.py v2.5.1
Serial port /dev/tty.usbserial-14110
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 2c:3a:e8:06:aa:7e
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

使用 esptool.py -p <SerialPort> erase_flash 命令对开发板进行擦除操作(以防万一):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$  esptool.py -p /dev/tty.usbserial-14110 erase_flash
esptool.py v2.5.1
Serial port /dev/tty.usbserial-14110
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 2c:3a:e8:06:aa:7e
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 2.5s
Hard resetting via RTS pin...

擦除完成后即可使用 esptool 工具的 write_flash 命令将 MicroPython 固件刷入开发板。
(完整命令为:esptool.py -p <SerialPort> --baud 460800 write_flash --flash_size=detect -fm dio 0 <FirmwareFile>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ esptool.py -p /dev/tty.usbserial-14110 --baud 460800 write_flash --flash_size=detect -fm dio 0  ~/Downloads/esp8266-20180511-v1.9.4.bin
esptool.py v2.5.1
Serial port /dev/tty.usbserial-14110
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 2c:3a:e8:06:aa:7e
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0240
Compressed 604872 bytes to 394893...
Wrote 604872 bytes (394893 compressed) at 0x00000000 in 9.9 seconds (effective 490.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

二、固件测试

刷写固件的操作完成后,可以使用 Mac 系统自带的串口调试工具 cu 连接 USB 串口,对刚刷好的开发版进行测试:
sudo cu -l <SerialPort> -s <BaudRateSpeed>
效果如下:

1
2
$ sudo cu -l /dev/tty.usbserial-14110 -s 115200
Connected.

终端窗口提示 Connected 之后,按下 NodeMCU 板子上的 RST (Reset) 按钮。
如固件刷写成功,则终端在输出部分乱码后会立即进入 Python 解释器界面:

1
2
3
MicroPython v1.9.4-8-ga9a3caad0 on 2018-05-11; ESP module with ESP8266
Type "help()" for more information.
>>>

在解释器界面下,输入 help() 命令获取基本的帮助信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
MicroPython v1.9.4-8-ga9a3caad0 on 2018-05-11; ESP module with ESP8266
Type "help()" for more information.
>>> help()
Welcome to MicroPython!

For online docs please visit http://docs.micropython.org/en/latest/esp8266/ .
For diagnostic information to include in bug reports execute 'import port_diag'.

Basic WiFi configuration:

import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan() # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected() # Check for successful connection
# Change name/password of ESP8266's AP:
ap_if = network.WLAN(network.AP_IF)
ap_if.config(essid="<AP_NAME>", authmode=network.AUTH_WPA_WPA2_PSK, password="<password>")

Control commands:
CTRL-A -- on a blank line, enter raw REPL mode
CTRL-B -- on a blank line, enter normal REPL mode
CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, do a soft reset of the board
CTRL-E -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
>>>

更多的交互命令和详细的指导手册可以参考官方文档

使用如下的命令,能够让 GPIO2 上连接的 LED(即 ESP8266 模块内置的蓝色 LED)以 1s 的频率闪烁:

1
2
3
4
5
6
7
8
9
10
11
>>> from machine import Pin
>>> import time
>>> p=Pin(2,Pin.OUT)
>>> while True:
... p.on()
... time.sleep(1)
... p.off()
... time.sleep(1)
...
...
...

三、配置 Atom 编程环境

当前可以使用多种软件作为简单的 IDE 对 MicroPython 开发板进行编程。主要是提供连接串口的终端,可以交互地执行 Python 命令,以及程序文件的上传和下载。

我个人比较喜欢 Atom 编辑器搭配上 pymakr-atom 插件。
Atom

Atom 的配置较简单,主要步骤如下:

  • 从 Atom 官网下载对应系统版本的安装程序并安装
  • 通过 Atom 内置的插件管理器搜索安装 pymakr 插件,安装完成后重启编辑器
  • 编辑器重启后底部自动出现 pymakr 的终端窗口,点击终端右上角设置 - 全局设置,找到设备地址并改为开发板连接的端口号
  • 直接点击终端顶部的连接按钮即可完成串口连接

此时的 Atom 编辑器,可以通过底部的终端窗口直接输入 Python 命令。
也可以在编辑器中新建项目目录,并创建 main.py 源文件。编辑好 Python 代码后,点击执行按钮即可直接运行,或者点击上传按钮将代码文件上传至开发板。

参考资料

MicroPython documentation