การพัฒนาหุ่นยนต์ที่สามารถควบคุมผ่านเครือข่าย WiFi เป็นหนึ่งในแนวทางที่น่าสนใจในโลกของการสร้างโครงการอิเล็กทรอนิกส์และหุ่นยนต์ในปัจจุบัน ในบทความนี้เราจะสร้างหุ่นยนต์โดยใช้ ESP32 ซึ่งเป็นบอร์ดที่มีความสามารถในการเชื่อมต่อ WiFi และใช้งานด้วย Arduino IDE ซึ่งเป็นแพลตฟอร์มที่ใช้กันอย่างแพร่หลายในโครงการอิเล็กทรอนิกส์ต่าง ๆ
ESP32 ได้รับความนิยมอย่างมากในการพัฒนาโปรเจกต์ IoT (Internet of Things) ด้วยความสามารถที่มากมายที่มีอยู่ในชิปเบอร์เดียว ไม่ว่าจะเป็นการเชื่อมต่อ WiFi, Bluetooth, หรือความสามารถในการประมวลผลที่มีประสิทธิภาพ นอกจากนี้ยังมีความสามารถในการสร้างเว็บเซิร์ฟเวอร์ขึ้นมาบน ESP32 ด้วยไลบรารี ESPAsyncWebServer ซึ่งเป็นไลบรารีที่ทำให้การสร้างแอปพลิเคชัน IoT ที่มีการติดต่อกับเว็บแอปพลิเคชันเป็นเรื่องง่ายและรวดเร็วมากขึ้น
ESP32 Car Controller – WIFI แอปพลิเคชั่นมือถือนี้จะแนะนำให้คุณพัฒนารถยนต์อัจฉริยะด้วยบอร์ดพัฒนา esp32 และควบคุมรถอัจฉริยะของคุณผ่านเครือข่าย WIFI
วัตถุประสงค์
- สร้างหุ่นยนต์ที่สามารถควบคุมผ่านเครือข่าย WiFi จาก ESP32
- เรียนรู้การใช้งาน Arduino IDE ในการโปรแกรม ESP32
- สร้างโครงการหุ่นยนต์ที่สามารถเชื่อมต่อและควบคุมผ่านเครือข่าย WiFi
อุปกรณ์ที่ใช้
1. RB-0024 4WD Smart Robot Car Chassis Kits
2. RB-0173 DevKitC V4 ESP32 Development Board
3. RB-0272 ESP32 Expansion Board 38Pins
4. RB-0003 Motor Driver Module L298N
5. RB-0019 รางถ่าน 18650 – 2 ก้อน
6. RB-0025 เสารองแผ่นพีซีบีโลหะแบบเหลี่ยม 8 mm
7. RB-0049 แจ๊กขั้วถ่าน 9 โวลต์ สำหรับ Ardiuno
8. RB-0042 เพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF Rocker Switch)
9. RB-0015 Jumper (F2M) cable wire 20cm Female to Male
10. RB-0021 ถ่านชาร์จ 18650 NCR18650B 3.7v 3400mAh 2 ก้อน
11. RB-0017 Jumper (F2F) cable wire 20cm Female to Female
12. RB-0106 Micro USB Cable Wire 1m for NodeMCU
ขั้นตอนการสร้าง
1.ประกอบหุ่นยนต์และเชื่อมต่อวงจร
บัดกรีสายมอเตอร์ โดย สายสีแดงอยู่ด้านบน และ สายสีดำอยู่ด้านล่าง ทั้ง 4 ตัว
ยึดมอเตอร์เข้ากับโครงหุ่นยนต์ (ด้านล่าง)
ยึดเสา 6 ต้น สำหรับใส่โครงหุ่นยนต์ด้านบน
การต่อวงจร
ยึด Expansion Board (บอร์ดขยายขา ESP32) , โมดูลขับมอเตอร์ และ รางถ่าน เข้ากับโครงหุ่นยนต์ด้านบน
ใส่บอร์ด ESP32 เข้ากับ บอร์ดขยายขา ESP32
ต่อสายไฟ จากรางถ่าน กับ แจ๊กขั้วถ่าน โดย สายสีแดง ต่อ ผ่านสวิตช์ปิดเปิด แล้ว เสียบแจ๊กขั้วถ่าน เข้ากับ DC 6.5 – 16V ของ บอร์ดขยายขา ESP32
ใส่ถ่าน 18650 จำนวน 2 ก้อน และ เมื่อเปิดไฟเข้า ต้องมีไฟติดทั้ง 3 บอร์ด คือ บอร์ดขยายขา ESP32 , บอร์ด ESP32 และ โมดูลขับมอเตอร์
เชื่อมต่อวงจร ระหว่าง บอร์ดขยายขา ESP32 กับ โมดูลขับมอเตอร์
เชื่อมต่อ มอเตอร์ ทั้ง 4 ตัวเข้ากับ โมดูลขับมอเตอร์ (ตรวจสอบการต่อสายและสีของสาย)
ใส่ล้อและยึดน็อตโครงหุ่นยนต์ชั้นบนกับชั้นล่างเข้าด้วยกัน
ภาพรวมการต่อหุ่นยนต์
2.ติดตั้ง Arduino IDE
สิ่งแรกคือการติดตั้ง Arduino IDE เพื่อให้คุณสามารถค้นหา Arduino IDE ใน Google
จากนั้นคุณมีสองทางเลือก
หนึ่งคือการติดตั้งเวอร์ชัน1 หรือเพื่อติดตั้งเวอร์ชัน 2
เราจะติดตั้งเวอร์ชัน 2 เพราะมีคุณสมบัติเพิ่มเติมบางอย่าง แต่ไม่ว่าคุณจะเลือกอะไรมันจะทำงานเช่นกัน ดังนั้นคุณสามารถเลือกอย่างใดอย่างหนึ่ง
ดาวน์โหลด Arduino IDE จากที่นี่
https://www.arduino.cc/en/software
กำหนดค่าให้ รองรับบอร์ด ESP32
ไปที่ File > Preferences
คัดลอกและวางบรรทัดต่อไปนี้ลงในฟิลด์ Boards Manager URLs
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
คลิกไอคอนตัวจัดการบอร์ดที่มุมด้านซ้าย ค้นหา ESP32 และกดปุ่มติดตั้งสำหรับ esp32 โดย Espressif Systems
3. ทดสอบ การเคลื่อนที่ของหุ่นยนต์
การทดสอบนี้ เป็นการตรวจสอบการต่อสายต่างๆ เช่น การเชื่อมต่อสายของมอเตอร์ ทั้ง 4 ตัว รวมทั้งสายอื่นๆ ของหุ่นยนต์ที่เราสร้าง ว่าถูกต้องหรือไม่ ถ้าถูกต้องหุ่นยนต์จะดำเนินการดังนี้
คือ เดินหน้า -> ถอยหลัง -> เลี้ยวซ้าย -> เลี้ยวขวา
และนี่คือโค้ดที่ใช้ทดสอบ
int MA1 = 27; // Motor A1
int MA2 = 26; // Motor A2
int PWM_A = 14; // Speed Motor A
int MB1 = 17; // Motor B1
int MB2 = 16; // Motor B2
int PWM_B = 4; // Speed Motor B
int SPEED = 255; // Speed PWM สามารถปรับความเร็วได้ถึง 0 - 255
void setup() {
//Setup Channel A
pinMode(MA1, OUTPUT); //Motor A1
pinMode(MA2, OUTPUT); //Motor A2
pinMode(PWM_A, OUTPUT); //Speed PWM Motor A
//Setup Channel B
pinMode(MB1, OUTPUT); //Motor B1
pinMode(MB2, OUTPUT); //Motor B2
pinMode(PWM_B, OUTPUT); //Speed PWM Motor B
}
void loop() {
Stop(5000);
Forward(600);
Stop(200);
Backward(600);
Stop(200);
turnLeft(600);
Stop(200);
turnRight(600);
}
void Backward(int time)
{
digitalWrite(MA1, LOW);
digitalWrite(MA2, HIGH);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, HIGH);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, SPEED);
delay(time);
}
void Forward (int time)
{
digitalWrite(MA1, HIGH);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, LOW);
digitalWrite(MB2, HIGH);
analogWrite(PWM_B, SPEED);
delay(time);
}
void turnLeft(int time)
{
digitalWrite(MA1, HIGH);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, LOW);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, 0);
delay(time);
}
void turnRight(int time)
{
digitalWrite(MA1, LOW);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, 0);
digitalWrite(MB1, LOW);
digitalWrite(MB2, HIGH);
analogWrite(PWM_B, SPEED);
delay(time);
}
void Stop(int time)
{
digitalWrite(MA1, LOW);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, 0);
digitalWrite(MB1, LOW);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, 0);
delay(time);
}
ลิงค์โค้ด https://lungmaker.com/code/test-motor-esp32.ino
เชื่อมต่อสาย Micro USB ระหว่าง คอมพิวเตอร์ กับ ESP32 และ ต้องเปิดสวิตช์เพื่อจ่ายไฟจากรางถ่านให้กับหุ่นยนต์ด้วย
เลือกบอร์ด ESP32 ตามรุ่นที่ใช้ เป็น ESP32 Dev Module
เลือก Port โดยไปที่ Tools -> Port -> COM5
(โดย COM5 แต่ละเครื่องจะไม่เหมือนกัน ให้เลือกตามที่ปรากฎ)
คลิกที่ Upload
แสดงการ Upload สำเร็จ
วิดีโอผลลัพธ์การทำงาน การเคลื่อนที่ของหุ่นยนต์ ESP32
ถ้ายังทำงานไม่ถูกต้อง คือ เดินหน้า -> ถอยหลัง -> เลี้ยวซ้าย -> เลี้ยวขวา ให้กลับไปแก้ไขการต่อวงจร การต่อสายต่างๆ เช่น การต่อสายมอเตอร์ จนกว่าจะทำงานถูกต้อง ถึงจะสามารถไปทำงานในขั้นตอนต่อไป
4. ติดตั้ง ไลบรารี่ ESPAsyncWebServer
เขียนโค้ด หุ่นยนต์ ESP32 ควบคุมผ่านเครือข่าย WIFI ดังนี้
#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h>
//#include <analogWrite.h>
#define S_FORWARD 11
#define S_BACKWARD 12
#define S_LEFT 13
#define S_RIGHT 14
#define S_FORWARD_LEFT 15
#define S_FORWARD_RIGHT 16
#define S_BACKWARD_LEFT 17
#define S_BACKWARD_RIGHT 18
#define M_FORWARD 21
#define M_BACKWARD 22
#define M_LEFT 23
#define M_RIGHT 24
#define M_FORWARD_LEFT 25
#define M_FORWARD_RIGHT 26
#define M_BACKWARD_LEFT 27
#define M_BACKWARD_RIGHT 28
#define F_FORWARD 31
#define F_BACKWARD 32
#define F_LEFT 33
#define F_RIGHT 34
#define F_FORWARD_LEFT 35
#define F_FORWARD_RIGHT 36
#define F_BACKWARD_LEFT 37
#define F_BACKWARD_RIGHT 38
#define STOP 0
#define START 1
// Motor A
int motor1Pin1 = 27;
int motor1Pin2 = 26;
int enable1Pin = 14;
// Motor B
int motor2Pin1 = 16;
int motor2Pin2 = 17;
int enable2Pin = 4;
// Setting PWM properties 1
const int freq1 = 30000;
const int pwmChannel = 0;
const int resolution1 = 8;
int dutyCycle = 200;
// Setting PWM properties 1
const int freq2 = 30000;
const int pwmChanne2 = 1;
const int resolution2 = 8;
int dutyCycle2 = 200;
const char* ssid = "MyDevelopmentBoard Car";
const char* password = "12345678";
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
void setup(void)
{
// sets the pins as outputs:
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
// sets the pins as outputs:
pinMode(motor2Pin1, OUTPUT);
pinMode(motor2Pin2, OUTPUT);
pinMode(enable2Pin, OUTPUT);
// configure LED PWM functionalitites
ledcSetup(pwmChannel, freq1, resolution1);
ledcSetup(pwmChanne2, freq2, resolution2);
// attach the channel to the GPIO to be controlled
ledcAttachPin(enable1Pin, pwmChannel);
ledcAttachPin(enable2Pin, pwmChanne2);
Serial.begin(115200);
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
ws.onEvent(onWebSocketEvent);
server.addHandler(&ws);
server.begin();
Serial.println("HTTP server started");
}
void loop()
{
ws.cleanupClients();
}
void rotateMotor1(int x) {
if (x == 1) {
Serial.println("Moving Forward");
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
} else if (x == -1) {
Serial.println("Moving Backward");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, HIGH);
} else {
Serial.println("STOP");
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
}
}
void rotateMotor2(int x) {
if (x == 1) {
Serial.println("Moving Forward");
digitalWrite(motor2Pin1, HIGH);
digitalWrite(motor2Pin2, LOW);
} else if (x == -1) {
Serial.println("Moving Backward");
digitalWrite(motor2Pin1, LOW);
digitalWrite(motor2Pin2, HIGH);
} else {
Serial.println("STOP");
digitalWrite(motor2Pin1, LOW);
digitalWrite(motor2Pin2, LOW);
}
}
void speedControl(int motor1, int motor2) {
ledcWrite(pwmChannel, motor1);
ledcWrite(pwmChanne2, motor2);
}
void processCarMovement(String inputValue)
{
Serial.printf("Got value as %s %d\n", inputValue.c_str(), inputValue.toInt());
switch (inputValue.toInt())
{
case S_FORWARD:
rotateMotor1(1);
rotateMotor2(1);
speedControl(215, 215);
break;
case S_BACKWARD:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(215, 215);
break;
case S_LEFT:
rotateMotor1(1);
rotateMotor2(0);
speedControl(215, 215);
break;
case S_RIGHT:
rotateMotor1(0);
rotateMotor2(1);
speedControl(215, 215);
break;
case S_FORWARD_LEFT:
rotateMotor1(1);
rotateMotor2(1);
speedControl(215, 170);
break;
case S_FORWARD_RIGHT:
rotateMotor1(1);
rotateMotor2(1);
speedControl(170, 215);
break;
case S_BACKWARD_LEFT:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(215, 170);
break;
case S_BACKWARD_RIGHT:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(170, 215);
break;
case M_FORWARD:
rotateMotor1(1);
rotateMotor2(1);
speedControl(235, 235);
break;
case M_BACKWARD:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(235, 235);
break;
case M_LEFT:
rotateMotor1(1);
rotateMotor2(0);
speedControl(215, 215);
break;
case M_RIGHT:
rotateMotor1(0);
rotateMotor2(1);
speedControl(235, 235);
break;
case M_FORWARD_LEFT:
rotateMotor1(1);
rotateMotor2(1);
speedControl(235, 180);
break;
case M_FORWARD_RIGHT:
rotateMotor1(1);
rotateMotor2(1);
speedControl(180, 235);
break;
case M_BACKWARD_LEFT:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(235, 180);
break;
case M_BACKWARD_RIGHT:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(180, 235);
break;
case F_FORWARD:
rotateMotor1(1);
rotateMotor2(1);
speedControl(255, 255);
break;
case F_BACKWARD:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(255, 255);
break;
case F_LEFT:
rotateMotor1(1);
rotateMotor2(0);
speedControl(255, 255);
break;
case F_RIGHT:
rotateMotor1(0);
rotateMotor2(1);
speedControl(255, 255);
break;
case F_FORWARD_LEFT:
rotateMotor1(1);
rotateMotor2(1);
speedControl(255, 180);
break;
case F_FORWARD_RIGHT:
rotateMotor1(1);
rotateMotor2(1);
speedControl(180, 255);
break;
case F_BACKWARD_LEFT:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(255, 180);
break;
case F_BACKWARD_RIGHT:
rotateMotor1(-1);
rotateMotor2(-1);
speedControl(180, 255);
break;
case STOP:
rotateMotor1(0);
rotateMotor2(0);
break;
default:
rotateMotor1(0);
rotateMotor2(0);
break;
}
}
void onWebSocketEvent(AsyncWebSocket *server,
AsyncWebSocketClient *client,
AwsEventType type,
void *arg,
uint8_t *data,
size_t len)
{
switch (type)
{
case WS_EVT_CONNECT:
Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
ws.text(client->id(), String("connected"));
break;
case WS_EVT_DISCONNECT:
Serial.printf("WebSocket client #%u disconnected\n", client->id());
processCarMovement("0");
break;
case WS_EVT_DATA:
AwsFrameInfo *info;
info = (AwsFrameInfo*)arg;
if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT)
{
std::string myData = "";
myData.assign((char *)data, len);
processCarMovement(myData.c_str());
}
break;
case WS_EVT_PONG:
case WS_EVT_ERROR:
break;
default:
break;
}
}
ลิงค์โค้ด https://lungmaker.com/code/robot-esp32-wifi.ino
ติดตั้ง ไลบรารี่ ESPAsyncWebServer
ในการสร้างเว็บเซิร์ฟเวอร์ เราจะใช้ไลบรารี ESPAsyncWebServer ที่ให้วิธีง่ายๆ ในการสร้างเว็บเซิร์ฟเวอร์แบบอะซิงโครนัส ใช้สถาปัตยกรรมแบบ non-blocking ทำให้ไม่มีการบล็อกการทำงานของ MCU (Microcontroller Unit) ในระหว่างการรอคำขอ (request) ซึ่งทำให้ ESP32 สามารถรับและตอบสนองคำขอได้อย่างรวดเร็วและมีประสิทธิภาพ
การติดตั้ง : ไปที่ LIBARY MANAGER ค้นหา ไลบรารี่ ชื่อ ESPAsyncWebServer คลิกที่ INSTALL เพื่อทำการติดตั้ง
คลิก INSTALL ALL เพื่อติดตั้ง ไลบรารี่อื่นๆ ที่เพิ่มเติมเข้ามาด้วย
แสดงการติดตั้ง ไลบรารี่ ESPAsyncWebServer สำเร็จ
เชื่อมต่อสาย Micro USB ระหว่าง คอมพิวเตอร์ กับ ESP32 และ ต้องเปิดสวิตช์เพื่อจ่ายไฟจากรางถ่านให้กับหุ่นยนต์ด้วย
เลือกบอร์ด ESP32 ตามรุ่นที่ใช้ เป็น ESP32 Dev Module
เลือก Port โดยไปที่ Tools -> Port -> COM5
(โดย COM5 แต่ละเครื่องจะไม่เหมือนกัน ให้เลือกตามที่ปรากฎ)
คลิกที่ Upload
แสดงการ Upload สำเร็จ
5. ติดตั้ง แอปพลิเคชั่น ESP32 Car Controller – WIFI
ใช้สมาร์ทโฟนดาวน์ ระบบปฏิบัติการแอนดรอยด์ (Android) ดาวน์โหลดและติดตั้งแอพ ESP32 Car Controller – WIFI จาก Google Play Store
เปิดการเชื่อมต่อ WI-FI แล้วเลือกเชื่อมต่อ MyDevelopmentBoard Car รหัสผ่าน คือ 12345678 ตามที่เราเขียนโค้ดไว้ (สามารถเปลี่ยนได้ตามความต้องการ)
แสดงการเชื่อมต่อสำเร็จ
เปิด แอปพลิเคชั่น ESP32 Car Controller – WIFI
เลือกเปิด ลำดับที่ 2 คือ Simple Remote Plus
เลือกที่ Not Connected เพื่อให้ทำการเชื่อมต่อ
ปุ่มเปลี่ยนเป็น Connected แสดงว่าสามารถเชื่อมต่อได้แล้ว สามารถทดสอบควบคุมรถ ณ ขณะนี้แล้ว
6. ทดสอบควบคุม หุ่นยนต์ ESP32 ควบคุมผ่านเครือข่าย WIFI
วิดีโอผลลัพธ์การทำงาน หุ่นยนต์ ESP32 ควบคุมผ่านเครือข่าย WIFI
การปรับปรุงและการขยาย
- เพิ่มเซนเซอร์: เพิ่มเซนเซอร์ต่าง ๆ เช่น เซนเซอร์ระยะทาง ultrasonic, เซนเซอร์อินฟราเรด หรือเซนเซอร์อื่น ๆ เพื่อเพิ่มความสามารถในการตรวจจับและเคลื่อนที่ของหุ่นยนต์
- การควบคุมผ่านอินเตอร์เน็ต: สามารถเชื่อมต่อหุ่นยนต์กับเซิร์ฟเวอร์อินเตอร์เน็ตเพื่อควบคุมผ่านเว็บไซต์หรือแอพพลิเคชันพร้อมทั้งใช้งานข้อมูลที่เกี่ยวข้องอื่น ๆ จากอินเตอร์เน็ต
- การเพิ่มความสามารถในการใช้งาน: เช่น เพิ่มการตอบสนองด้านเสียง, การตรวจจับวัตถุ, หรือการเดินตามเส้นทาง
สรุป
การใช้หุ่นยนต์ ESP32 ที่สามารถควบคุมผ่าน WiFi ด้วย Arduino IDE มีข้อดีที่น่าสนใจมากมาย:
- การเชื่อมต่อไร้สาย: การใช้ WiFi ในการควบคุมหุ่นยนต์ทำให้ไม่จำเป็นต้องอยู่ใกล้หุ่นยนต์หรือต่อสายผ่าน USB เพื่อควบคุม ซึ่งเพิ่มความสะดวกในการใช้งานและการควบคุมหุ่นยนต์ได้ในระยะทางไกล
- ความยืดหยุ่นในการเชื่อมต่อ: การใช้ WiFi ในการควบคุมหุ่นยนต์สามารถเชื่อมต่อกับเครือข่าย WiFi ที่มีอยู่และสามารถควบคุมหลายหุ่นยนต์พร้อมกันได้ในเครือข่ายเดียวกัน
- ความสามารถในการสื่อสาร: WiFi มีความเร็วในการสื่อสารสูง ทำให้สามารถส่งข้อมูลไป-มาระหว่างหุ่นยนต์กับอุปกรณ์ควบคุมได้อย่างรวดเร็วและมีประสิทธิภาพ
- การทำงานแบบเสถียร: การเชื่อมต่อผ่าน WiFi ทำให้หุ่นยนต์สามารถทำงานอย่างต่อเนื่องโดยไม่มีการหยุดพัก เนื่องจากไม่จำเป็นต้องกลับมาต่อสายหรือเปลี่ยนโหมดการเชื่อมต่อ
- การทดสอบและพัฒนา: การใช้ WiFi ในการควบคุมหุ่นยนต์ทำให้สามารถทดสอบและพัฒนาซอฟต์แวร์ได้อย่างรวดเร็วและสะดวก เนื่องจากสามารถอัปโหลดโปรแกรมไปยังหุ่นยนต์ผ่านเครือข่าย WiFi ได้โดยตรง
- ความสามารถในการสร้างและควบคุมเครือข่าย: ESP32 มีความสามารถในการเป็น Access Point หรือ Station ในเครือข่าย WiFi ทำให้สามารถสร้างเครือข่ายหรือเข้าร่วมเครือข่ายที่มีอยู่ได้ตามความต้องการ