ESP32-C3 Super Mini là board ESP32-C3 siêu nhỏ gọn, rất hợp làm IoT “nhét hộp” (tracker, cảm biến pin, gateway mini). Điểm quan trọng nhất khi làm dự án thật là nắm chắc pinout để khỏi cắm nhầm (đặc biệt I2C/SPI/UART) và tránh những chân có thể ảnh hưởng boot/nạp.



1) Pinout tổng quan
Nguồn
- 5V: cấp nguồn 5V (thường từ USB hoặc nguồn ngoài 5V)
- 3V3: nguồn 3.3V (cấp trực tiếp nếu bạn có regulator 3.3V chuẩn)
- G (GND): mass
Digital / ADC / nhóm chức năng
- GPIO đa năng: dùng cho Digital/PWM/I2C/SPI/UART (ESP32-C3 cho phép map khá linh hoạt)
Pinout trên ảnh cho mapping như sau:
| Nhóm | Tên trên ảnh | GPIO |
| ADC | A0 | GPIO0 |
| ADC | A1 | GPIO1 |
| ADC | A2 | GPIO2 |
| ADC | A3 | GPIO3 |
| ADC / SPI SCK | A4 / SCK | GPIO4 |
| ADC / SPI MISO | A5 / MISO | GPIO5 |
| SPI MOSI | MOSI | GPIO6 |
| SPI SS/CS | SS | GPIO7 |
| I2C SDA | SDA | GPIO8 |
| I2C SCL | SCL | GPIO9 |
| GPIO thêm | (Digital) | GPIO10 |
| UART RX | RX | GPIO20 |
| UART TX | TX | GPIO21 |
✅ Tóm lại cho dự án:
- I2C: SDA=GPIO8, SCL=GPIO9
- SPI: SCK=GPIO4, MISO=GPIO5, MOSI=GPIO6, CS=GPIO7
- UART: RX=GPIO20, TX=GPIO21
2) 2 nút quan trọng: BOOT và RST
Trên board có 2 nút:
- BOOT: dùng để vào chế độ nạp (bootloader) khi gặp lỗi upload/không nhận cổng.
- RST: reset chip.
Cách vào bootloader (thường dùng khi Arduino IDE không thấy port / upload fail):
- Giữ BOOT
- Nhấn RST rồi thả RST
- Thả BOOT
- Upload lại
Lưu ý quan trọng: Trên pinout của bạn, SCL = GPIO9. Ở nhiều board ESP32-C3, các chân kiểu này có thể “nhạy” lúc boot. Nếu bạn gắn thiết bị I2C kéo mức không đúng ngay khi khởi động (đặc biệt kéo xuống), có thể gây tình trạng khó nạp/khó boot. Cách an toàn: dùng pull-up I2C (4.7k–10k lên 3.3V) và tránh mạch ngoại vi “giữ thấp” lúc vừa cấp nguồn.
3) Arduino IDE chọn board gì?
Trong Arduino IDE bạn có thể chọn loại board là ESP32 C3 Dev Module hoặc XIAO_ESP32C3
Nếu gặp lỗi “No ports discovered”:
- Đổi cáp USB-C loại data (rất nhiều dây chỉ sạc)
- Đổi cổng USB / bỏ hub
- Thử vào bootloader bằng BOOT+RST như hướng dẫn ở trên
- Trên Windows: check Device Manager xem có COM port mới không
- Trên macOS: mở Terminal, check /dev/cu.* (thường sẽ có usbmodem)
4) Ví dụ code thực chiến theo đúng pinout
A) I2C scan (SDA=8, SCL=9)
#include <Wire.h>
void setup() {
Serial.begin(115200);
Wire.begin(8, 9); // SDA, SCL theo pinout của bạn
Serial.println(“I2C scan…”);
for (uint8_t addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
Serial.print(“Found I2C device at 0x”);
Serial.println(addr, HEX);
}
}
}
void loop() {}
B) SPI (SCK=4, MISO=5, MOSI=6, CS=7)
#include <SPI.h>
static const int PIN_CS = 7;
void setup() {
Serial.begin(115200);
SPI.begin(4, 5, 6, PIN_CS); // SCK, MISO, MOSI, SS/CS
pinMode(PIN_CS, OUTPUT);
digitalWrite(PIN_CS, HIGH);
Serial.println(“SPI ready”);
}
void loop() {}
C) UART thiết bị ngoài (RX=20, TX=21)
HardwareSerial SerialAT(1);
void setup() {
Serial.begin(115200);
SerialAT.begin(9600, SERIAL_8N1, 20, 21); // RX, TX theo pinout
Serial.println(“UART ready”);
}
void loop() {
if (SerialAT.available()) Serial.write(SerialAT.read());
if (Serial.available()) SerialAT.write(Serial.read());
}
5) Gợi ý “cắm dây chuẩn” cho dự án IoT (đỡ sai)
- Thiết bị I2C (OLED, sensor): VCC 3.3V, GND, SDA=8, SCL=9
- Thiết bị SPI (NRF24, SD, TFT SPI): SCK=4, MISO=5, MOSI=6, CS=7, thêm CE/IRQ tùy module
- Module cần UART (GPS/4G/Serial sensor): RX=20, TX=21 (nhớ nối chéo TX↔RX)
6) Lỗi thường gặp & cách cứu (không nhận cổng, upload fail, treo boot do ngoại vi kéo mức)
Phần này dành cho đúng tình huống “đang làm dự án thật”: cắm thêm module vào là board không nhận cổng, upload fail, hoặc cứ reset là treo. Với ESP32-C3 Super Mini (Tenstar Robot), đa phần lỗi rơi vào 3 nhóm dưới đây.
6.1 Không nhận cổng USB / Arduino IDE báo “No ports discovered”
Triệu chứng
- Arduino IDE không thấy COM/Port
- Chỉ thấy “No ports discovered”
- Cắm USB vào nhưng máy tính không phản ứng hoặc chập chờn
Nguyên nhân phổ biến
- Cáp USB-C chỉ sạc (không có data)
- Cổng USB/hub yếu nguồn hoặc chập chờn
- Board đang kẹt trạng thái boot do ngoại vi kéo mức sai hoặc firmware treo nặng
- Driver/permission (đặc biệt trên Windows/macOS)
Cách cứu nhanh (làm theo thứ tự)
- Đổi sang cáp USB-C data (cách nhanh nhất để loại trừ 80% lỗi)
- Đổi cổng USB khác, bỏ hub, cắm thẳng vào máy
- Thử reset:
- Nhấn RST 1 lần → xem port có xuất hiện lại không
- Ép vào bootloader:
- Giữ BOOT
- Nhấn RST rồi thả RST
- Thả BOOT
- Mở lại Arduino IDE và thử upload
- Nếu vẫn không thấy port:
- Rút hết module ngoại vi (GPS/4G/I2C/SPI), chỉ để board trống → cắm lại USB
- Trên macOS: kiểm tra có thiết bị /dev/cu.* mới xuất hiện không
- Trên Windows: mở Device Manager xem có COM mới không (nếu không có thì thường là do cáp/nguồn/board kẹt boot)
6.2 Upload fail / “Failed to connect” / nạp code lúc được lúc không
Triệu chứng
- Upload đứng ở “Connecting…”
- Báo lỗi “Failed to connect”
- Nạp được khi board trống, nhưng gắn module vào thì fail
Nguyên nhân phổ biến
- Chân liên quan boot/strap bị kéo mức sai lúc khởi động
- Thiết bị ngoại vi dùng chung chân UART/boot gây xung đột
- Nguồn không ổn định (tụ lọc thiếu, dây nguồn mảnh, module 4G/GPS gây sụt áp)
Cách cứu nhanh
- Thử upload ở chế độ bootloader thủ công (BOOT + RST như trên).
- Tháo ngoại vi ra trước khi nạp, nạp xong mới gắn lại (đặc biệt module “kéo tín hiệu” mạnh).
- Nếu bạn đang dùng UART ngoài:
- Tránh để thiết bị UART “spam” dữ liệu ngay khi boot (có thể làm rối quá trình nạp).
- Nếu nghi nguồn:
- Dùng nguồn USB tốt hơn / cáp ngắn hơn
- Thêm tụ gần board: 100nF + 10µF (tối thiểu) trên rail 3.3V, và nếu có 4G thì nên có tụ lớn hơn gần module (tuỳ thiết kế).
6.3 Treo boot / reset liên tục khi gắn I2C, SPI, hoặc module “kéo mức”
Đây là lỗi nhiều người gặp nhất khi làm IoT: board chạy OK khi trống, nhưng gắn thêm cảm biến/màn hình/module vào là treo.
Case A: I2C treo do SDA/SCL bị giữ LOW
Trên pinout của bạn:
- SDA = GPIO8
- SCL = GPIO9
Triệu chứng
- Treo ngay lúc khởi động
- Code chạy nhưng I2C không hoạt động, hoặc treo ở Wire.begin() / Wire.requestFrom()
Nguyên nhân
- Thiết bị I2C/cáp dài giữ SDA/SCL ở mức thấp
- Thiếu pull-up hoặc pull-up quá yếu
- Module cấp sai mức điện áp (5V logic)
Cách cứu
- Đảm bảo I2C chạy 3.3V (nếu module I2C 5V logic → cần level shifting)
- Thêm pull-up 4.7k–10k từ SDA/SCL lên 3.3V (nhiều module đã có sẵn, nhưng không phải lúc nào cũng đủ)
- Nếu treo ngẫu nhiên:
- Giảm tốc độ I2C: dùng Wire.setClock(100000);
- Rút ngắn dây, tránh đi chung với dây nguồn nhiễu (đặc biệt gần module 4G)
Case B: SPI lỗi do CS/SS không được kéo đúng mức khi boot
SPI của bạn:
- SCK=GPIO4, MISO=GPIO5, MOSI=GPIO6, CS=GPIO7
Triệu chứng
- Thỉnh thoảng boot được, thỉnh thoảng treo
- Module SPI nóng/đơ
- SD/NRF/TFT hoạt động chập chờn
Cách cứu
- Đặt CS (GPIO7) là OUTPUT và kéo HIGH ngay từ đầu setup() (tránh module bị chọn nhầm)
- Nếu nhiều thiết bị SPI: mỗi thiết bị 1 CS riêng, và luôn đảm bảo các CS khác HIGH.
Case C: UART xung đột / thiết bị ngoài làm board “khó thở” lúc boot
UART của bạn:
- RX=GPIO20, TX=GPIO21
Triệu chứng
- Gắn GPS/4G vào UART thì upload khó hoặc chạy treo
- Serial Monitor bị loạn
Cách cứu
- Khi upload: tháo TX/RX của module ra (hoặc dùng jumper/công tắc debug)
- Sau khi boot ổn: mới cấp nguồn cho module hoặc mới gắn UART vào (nếu thiết kế phần cứng cho phép)
6.4 Checklist “cứu hộ” 60 giây (khi đang bí)
- Rút hết module ngoại vi → chỉ để board + USB
- BOOT + RST vào bootloader → upload lại “blink/hello”
- Cắm lại từng module một-by-một:
- Ưu tiên test I2C scan trước (SDA=8 SCL=9)
- Test UART echo (RX=20 TX=21)
- Test SPI init (SCK=4 MISO=5 MOSI=6 CS=7)
- Khi module nào cắm vào là chết → khoanh vùng:
- Sai điện áp? (5V/3.3V)
- Kéo mức LOW? (I2C/SPI CS)
- Nguồn sụt áp? (4G)
6.5 Gợi ý thiết kế “đỡ khổ” cho dự án thật
- Làm jumper/công tắc debug cho UART (để lúc nạp khỏi rút dây)
- Tách nguồn cho module “ngốn dòng” (4G) và thêm tụ lớn gần module
- Với I2C: dây ngắn, pull-up chuẩn, tránh 5V logic
- Với SPI: CS kéo HIGH mặc định, không để floating
7) Tổng kết: chọn đúng cách làm để board “luôn ổn định”
ESP32-C3 Super Mini (Tenstar Robot) là một board rất đáng dùng cho các dự án IoT nhỏ gọn, nhưng để “lên sản phẩm” mượt thì bạn cần nhớ 3 nguyên tắc:
- Pinout rõ ràng ngay từ đầu
Lưu lại pinout (ảnh + ghi chú) cho đúng biến thể board bạn đang dùng. Đặc biệt:
- I2C: SDA=GPIO8, SCL=GPIO9
- SPI: SCK=GPIO4, MISO=GPIO5, MOSI=GPIO6, CS=GPIO7
- UART: RX=GPIO20, TX=GPIO21
- Nguồn ổn định là ưu tiên số 1
Phần lớn lỗi treo/khởi động lại đến từ sụt áp hoặc nhiễu nguồn khi gắn thêm module (đặc biệt 4G/GPS). Khi thiết kế thật, hãy có tụ lọc hợp lý và đường nguồn gọn gàng. - Tránh ngoại vi “kéo mức” làm hỏng boot
Nếu cắm thêm I2C/SPI/UART mà board khó nạp hoặc treo boot, hãy nghĩ ngay đến:
- I2C thiếu pull-up / bị giữ LOW
- SPI CS không kéo HIGH mặc định
- UART bị thiết bị ngoài “spam” lúc boot
Và luôn có phương án BOOT+RST để cứu nhanh.

