3 คะแนน โดย GN⁺ 2025-02-03 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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
      • ใช้คอนโทรลเลอร์ PS4

วิธีเดินสาย

  • ถอดอะแดปเตอร์ 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
  • สามารถเข้าถึงเซิร์ฟเวอร์ได้ที่ http://localhost:8080/

วิธีใช้งานและคำสั่ง 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 ความคิดเห็น

 
GN⁺ 2025-02-03
ความคิดเห็นบน Hacker News
  • เมื่อ 12 ปีก่อน ตอนที่มี Arduino แต่ยังไม่มี ESP32 ผมเคยทำอะไรคล้าย ๆ กัน: https://newton-net-pl.translate.goog/2012/01/robot/?_x_tr_sl...
    ใช้โทรศัพท์ HTC Magic รุ่นเก่าเป็นตัวส่งภาพจากกล้อง+Wi‑Fi แล้วเชื่อมต่อเข้ากับ Arduino ผ่านพอร์ตอนุกรมและ level shifter เพื่อควบคุมเซอร์โวกับ RGB LED
    การเชื่อมต่อไม่ค่อยเสถียรมากนัก แต่ก็สนุกมาก และตอนนี้อาจถึงเวลาลองชุบชีวิตโปรเจ็กต์นี้ขึ้นมาอีกครั้งด้วยไมโครคอนโทรลเลอร์รุ่นถัดไป
  • ขอบคุณสำหรับฟีดแบ็กของโปรเจ็กต์ อยากทำต่อไปเรื่อย ๆ และยินดีรับ PR ด้วย
    ถ้าชอบโปรเจ็กต์นี้ การแนะนำให้คนที่กำลังมองหานักพัฒนาระยะไกลรู้จักผมจะช่วยได้มากที่สุด
    งานหลักของผมคือเป็นนักพัฒนา Ruby on Rails แต่ก็เปิดรับงานด้านหุ่นยนต์เช่นกัน
  • ก่อนซื้อ ESP32 CAM ควรพิจารณารุ่นที่มีเสาอากาศภายนอก
    โพสต์นี้น่าอ่าน: https://www.reddit.com/r/esp32/comments/r7kqtt/esp32cam_supe...
    ก่อนจะทำตามคำแนะนำบางอย่าง อัตราเฟรมค่อนข้างแย่มาก
    • จากหน้าผู้ดูแลเราเตอร์ พอผมบัดกรีตัวต้านทานใหม่แล้วต่อเสาอากาศเข้าไป ความเร็วก็เด้งจาก 1Mbps ที่ไม่เสถียรไปเป็น 20Mbps ที่เสถียรทันที
      การบัดกรีตัวต้านทาน 0Ω ใหม่นี่แทบเหมือนการผจญภัย แต่สุดท้ายก็ต่อเข้าขาที่ถูกต้อง และผลลัพธ์ออกมาแบบนี้: https://imgur.com/a/LJflZ80
    • จากประสบการณ์ที่ทำโปรเจ็กต์นี้มา เสาอากาศภายนอก แทบจะเป็นสิ่งจำเป็น
      ผมเพิ่มลิงก์เสาอากาศที่ใช้ไว้ใน README แล้ว
    • พอจะแนะนำรุ่นที่แน่ชัดได้ไหม?
  • เจ๋งมาก ผมเคยทำ รถถัง RC แบบตีนตะขาบ ที่ขับเคลื่อนด้วย ESP32 แล้วควบคุมผ่าน Bluetooth โดยเชื่อมกับคอนโทรลเลอร์ PlayStation 4
    ซอฟต์แวร์พื้นฐานเริ่มต้นได้ง่ายมาก แค่ใช้ไลบรารีคอนโทรลเลอร์ Bluetooth กับโค้ด C ราว 20 บรรทัด
    หลังจากนั้นผมก็เพิ่มฟีเจอร์เพื่อให้บังคับง่ายขึ้น เพราะการควบคุมตีนตะขาบ 2 ฝั่งด้วยสติ๊ก 2 อันนั้นโอเคที่ความเร็วต่ำ แต่พอใช้มอเตอร์โดรน 2 ตัวจนวิ่งได้เกือบ 20 กม./ชม. ก็ต้องใช้รูปแบบการควบคุมแบบอื่น
    สุดท้ายเลยทำเป็นควบคุมตีนตะขาบโดยตรงแบบมีการจำกัดรอบด้วยทริกเกอร์ของ DualShock และตอนขับเร็วก็ใช้สติ๊กซ้ายขึ้น/ลงเป็นคันเร่ง สติ๊กขวาซ้าย/ขวาเป็นพวงมาลัย ให้ขับเหมือนรถ RC ทั่วไป
    นี่คือวิดีโอของโมเดลพิมพ์ 3D แบบเดียวกันที่ใช้เป็นฐาน และตั้งแต่นาที 00:50 จะเห็นความเร็วได้ชัด: https://www.youtube.com/watch?v=3Mv_tDY89Zw
    • น่าประทับใจมาก
      ผมไม่ค่อยรู้เรื่องการทำ RC เท่าไร ปกติเขาควบคุมกันอย่างไร? คือเชื่อมคอนโทรลเลอร์ PS4 เข้ากับ ESP โดยตรงเลยหรือ?
  • ปัญหาใหญ่ของ FPV และเหตุผลที่มันอยู่กับเทคโนโลยีอนาล็อกมานานคือเรื่อง latency
    เลยอยากรู้ว่าโปรเจ็กต์นี้มี latency ประมาณไหน
    • ทุกวันนี้ FPV มักใช้ ExpressLRS[0] ซึ่งเป็นโปรโตคอลเปิดสำหรับลิงก์ควบคุมของ FPV quadcopter และโดยทั่วไปก็ใช้ ESP32 ด้วย
      ส่วนวิดีโอของ FPV quadcopter นั้นยังแบ่งกันอยู่ บางคนใช้อะนาล็อกเพราะเวลาสัญญาณแย่ลงมันจะค่อย ๆ แย่ลงแทนที่จะตัดหายแล้วค่อยเชื่อมใหม่ทั้งหมด ขณะที่บางคนใช้การสื่อสารบนพื้นฐาน 802.11 ซึ่งในทางปฏิบัติก็แข่งขันได้พอสมควร
      ตัวอย่างเช่น Walksnail Goggles ใช้ 802.11 สำหรับวิดีโอลิงก์ แม้จะไม่ได้เปิดหรือมีเอกสารดีมากนัก แต่ก็มีคนที่เจาะลึกภายในอย่างงานของ Chris Rosser
      latency ของชุดลักษณะนี้ดูเหมือนจะต่ำพอแม้แต่สำหรับการแข่ง quadcopter ความเร็วสูงแบบจริงจัง
      [0] https://www.expresslrs.org
    • โปรเจ็กต์ที่เกี่ยวข้อง: https://github.com/wooky/esp32-analog-video-over-wifi
      และ: https://github.com/gyrex/CrystalVideo
    • ผมไม่มีประสบการณ์กับโดรน FPV เลยไม่มีฐานเทียบเหมือนกัน แต่ในเครือข่ายไร้สายในบ้าน latency ไม่เป็นปัญหา แม้ว่าจะมีอุปกรณ์ในบ้านอื่น ๆ เชื่อมต่ออยู่ทั้งหมดก็ตาม
      ดูเหมือนว่าอัตราเฟรมจะถูกจำกัดหลัก ๆ ด้วยความเร็วที่ ESP32 สามารถจับภาพได้
      ตอนวัด FPS ด้วยสคริปต์ Python ผมได้ราว 50fps จาก ESP32 และช่วงหลังเพิ่งซื้อ travel router มาเพื่อลองทดสอบนอกบ้าน
  • ผมกำลังคิดจะลองทำโปรเจ็กต์คล้ายกัน เลยอยากรู้ประสบการณ์เรื่อง latency
    มันควบคุมจากระยะไกลโดยดูวิดีโอฟีดได้จริงไหม? สิ่งที่กังวลที่สุดคือมันอาจช้าเกินไปสำหรับการหลบสิ่งกีดขวางในความเร็วส่วนใหญ่
  • ปีที่แล้วผมซื้อคิตชุดเดียวกัน และช่วงหลังยังซื้อ ESP32 game controller ที่มีจอเล็กมาด้วย: https://github.com/01studio-lab/pyController
    ถ้ามีเวลา ผมอยากเอาทั้งสองอย่างมารวมกันเพื่อบังคับรถพร้อมดูภาพจากกล้องบนจอไปด้วย
  • ถ้าสนใจผลลัพธ์มากกว่าความสนุกจากการลงมือทำ ทุกวันนี้บน AliExpress มี รถ RC ขนาด 2.5 นิ้ว ที่ใช้ได้ในราคาประมาณ 30 ดอลลาร์ และกล้องอนาล็อก 5.8GHz แบบสแตนด์อโลนราคา 25 ดอลลาร์
    • ถ้าคำว่าแบบสแตนด์อโลนหมายถึงกล้องแบบ all-in-one ล่ะก็ กล้องที่มี VTX ในตัวมักจะแย่กว่าระบบอนาล็อกทั่วไปเสียอีก และก็ยังต้องใช้แว่นอนาล็อกอยู่ดี
      ถ้าคุณไม่ต้องใส่แว่นสายตาหรือใช้คอนแทคเลนส์ ชุด DJI O4 'lite' กับแว่น N3 เป็นตัวเลือกที่ดีกว่ามาก
  • ถ้าอยากทำให้รถ RC ทำงานอัตโนมัติ อันนี้น่าอ่านและสนุกดี
    เป็นบทความเมื่อหลายปีก่อน ดังนั้นตอนนี้อาจได้ผลลัพธ์คล้ายกันด้วยวิธีที่ง่ายกว่าหรือดีกว่าก็ได้: https://hackaday.com/2021/10/25/fast-indoor-robot-watches-ce...
  • ทุกคนรู้จัก FPV quadcopter ที่ใช้ในสนามรบกันอยู่แล้ว แต่ความสนใจในยานพาหนะภาคพื้นดินก็เพิ่มขึ้นเรื่อย ๆ
    มันไม่ได้ดูเหมือนการผสมกันของหุ่นยนต์สุนัข Boston Dynamics กับ Terminator แบบในหนังเลย แต่มีประโยชน์มากกับงาน "น่าเบื่อ" ที่ไม่สะดุดตา เช่น การวางทุ่นระเบิด การทำลายทุ่นระเบิด หรือการขนเสบียงเล็กน้อยไปให้ทหารที่ซ่อนตัวอยู่ตามแนวต้นไม้หรือสายไฟ