Áp dụng cho ESP32-S3-DevKitC N16R8 CAM có khe microSD on-board
Mục tiêu: dùng thẻ ổn định, không crash, không xung đột camera, chạy lâu
Mục tiêu bài học
Sau bài này, bạn sẽ:
- Hiểu microSD trên board CAM hoạt động như thế nào
- Phân biệt SD (SPI) và SD_MMC (4-bit)
- Biết nên dùng mode nào cho ESP32-S3 CAM
- Format thẻ đúng chuẩn (tránh mount fail)
- Test đọc / ghi / tạo file ổn định
- Tránh các lỗi phổ biến:
SD mount failed, reset ngẫu nhiên, lỗi xung đột GPIO
Tổng quan: microSD trên ESP32-S3-DevKitC CAM
MicroSD dùng để làm gì?
- Lưu ảnh chụp từ camera
- Lưu log, dữ liệu cảm biến
- Dùng cho các dự án:
- Camera nhật ký
- Camera an ninh
- Xiaozhi AI (ghi file tạm, cache)
microSD không phải bộ nhớ chính
- ❌ Không thay Flash / PSRAM
- ✅ Chỉ dùng để lưu dữ liệu
1. MicroSD pinout trên ESP32-S3-DevKitC N16R8 CAM
Trên board CAM, microSD đã được nối sẵn vào ESP32-S3.
Các chân microSD thường dùng
| Tín hiệu | GPIO |
|---|---|
| SD_CMD | GPIO38 |
| SD_CLK | GPIO39 |
| SD_DATA0 | GPIO40 |
| SD_DATA1 | GPIO41 |
| SD_DATA2 | GPIO42 |
| SD_DATA3 | GPIO43 |
⚠️ Các GPIO này dùng chung bus SD_MMC
❌ Không nên dùng cho ngoại vi khác
2. SD (SPI) vs SD_MMC (4-bit)
2.1. SD (SPI mode)
Đặc điểm
- Dùng giao tiếp SPI
- Ít chân hơn
- Chậm hơn
Ưu điểm
- Dễ debug
- Ít lỗi với board custom
Nhược điểm
- ❌ Trên board CAM: không tối ưu
- ❌ Dễ xung đột SPI với TFT / module khác
2.2. SD_MMC (4-bit mode) – KHUYẾN NGHỊ ✅
Đặc điểm
- Giao tiếp song song 4-bit
- Tốc độ cao
- Được Espressif tối ưu cho camera
Ưu điểm
- ✅ Ổn định
- ✅ Tốc độ tốt
- ✅ Ít xung đột camera
? Với ESP32-S3-DevKitC CAM: LUÔN ưu tiên SD_MMC
3. Chuẩn format thẻ microSD (rất quan trọng)
Dung lượng khuyến nghị
- 4GB – 32GB (SDHC)
- ❌ Tránh thẻ > 64GB cho người mới
Chuẩn format
- FAT32
- Allocation size: 32KB
- ❌ Không dùng exFAT
Kiểm tra thẻ
- Thẻ fake → lỗi mount ngẫu nhiên
- Ưu tiên thẻ chính hãng (Sandisk, Kingston…)
4. Thư viện cần dùng (Arduino IDE)
#include "FS.h"
#include "SD_MMC.h"
❌ Không dùng thư viện
SD.h(SPI) trong bài này
5. Code
Code 1 — Mount microSD bằng SD_MMC (chuẩn)
void sdSetup() {
if (!SD_MMC.begin()) {
Serial.println("SD_MMC mount failed");
return;
}
uint8_t cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD card attached");
return;
}
Serial.println("SD card mounted");
}
Code 2 — Kiểm tra thông tin thẻ
void sdInfo() {
uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %llu MB\n", cardSize);
}
Code 3 — Tạo & ghi file test
void sdWriteTest() {
File file = SD_MMC.open("/test.txt", FILE_WRITE);
if (!file) {
Serial.println("Failed to open file for writing");
return;
}
file.println("IoTLabs");
file.println("Nghien cuu - Sang tao - Thu nghiem");
file.println("Website: https://iotlabs.vn");
file.close();
Serial.println("Write OK");
}
Code 4 — Đọc file test
void sdReadTest() {
File file = SD_MMC.open("/test.txt");
if (!file) {
Serial.println("Failed to open file for reading");
return;
}
while (file.available()) {
Serial.write(file.read());
}
file.close();
}
Code 5 — Test đọc/ghi trong setup()
void setup() {
Serial.begin(115200);
delay(1000);
sdSetup();
sdInfo();
sdWriteTest();
sdReadTest();
}
void loop() {
}
⚠️ 6. Các lỗi microSD RẤT hay gặp & cách tránh
❌ Lỗi 1: SD_MMC mount failed
Nguyên nhân
- Thẻ format sai
- Thẻ kém chất lượng
- Nguồn yếu
Cách fix
- Format lại FAT32
- Đổi thẻ khác
- Cấp nguồn ổn định
❌ Lỗi 2: Reset ngẫu nhiên khi ghi file
Nguyên nhân
- Sụt áp
- Ghi file quá nhanh
Cách fix
- Delay hợp lý
- Không ghi liên tục trong loop
- Dùng nguồn ngoài tốt
❌ Lỗi 3: Xung đột GPIO
Nguyên nhân
- Dùng GPIO SD cho SPI / I2C
Cách fix
- ❌ Không dùng GPIO 38–43 cho ngoại vi khác
7. Best practices khi dùng microSD với camera
- Luôn mount SD trước khi init camera
- Kiểm tra
SD_MMC.begin()thành công - Tạo thư mục rõ ràng:
/img/ /log/ - Chuẩn bị logic xoay vòng file (Bài 11)
- microSD là nền tảng bắt buộc cho camera nhật ký, camera an ninh, nếu microSD không ổn định → dự án sẽ fail sớm.


