- ESP32 RC Cars เป็น ระบบกล้องควบคุมระยะไกลที่ใช้ ESP32-CAM ซึ่งทำทั้งการสตรีมวิดีโอแบบเรียลไทม์และการควบคุมมอเตอร์·เซอร์โวผ่าน WebSocket
- แอปพลิเคชันเซิร์ฟเวอร์ Python จัดการ การสื่อสารผ่าน WebSocket และมีเว็บอินเทอร์เฟซให้ดูภาพจากอุปกรณ์ ESP32 และควบคุมผ่านเบราว์เซอร์ได้
- ฟีเจอร์หลัก ได้แก่ การสตรีมวิดีโอสด จาก ESP32-CAM, การควบคุมมอเตอร์·เซอร์โวด้วยคำสั่งผ่าน WebSocket, timeout อัตโนมัติที่คืนค่าสู่สถานะเริ่มต้นเมื่อไม่ได้รับคำสั่งควบคุม และแคนวาสวิดีโอสำหรับหลายไคลเอนต์
- ฮาร์ดแวร์ต้องใช้ AI Thinker หรือ ESP32-CAM ที่เข้ากันได้, มอเตอร์·เซอร์โวที่เชื่อมต่อกับ GPIO, แหล่งจ่ายไฟ 5V ที่เสถียร และเครือข่าย Wi-Fi ส่วน SD card เป็นอุปกรณ์เสริม
- คำสั่งควบคุมอยู่ในรูปแบบ
MOTOR:<speed>, SERVO:<angle>, CONTROL:<speed>:<angle> และเซิร์ฟเวอร์จะจัดเฟรมวิดีโอจากไคลเอนต์ ESP32 หลายตัวเป็นตารางแล้วสตรีมไปยังเว็บอินเทอร์เฟซ
ภาพรวมโปรเจกต์
- ESP32 RC Cars เป็นตัวอย่างระบบกล้องควบคุมระยะไกลที่ใช้ ESP32
- ESP32-CAM ส่งวิดีโอแบบเรียลไทม์ผ่าน WebSocket และมอเตอร์กับเซอร์โวถูกควบคุมด้วยคำสั่ง WebSocket
- แอปพลิเคชันเซิร์ฟเวอร์ Python จัดการการสื่อสารผ่าน WebSocket และทำให้สามารถดูและควบคุมอุปกรณ์ ESP32 จากเว็บอินเทอร์เฟซได้
- วิดีโอเดโม: https://youtu.be/OubYFXmvA1E
ฟีเจอร์หลัก
- ส่ง การสตรีมวิดีโอสด จาก ESP32-CAM ไปยังเว็บเซิร์ฟเวอร์
- ควบคุม มอเตอร์และเซอร์โว จากระยะไกลด้วยคำสั่ง WebSocket
- หากไม่มีคำสั่งควบคุมเป็นระยะเวลาหนึ่ง มอเตอร์และเซอร์โวจะกลับสู่สถานะเริ่มต้นโดยอัตโนมัติ
- เซิร์ฟเวอร์จัดวางฟีดวิดีโอจากไคลเอนต์หลายตัวลงบนแคนวาสแบบไดนามิก
ฮาร์ดแวร์และวัสดุ
- ฮาร์ดแวร์ที่ต้องใช้
- ESP32-CAM, โมดูล AI Thinker หรือบอร์ดที่เข้ากันได้
- มอเตอร์และเซอร์โวที่เชื่อมต่อกับขา GPIO ที่เหมาะสม
- แหล่งจ่ายไฟ 5V ที่เสถียรสำหรับ ESP32-CAM
- เครือข่าย Wi-Fi สำหรับการสื่อสาร
- SD card เป็นอุปกรณ์เสริม หากจำเป็นสำหรับฟังก์ชันอื่น
- วัสดุที่ใช้เป็นชิ้นส่วนจากชุดคิทที่ซื้อจาก AliExpress
- แชสซีรถ
- ตัวควบคุมความเร็วอิเล็กทรอนิกส์
- ใช้รุ่น 30A และเอาต์พุต BEC เป็น 5V 3A จึงดูเหมือนมีกระแสเพียงพอสำหรับขับ ESC และเซอร์โว
- กล่องใส่แบตเตอรี่
- เซลล์ 18650 3.6V จำนวน 2 ก้อน หรือแพ็กแบตเตอรี่ 7.4V
- ใช้ทั้งสองแบบ และเซลล์สามารถนำไปใช้กับโปรเจกต์อื่นได้ยืดหยุ่นกว่า
- ESP32-CAM
- โมเดลที่มีเสาอากาศภายนอกมีความสำคัญมาก และใช้กล้องฟิชอาย 170 องศา
- Bluetooth Gamepad
วิธีเดินสาย
- ถอดอะแดปเตอร์ JST 3 พินของเซอร์โวที่มากับแชสซีรถออก แล้วเปลี่ยนเป็น ปลั๊ก JST 4 พิน เพื่อให้เชื่อมต่อกับ ESP32 ได้
- ต่อสายขั้วบวก·ขั้วลบของเซอร์โวเข้าด้วยกัน และเพิ่มปลั๊ก JST ตัวเมีย 3 พินด้วยเครื่องมือย้ำหางปลา
- เชื่อมต่อสายควบคุมสีขาวของ ESC เข้ากับปลั๊ก JST 4 พินและปลั๊กตัวเมีย 3 พิน
โครงสร้างซอฟต์แวร์
- ไลบรารีที่ใช้ในโค้ด ESP32
WiFi.h: การเชื่อมต่อ Wi-Fi
ArduinoWebsockets.h: การสื่อสาร WebSocket
esp_camera.h: การควบคุมกล้อง ESP32-CAM
ServoControl.h, Esc.h: การควบคุมเซอร์โวและมอเตอร์
Arduino.h: ฟังก์ชันมาตรฐานของ Arduino
- ติดตั้ง dependency ของเซิร์ฟเวอร์ Python ด้วยคำสั่งต่อไปนี้
sudo apt install python3-aiohttp python3-opencv python3-numpy
การตั้งค่าและการรัน
- การตั้งค่าเฟิร์มแวร์ ESP32
- ตั้งค่า credentials ของ Wi-Fi และ URL เซิร์ฟเวอร์ WebSocket ใน
secrets.h
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
#define WS_SERVER_URL "ws://YourServerIP:Port"
- ขา GPIO ของกล้องถูกตั้งค่าไว้ล่วงหน้าสำหรับบอร์ด AI Thinker ESP32-CAM
- หากจำเป็น ให้แก้ไขขามอเตอร์และเซอร์โวให้ตรงกับการจัดฮาร์ดแวร์ของคุณ
- การตั้งค่าเซิร์ฟเวอร์ Python
- วางสคริปต์เซิร์ฟเวอร์ไว้ในไดเรกทอรีเดียวกับไฟล์
index.html สำหรับเว็บอินเทอร์เฟซ
- รันเซิร์ฟเวอร์ด้วยคำสั่งต่อไปนี้
python3 app.py
วิธีใช้งานและคำสั่ง WebSocket
- ขั้นตอนการใช้งาน ESP32
- อัปโหลดสเก็ตช์ที่ให้มาไปยัง ESP32-CAM ด้วย Arduino IDE หรือแพลตฟอร์มที่เข้ากันได้
- ตรวจสอบเอาต์พุต serial เพื่อยืนยันว่าเชื่อมต่อ Wi-Fi และเซิร์ฟเวอร์ WebSocket สำเร็จ
- ขั้นตอนการใช้งานเซิร์ฟเวอร์
- รันสคริปต์เซิร์ฟเวอร์ Python
- เปิดเว็บอินเทอร์เฟซในเบราว์เซอร์เพื่อดู สตรีมวิดีโอสด
- ส่งคำสั่งควบคุมผ่านการเชื่อมต่อ WebSocket
- คำสั่งที่รองรับ
MOTOR:<speed>: ตั้งค่าความเร็วมอเตอร์ ช่วงตั้งแต่ -255 ถึง 255
SERVO:<angle>: ตั้งค่ามุมเซอร์โว ช่วงตั้งแต่ 0 ถึง 180
CONTROL:<speed>:<angle>: ควบคุมความเร็วมอเตอร์และมุมเซอร์โวพร้อมกัน
รายละเอียดการทำงานและการแก้ปัญหา
- ขั้นตอนการเริ่มต้น ESP32
- เชื่อมต่อกับเครือข่าย Wi-Fi ที่ระบุ
- ตั้งค่า ESP32-CAM ให้เหมาะกับการสตรีมวิดีโอ
- สร้างการเชื่อมต่อ WebSocket กับเซิร์ฟเวอร์
- การจัดการ timeout จะตั้งค่าความเร็วมอเตอร์กลับเป็น
0 และมุมเซอร์โวกลับเป็น 90 เมื่อไม่มีคำสั่งควบคุมเป็นระยะเวลาหนึ่ง
- เซิร์ฟเวอร์ Python สื่อสารกับไคลเอนต์ ESP32 หลายตัวผ่าน WebSocket
- เซิร์ฟเวอร์ประมวลผลเฟรมวิดีโอที่เข้ามา จัดวางแบบไดนามิกเป็นรูปแบบตาราง แล้วสตรีมไปยังเว็บอินเทอร์เฟซ
- หากมีปัญหาการเชื่อมต่อ ให้ตรวจสอบ credentials ของ Wi-Fi ใน
secrets.h และตรวจสอบว่าเซิร์ฟเวอร์ WebSocket กำลังทำงานและเข้าถึงได้
- หากมีปัญหาสตรีมวิดีโอ ให้ตรวจสอบว่าไฟเลี้ยง ESP32-CAM เหมาะสมหรือไม่ และตรวจสอบการตั้งค่าเริ่มต้นของกล้อง
- โปรเจกต์เผยแพร่ภายใต้ MIT License
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ใช้โทรศัพท์ HTC Magic รุ่นเก่าเป็นตัวส่งภาพจากกล้อง+Wi‑Fi แล้วเชื่อมต่อเข้ากับ Arduino ผ่านพอร์ตอนุกรมและ level shifter เพื่อควบคุมเซอร์โวกับ RGB LED
การเชื่อมต่อไม่ค่อยเสถียรมากนัก แต่ก็สนุกมาก และตอนนี้อาจถึงเวลาลองชุบชีวิตโปรเจ็กต์นี้ขึ้นมาอีกครั้งด้วยไมโครคอนโทรลเลอร์รุ่นถัดไป
ถ้าชอบโปรเจ็กต์นี้ การแนะนำให้คนที่กำลังมองหานักพัฒนาระยะไกลรู้จักผมจะช่วยได้มากที่สุด
งานหลักของผมคือเป็นนักพัฒนา Ruby on Rails แต่ก็เปิดรับงานด้านหุ่นยนต์เช่นกัน
โพสต์นี้น่าอ่าน: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
ก่อนจะทำตามคำแนะนำบางอย่าง อัตราเฟรมค่อนข้างแย่มาก
การบัดกรีตัวต้านทาน 0Ω ใหม่นี่แทบเหมือนการผจญภัย แต่สุดท้ายก็ต่อเข้าขาที่ถูกต้อง และผลลัพธ์ออกมาแบบนี้: https://imgur.com/a/LJflZ80
ผมเพิ่มลิงก์เสาอากาศที่ใช้ไว้ใน README แล้ว
ซอฟต์แวร์พื้นฐานเริ่มต้นได้ง่ายมาก แค่ใช้ไลบรารีคอนโทรลเลอร์ Bluetooth กับโค้ด C ราว 20 บรรทัด
หลังจากนั้นผมก็เพิ่มฟีเจอร์เพื่อให้บังคับง่ายขึ้น เพราะการควบคุมตีนตะขาบ 2 ฝั่งด้วยสติ๊ก 2 อันนั้นโอเคที่ความเร็วต่ำ แต่พอใช้มอเตอร์โดรน 2 ตัวจนวิ่งได้เกือบ 20 กม./ชม. ก็ต้องใช้รูปแบบการควบคุมแบบอื่น
สุดท้ายเลยทำเป็นควบคุมตีนตะขาบโดยตรงแบบมีการจำกัดรอบด้วยทริกเกอร์ของ DualShock และตอนขับเร็วก็ใช้สติ๊กซ้ายขึ้น/ลงเป็นคันเร่ง สติ๊กขวาซ้าย/ขวาเป็นพวงมาลัย ให้ขับเหมือนรถ RC ทั่วไป
นี่คือวิดีโอของโมเดลพิมพ์ 3D แบบเดียวกันที่ใช้เป็นฐาน และตั้งแต่นาที 00:50 จะเห็นความเร็วได้ชัด: https://www.youtube.com/watch?v=3Mv_tDY89Zw
ผมไม่ค่อยรู้เรื่องการทำ RC เท่าไร ปกติเขาควบคุมกันอย่างไร? คือเชื่อมคอนโทรลเลอร์ PS4 เข้ากับ ESP โดยตรงเลยหรือ?
เลยอยากรู้ว่าโปรเจ็กต์นี้มี latency ประมาณไหน
ส่วนวิดีโอของ FPV quadcopter นั้นยังแบ่งกันอยู่ บางคนใช้อะนาล็อกเพราะเวลาสัญญาณแย่ลงมันจะค่อย ๆ แย่ลงแทนที่จะตัดหายแล้วค่อยเชื่อมใหม่ทั้งหมด ขณะที่บางคนใช้การสื่อสารบนพื้นฐาน 802.11 ซึ่งในทางปฏิบัติก็แข่งขันได้พอสมควร
ตัวอย่างเช่น Walksnail Goggles ใช้ 802.11 สำหรับวิดีโอลิงก์ แม้จะไม่ได้เปิดหรือมีเอกสารดีมากนัก แต่ก็มีคนที่เจาะลึกภายในอย่างงานของ Chris Rosser
latency ของชุดลักษณะนี้ดูเหมือนจะต่ำพอแม้แต่สำหรับการแข่ง quadcopter ความเร็วสูงแบบจริงจัง
[0] https://www.expresslrs.org
และ: https://github.com/gyrex/CrystalVideo
ดูเหมือนว่าอัตราเฟรมจะถูกจำกัดหลัก ๆ ด้วยความเร็วที่ ESP32 สามารถจับภาพได้
ตอนวัด FPS ด้วยสคริปต์ Python ผมได้ราว 50fps จาก ESP32 และช่วงหลังเพิ่งซื้อ travel router มาเพื่อลองทดสอบนอกบ้าน
มันควบคุมจากระยะไกลโดยดูวิดีโอฟีดได้จริงไหม? สิ่งที่กังวลที่สุดคือมันอาจช้าเกินไปสำหรับการหลบสิ่งกีดขวางในความเร็วส่วนใหญ่
ถ้ามีเวลา ผมอยากเอาทั้งสองอย่างมารวมกันเพื่อบังคับรถพร้อมดูภาพจากกล้องบนจอไปด้วย
ถ้าคุณไม่ต้องใส่แว่นสายตาหรือใช้คอนแทคเลนส์ ชุด DJI O4 'lite' กับแว่น N3 เป็นตัวเลือกที่ดีกว่ามาก
เป็นบทความเมื่อหลายปีก่อน ดังนั้นตอนนี้อาจได้ผลลัพธ์คล้ายกันด้วยวิธีที่ง่ายกว่าหรือดีกว่าก็ได้: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
มันไม่ได้ดูเหมือนการผสมกันของหุ่นยนต์สุนัข Boston Dynamics กับ Terminator แบบในหนังเลย แต่มีประโยชน์มากกับงาน "น่าเบื่อ" ที่ไม่สะดุดตา เช่น การวางทุ่นระเบิด การทำลายทุ่นระเบิด หรือการขนเสบียงเล็กน้อยไปให้ทหารที่ซ่อนตัวอยู่ตามแนวต้นไม้หรือสายไฟ