試用 LuatOS ESP32-C3 及 使用 WS2812B通孔LED

早前曾經使用 Mini D1 ESP32 製作藍牙鍵盤
但 Mini D1 ESP32 開發板的價錢比較貴,而且引腳佈局亦不適合在麵包板上使用
因此在下希望尋找一些價錢可以便宜一點的開發板降低成本 及 方便在麵包板上測試 的 開發板

LuatOS ESP32-C3

LuatOS 使用 ESP32-C3晶片,是一種具備 Wifi 及 藍牙 功能的微控制器開發板

外觀
見下文
見下文
LuatOS ESP32-C3 正面

見下文
見下文
LuatOS ESP32-C3 背面
背面印有 LuatOS 的官方網址 及 引腳的功能

見下文
使用 USB Type-C 作為資料傳輸的連接埠
非常適合現在的電腦連接用途

見下文
Expressif 的 ESP32-C3晶片,是一種整合 WiFi模組 及 藍牙模組 的 微控制器晶片

見下文
WCH 的 343PC41 USB轉TTL晶片

見下文
PUYA 的 PY25Q32HB 提供 32Mb快閃記憶體的 晶片

見下文
BOOT按鈕,與 GP9引腳 相連,閒置時為高電壓
按下時接地讓 ESP32-C3 進入 起動模式(Boot Mode) ,用來更新韌體

見下文
RST按鈕,與 RST引腳 相連,閒置時為懸空, 按下時接地並重新啟動

見下文
D4 LED ,與 GP12引腳 相連
閒置時為低電壓時關閉,高電壓時亮著

見下文
D5 LED ,與 GP13引腳 相連
閒置時為低電壓時關閉,高電壓時亮著

引腳
編號引腳方向功能
1GND接地
25V提供 5V
3GP9輸入第9數碼引腳,與 BOOT按鈕 相連
4GP8~輸入/輸出第8數碼引腳,10位元PWM訊號
5GP4輸入/輸出第4數碼引腳,12位元類比訊號,I 2 C SDA引腳
6GP5輸入/輸出第5數碼引腳,I 2 C SCL引腳
73V3提供 3.3V
8GND接地
9GP11輸入/輸出第11數碼引腳
10GP7輸入/輸出第7數碼引腳,SPI SS引腳
11GP6~輸入/輸出第6數碼引腳,10位元PWM訊號
12GP10~輸入/輸出第10數碼引腳,10位元PWM訊號,SPI MISO引腳
13GP3輸入/輸出第3數碼引腳,SPI MOSI引腳
14GP2~輸入/輸出第2數碼引腳,10位元PWM訊號,SPI SCK引腳
153V3提供 3.3V
16GND接地
17GND接地
18GP0輸入/輸出第0數碼引腳,12位元類比訊號,UART1 TX引腳
19GP1輸入/輸出第1數碼引腳,12位元類比訊號,UART1 RX引腳
20GP12輸入/輸出第12數碼引腳;與 D4 LED 相連,高電壓亮著
21GP18輸入/輸出第18數碼引腳
22GP19輸入/輸出第19數碼引腳
23GND接地
24RX輸入UART0 RX引腳
25TX輸出UART0 TX引腳
26GP13輸入/輸出第13數碼引腳;與 D5 LED 相連,高電壓亮著
27NC空引腳
28RST低電壓時重置裝置
293V3提供 3.3V
30GND接地
31PWB
32VCC

測試電路
見下文
只是將 LuatOS ESP32-C3 上的 LED 閃動
在下使用 Arduino IDE 編寫程式

在 Additional Boards Manager URLs: 加入
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
並在 Boards Manager: 尋找、下載、安裝 esp32

見下文
安裝 ESP32 後,選擇 ESP32 Arduino > ESP32C3 Dev Module

見下文
在 Flash Mode 選擇 DIO

見下文
在 Programmer 選擇 Esptool

編寫 Sketch 測試
const byte D4_LED = 12;
const byte D5_LED = 13;
const unsigned int DELAY = 500;
void setup() {
	pinMode(D4_LED, OUTPUT);
	pinMode(D5_LED, OUTPUT);
}
void loop() {
	digitalWrite(D4_LED, HIGH);
	digitalWrite(D5_LED, LOW);
	delay(DELAY);
	digitalWrite(D4_LED, LOW);
	digitalWrite(D5_LED, HIGH);
	delay(DELAY);
}

實際效果
見下文
D4 LED 及 D5 LED 閃動
由於 D4 及 D5 分別由 GP12 及 GP13 控制,因此將輸出裝置 LED 連接到 GP12 及 GP13 亦會有相同效果

WS2812B 通孔 LED

即是之前 使用 RP2040微控制器 控制 NeoPixel 介紹的 WS2812B SMD LED
但 WS2812B SMD LED 焊接及測試上比較困難,不過原來 WS2812B 有 通孔的版本

外觀
見下文
見下文
連接電源及接地,並以訊號引腳來控制顏色及光度
與 WS2812B SMD LED 完全相同

引腳
見下文
與 WS2812B SMD 相同,在細小空間中包含非常細小的控制晶片及LED

見下文
與一般通孔LED相同,LED外殼其中一面被 削平 ,即使引腳被裁短仍有方法判斷引腳的功能
編號(削平為1)描述引腳方向功能
1VCC旁引腳DO輸出將控制訊號傳送給下一個地址
2第二長引腳VCC電源
3最長引腳GND接地
4GND旁引腳DI輸入接收控制訊號
但不同生產商削平的方向可能會不同,因此還是需要檢查資料表

測試電路
見下文
接駁 WS2812B 測試

實際效果
見下文
實際效果與之前相同

測試電路2
見下文
以串聯方式接駁 WS2812B 測試

實際效果2
見下文
同樣相同效果

測試電路3
見下文
由於 BOOT按鈕 與 GP9引腳相連,因此可以將 BOOT按鈕 當作 GP9的按鈕操作
BOOT按鈕連接到到上拉電阻,並保持高電壓狀態,BOOT按鈕按下後會連接到 GND
因此 BOOT按鈕按下的狀態 是 LOW 而不是 HIGH ,而且亦要考慮按下及沒有按下的狀態
避免因為 BOOT按鈕按下時 ,資料不斷變化
#include <Adafruit_NeoPixel.h>

const byte LEVEL = 0x10;
const byte CLEAR = 0x00;
const unsigned long COLOR[] = {
	(0UL + CLEAR) << 16 | (0UL + CLEAR) << 8 | CLEAR, // NONE
	(0UL + LEVEL) << 16 | (0UL + CLEAR) << 8 | CLEAR, // RED
	(0UL + CLEAR) << 16 | (0UL + LEVEL) << 8 | CLEAR, // GREEN
	(0UL + CLEAR) << 16 | (0UL + CLEAR) << 8 | LEVEL, // BLUE
	(0UL + LEVEL) << 16 | (0UL + LEVEL) << 8 | CLEAR, // YELLOW
	(0UL + LEVEL) << 16 | (0UL + CLEAR) << 8 | LEVEL, // CYAN
	(0UL + CLEAR) << 16 | (0UL + LEVEL) << 8 | LEVEL, // MAGENTA
	(0UL + LEVEL) << 16 | (0UL + LEVEL) << 8 | LEVEL, // WHITE
};

const unsigned int NUM = 1;
const byte PIN = 2;
const byte CONTROL = 9;
byte i = 0;
bool pressed = false;

Adafruit_NeoPixel rgb = Adafruit_NeoPixel(NUM, PIN);

void setup() {
	rgb.begin();
	pinMode(PIN, INPUT_PULLUP);
}

void loop() {
	if (digitalRead(CONTROL) == LOW && !pressed) {
		pressed = true;
		i++;
		i = i % (sizeof(COLOR) / sizeof(unsigned long));
	} else if (digitalRead(CONTROL) == HIGH && pressed) {
		pressed = false;
	}
	for (unsigned int j = 0; j < NUM; j++) {
		rgb.setPixelColor(j, COLOR[i]);
		rgb.show();
	}
	delay(1);
}

實際效果3
見下文
可以使用 Boot按鈕 作為互動操作

使用 MicroPython

與 Raspberry Pi Pico 相同,除了能夠使用 Arduino 編寫及製作 Sketch 外
亦可以使用 Thonny 以 MicroPython 編寫及製作程式

見下文
使用 Thonny ,到 Run > Configure Interpreter...
  • Which kind of interpreter should Thonny use for running your code? 選擇 MicroPython (ESP32)
  • Port or WebREPL 選擇對應 LuatOS ESP32-C3 的 連接埠
然後按 Install or update MicroPython (esptool)

見下文
先到更多選擇的圖示,按 Show install options

見下文
然後將:
  • Target Port 選擇 LuatOS ESP32-C3 的連接埠
  • MicroPython family 選擇 ESP32-C3
  • variant 選擇 Espressif . ESP32-C3
  • version 按需要選擇版本,在下使用當時最新穩定版本
  • Target address 選擇 0x0 (for MicroPython on ESP8266, ESP32-S3 and ESP32-C3)
  • Install speed 選擇 460800 (supported by some board) 如果不支援,請改用 115200 (default)
  • Flash mode 選擇 dio (next to try if 'keep' doesn't give working result)
  • Flash size 根據裝置的快閃記憶體而選擇
    由於在下的 LuatOS ESP32-C3 使用 32Mb快閃記憶體 ,即是 4MB ,因此選擇 4MB
選擇正確後,便可以按 Install

在下亦製作指令安裝方法
#!/bin/bash
ESPTOOL="/path/of/esptool.py" # change to your esptool path
PORT="/dev/ttyACM0" # change to your ESP32-C3 board port
CHIP="esp32c3"
BUAD="115200" # default speed, your can change to 230400, 460800
BEFORE="default_reset"
AFTER="hard_reset"
MODE="dio"
SIZE="4MB" # change to your ESP32-C3 size
OFFSET="0x0"
FILE="/tmp/firmware"
# uncomment if the same
#ESPTOOL="${HOME}/.arduino*/packages/esp32/tools/esptool_py/*/esptool.py"
wget `curl -sL --request "GET" "https://micropython.org/download/esp32c3/" | grep 'v\([0-9]\+\.\)\+bin"' | sed -r 's/.*"([^"]+)".*/https:\/\/micropython\.org\/\1/g' | sort | tail -1` -O "${FILE}"
python3 $ESPTOOL --port "${PORT}" --chip "${CHIP}" --baud "${BUAD}" --before "${BEFORE}" --after "${AFTER}" write_flash --flash_mode "${MODE}" --flash_size "${SIZE}" --erase-all "${OFFSET}" "${FILE}"
rm "${FILE}"
要使用 esptool 除了到官方下陣或安裝由 Linux發行版 提供版本外
亦可以使用從 Arduino 的 Boards Manager 中安裝亦可
通常路徑是 ${HOME}/.arduino<arduino version>/packages/esp32/tools/esptool_py/<esptool version>/esptool.py

見下文
Thonny 會自動下載及安裝 MicroPython 到

見下文
安裝後按 Close 關閉安裝頁面

見下文
當 MicroPython 安裝到 LuatOS ESP32-C3 後, Thonny 的終端會顯示可以輸入指令

見下文
使用方法與 Raspberry Pi Pico 運行 MicroPython 完全相同

見下文
在下曾經在 Raspberry Pi Pico W 使用 Arduino 建立網頁伺服器
但在下今次改以 MicroPython 建立網頁達至相同效果
import machine, time, socket, network, wifi_config

# connect wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.disconnect()
wlan.connect(wifi_config.ssid, wifi_config.password)
while not wlan.isconnected():
	time.sleep(0.1)
print(wlan.ifconfig())

# create http server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 80))
server.listen(1)

# waiting client
while True:
	client, address = server.accept()
	print(address)
	request = client.recv(4096).decode("UTF-8")
	print(request)
	response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello, world"
	client.send(response.encode("UTF-8"))
	client.close()
網頁伺服器運作後,會顯示 4組 的資料,分別是:
  1. IP地址
  2. 網絡遮罩
  3. 廣播地址
  4. DNS地址
獲取 IP地址 後,便可以使用網頁瀏覽器測試

見下文
能夠連接到 LautOS ESP32-C3 的網頁伺服器

見下文
test

使用 CircuitPython

既然能夠使用 MicroPython , CircuitPython 都可行

見下文
Thonny 同樣有提供安裝 CircuitPython 的程序,但沒有區分不同微控制器的類型
因此選擇 CircuitPython (generic) ,然後按 (esptool)

見下文
然後將:
  • Target Port 選擇 LuatOS ESP32-C3 的連接埠
  • CircuitPython family 選擇 ESP32-C3
  • variant 選擇 LuatOS . Core ESP32C3
  • version 按需要選擇版本,在下使用當時最近版本,即是 8.2.2
  • Target address 選擇 與 MicroPython 的項目即可
  • Install speed 選擇 與 MicroPython 的項目即可
  • Flash mode 選擇 與 MicroPython 的項目即可
  • Flash size 選擇 與 MicroPython 的項目即可
選擇正確後,便可以按 Install

見下文
等待下載及安裝 CircuitPython 到 LuatOS ESP32-C3

見下文
但安裝後卻無法正確運作

在下懷疑是 CircuitPython 的版本太新導致無法正確運作,因此尋找舊版本的 CircuitPython
Adafruit 官方網站的 Amazon Web Services 頁面 ,找到 LuatOS ESP32-C3 另一個版本的 CircuitPython
先前介紹 LautOS ESP32-C3 的外觀時,有一粒 CH343晶片 ,因此在下嘗試安裝 LuatOS ESP32-C3 的 CH343版本

見下文
在更多選項中,按 Select local MicroPython image ...

見下文
選擇支援 CH343 的 LuatOS ESP32-C3 的 CircuitPython

見下文
與之前的設定相同,並等待安裝

見下文
完成後,終於能夠在 LuatOS ESP32-C3 使用 CircuitPython

見下文
為了方便更新,在下亦製作自動下載及寫入的腳本
#!/bin/bash
ESPTOOL="/path/of/esptool.py" # change to your esptool path
PORT="/dev/ttyACM0" # change to your ESP32-C3 board port
CHIP="esp32c3"
BUAD="115200" # default speed, your can change to 230400, 460800
BEFORE="default_reset"
AFTER="hard_reset"
MODE="dio"
SIZE="4MB" # change to your ESP32-C3 size
OFFSET="0x0"
FILE="/tmp/firmware"
# uncomment if the same
#ESPTOOL="${HOME}/.arduino*/packages/esp32/tools/esptool_py/*/esptool.py"
wget `curl -sL --request "GET" "https://adafruit-circuit-python.s3.amazonaws.com/?delimiter=/&prefix=bin/luatos_core_esp32c3_ch343/en_US/" | grep '\.bin<' | sed -r 's/<\/?Key>/\nhttps:\/\/adafruit-circuit-python\.s3\.amazonaws\.com\//g' | grep '\.bin' | sort | tail -1` -O "${FILE}"
python3 $ESPTOOL --port "${PORT}" --chip "${CHIP}" --baud "${BUAD}" --before "${BEFORE}" --after "${AFTER}" write_flash --flash_mode "${MODE}" --flash_size "${SIZE}" --erase-all "${OFFSET}" "${FILE}"
rm "${FILE}"
見下文
安裝正確版本的 CircuitPython 到 LuatOS ESP32-C3 ,再使用 Thonny 選擇 CircuitPython (generic) 執行後
終於能夠終端顯示正確資訊

見下文
同樣地,使用方法與 Raspberry Pi Pico 運行 CircuitPython 完全相同
(只是引腳名稱稍有不同)

但 LuatOS ESP32-C3 運作 CircuitPython 時,仍然需要使用與 Thonny 等於 整合開發環境 來編寫及執行程式
不能像 Raspberry Pi Pico 一般可以直接在 檔案管理員 直接編寫檔案及存取來變更效果

補充資料

在下使用 GP* 的引腳名稱時並出現
AttributeError: 'module' object has no attribute 'GP2'
的錯誤

因此在 Thonny 的終端輸入
import board
print(dir(board))
來檢視 board 的屬性資料,結果傳回
['__class__', '__name__', 'BOOT0', 'BUTTON', 'IO0', 'IO1', 'IO10', 'IO12', 'IO13', 'IO18', 'IO19', 'IO2', 'IO3', 'IO4', 'IO5', 'IO6', 'IO7', 'IO8', 'IO9', 'LED', 'LED2', 'UART', 'board_id']
顯示有一堆 IO* 的引腳名稱卻沒有 GP* ,因此在下改用 IO* ,結果正確
另外還有提供:
  • BOOT按鈕 的 BOOT0 及 BUTTON
  • D4 LED 的 LED
  • D5 LED 的 LED2
令對應引腳的用途更清楚

總結

由於 ESP32C3 與之前的 使用 Arduino IDE 編寫 ESP8266 NodeMCU 程式 的WiFi功能
Mini D1 ESP32 製作 藍牙HID鍵盤 的藍牙功能非常相似
只需要使用相同的方法,便可以做到效果
但在下尋找很多資料都無法以 MicroPython 及 CircuitPython 製作 藍牙HID ,因此唯有暫時放棄
稍後再嘗試

單純比較價錢 LuatOS ESP32C3 是非常便宜,只需要2美金便具備WiFi及藍牙HID功能
而且屬於雙列直插的引腳排列,可以安裝到麵包板上測試
另外 LuatOS ESP32C3 還有一粒內置 GP9按鈕 及 重設按鈕 使用

WS2812B通孔LED 亦是非常方便使用的 LED ,可以在麵包板上使用
由於在下經常忘記引腳的功能,與電源引腳及接地引腳接駁錯誤後
WS2812B 便立即燒毀,總共燒毀了3粒 WS2812B通孔LED

參考資料