Nếu bạn dùng ESP32-WROOM-32 + Arduino IDE, cách nạp firmware (upload code) đơn giản nhất là qua cáp USB.
Bước 1: Cài Arduino IDE
Tải và cài:
Bước 2: Cài board ESP32
Trong Arduino IDE:
File → Preferences
Thêm URL này vào “Additional Boards Manager URLs”:
https://espressif.github.io/arduino-esp32/package_esp32_index.json
Sau đó:
Tools → Board → Boards Manager
Tìm:
esp32
Cài:
ESP32 by Espressif Systems. (Arduino Docs)
Bước 3: Kết nối ESP32
Dùng cáp Micro-USB hoặc USB-C tùy board.
Lưu ý:
- Nhiều cáp chỉ có chức năng sạc.
- Nếu máy tính không thấy cổng COM, hãy thử cáp khác. (OceanRemote)
Bước 4: Chọn đúng board
Vào:
Tools
└── Board
└── ESP32 Arduino
└── ESP32 Dev Module
Đối với ESP32-WROOM-32, lựa chọn ESP32 Dev Module thường là đúng. (OceanRemote)
Bước 5: Chọn cổng COM
Vào:
Tools
└── Port
Ví dụ:
COM3
COM5
COM8
Rút ESP32 ra rồi cắm lại:
- Cổng nào xuất hiện thêm chính là ESP32.
Bước 6: Nạp chương trình thử
Dán code:
void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.println("ESP32 OK");
delay(1000);
}
Nhấn nút:
Upload (→)
Arduino IDE sẽ:
- Compile.
- Kết nối bootloader.
- Nạp firmware vào Flash.
- Reset ESP32. (Espressif Systems)
Nếu bị lỗi “Failed to connect to ESP32”
Đây là lỗi phổ biến nhất.
Khi IDE hiện:
Connecting.....
Hãy:
- Nhấn giữ nút BOOT trên ESP32.
- Bấm Upload.
- Khi IDE bắt đầu chạy phần trăm upload, thả nút BOOT. (OceanRemote)
Nếu vẫn không nhận COM
ESP32 thường dùng chip USB-UART:
- CP2102
- CH340
Bạn có thể cần cài driver tương ứng.
Driver CP210x
Driver CH340
Bước 7: Mở Serial Monitor
Sau khi nạp thành công:
Tools
└── Serial Monitor
Baud rate:
115200
Bạn sẽ thấy:
ESP32 OK
ESP32 OK
ESP32 OK
Kiểm tra trước khi nạp code Follow-Me
Trước khi nạp code BLE Follow-Me, hãy cho mình biết:
- Bạn dùng Arduino IDE 1.8.x hay 2.x?
- ESP32 board package đang là phiên bản mấy (2.x hay 3.x)?
- Board ESP32 của bạn dùng chip USB:
- CP2102
- CH340
- hay CH9102?
Chỉ cần gửi ảnh mặt trước và mặt sau của board ESP32-WROOM-32, mình sẽ chỉ chính xác:
- driver cần cài,
- board cần chọn,
- và chỉnh lại code BLE/L298N để chạy ngay trên phiên bản ESP32 của bạn.
-
#include <BLEDevice.h>#include <BLEUtils.h>#include <BLEScan.h>#include <BLEAdvertisedDevice.h>// ================= MOTOR =================#define IN1 25#define IN2 26#define IN3 27#define IN4 14#define ENA 33#define ENB 32const char* TARGET_NAME = “FOLLOW_ME”;BLEScan* pBLEScan;int filteredRSSI = -100;// ================= MOTOR FUNCTIONS =================void motorForward(){digitalWrite(IN1, HIGH);digitalWrite(IN2, LOW);digitalWrite(IN3, HIGH);digitalWrite(IN4, LOW);analogWrite(ENA, 180);analogWrite(ENB, 180);}void motorBackward(){digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);digitalWrite(IN3, LOW);digitalWrite(IN4, HIGH);analogWrite(ENA, 150);analogWrite(ENB, 150);}void motorStop(){analogWrite(ENA, 0);analogWrite(ENB, 0);}// ================= BLE CALLBACK =================class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks{void onResult(BLEAdvertisedDevice device){std::string name = device.getName();if(name == TARGET_NAME){int rssi = device.getRSSI();filteredRSSI =(0.8 * filteredRSSI) +(0.2 * rssi);Serial.print(“FOUND “);Serial.print(TARGET_NAME);Serial.print(” RSSI=”);Serial.println(filteredRSSI);}}};// ================= SETUP =================void setup(){Serial.begin(115200);pinMode(IN1, OUTPUT);pinMode(IN2, OUTPUT);pinMode(IN3, OUTPUT);pinMode(IN4, OUTPUT);pinMode(ENA, OUTPUT);pinMode(ENB, OUTPUT);motorStop();BLEDevice::init(“”);pBLEScan = BLEDevice::getScan();pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());pBLEScan->setActiveScan(true);Serial.println(“BLE Follow-Me Start”);}// ================= LOOP =================void loop(){BLEScanResults results =pBLEScan->start(2, false);Serial.print(“Filtered RSSI: “);Serial.println(filteredRSSI);if(filteredRSSI > -55){Serial.println(“TOO CLOSE -> BACKWARD”);motorBackward();}else if(filteredRSSI > -65){Serial.println(“GOOD DISTANCE -> STOP”);motorStop();}else if(filteredRSSI > -90){Serial.println(“TOO FAR -> FORWARD”);motorForward();}else{Serial.println(“SIGNAL LOST -> STOP”);motorStop();}pBLEScan->clearResults();delay(300);}
