NodeMCU 物聯網開發快速上手
來源 http://tinylab.org/nodemcu-kickstart/
By Falcon of TinyLab.org 2015-12-20 19:25:59
1 NodeMCU 簡介
NodeMCU 是一款開源的物聯網開發平台,其固件和開發板均開源,自帶 WIFI 模塊。基於該平台,用幾行簡單的 Lua 腳本就能開發物聯網應用。
其主要特點如下:
-
像 Arduino 一樣操作硬件 IO 提供硬件的高級接口,可以將應用開發者從繁復的硬件配置、寄存器操作中解放出來。用交互式 Lua 腳本,像 Arduino 一樣編寫硬件代碼!
-
用 Nodejs 類似語法寫網絡應用 事件驅動型 API 極大的方便了用戶進行網絡應用開發,使用類似 Nodejs 的方式編寫網絡代碼,並運行於
5mm*5mm
大小的 MCU 之上,加快您的物聯網開發進度。 -
超低成本的 WIFI 模塊 用於快速原型的開發板,集成了售價低於 10 人民幣 WIFI 芯片 ESP8266,為您提供性價比最高的物聯網應用開發平台。
基於樂鑫 ESP8266 的 NodeMCU 開發板,具有 GPIO、PWM、I2C、1-Wire、ADC 等功能,結合 NodeMCU 固件為您的原型開發提供最快速的途徑。
NodeMCU 最新版為 1.0,如下圖:
其硬件詳細配置如下:
- 核心模組為 ESP8266
- MCU 為 Xtensa L106
- RAM 50K
- Flash 512K
- D1~D10:10 GPIO, 每個都能配置為 PWM, I2C, 1-wire
- FCC 認證的 WIFI 模塊,內置 PCB 天線,可作為 AP
- CP2102 USB 串口,即插即用(官方驅動支持 Windows, OS X,Linux 以及 VMware)
該平台自 2014 年問世以來,就受到廣大物聯網開發者喜愛。雖然該平台有上述諸多特性,但是文檔方面還是有所欠缺,所以泰曉科技計划跟 NodeMCU 合作,逐步推出一系列文章,介紹該平台的開發環境搭建、SDK 使用、硬件 DIY 精品案例分享等,從而讓更多的開發者快速上手和使用該平台。
作為整個系列的第一篇,咱們主要介紹各平台開發環境搭建,SDK 基本使用和簡單案例展示等。
在具體展開之前,大家可以從參考資料瀏覽下該平台的一些基本資源,在下文基本都會介紹到。
2 購買 NodeMCU
泰曉為 NodeMCU 的國內代理,購買地址為:泰曉開源小店。
如果需要周邊配件,可以從 NodeMCU 官方淘寶店 購買。
3 選擇開發系統
NodeMCU 目前支持的開發主機系統類型涵蓋 Windows,Linux 和 Mac OS X,也支持通過 VMware 虛擬機搭建的 Linux 環境。
需要提到的是,如果用虛擬機的話,請優先用 VMware 而不是 VirtualBox。雖然用 VirtualBox 也能夠通過串口虛擬化 進行 Lua 開發,但是由於 VirtualBox 無法虛擬 uhci 的 cp210x,所以 VirtualBox 中的 Linux 上就無法直接燒錄固件,會很不方便。
下面是我們推薦的優選開發環境:
- 純 Linux(首推 Lubuntu)
- 在 Mac OS X 上安裝 VMware,在 VMware 中運行 Linux(首推 Lubuntu)
- 在 Windows 上安裝 VMware,在 VMware 中運行 Linux(首推 Lubuntu)
本文主要介紹上述三種,實際上核心還是 Linux 開發環境,后面兩個只要額外安裝 VMware 並在主機上也安裝上 USB 串口驅動即可。
如果大家手頭沒有 Linux 環境,那么建議通過 VMware 來安裝 Linux,這樣更安全可靠,避免搞壞原來的系統。
VMware 可以從官方下載,安裝好以后再從 Ubuntu 官方下載 Lubuntu 14.04 ISO,之后啟動 VMware 來安裝 Lubuntu。安裝時先創建/Add 一個 Lubuntu(Create a custom virtual machine -> Linux -> Ubuntu 64bit),之后通過設置/Settings 選擇 Startup Disk 從 CD/DVD 啟動安裝,選擇剛下載的 ISO,安裝成功后,再通過 Startup Disk 選回從 Hard Disk(SCSI) 啟動即可。
至於純 Windows 或者純 Mac OS X 環境,都不推薦,因為在 Linux 下,一條命令就可以安裝所需的大部分工具,而在 Windows 和 Mac OS X 會浪費掉大量的時間去不同地方找不同工具,然后再花費更多倍的時間去解決各類軟件編譯和安裝問題,事倍功半。而且 OS X 對於基本的開發環境,往往還存在收費服務,實在是不友好,珍惜生命,遠離它們!
但是如果真地厚愛它們,大家還是可以通過參考后續資料,尤其是 Noduino/Noduino SDK 相關部分,很詳細地介紹到了 Windows 和 Mac OS X 的開發環境,另外,參考資料中的其他軟件或者工具基本都有提供 README.md 對各自的安裝做了說明,請予以參考。
4 安裝串口驅動
在選定開發系統后,接下來就是要安裝串口驅動,打通開發主機與 NodeMCU 板子的通信,以便燒錄固件、執行命令或者上傳 Lua 程序。
因為 NodeMCU 1.0 采用了 cp2102 USB 串口,其驅動完美支持 Windows,Linux,OS X 和 VMWare,所以各個平台下載 CP210x 安裝上即可。
對於 VMware + Linux,除了在開發主機上安裝好串口驅動外,需要在插入 USB 串口以后,根據提示,允許 VMware 控制該 USB 串口,也可以通過設置/Settings 的 USB & Bluetooth
來進行設置。
安裝好再確認下串口驅動是否正常加載:
$ dmesg
[13784.667753] usb 2-2.2: new full-speed USB device number 8 using uhci_hcd
[13784.775474] usb 2-2.2: New USB device found, idVendor=10c4, idProduct=ea60
[13784.775477] usb 2-2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[13784.775479] usb 2-2.2: Product: CP2102 USB to UART Bridge Controller
[13784.775481] usb 2-2.2: Manufacturer: Silicon Labs
[13784.775482] usb 2-2.2: SerialNumber: 0001
[13784.935711] cp210x 2-2.2:1.0: cp210x converter detected
[13785.019977] usb 2-2.2: reset full-speed USB device number 8 using uhci_hcd
[13785.225496] usb 2-2.2: cp210x converter now attached to ttyUSB0
$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 12月 21 21:55 /dev/ttyUSB0
接着需要安裝一個串口通信工具,在 Linux 下推薦 minicom。
$ sudo apt-get install minicom
使用 minicom 之前,需要明確 NodeMCU 1.0 的串口屬性。
NodeMCU 1.0 的啟動時波特率為 74880,但是啟動后就切到了 9600,如果直接用 9600,則開頭會看到一串亂碼之后恢復正常。而刷固件時可以通過 esptool 自己設置波特率,NodeMCU 1.0 那邊會根據用戶設置自動配置波特率,比如說設置成 115200,921600 都可以。
串口設備在不同系統下名字有些差異,在 Linux 下為 /dev/ttyUSBn
,在 Mac OS X 下為 /dev/cu.SLAB_USBtoUART
和 /dev/tty.SLAB_USBtoUART
,Windows 下為 COMn
。
其他配置為常見的:8N1
,即 Bits:8;Parity:None;Stop Bits:1。另外,Hardware Flow Control 和 Software Flow Control 均為 No。
5 下載並燒錄最新固件
從 NodeMCU Firmware Release 下載最新固件,以 float 為例(注:integer 不支持 float,但節省了 11 KB):
$ wget -c https://github.com/nodemcu/nodemcu-firmware/releases/download/0.9.6-dev_20150704/nodemcu_float_0.9.6-dev_20150704.bin
接着咱們把燒錄工具 esptool.py 下載下來。同時安裝其他必要工具。
$ sudo apt-get install git python python-serial python-setuptools
$ git clone https://github.com/themadinventor/esptool.git
$ cd esptool
$ python setup.py install
在燒錄固件之前需要通過如下操作進入 NodeMCU 的固件燒錄模式:
- 按住 FLASH 按鍵(這里不松開)
- 按下 RST 按鍵並松開
- 松開 FLASH 按鍵
接着通過 esptool.py 燒錄固件:
$ sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 nodemcu_float_0.9.6-dev_20150704.bin
燒錄完以后記得按下 RST 重啟進入新固件。
esptool.py 燒寫時默認的通信波特率為 115200,為了加速燒寫速度,可以通過 --baud 921600
設置為 921600。
需要提到的是,如果不想保留固件中原有的各類 Lua 程序,可以在啟動后格式化文件系統(file.format()
,見后文),也可以在燒錄前刷掉整個固件:
$ sudo esptool.py --port /dev/ttyUSB0 erase_flash
當文件系統被破壞或者某個 Lua 程序出錯以后導致系統不斷重啟時,擦除整個 Flash 幾乎是必要的(實際也可以擦除文件系統所在的區塊或者重寫該區塊),當然,還有一些另類的辦法,后面會補充。
6 基本操作演示
燒錄完以后按下 RST 按鈕重啟 NodeMCU,再啟動 minicom 就可以進入 Lua 交互式命令行:
$ minicom -D /dev/ttyUSB0
> print('Hello, NodeMCU 1.0')
Hello, NodeMCU 1.0
> gpio.mode(0, gpio.OUTPUT)
> gpio.write(0, gpio.LOW)
> gpio.write(0, gpio.HIGH)
> file.format()
> node.restart()
上面幾條命令分別完成:
- 打印了一串字符串
- 開/關了靠近 USB 口的 LED(靠近 Wifi 模塊的 LED 的 pin 為 4)
- 格式化文件系統
- 最后重啟了 NodeMCU
如果嫌不夠酷,可以參考 NodeMCU API 手冊 可以做更多有趣的操作。
接下來,創建一個初始化程序:init.lua
,它在 NodeMCU 啟動后自動執行。
咱們通過該程序在 NodeMCU 啟動后立即點亮 LED:
> file.open('init.lua','w')
> file.writeline('gpio.mode(0,gpio.OUTPUT)')
> file.writeline('gpio.write(0,gpio.LOW)')
> file.close()
> node.restart()
init.lua
是 NodeMCU 啟動時默認執行的第一個程序,有點類似 Linux 上的 init 程序。通過它還可以加載其他程序來完成特定的功能。
咱們再做一個復雜一點的操作,在 init.lua
里頭調用(dofile)一個 user.lua
來點亮 LED:
> file.open('init.lua','w')
> file.writeline('dofile("user.lua")')
> file.close()
> file.open('user.lua','w')
> file.writeline('gpio.mode(0,gpio.OUTPUT)')
> file.writeline('gpio.write(0,gpio.LOW)')
> file.close()
> node.restart()
讀出 init.lua
看下效果:
> file.open('init.lua','r')
> print(file.readline())
dofile("user.lua")
> file.close()
當 user.lua
腳本出錯時可能導致系統不停地重啟,這個時候除了擦除整個 Flash 外,還可以通過 init.lua
做個簡單的容錯處理:
if gpio.read(2) == 1:
file.format()
else
dofile('user.lua')
end
一旦系統出錯,只要拉高 GPIO 2 就可以格式化文件系統。
暫時先到這里吧,后面會逐步介紹更多實例。
7 上傳 Lua 程序
上面演示的是命令行操作,這里再介紹如何把在主機端寫好的 Lua 程序上傳到 NodeMCU 上。
測試過兩個工具都可以用來上傳 Lua 程序,分別是:
- luatool.py:可用於命令行傳送 Lua 腳本,無須復雜的圖形化工具支持,同時支持通過串口和 Telnet 上傳
- nodemcu.py:除了不支持通過 Telnet 上傳外,基本功能同 luatool,只是操作方式稍有差異
下載上述工具:
$ git clone https://github.com/4refr0nt/luatool.git
$ git clone https://github.com/md5crypt/nodemcu.py.git
兩個都可以進行文件傳輸,第二個還可以作為串口終端,兩個都依賴 pySerial,第二個還需要安裝 clipboard:
$ easy_install clipboard
在上傳前咱們寫一個簡單的 init.lua
腳本,該腳本用於點亮另外一個 LED:
print('Hello, NodeMCU 1.0')
gpio.mode(4, gpio.OUTPUT)
gpio.write(4, gpio.LOW)
7.1 luatool.py
通過 luatool.py
傳送,傳送完立馬重啟:
$ cd luatool/luatool/
$ sudo ./luatool.py -p /dev/ttyUSB0 -b 9600 -f init.lua -r
查看幫助,可以看到更多用法:
$ sudo ./luatool.py -h
Usage: luatool.py [-h] [-p PORT] [-b BAUD] [-f SRC] [-t DEST] [-c] [-r] [-d]
[-v] [-a] [-l] [-w] [-i] [--delete DELETE] [--ip IP]
ESP8266 Lua script uploader.
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT Device name, default /dev/ttyUSB0
-b BAUD, --baud BAUD Baudrate, default 9600
-f SRC, --src SRC Source file on computer, default main.lua
-t DEST, --dest DEST Destination file on MCU, default to source file name
-c, --compile Compile lua to lc after upload
-r, --restart Restart MCU after upload
-d, --dofile Run the Lua script after upload
-v, --verbose Show progress messages.
-a, --append Append source file to destination file.
-l, --list List files on device
-w, --wipe Delete all lua/lc files on device.
-i, --id Query the modules chip id.
--delete DELETE Delete a lua/lc file from device.
--ip IP Connect to a telnet server on the device (--ip
IP[:port])
7.2 nodemcu.py
通過 nodemcu.py
上傳:
$ cd nodemcu.py/
$ python ./nodemcu.py /dev/ttyUSB0 9600
> :file init.lua init.lua
> node.restart()
查看幫助,更多用法:
> :help
:help
:uart [boudrate] - dynamic boudrate change
:load src - evaluate file content
:file dst src - write local file src to dst
:paste [file] - evaluate clipboard content
or write it to file if given
:cross-compile dst [file] - compile file or clipboard using
luac-cross and save to dst
:execute [file] - cross-compile and execute clipboard or
file content without saving to flash
:soft-compile dst [file] - compile file or clipboard on device
and save do dst. This call should handle
lager files than file.compile
8 Lua 程序示例
這里僅僅展示幾則基本的 Lua 程序,方便大家快速上手。更多例子請參考 NodeMCU Firmware 下的 Lua examples:
也可以在后面下載的 nodemcu-firmware/examples,nodemcu-firmware/lua_examples 找到這些例子:
8.1 啟動后不斷閃爍 LED
上面其實已經演示了 LED 的基本操作,這里再介紹一個 timer module 的 API:tmr.alarm():
tmr.alarm(id, interval, repeat, function do())
id: 0~6, alarmer id. Interval: alarm time, unit: millisecond repeat: 0 - one time alarm, 1 - repeat function do(): callback function for alarm timed out
咱們基於它實現一個 blink.lua
:
print('Blink Demo')
lighton=0
led=0
gpio.write(led, gpio.HIGH)
tmr.alarm(0,1000,1,function()
if lighton==0 then
lighton=1
gpio.mode(led, gpio.OUTPUT)
gpio.write(led, gpio.LOW)
else
lighton=0
gpio.write(led, gpio.HIGH)
end
end)
gpio.mode(led, gpio.INPUT)
上傳 blink.lua
並立即執行:
$ sudo ./luatool.py -p /dev/ttyUSB0 -b 9600 -f blink.lua -d
8.2 遠程控制 LED 閃爍
對於物聯網來講,遠程控制很關鍵。咱們這里演示如何通過 Wifi 開啟一個服務端口 8888 用於控制 LED,remote_led.lua
:
-- 開啟 Wifi 並獲得 NodeMCU IP 地址
-- ssid 和 pwd 分別為自家路由器的 SSID 和訪問密碼
local ssid="SSID"
local pwd="password"
ip=wifi.sta.getip()
print(ip)
if not ip then
wifi.setmode(wifi.STATION)
wifi.sta.config(ssid,pwd)
print(wifi.sta.getip())
end
-- 開啟一個 8888 的端口
-- 並通過 node.input() 調用 Lua 解釋器控制 LED
srv=net.createServer(net.TCP)
srv:listen(8888,function(conn)
conn:on("receive",function(conn,payload)
node.input("gpio.mode(0, gpio.OUTPUT)")
node.input("gpio.write(0, gpio.LOW)")
end)
end)
上傳 Lua 程序到服務器執行:
$ sudo ./luatool.py -p /dev/ttyUSB0 -b 9600 -f remote_led.lua -d
查看 NodeMCU 獲取的 IP 地址:
$ sudo minicom -D /dev/ttyUSB0
> print(wifi.sta.getip())
192.168.0.104 255.255.255.0 192.168.0.1
並測試:
$ sudo apt-get install lynx
$ lynx 192.168.0.104:8888
8.3 開啟一個 Telnet 服務
先從 NodeMCU.com 下載該例子,telnetd.lua
:
-- a simple telnet server
s=net.createServer(net.TCP,180)
s:listen(2323,function(c)
function s_output(str)
if(c~=nil)
then c:send(str)
end
end
node.output(s_output, 0)
-- re-direct output to function s_ouput.
c:on("receive",function(c,l)
node.input(l)
--like pcall(loadstring(l)), support multiple separate lines
end)
c:on("disconnection",function(c)
node.output(nil)
--unregist redirect output function, output goes to serial
end)
print("Welcome to NodeMCU world.")
end)
上傳並執行:
$ sudo ./luatool.py -p /dev/ttyUSB1 -b 9600 -f telnetd.lua -d
通過 telnet 連接:
$ sudo apt-get install telnet
$ telnet 192.168.0.104 2323
Trying 192.168.0.104...
Connected to 192.168.0.104.
Escape character is '^]'.
Welcome to NodeMCU world.
> print('Hello, NodeMCU Telnet')
Hello, NodeMCU Telnet
>
有了 telnet 服務,咱就可以不依賴串口而是直接通過 Wifi 上傳 Lua 腳本了:
$ cat test.lua
print('Upload via telnet service')
$ sudo ./luatool.py --ip 192.168.0.104:2323 -f test.lua -d -v
9 下載編譯工具鏈
社區已經有編譯好的工具鏈並有同學已經打包到 github,下載、安裝和配置如下:
$ git clone https://github.com/icamgo/xtensa-toolchain.git
$ cd xtensa-toolchain && ./gen.py
$ echo "export PATH=$PWD/xtensa-lx106-elf/bin:$PWD/bin:\$PATH" >> ~/.bashrc
$ . ~/.bashrc
之后就可以使用 xtensa-lx106-elf-gcc
編譯器了。
10 編譯 NodeMCU Firmware
10.1 采用泰曉科技的倉庫
NodeMCU 的官方倉庫,在使用預編譯的 Xtensa 工具鏈編譯時有很多問題。
泰曉科技對 Firmware 源碼進行一一修復后,就可以用上述預編譯的 Xtensa 工具鏈進行編譯和燒錄:
$ git clone https://github.com/tinyclub/nodemcu-firmware.git
$ make -j5
$ sudo make flash
如果串口地址不是默認的 /dev/ttyUSB0
,那么可以這樣配置:
$ sudo COMPORT=/dev/ttyUSB1 make flash
10.2 編譯 NodeMCU 官方源
如果一定要用官方源,詳細步驟如下:
在編譯 NodeMCU Firmware 時需要額外下載一個 xtensa 頭文件目錄以及一個 libhal 庫,否則編譯時會出現如下錯誤:
fatal error: xtensa/corebits.h: No such file or directory
xtensa-toolchain/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: cannot find -lhal collect2: error: ld returned 1 exit status
可以依次下載 NodeMCU Firmware,ESP8266_RTOS_SDK(含 xtensa 頭文件)以及 libhal.a:
$ git clone https://github.com/nodemcu/nodemcu-firmware.git
$ git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
$ wget -c https://github.com/esp8266/esp8266-wiki/raw/master/libs/libhal.a
然后把這些頭文件和庫放到正確的位置:
$ cp -r ESP8266_RTOS_SDK/extra_include/xtensa/ nodemcu-firmware/app/user/
$ cp libhal.a nodemcu-firmware/sdk/esp_iot_sdk_v1.4.0/lib/libhal.a
編譯:
$ cd nodemcu-firmware/
$ make
之后是燒錄,但是默認燒錄(make flash)后無法正常啟動,需要命令行中額外傳遞 -fm dio -fs 32m -ff 40m
參數:
$ sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 ./bin/0x00000.bin 0x10000 ./bin/0x10000.bin
執行上述命令前記得依次:按下 FLASH,按下 RST,松開 RST,松開 FLASH,以便進入燒錄模式。
10.3 制作單一文件的固件
NodeMCU 發布時是單一文件的固件,這個是怎么制作的呢?
實際上它是通過 .travis.yml
配置在線編譯服務:http://www.travis-ci.org/ 實現的,該服務可以作為 github 的插件配置並把編譯好的內容發布回 github。
在 .travis.yml
文件中,可以看到 srec_cat
命令,這個就是用來打包的:
$ cat .travis.yml | grep srec_cat
- srec_cat -output ${file_name_float} -binary 0x00000.bin -binary -fill 0xff 0x00000 0x10000 0x10000.bin -binary -offset 0x10000
- srec_cat -output ${file_name_integer} -binary 0x00000.bin -binary -fill 0xff 0x00000 0x10000 0x10000.bin -binary -offset 0x10000
上述兩條命令分別是用來打包支持 float 和僅支持 integer 的固件包,咱們可以自己用上述命令制作一個:
$ sudo apt-get install srecord
$ cd bin
$ srec_cat -output nodemcu_firmware.bin -binary 0x00000.bin -binary -fill 0xff 0x00000 0x10000 0x10000.bin -binary -offset 0x10000
編譯完的 nodemcu_firmware.bin 就跟從 NodeMCU 官方下載的一樣可以直接一條命令燒錄:
$ sudo esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 nodemcu_firmware.bin
10.4 精細配置
為了更精細地控制 NodeMCU 固件的大小,可以配置是否支持浮點,也可以配置所需的模塊。
上面看到有 float 和 integer 之分:
$ cat .travis.yml | grep EXTRA_
- make EXTRA_CCFLAGS="-DBUILD_DATE='\"'$BUILD_DATE'\"'" all
- make EXTRA_CCFLAGS="-DLUA_NUMBER_INTEGRAL -DBUILD_DATE='\"'$BUILD_DATE'\"'"
要編譯成僅支持 integer 可以在編譯時定義宏 LUA_NUMBER_INTEGRAL
或者在 app/include/user_config.h
打開如下定義:
#define LUA_NUMBER_INTEGRAL
上面默認是沒定義的,即默認編譯出來是支持 float 的,但是 integer 比 float 的固件小 11k 左右,可以節省一些空間來存放用戶的 Lua 程序。
另外,通過 app/include/user_modules.h
可以僅僅打開所需的模塊,例如要去掉 MQTT:
// #define LUA_USE_MODULES_MQTT
10.5 在線編譯
如果不想搭建編譯環境,也可以在線編譯。
-
https://travis-ci.org/ 如果需要修改代碼,可以用該方案。只需要把修改提交到自己的 github 倉庫,並通過 github 配置好
.travis.yml
即可。 -
http://nodemcu-build.com 該方案適合直接采用 NodeMCU 源,並且不做修改的情況,它提供了 Web 界面可以簡單方便地選擇所需模塊。
11 制作 Xtensa 交叉編譯器
雖然有現成的工具鏈可用,但是如果還是想浪費時間從頭編譯一套也無妨。
社區有開發一套 esp-open-sdk,集成了 crosstool-NG, gcc-xtensa, newlib-xtensa 和 lx106-hal 等工具,借助它可以自助編譯一套 Xtensa 工具鏈。
下載后的 README.md 針對各平台有較詳細的說明,咱們只介紹 Ubuntu 14.04 下如何編譯。由於編譯過程需要下載大量軟件包,編譯過程會相當慢,需要有足夠耐心。
$ sudo apt-get install make unrar autoconf automake libtool gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python python-serial sed git
$ git clone https://github.com/pfalcon/esp-open-sdk.git
$ cd esp-open-sdk
$ make
同樣配置好 PATH 環境變量后就可使用:
$ echo "export PATH=$PWD/xtensa-lx106-elf/bin:$PWD/esptool/:\$PATH" >> ~/.bashrc
$ . ~/.bashrc
12 使用 Noduino SDK
前面所有的內容都在介紹 NodeMCU 官方的 Lua SDK,其實 ESP8266 官方也有提供 SDK,第三方也有提供,這里再介紹一個基於 ESP8266 官方但是做了更好封裝的 Noduino SDK:
下載 Noduino SDK:
$ git clone git://github.com/icamgo/noduino-sdk.git
下載工具鏈(包括 esptool 和 xtensa-toolchain)和 ESP8266 官方的 RTOS SDK:
$ cd noduino-sdk
$ git submodule init
Submodule 'rtos/esp32' (git://github.com/espressif/esp32_rtos_sdk.git) registered for path 'rtos/esp32'
Submodule 'rtos/esp8266' (git://github.com/espressif/esp8266_rtos_sdk.git) registered for path 'rtos/esp8266'
Submodule 'toolchain' (git://github.com/icamgo/xtensa-toolchain.git) registered for path 'toolchain'
$ git submodule update
$ cd toolchain
$ ./gen.py
實例演示:
$ cd ../examples/noduino/blink/
$ make && make flash
13 使用 Arduino IDE
Noduino 封裝為了 Arduino IDE 可用的簡易包,不同於可獨立使用的 Noduino SDK,該包需要集成進 Arduino IDE 使用,這個對於習慣 Arduino 或者喜歡 IDE 環境的同學是福音。
先從 arduino.cc 下載並安裝 Arduino IDE,安裝后進入:
$ cd /PATH/TO/arduino
$ cd hardware
$ mkdir esp8266com
$ cd esp8266com
$ git clone git://github.com/icamgo/Noduino.git esp8266
# fetch the toolchain of esp8266
$ cd esp8266
$ git submodule init
$ git submodule update
$ cd tools/xtensa-toolchain
$ ./gen.py
之后啟動或者重啟 Arduino,在菜單 Tools 里頭選擇 Board 為 NodeMCU 1.0,並確認串口正確,默認為 /dev/ttyUSB0
,比如說 /dev/ttyUSB1
。
接着通過菜單 File 中的 Examples 找到 esp8266 的 Blink。
最后,按下 Arduino IDE 的“上傳”按鈕編譯和燒錄 Blink 到板子上,效果跟上面的 Lua 例子一樣,會閃爍 LED 。
14 參考資料
- ESP8266 資源
- ESP8266 介紹:ESP8266 為其核心模塊
- NodeMCU 資源
- Noduino/Noduino SDK 文檔
- 其他資源
- 語言
- C
- eLua:NodeMCU Firmware 默認支持 eLua
- MicroPython
- SDK
- NodeMCU Firmware:NodeMCU 官方提供的固件,支持 Lua 編程
- Nodunio:NodeMCU 合作伙伴提供的純 C SDK,可集成進 Arduino IDE
- ESP8266 SDK:ESP8266 官方廠商提供的 SDK,其他都基於這個但是在這個基礎上做了封裝,更便於使用
- IDE
- Arduino IDE:支持 Windows,Linux 和 OS X
- 文件系統
- 編譯器
- xtensa-lx106-elf-gcc:預先編譯好的 Xtensa 交叉編譯器,支持多個平台
- esp-open-sdk:集成了 crosstool-NG 的編譯器制作環境
- USB 串口驅動
- 固件燒錄
- NodeMCU Flasher:NodeMCU 官方采用 .net 編寫的圖形下載界面,支持 Windows
- esptool.py:Python 版本,推薦在 OS X 和 Linux 環境下使用,可用於命令行燒寫固件
- esptool:C 語言版,編譯好的版本在 Release
- ESPlorer:JAVA 寫的,支持 Windows,Linux,Solaris 和 Mac OS X,來自 luatool 的作者
- 文件傳送
- luatool.py:可用於命令行傳送 Lua 腳本,無須圖形化工具支持
- nodemcu.py:同上
- 雲服務
- 語言
===================== End