2017/9/13

在MacOS上燒錄ESP8266 NodeMCU韌體

之前都是在Windows上燒,沒想到在Mac上燒沒那麼容易...
因為Windows有NodeMCU Flasher這套軟體,Mac上似乎沒有...因此增加燒錄的困難

沒搞錯的話,這張應該是NodeMCU V2

現在似乎有出到V3了,至於V1、V2、V3有什麼差別請看這篇:
http://bit.ly/2eWtdtM
v2是Amica的官方版,v3是Lolin的非官方版
前者沒有VU腳位,且體積較小,後者有VU腳位且體積較大一些,
VU腳位就是把USB的電源接出來,提供實實在在的5V


燒錄NodeMCU韌體主要分:

  1. 安裝USBtoUart驅動(v2是CP2102)v3是CH340G
  2. 編譯韌體
  3. 燒錄韌體
至於其他還有很多韌體可以燒,我沒試過,故這裡只寫NodeMCU
而因為NodeMCU官方開放的韌體是原始碼?在這裡:
https://github.com/nodemcu/nodemcu-firmware
這是未編譯過的,因此一般來說我們要取得編譯過的.bin檔,才能燒錄。

有幾種方式可以取得編譯檔,如官方所說
  • 線上編譯:去這個官方的線上服務,把你要的功能打勾,填信箱就會寄給你編譯檔了,最方便的。
  • Docker:沒試過
  • Linux Build Environment:最麻煩了,等於是整個都要下指令手動編譯
我是用線上編譯,手動編譯太狗血了,感覺很容易出錯...
至於那個線上編譯的服務操作就不寫了,就填你要的功能,看要MQTT、HTTP還其它什麼...
填好信箱最後送出他就會寄給你兩個已編譯好的bin檔
分別為integer和float,如果要做float計算的話就選float,但佔空間會比較大,integer反之。

這樣第一步,編譯韌體就算完成了。



第二步,燒錄韌體

因為nodemcu-flasher不支援macOS,所以變成要手動下指令編譯,應該還有其他方法,但我是這樣做

可能需要的安裝:
python or python3

1.安裝python3
2.把esptool git下來
$ git clone https://github.com/themadinventor/esptool.git
3.$ cd esptool
4.sudo python3 setup.py install
5.查看接入電腦的NodeMCU裝置名稱
$ ls /dev/tty.*
這裡顯示/dev/tty.SLAB_USBtoUART
6.編譯
$ sudo python esptool.py --port /dev/tty.SLAB_USBtoUART write_flash -fm dio 0x00000 ~/nodemcu-master-21-modules-2017-09-13-07-46-38-float.bin
安裝過程的訊息:
esptool.py v2.2-dev
Connecting........_
Detecting chip type... ESP8266
Chip is ESP8266EX
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0240
Compressed 700832 bytes to 460844...
Wrote 700832 bytes (460844 compressed) at 0x00000000 in 40.6 seconds (effective 138.1 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...
最後的訊息我一直覺得怪怪的,然後python python3都試試看,我也忘記成功是哪個,
最後就可以上ESPlore看是不是正常了,雖然畫面看起來有些亂碼和指令跳出兩次,但至少還可以用.........



以下是2018-3-1紀錄的燒錄過程,因為後來照之前的方式的指令燒錄發現不行,換了一點指令才可以,但本質上還是用原本的指令去燒錄。試過用舊指令配舊的bin檔,或是舊指令配新的bin檔都不行,最後是把指令和bin檔都換成新的才可以。

那這次一樣用官方的Amica v2板,並且重新開始。

1.安裝esptool:去這個網址把最新的git下來。然後用cd指令進入esptool資料夾,再用以下指令安裝,當然在安裝之前python或是python3要先安裝好:
pip install esptool
如果你是python3就改成pip3,我是pip和pip3都安裝。
安裝完畢用以下指令確認是否安裝成功:
esptool.py version

我這時安裝的是v2.3.2版本。

2.查看接入電腦的NodeMCU裝置名稱。
ls /dev/tty.*
我顯示的是/dev/tty.SLAB_USBtoUART

3.燒錄進去。
再燒錄之前先按著板子上的FLASH按鈕,再按RST按鈕,這時應該會看到板子的燈有閃一下。此動作建議要做,雖然我不清楚意義...
然後bin檔建議也去下載新的,下圖是我勾選的module:

他就會把編譯好的bin檔寄給你。

然後就可以用以下指令燒錄了:
$ esptool.py --port /dev/tty.SLAB_USBtoUART write_flash --flash_mode dio --flash_size 4MB 0x0 ~/nodemcu-master-19-modules-2018-03-01-04-17-41-float.bin
以下是燒錄的訊息:
esptool.py v2.3.2-dev
Connecting........_
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash params set to 0x0240
Compressed 649504 bytes to 425934...
Wrote 649504 bytes (425934 compressed) at 0x00000000 in 37.5 seconds (effective 138.5 kbit/s)...
Hash of data verified.

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

燒錄完成,照他說明按一下RTS鈕,燈會閃一下。
然後可以打開ESPlorer了,點open鈕,再按一下ESPlorer上的RTS鈕,再按掉。
此時他會回應一段亂碼的訊息

按右邊的Reload,如果出現Waiting answer from ESP - Timeout reached. Command aborted.這類的訊息是正常,再按第二次應該會顯示以下訊息:
這樣就算成功了。
如果按好幾次Reload都出現Waiting answer from ESP - Timeout reached. Command aborted. 那就是失敗,請重新燒錄。
或是燒錄完畢燈一直閃,也是失敗,也請重新燒錄。
重新燒錄建議用以下指令,可以清空上面燒壞的韌體:
$ esptool.py --port /dev/tty.SLAB_USBtoUART erase_flash

上面是線上取得編譯檔然後再燒錄,好處是方便、快速、簡單並且比較不會出錯,但如果要一些特別的功能像SmartConfig可能就無法用上面的方式了,因為他SmartConfig預設關閉,必須自己開起並且自己編譯。

接下來將使用Docker來編譯。
前置條件:需安裝Docker。就不說明Docker怎麼安裝了。
操作系統為masOS Sierra 10.12.6

1.到docker hub把nodemcu-build pull下來:
$ sudo docker pull marcelstoer/nodemcu-build

2.把nodemcu-firmware clone下來:
$ git clone git@github.com:nodemcu/nodemcu-firmware.git

3.至nodemcu-firmware/app/include/user_config.h打開SmartConfig
他原本是被註解掉的,把它取消註解

4.至nodemcu-firmware/app/include/user_modules.h將你要的模組取消註解,我這裡是將SJSON打開


5.移動到nodemcu-firmware並編譯,記得一定要先cd移動到nodemcu-firmware底下:
$ cd nodemcu-firmware
$ sudo docker run --rm -it -v `pwd`:/opt/nodemcu-firmware marcelstoer/nodemcu-build
他大概會跑3~5分鐘多

6.查看編譯完成的bin檔
$ cd nodemcu-firmware/bin
$ ls
接下來就可以燒錄進去了,燒錄過程就不再寫了,參考上面的部分。

7.燒錄...(略過)

8.驗證是否成功,這裡以SmartConfig來測試。
--SmartConfig.lua
wifi.setmode(wifi.STATION)
wifi.startsmart(0,
    function(ssid, password)
        print(string.format("Success. SSID:%s ; PASSWORD:%s", ssid, password))
    end
)
SmartConfig程式碼如上,把他上傳至NodeMCU裡面,只要連接成功ESPloer就會顯示SSID和密碼。
APP我從Google Play下載ESP8266 SmartConfig來用:
開啟APP,並連接WIFI,按下CONFIRM。

成功!



[5] How to compile NodeMCU firmware
[6] Build custom NodeMCU firmware and flash it on ESP8266

沒有留言:

張貼留言