用 Arduino 寫 NodeMCU V3 的 Blink 程式但 LED 不會閃

NodeMCU 是一款基於 ESP-12E WiFi 無線微控制器的開發板,本身已經內建了USB To TTL 晶片,因此在開發的時候,直接連接板子上的 Micro USB 接頭到電腦,就可以直接燒寫,而且支援 Arduino IDE 開發環境,對於原本就熟悉 Arduino 的開發者來說,拿到就可以直接上手。
拍賣網上,可以找到好幾款不同版本的 NodeMCU,價格不一。我買到的這個版本,叫做「NodeMCU V3 Lua WiFi 開發板」,不到 NT$70 就能買到(作為數位 I/O 控制,你說,這個價格,要我選擇 Arduino Nano 還是它?)。

這個 Lolin 版本的 NodeMCU 採用 CH340 這片萬用 USB To TTL 晶片,幾乎在當今所有的作業系統上都有支援,不需要另外安裝驅動程式,使用上比原始版本相容性更好。




三個世代的 NodeMCU

NodeMCU v3 跟 Arduino Uno 一樣,本身就有 USB 跟電源轉換,在 Ubuntu 作業系統上,一插上去電腦,執行 lsusb 指令,就能看到這片板子已經連接:
Bus 001 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
在 Windows 或其他作業系統,可以在裝置管理員中,「連接埠 (COM 和 LPT)」裝置類別中,找到 CH340 這個 Serial USB 的裝置。Windows XP 則需要 Google 一下,安裝 CH340 的驅動程式。

燒錄能夠讓 Arduino 控制的固件韌體

或許你買來的 NodeMCU V3,賣家已經貼心的預裝好 ai-thinker 這個可以讓 Arduino 控制、燒錄的韌體。如果不確定的話,建議你還是自己重新安裝一下。
韌體可以在這個網址下載:
下載目前 (2020 5月) 最新版的韌體,選其中一個就可以,9600 bps 速度的,比較不容易有意外,如果電腦 USB 偶爾不太穩定的話,用這個比較容易成功:
在 Linux 系統,如果內建有 Python 3 的話,可以用下面指令,安裝或更新 esptool 模組:
sudo pip3 install -upgrade esptool
這個模組可以透過串列埠,對 NodeMCU 燒錄固件韌體。安裝完了之後,執行以下指令燒錄:
esptool.py --port /dev/ttyUSB0 --baud 9600 write_flash 0x0 ai-thinker-0.9.5.2-9600.bin
或是:
esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash 0x0 ai-thinker-0.9.5.2-115200.bin
上面 ttyUSB0 可能在你的電腦上不太一樣,可以用這個指令,看看目前有哪些 ttyUSB:
ls /dev/ttyUSB*

如果不動作,換一下另外一個 ttyUSB 試試。
如果出現權限問題,可以用管理者權限:
esptool.py --port /dev/ttyUSB0 --baud 9600 write_flash 0x0 ai-thinker-0.9.5.2-9600.bin
或者把你現在用的這個使用者,加入 dialout 群組,userxxx 換成你的使用者名稱即可:
sudo usermod -a -G dialout userxxx
在 Ubuntu 系統,預設把 ttyXXXX 歸屬於 dialout 使用者群組。

在 Windows 系統,則建議安裝燒錄軟體 ESP8266Flasher.exe,在此下載:
32-bit 跟 64-bit 的 Windows,各自有對應的執行檔在 Win32 跟 Win64 資料夾中。
  1. 執行這個檔案以後,選擇 Log 選單
  2. 插上你的 NodeMCU,就會跑出 COM 埠資訊
  3. 接著去 Config 選單中,選擇你剛剛下載的固件韌體檔案,確認燒錄起始位址是 0x00000 
  4. 到Operation 選單中,按下 Flash 按鈕,就會開始燒錄。
  5. 然後回到 log 選單,查看燒錄過程紀錄。
燒錄完成之後,等等就能在 Arduino 寫個小程式上傳了。

讓 Arduino 上傳程式到 NodeMCU v3

由於 Arduino 預設並沒有支援這片板子,因此需要安裝這片板子的相關支援程式。
到 File -> Preferences 中,加入這個板子相關檔案的下載網址:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
然後到 Tools -> Board:xxxxxx -> Boards Manager 裡面的文字方塊中,輸入 nodemcu 或 esp8266,夠能找到支援的軟體包,按下 Install 安裝。安裝完之後,回到 Tools ->Board:xxxx 選單中,可以找到 NodeMCU V0.9 (ESP-12) 跟 NodeMCU V1.0 (ESP-12E) 兩塊板子, V3 就是使用 ESP-12E 這個。
選好之後,會發現還有其他的參數能夠設定。像 LED,V3版是放在硬體的第2腳,所以要選擇第二腳,之後,按照 Arduino Uno 的軟體腳位 D13 就能控制這片板子上的 LED 了:

LED Blink 測試範例程式

因為 NodeMCU v3 上面有安裝一個藍色的 LED,你的第一個程式,可以用 Arduino Uno 那個 Blink 的範例來試驗最簡單。
File -> Examples -> 01. Basics -> Blink,執行下去就能用了。
如果你的 LED 閃爍的試驗失敗,但是明明可以上傳程式,那非常有可能是某種原因,腳位的定義不對。
每次對這些搞得迷迷糊糊的時候,該怎麼辦?
很簡單,不管是哪種板子,去找出剛剛安裝的第三方板卡支援模組,對這塊板子針腳定義檔 pins_arduino.h 就可以完全明白了。

這個檔案在 Arduino 安裝目錄下,hardware/esp8266/2.7.0/variants/nodemcu 下面。
Linux 版本的設定檔,藏在 家目錄中, .arduino15這個隱藏目錄下,真的找不到,可以執行以下檔案搜尋指令:
find ~ -name nodemcu -print
就可以找到了。
下面是我安裝的 esp8266 2.7.0 版本的板卡 pin 腳重定義設定 pins_arduino.h,然後比對一下 NodeMCU v3 的實體腳位定義,你寫程式的時候,就不會再搞混了。所以 LED_BUILTIN 預設對應硬體第2支腳。沒錯,對應 Arduino 的軟體腳位設定,就是 D4 這個名稱,所以你用 D4 也可以控制 LED 閃爍。

#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#define PIN_WIRE_SDA (4)
#define PIN_WIRE_SCL (5)

static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

#ifndef LED_BUILTIN
#define LED_BUILTIN 2
#endif
#define LED_BUILTIN_AUX 16

static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t D9   = 3;
static const uint8_t D10  = 1;

自己寫程式的時候,我建議 GPIO 腳位,直接用硬體腳位號碼比較直接,比較不會搞混,不要用 D0-D10。




沒有留言:

張貼留言