Hello everyone,
I have made an wifi controlled car Iβm having trouble uploading code to my Wemos D1 R2 (ESP8266). Every time I try, Arduino IDE shows this error:
"ESP8266 Wemos D1 R2 PermissionError 13 when uploading
A fatal esptool.py error occurred: Cannot configure port, something went wrong.
Original message: PermissionError(13, 'A device attached to the system is not functioning.', None, 31)
Serial port COM8"
Details:
- Board: Wemos D1 R2 & mini
- Chip: ESP8266 (WiFi 802.11 b/g/n)
- USB-to-Serial: CH340
- Arduino IDE version: 2.2.1
- OS: Windows 10 64-bit
- USB cable: Branded data cable (not USB-C)
- COM ports tested: COM8 (system-assigned), previously tried COM14
What Iβve tried so far:
- Installed the latest CH340 driver from WCH website
- Closed Serial Monitor and any other programs using COM ports
- Tried multiple USB ports (front and rear)
- Manual reset during upload
- Verified in Device Manager β Wemos appears on COM8
Even though Arduino IDE sometimes says βDone uploadingβ, the error still appears and the car does not respond.
- What is causing this PermissionError 13?
- How can I upload my code successfully to the Wemos?
My code
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
// ---------- Wi-Fi Hotspot ----------
const char* ssid = "MyCar";
const char*
// ---------- Motor Pins (adjust if needed) ----------
#define M1A D1
#define M1B D2
#define M2A D3
#define M2B D4
#define M3A D5
#define M3B D6
#define M4A D7
#define M4B D8
ESP8266WebServer server(80);
// ---------- HTML Web Page ----------
const char htmlPage[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>WiFi Car Control</title>
<style>
body {font-family: Arial; text-align:center; margin-top:40px;}
button {width:120px; height:60px; font-size:20px; margin:6px; border-radius:10px;}
</style>
</head>
<body>
<h2>π WiFi Car Controller</h2>
<button onclick="fetch('/forward')">Forward</button><br>
<button onclick="fetch('/left')">Left</button>
<button onclick="fetch('/stop')">Stop</button>
<button onclick="fetch('/right')">Right</button><br>
<button onclick="fetch('/backward')">Backward</button>
</body>
</html>
)rawliteral";
// ---------- Motor Control ----------
void stopMotors() {
digitalWrite(M1A, LOW); digitalWrite(M1B, LOW);
digitalWrite(M2A, LOW); digitalWrite(M2B, LOW);
digitalWrite(M3A, LOW); digitalWrite(M3B, LOW);
digitalWrite(M4A, LOW); digitalWrite(M4B, LOW);
delay(5);
}
void forward() {
digitalWrite(M1A, HIGH); digitalWrite(M1B, LOW);
digitalWrite(M2A, HIGH); digitalWrite(M2B, LOW);
digitalWrite(M3A, HIGH); digitalWrite(M3B, LOW);
digitalWrite(M4A, HIGH); digitalWrite(M4B, LOW);
delay(10);
}
void backward() {
digitalWrite(M1A, LOW); digitalWrite(M1B, HIGH);
digitalWrite(M2A, LOW); digitalWrite(M2B, HIGH);
digitalWrite(M3A, LOW); digitalWrite(M3B, HIGH);
digitalWrite(M4A, LOW); digitalWrite(M4B, HIGH);
delay(10);
}
void left() {
digitalWrite(M1A, LOW); digitalWrite(M1B, HIGH);
digitalWrite(M2A, HIGH); digitalWrite(M2B, LOW);
digitalWrite(M3A, LOW); digitalWrite(M3B, HIGH);
digitalWrite(M4A, HIGH); digitalWrite(M4B, LOW);
delay(10);
}
void right() {
digitalWrite(M1A, HIGH); digitalWrite(M1B, LOW);
digitalWrite(M2A, LOW); digitalWrite(M2B, HIGH);
digitalWrite(M3A, HIGH); digitalWrite(M3B, LOW);
digitalWrite(M4A, LOW); digitalWrite(M4B, HIGH);
delay(10);
}
// ---------- Setup ----------
void setup() {
Serial.begin(115200);
Serial.println("\nStarting WiFi Car Controller...");
// Motor pins
int pins[] = {M1A, M1B, M2A, M2B, M3A, M3B, M4A, M4B};
for (int i = 0; i < 8; i++) pinMode(pins[i], OUTPUT);
stopMotors();
// Start Access Point
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
Serial.print("Access Point: "); Serial.println(ssid);
Serial.print("IP Address: "); Serial.println(WiFi.softAPIP());
// Web routes
server.on("/", []() { server.send(200, "text/html", htmlPage); });
server.on("/forward", []() { forward(); server.send(200, "text/plain", "Moving Forward"); });
server.on("/backward", []() { backward(); server.send(200, "text/plain", "Moving Backward"); });
server.on("/left", []() { left(); server.send(200, "text/plain", "Turning Left"); });
server.on("/right", []() { right(); server.send(200, "text/plain", "Turning Right"); });
server.on("/stop", []() { stopMotors(); server.send(200, "text/plain", "Stopped"); });
server.begin();
Serial.println("Web server started.");
}
// ---------- Main Loop ----------
void loop() {
server.handleClient();
yield(); // prevent WDT resets
}








