2015年5月31日 星期日

ESP8266 ( ESP-01 ) 無線模組燒錄 NodeMCU 韌體 ( Lua 語法支援 )

網頁最後修改時間:2016/12/19
NodeMCU 是一個開放原始碼與硬體,並將 Lua 嵌入到 ESP8266 中的一個成功的項目。而在這篇網頁中,將會介紹如何使用賣場的 ESP8266 IoT 入門學習套件,燒錄可支援 Lua 語法的 NodeMCU 韌體進到 ESP8266, ESP-01 中,並且介紹一個方便的軟體做為學習 NodeMCU 之用。最後,我會給出幾個 ESP8266, ESP-01 的例子,撰寫 Lua 程式控制 LED 開關以及以 PWM 控制 LED 漸亮與漸滅來做示範;最後介紹 Arduino 如何與燒錄 NodeMCU 的 ESP8266 ESP-01 做溝通控制作為結尾。

之前曾經有使用者遇到無法使用 AT 指令將設定的資料存放在 ESP8266 ESP-01 中的問題,只要更新為 NodeMCU 之後,就可以很容易的將其存放在 ESP 的檔案系統裡,每次重新啟動或是開機就會自動載入,不用預先撰寫初始化程式。

相信我,看過這篇網頁的介紹之後,你(妳)會喜歡上 NodeMCU

已擁有賣場 IoT 套件的使用者,相關的軟體與工具都已放置在雲端硬碟中,可先自行下載,位置在下方圖示的灰色資料夾中。

新增的目錄名稱以 [2015.05.29 ] 做開頭且顏色標註為"巧克力冰淇林",大部分的資料都是以這次套件中 ESP8266 韌體更新的資料 ( AT:0.23, SDK:1.0.1 ) 為主;另外,若是之前使用舊版韌體的使用者,其中也放置韌體燒錄的軟體以及編譯之後的韌體檔案,請依照該資料夾中的照片設置軟體參數並依照燒錄的步驟燒錄即可更新舊版的韌體到與線在賣場中韌體的版本。
ESP8266 IoT 入門學習套件雲端硬碟資料夾目錄
Note:本篇網頁的目的是讓使用者改用 NodeMCU 韌體學習 Lua 語法並藉以操控 ESP8266,所以建議直接變更韌體為 NodeMCU。


延伸閱讀:
網頁中使用的軟體與韌體原始碼下載:
  • NodeMCU V0.9.5 韌體一鍵燒錄軟體
    所提供的軟體只能在 Windows 用。分為 Win32 與 Win 64 的版本,請依自己的作業系統是 32-bit 或是 64-bit 選擇合適的檔案。
  • ESPlorer 軟體 ( 最新版 )
    Java 寫的,支援 Windows / Linux / Solaris / Mac 作業系統,軟體特色如下:
    • 支援 LUA 和 Python 的語法高亮度顯示
    • 程式編輯器可設置不同的主題:default, darl, Eclipse, IDEA, Visual Studio
    • 程式編輯器支援 Undo / Redo 功能
    • 程式碼自動完成 ( Ctrl+Space )
    • 聰明的餵食資料給 ESP8266 並且確認每一條發出去的指令回覆是否正確
    • 程式碼片段 ( Code snippet ) 管理功能
    • 詳細的記錄 ( logging ) 功能
    • 可將多個寫好的 Lua 腳本存放到 flash,讓 ESP8266 自己執行!
      個人最喜歡的特點!
    • 更多、更多的功能,請自行探索 !
*********************************************************************************
此網頁所用的材料可自行準備,或選用新版本的升級套件
更多 ESP8266 相關商品,請至分類賣場*********************************************************************************
在進入主題之前,使用者必須要注意!就像是 Arduino 一樣,ESP8266 也有許多不同的電路板類別,但主要差別是在接腳開放程度。因此不管是哪一款的 ESP8266,都可以使用下面所介紹的方式進行燒錄和軟體的操作,但是必須注意的是,接腳!有多少接腳做多少事。
以 ESP8266, ESP-01 為例,板上只有 GPIO0 與 GPIO 2 兩隻接腳可供與外部周邊做連接,因此使用者必須自己去找出這些接腳的號碼,然後使用下面的表格將其轉換成 NodeMCU 所定義的接腳號碼才能正常使用。


NodeMCU
接腳號碼
ESP8266
板載接腳號碼
NodeMCU
接腳號碼
ESP8266
板載接腳號碼
0
GPIO16
7
GPIO13
1
GPIO5
8
GPIO15
2
GPIO4
9
GPIO3
3
GPIO0
10
GPIO1
4
GPIO2
11
GPIO9
5
GPIO14
12
6
GPIO12

網頁分為下面幾個段落:
  1. 韌體燒錄線路準備
  2. 進行 NodeMCU 韌體燒錄
  3. ESP8266 整合開發環境 ( IDE ) 操作範例 ( 以 ESP-01 為例 )
    • LED 開關 ( GPIO 控制 )
    • LED 亮滅 ( PWM )
  4. 生成 init.lua

1. 韌體燒錄線路準備:

韌體燒錄的硬體配線請參考 "如何燒錄 ESP8266 無線模組的韌體 ( 使用一鍵燒錄軟體,燒錄版本:0018000902 ) " 網頁中的硬體接線及操作步驟,動作上都是相同的,若是之前沒自行燒錄成功過,請一定要先去此網頁瀏覽一下,不然出現問題會找不到原因!

首先依照 ESP8266 的接腳圖,依照電路圖中的指示接好線
ESP8266, ESP-01 接腳配置圖
ESP8266, ESP-01 燒錄接線圖
ESP8266, ESP-01 燒錄接線完成圖

2. 進行 NodeMCU 韌體燒錄:

完成燒錄的接線後,將 USB 轉 TTL 插上電腦,然後再插上 ( 右邊 ) 電源板的電源 ( 此時先不要按下開關 ),最後依照自己的作業系統是什麼位元選擇 "{ESP8266}/Firmware Upload Tools/" 目錄中 Win32 或是 Win64 裡的 ESP8266Flasher_Win##.zip 來使用,下載檔案後解壓縮並開啟它
NodeMCU Flasher - Operation

確定一下準備要進行韌體燒錄的 ESP8266 的串列通訊速度 ( baudrate ) 是多少 ? 以賣場的 ESP8266 來說,藍色板子的是 9600 bps,黑色板子的是 115200 bps。

切換到 Advanced 頁面,依照下面畫面輸入 ( 以藍色板子為例 )
NodeMCU Flasher - Advanced
返回到 Operation 頁面,按下右上的 "Flash" 按鈕,然後切換到 Log 頁面。

按下電源模組的按鈕開啟電源!

這時應該就會看到下面綠色框框的文字陸續出現;但若是一開始就按下電源模組的開關,然後再按下 Operation Flash 按鈕,出現的就是紅色框框裡面的文字出現,最後發生錯誤!解決的方法就是關掉電源模組的電源,Stop 再重新 Flash 一次。
NodeMCU Flasher - Log - 01
成功開始燒錄之後,在 Operation 頁面就會看到 AP MACSTA MAC 兩個欄位出現 MAC 位址,畫面中間的進度欄的藍色指示條會一直向右移動
NodeMCU Flasher - Operation, Flash

時間不用很久!完成燒錄之後,就會看到 Log 頁面如下所示
NodeMCU Flasher - Log- 燒錄完成
記得完成燒錄之後,先關閉電源模組的電源,再將 GPIO0 那一條線拔掉,恢復模組成一般通訊模式!


3. ESP8266 整合開發環境 ( IDE ) 操作範例 ( 以 ESP-01 為例 )

NodeMCU 燒錄好之後,我們必須要有一個好用的軟體來作為開發環境。打開網頁中所提供的 ESPlorer 來做一些簡單的測試 ( 簡單的使用說明請自行上網找;有賣場雲端硬碟連結的到 "{ESP8266}/datasheets/ESP8266/非官方文件/[2015.05.29更新]" 有簡單的該軟體使用教學 ( PDF, 英文 ),所以這邊就不再贅述 ! 直接進入主題。

下面兩個使用範例使用相同的硬體線路,就是延續 ESP8266, ESP-01 通訊的電路圖,並加入兩顆 LED 分別接到 GPIO0 與 GPIO2 兩個接腳

ESP8266, ESP-01,NodeMCU 韌體測試接線
灰線是接到 GPIO0 ( 綠色 LED );白線是接到 GPIO2 ( 紅色 LED )
ESP8266, ESP-01,NodeMCU 韌體測試接線實際完成圖

複製下面的程式碼,根據影片的方式到 ESPlorer Snippets 頁面中



* 3.1 LED 開關 ( GPIO 控制 ):

在 ESPlorer 左邊的視窗,選擇 "NodeMCU+MicroPython" --> "Snippets" --> Snippet0 並將下面程式碼複製到下面的文字框中,並將名稱改為 "gpio",按下 "Save" 按鈕存檔。
-- ESP8266, ESP-01 GPIO0
esp01_gpio0 = 3 -- NodeMCU pin no.
-- ESP8266, ESP-01 GPIO2
esp01_gpio2 = 4   -- NodeMCU pin no.
gpio.mode( esp01_gpio0, gpio.OUTPUT )
gpio.mode( esp01_gpio2, gpio.OUTPUT )
-- turn on
gpio.write( esp01_gpio0, gpio.LOW )
tmr.delay( 1500000 ) -- delay 1.5 second
gpio.write( esp01_gpio2, gpio.LOW )
tmr.delay( 1500000 ) -- delay 1.5 second
gpio.write( esp01_gpio0, gpio.HIGH )
tmr.delay( 1500000 ) -- delay 1.5 second
gpio.write( esp01_gpio2, gpio.HIGH )
tmr.delay( 1500000 ) -- delay 1.5 second


* 3.2 LED 亮滅 ( PWM ):

重複上面的動作,複製下面程式碼選擇 Snippet2 貼上,名稱改為 pwm 再存檔。
--[[ GPIO0 ---/\/\/\---|<--o Vcc
 LED from dark to light and the from light to dark]]
pwmpin=3
pwm.setup(pwmpin,500,1020) 
pwm.start(pwmpin)
for i = 1020,0,-20 do
    pwm.setduty(pwmpin,i)
    tmr.delay(30000)
end
tmr.delay(1000000)
for i=0,1020,20 do
    pwm.setduty(pwmpin,i)
    tmr.delay(30000)
end
pwm.setduty(pwmpin, 1023) -- turn off the ledpin
pwm.close(pwmpin)

**

存好檔的兩份程式碼片段,會出現在左邊視窗下。按下 Refresh 按鈕取得系統所有的串列埠號碼,選擇 USB 轉 TTL 模組所連接到的,通訊速度改為 9600,按下 Open 開啟通訊 ( 下面的就會出現 PORT OPEN 9600 的文字訊息)

按下電源模組的開關,開啟電源 ! 

下方就會出現開機訊息以及韌體版本等資訊。

ESP8266, ESP-01,NodeMCU 韌體測試接線實際完成圖
但是 NodeMCU 開機訊息中為什麼出現 "lua: cannot open init.lua",有沒關係啊 ?
其實就是在 ESP8266, ESP-01 儲存空間中找不到 init.lua 這 Lua 腳本做初始化,所以才會出現這個訊息。 這並不要緊!下面會展示如何產生一個 init.lua,讓每次開機就像是 Arduino 一樣,有一顆 LED 一直在閃呀閃的 !

執行的步驟與結果如下面影片所示


Snippet 頁面可以讓使用者存放好幾個片段 Lua 腳本程式,使用它可以方便的測試每一段程式碼執行的結果。

但是如果需要讓燒錄 NodeMCU 韌體的 ESP8266, ESP-01 一開機就執行某些預先設定好的動作,那使用者可以將寫好的 Lua 腳本存放進去 ESP8266, ESP-01Flash 記憶體裡面。


4. 生成 init.lua

複製下面的 Lua 程式碼,然後存成 init.lua 再傳送到 ESP8266, ESP-01Flash 去。

lighton=0
pin=4
gpio.mode(pin,gpio.OUTPUT)
tmr.alarm(1,2000,1,function()
    if lighton==0 then
        lighton=1
        gpio.write(pin,gpio.HIGH)
    else
        lighton=0
        gpio.write(pin,gpio.LOW)
    end
end)

詳細的步驟與結果如下影片所示



使用螢幕右邊的 FS Info 按鈕可以查現在 ESP8266, ESP-01 使用的狀況!

上傳 init.lua 之後,ESP8266, ESP-01 還剩下的儲存空間大小

斷電之後再開電可以看到接到 GPIO2 的 LED 每 2 秒閃爍一次,這會重複執行!當然因為空間還有,所以還可以繼續上傳其他的 Lua 腳本。


結論:

掛載 NodeMCU 韌體的 ESP8266 使用上類似 Arduino,雖然 ESP-01 只有兩隻 GPIO 接腳可以用,不過還是有其他 PCB 封裝有釋出更多接腳的 ESP8266 ( ESP-12  ),或是內建串列通訊與降壓晶片的  NodeMCU DevKit ( 賣場有,接上 MicroUSB 就可以馬上使用 ( 除非作業系統沒有 自動抓到 CP2102 串列晶片的驅動程式 ) ),詳細支援的函式,請到上面提供的網頁連結查詢。

由於可以上傳多個 Lua 腳本程式到 Flash 記憶體中,個人認為 NodeMCU 韌體的支援讓 ESP8266 的開發更加的方便並富有彈性,可以獨立運行於微處理器之外,自己本身不但就是微處理器,也可以另外與其他處理器做溝通,可以大幅降低微處理器的負載,這也是我為什麼要推薦這韌體的原因!

希望這網頁對大家有所幫助,期待下篇網頁的相逢!

34 則留言:

  1. 您好,
    請問ESP8266的SDK或是Lua的編寫,可以連上Taipei Free這種網頁登入型的WIFI熱點嗎?

    回覆刪除
    回覆
    1. 您好:
      應該可以,但要實際去做才知道會遇到什麼問題,因為不曉得會不會一直確認登入的使用者帳號與密碼,或是傳送時需不需要先傳送什麼資料等 ( 網路上也有人有相同問題,不過還未有人說明要怎麼做 ),不過我這邊沒這環境可以測試,只能精神上先支持!

      刪除
    2. 謝謝您的回覆. 我只是想到上周末在台北華山創意文化園區的活動,就坐落在台北,而且台灣的WIFI熱點這麼多,如果可以用ESP8266直接連線,整個台北到處都可以玩物聯網了

      刪除
    3. 想請問,再燒錄lua程式至esp8266 soc 時,會出現"Lua interpreter error detected!!"這項錯誤,想請問是接腳錯誤還是相關可供參考的經驗嗎?

      chpd - vcc
      vcc -3.3v
      Gnd - GND
      rx - tx (usb port)
      tx -rx (usb port)

      刪除
  2. 不僅內容紮實,而且解說非常清楚,獲益良多,感謝分享!
    升級Firmware讓我忙了整整30hrs,最大問題在電源的noise與杜邦頭沒牢接。

    回覆刪除
  3. 您好,我照著您的步驟走,開啟ESP8266電源時,可以得到版本資訊,我試著送出AT訊息也可以得到OK的回應
    ,唯一不同處應該是我的Baudrate是115200,不是9600, 在run GPIO和PWM程式的時候卻發生ESP8266回傳ERROR的訊息。可否協助判斷可能是哪邊有異常?

    回覆刪除
    回覆
    1. 燒錄時是要使用 115200(黑板)燒錄速度;燒錄完成之後的通訊速度就要使用 9600 bps,這是 nodemcu 的韌體設定。

      除了通訊速度之外,也要確認是否真正地上傳 .lua 程式上去 ESP8266 中,不然就會有錯誤產生!
      上傳 .lua 程式可以參考影片,步驟與結果都要一樣才能產生相同的結果!

      另外,若不是使用與網頁相同的硬體線路,就必須自己確認硬體其他的因素,因為 USB 轉 TTL 或是電源模組都會是產生問題的因素!

      希望以上對你有所幫助,若有問題請再詳細說明或是使用電子郵件將執行畫面給我看看!

      刪除
    2. Hi,您好,我將ESP8266韌體燒錄成SDK version:0.9.5和0.9.2,分別用Baudrate 9600和115200對ESP8266下指令都會取得回應,這樣應該是有燒錄成功,但在直接run GPIO和PWM Python程式時都會是回傳Error,還沒有到.lua檔案上傳。是否可提供email讓我把錯誤畫面截圖給您,協助幫忙判斷一下可能錯誤的地方。

      刪除
    3. 電子郵件不適合直接在這裡提供,但還是有人可以找到並寄電子郵件給我與我討論問題!

      如果會用 Google+,加我!

      刪除
    4. 或者您可以連下列四張圖片的網址,我把問題截成四張圖片,可以的話再麻煩你協助看一下
      http://i.imgur.com/3YK0lXV.png
      http://i.imgur.com/MsZ7oyq.png
      http://i.imgur.com/mGTLBdf.png
      http://i.imgur.com/mGTLBdf.png

      刪除
    5. 下列網址才對 再次感謝

      http://i.imgur.com/3YK0lXV.png
      http://i.imgur.com/MsZ7oyq.png

      http://i.imgur.com/epXn2gP.png
      http://i.imgur.com/mGTLBdf.png

      刪除
    6. 一看到您用 115200 bps 通訊就知道您韌體燒錯了!
      您燒錄的是 AT 韌體,不是 NodeMCU !
      Firmware upload tools 目錄裡面有,在 Nodemcy(lua) 目錄裡面,選擇 Win32 或是 Win64 目錄下面的檔案執行燒錄就可以了!

      刪除
    7. 太感謝您了,燒完NodeMCU就OK了,感恩

      刪除
  4. 我是買黑色板子的ESP8266-01,請問燒錄時SIZE及速度要設為多少?,因為老師是用藍色板子為例,不知兩者是否相同

    回覆刪除
    回覆
    1. 網頁裡面有寫;問與答裡面也有人問 ! 沒有先看過網頁中的說明嗎?

      刪除
    2. 如果是賣場的黑色板子,就根據上面的設定直接用,速度的設定在畫面下面的文字中有說明。
      SIZE 的話,因為檔案大小與重頭開始燒錄的關係,可以使用預設值;擔心的話就選 1MByte 來燒錄就是正確的 !

      刪除
    3. 所以黑板
      Buad Rate : 115200
      Flash Size : 1MBytes
      Flash Speed : 26.7MHZ
      SPI MODE : DIO

      這樣對嗎 ?

      刪除
    4. 只要根據這網頁上面說明的燒錄硬體與線路接線,確認無誤之後就可以放心燒錄。即便燒錄出問題,重新燒錄就可以,不需要擔心!
      這樣的設定值可以!

      刪除
  5. 你好:
    我想請問一下我用ESPLORER去寫入程式時出現 Waiting answer from ESP - Timeout reached. Command aborted.
    請問項這樣的情形是不是我哪裡搞錯了?

    回覆刪除
    回覆
    1. 如果是寫好之後再一併傳而且是單區段執行的話,這情況是會發生的!因為前一個指令還沒有執行完就又傳一個指令過去就會;要不就是程式碼有問題,程式沒有回覆,等太久也會!

      刪除
    2. 你好!板主
      我的問題解決了。以下是我的小小心得提供給有相同問題但不知怎麼解決的玩家。
      我發現問題在於,內部有指令在然後沒有刪除乾淨就在燒錄新的同樣檔名但不同內容指令進去,導致指令之間有衝突。
      所以心得就是每次燒錄要記得自己燒了哪些指令進去,以便日後能清除乾淨那些指令。

      刪除
    3. 請問送電後一直出現Communication with MCU..Waiting answer from ESP - Timeout reached. Command aborted.Got answer! Communication with MCU established.
      AutoDetect firmware...

      Can't autodetect firmware, because proper answer not received (may be unknown firmware).
      Please, reset module or continue.

      這個是為什麼呢..我按FORMAT他也都沒反應 麻煩大大幫忙 謝謝..

      刪除
    4. 先將 "Autodetect firmware" 的選項取消掉 (ESPlorer 軟體頁面下, NodeMCU & MicroPython/Settings),這個選項就是下面這段文字產生的原因
      "Can't autodetect firmware, because proper answer not received (may be unknown firmware).
      Please, reset module or continue."

      完成之後再試試,應該就可以解決你的問題!

      刪除
    5. 大師,我剛嘗試把它取消掉之後,雖然那行不見了,但是程式還是無法傳進去,原本都是正常的,但是今天早上我寫了一個網頁控制LED亮滅的程式傳進去,然後在網頁上連續快速來回開啟和關閉,結果就掛掉了,請問這有可能是8266壞了嗎?我現在OPEN後再送上電會顯示亂碼,謝謝大師

      刪除
    6. 應該先檢查你的 Lua 程式,和 Lua 程式在 ESP8266 中的使用限制,大部分這情況都是程式碼造成的 ! 如果有問題的話,重新上傳 Lua 程式再自己測試看看;要不就重新燒錄 NodeMCU 韌體。

      刪除
    7. 韌體部分有重燒過了,但是還是一樣打開送電就會顯示一排亂碼,程式無法傳進去..請問如果8266壞掉會是這樣的狀況嗎,謝謝

      刪除
    8. 補充:如果我按下SAVE TO ESP就會顯示Waiting answer from ESP - Timeout reached. Command aborted.

      刪除
    9. 如果沒法正常開機,連正常開機的訊息都沒有出現,程式怎麼上傳的進去!
      我想,應該是韌體燒錄沒成功。
      若是真的壞掉,ESP-01 藍燈開機會一直亮;但 ESP-01S 可能情況就不一樣,不過我手邊的 ESP-01S 還沒弄壞過,所以不清楚 !

      刪除
    10. 好的,謝謝您的經驗分享與技術指導~我在嘗試看看好了,感謝

      刪除
    11. 請問 我有一個UDP傳輸資料和TCP網頁控制 這兩種是不是不能寫在同一塊ESP8266中 謝謝!!

      刪除
    12. 只要指定不同的通訊 port 號碼,可以分開處理 TCP 或是 UDP 的通訊。

      刪除

留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !