2023-09-02

試用 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引腳 相連
閒置時為低電壓時關閉,高電壓時亮著

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

測試電路
見下文
只是將 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) 描述 引腳 方向 功能
1 VCC旁引腳 DO 輸出 將控制訊號傳送給下一個地址
2 第二長引腳 VCC 電源
3 最長引腳 GND 接地
4 GND旁引腳 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

參考資料

沒有留言 :

張貼留言