NodeMCU 是基于 Espressif 的 ESP8266 WiFi SOC 的 eLua 固件,固件基于 Espressif NON-OS SDK,并使用基于 spiffs 的文件系统。SDK 代码库由 98.1% 的 C 语言代码和少量的 Lua 嵌入式代码组成。NodeMCU 固件是和流行的 NodeMCU dev kits 相配套的项目,现成的开源开发板使用 ESP8266-12E 芯片制作。本文记录了在 Linux 平台下对 NodeMCU 的入门学习。
NodeMCU - Arduino-like hardware IO,Nodejs style network API,Lowest cost WI-FI.
1. 构建 NodeMCU 固件
1.1 完整版固件
https://github.com/nodemcu/nodemcu-firmware/releases/
1.2 自定义固件
https://nodemcu-build.com/
2. 烧写 NodeMCU 固件
2.1 安装烧录工具 esptool.py
# 安装 esptool.py $ sudo apt install git python3 python3-pip python3-setuptools $ pip3 install esptool # esptool.py 使用方法 $ esptool.py -h usage: esptool [-h] [--chip {auto,esp8266,esp32}] [--port PORT] [--baud BAUD] [--before {default_reset,no_reset}] [--after {hard_reset,soft_reset,no_reset}] [--no-stub] {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version}
2.2 烧录固件
参考链接:http://nodemcu.readthedocs.io/en/dev/en/flash/
用法:
$ esptool.py --port <serial-port-of-ESP8266> --baud <baud> write_flash --flash_mode <mode> 0x00000 <nodemcu-firmware>.bin
说明(下同):
<serial-port-of-ESP8266>
为设备的串口号,在不同系统下名字有些差异,在 Linux 下为/dev/ttyUSBn
,在 Mac OS X 下为/dev/cu.SLAB_USBtoUART
和/dev/tty.SLAB_USBtoUART
,Windows 下为COMn
。<baud>
默认的通信波特率为 115200bps,为了加速烧写速度可以指定波特率为 921600。<mode>
为qio
时用于 512 KiB 的模块,>= 4 MiB 的模块用dio
(qio
可能也可以工作,YMMV)。
示例:
$ sudo esptool.py -p /dev/ttyUSB0 write_flash -fm dio 0x00000 nodemcu-master-20-modules-2017-05-05-08-29-27-float.bin
如果不想保留固件中原有的各类 Lua 程序,可以在启动后格式化文件系统 file.format()
,也可以在烧录前刷掉整个固件
$ sudo esptool.py --port <serial-port-of-ESP8266> erase_flash
3. 调试工具
3.1 串口调试
工具1:miniterm.py(该工具是 pyserial 的一部分,在安装 esptool 时会安装 pyserial)
$ miniterm.py /dev/ttyUSB0 74880
工具2:MiniCOM
安装软件:$ sudo apt install minicom
设置串口:$ sudo minicom -s
打开串口:$ minicom -D <serial-port-of-ESP8266>
基本操作:如果上面设置顺利,按开发板上的 Reset 键复位,此时窗口里就有信息打印出来了。功能设置需要先按组合键 Ctrl + A 进入设置状态,再按其它键。
Z 键:打开帮助菜单;
S 键:发送文件到目标系统中;
W 键:自动滚屏。当显示的内容超过一行之后,自动将后面的内容换行。这个功能在查看内核的启动信息时很有用;
C 键:清除屏幕的显示内容;
B 键:浏览 minicom 的历史显示;
X 键:退出 minicom ,会提示确认退出。
操作示例:
> print('Hello World!') Hello World! > file.open(init.lua', 'w') > file.writeline('dofile("test.lua")') > file.close() > node.restart() > file.open('init.lua', 'r') > print(file.readline()) dofile("test.lua") > file.close()
3.2 上传工具 luatool.py
安装:
$ sudo apt install python python-serial $ git clone https://github.com/4refr0nt/luatool.git $ cd luatool/luatool/
用法:
$ sudo ./luatool.py --port <serial-port-of-ESP8266> --baud <band> --src init.lua --dest init.lua --restart --verbose
示例:
$ sudo ./luatool.py -p /dev/ttyUSB0 -b 9600 -f init.lua -r -v
3.3 图形化开发工具 ESPlorer
到 https://esp8266.ru/esplorer/#download 下载最新版 ESPlorer(配置好 JDK 才能运行,可以参考 https://www.lanseyujie.com/post/deepin-optimization-techniques.html#7 )
$ java -jar "ESPlorer/ESPlorer.jar"
4. 初始化程序
在 ESP8266 上创建 init.lua,它会在启动后自动执行,类似 Linux 上的 init 程序。
当 Lua 脚本出错时可能导致系统不停地重启,可以设置拉高 GPIO 2 电平来格式化文件系统。
if gpio.read(2) == 1 then file.format() else dofile('test.lua') end
5. 引脚图
6. 自动连接 Wi-Fi
print('Setting up WIFI...') wifi.setmode(wifi.STATION) -- 设置基站模式 wifi.sta.config('SSID', 'PASSPHRASE') -- 设置 Wi-Fi 的 SSID 和 KEY wifi.sta.autoconnect(1) -- 设置自动连接 tmr.alarm(1, 3000, tmr.ALARM_AUTO, function() -- tmr.alarm([timer_id/ref], interval_ms, mode, func()) if wifi.sta.getip() == nil then print('Waiting for IP ...') else print('IP is ' .. wifi.sta.getip()) tmr.stop(1) end end)
7. 终端用户设置
参考链接:http://nodemcu.readthedocs.io/en/master/en/modules/enduser-setup/
连接热点 NodeMCU 后浏览器访问 http://192.168.4.1 打开配置页面。
wifi.setmode(wifi.STATIONAP) wifi.ap.config({ssid="NodeMCU", auth=wifi.OPEN}) print("AP MAC:" .. wifi.ap.getmac()) enduser_setup.manual(true) enduser_setup.start( function() print("Connected to wifi as:" .. wifi.sta.getip()) print("STA MAC:" .. wifi.sta.getmac()) end, function(err, str) print("Enduser Setup Error #" .. err .. ": " .. str) end );
DOCS:http://nodemcu.readthedocs.io/en/master/en/
未完待续...