โปรเจกต์นี้จะพาน้องๆ มาสร้างหุ่นยนต์เคลื่อนที่ 4 ล้อควบคุมผ่าน WiFi แบบง่ายๆ แต่เจ๋งเป้ง! โดยเราติดตั้งกล้อง WiFi บนหัวหมุนแบบ Pan & Tilt ที่ขับด้วยเซอร์โว ทำให้เราควบคุมหุ่นจากคอมพ์ผ่าน WiFi ได้แบบเรียลไทม์ แถมมีสตรีมวิดีโอสดจากกล้องบนตัวหุ่น เลยไม่ต้องมองเห็นตัวหุ่นด้วยตาเปล่าก็ขับได้สบายๆ
อัพเดทล่าสุด: เรามีเวอร์ชันอัพเกรดของเจ้ารถหุ่นตัวนี้ด้วยนะ ไปดูได้ที่ลิงก์นี้เลย (จัดไปวัยรุ่น!)
*คลิปหุ่นยนต์กำลังโชว์ของ*โปรเจกต์นี้เราใช้เครื่องมือเขียนโปรแกรมแบบโมเดลที่ชื่อว่า CASP ในการทำซอฟต์แวร์ทั้งหมด แถมยังใช้บล็อก CASP แบบคัสตอม (ที่มีซอร์สโค้ดให้ดูด้วย) ในโมเดลหลักอีก บล็อกนี้จะสร้างสัญญาณควบคุมเมื่อเรากดปุ่มคีย์บอร์ดเพื่อบังคับหุ่นยนต์ น้องๆ สามารถเปิดดูการตั้งค่าและซอร์สโค้ดของบล็อกนี้ได้ แล้วจะได้รู้วิธีเอามันไปต่อกับบล็อกอื่นๆ ในโมเดล CASP
ขั้นตอนการทำ
ขั้นตอนที่ 1: ประกอบฮาร์ดแวร์ตามที่อธิบายในส่วน 'Hardware Development' ด้านล่างเลย
ขั้นตอนที่ 2: ติดตั้ง CASP เวอร์ชันล่าสุด (แนะนำเวอร์ชัน 0.9.5.1 ขึ้นไปสำหรับโปรเจกต์นี้) ห้ามช็อตนะตัวนี้!
ขั้นตอนที่ 3: ดาวน์โหลดโปรเจกต์ตัวอย่าง 'Basic Remote Controlled Mobile Robot with on-board camera' แล้วทำตามขั้นตอนในส่วน 'Software Development' ให้ครบ
ขั้นตอนที่ 4: อาจต้องมีการปรับแต่งบางอย่างตามที่บอกในส่วน 'Adjustments' เพื่อให้ซอฟต์แวร์ทำงานเข้ากับฮาร์ดแวร์ที่เราสร้างขึ้น
ขั้นตอนที่ 5: สุดท้าย วิธีการควบคุมหุ่นยนต์ด้วยคีย์บอร์ดและเมาส์จะอธิบายในส่วน Control Methodology น้องๆ สามารถเปลี่ยนโค้ดในบล็อกคัสตอม 'rc_control' ในโมเดลหลัก เพื่อปรับปุ่มควบคุมให้เป็นสไตล์ตัวเองได้เลย สู้งานนะน้อง!
การพัฒนาด้านฮาร์ดแวร์
มอเตอร์กระแสตรง (DC Motor) จำนวน 4 ตัว ถูกติดตั้งบนฐานโลหะที่เหมาะสม พร้อมกับล้อ ส่วนประกอบแพน & ทิลท์ (ซึ่งติดตั้งด้วยเซอร์โวมอเตอร์ขนาดเล็ก 2 ตัว) จะถูกติดตั้งในตำแหน่งที่เหมาะสมบนฐาน (แนะนำให้อยู่ทางด้านท้ายของหุ่นยนต์) แบตเตอรี่ 12V จะถูกติดตั้งไว้ใต้ฐาน ส่วนโมดูลอิเล็กทรอนิกส์ต่างๆ ก็จะถูกวางและเชื่อมต่อบนฐานตามแผนภาพการต่อที่แสดงไว้ในส่วน 'Schematics' ภาพด้านล่างนี้คือตัวอย่างการจัดวางทั่วไป

ส่วนอิเล็กทรอนิกส์ประกอบด้วยบอร์ดไมโครคอนโทรลเลอร์ Arduino Nano RP2040 Connect ซึ่งทำหน้าที่เป็นสมองหลักของหุ่นยนต์ คอยสื่อสารกับพีซีโฮสต์ผ่าน WiFi บนบอร์ด ไมโครคอนโทรลเลอร์จะสร้างสัญญาณ PWM ที่จำเป็นเพื่อควบคุมล้อทั้งสี่ผ่านวงจรขับมอเตอร์ (Driver Circuit) ที่เหมาะสม และยังควบคุมเซอร์โวมอเตอร์ 2 ตัวสำหรับกล้องแพน & ทิลท์อีกด้วย
โมดูล ESP32 Camera จะถูกติดตั้งบนส่วนแพน & ทิลท์ เพื่อจับภาพวิดีโอสดและสตรีมไปยังพีซีโฮสต์
ไฟแฟลชบนโมดูล ESP32-CAM จะถูกควบคุมด้วยมือจากพีซีโฮสต์ ผ่าน Arduino Nano RP2040 ในสภาวะแสงน้อย
เราใช้แบตเตอรี่ 6V ถึง 12V เพื่อจ่ายไฟให้กับวงจรทั้งหมดบนหุ่นยนต์ และใช้ตัวแปลงแรงดัน DC Step Down จาก 6V/12V เป็น 5V เพื่อจ่ายไฟ 5V ที่จำเป็นให้กับไมโครคอนโทรลเลอร์, เซอร์โวมอเตอร์ และโมดูลกล้อง ESP32
รายละเอียดทางเทคนิคเพิ่มเติม (จัดเต็ม!)
รถบังคับบลูทูธทั่วไปมักถูกจำกัดด้วยระยะสายตาและขาดการเห็นภาพตอบกลับ แต่ Wi-Fi Mobile Camera Robot ตัวนี้คือการควบคุมระยะไกลแบบเต็มตัว! ด้วยการฝังโมดูลกล้อง IP ไว้ คุณสามารถนั่งอยู่อีกห้องนึงแล้วขับหุ่นยนต์ไปทั่วบ้าน โดยใช้เบราว์เซอร์ในแล็ปท็อปเป็นพวงมาลัยและจอมอนิเตอร์ไปในตัว
ESP32-CAM (หัวใจหลักของโครงการ) ดาราจอมแกร่งของระบบนี้คือโมดูล ESP32-CAM มันคือไมโครคอนโทรลเลอร์ WiFi ที่ทรงพลัง พร้อมเลนส์กล้อง OV2640 ในตัว
- เว็บเซิร์ฟเวอร์ตัวจิ๋ว: ESP32 จะโฮสต์เว็บไซต์เล็กๆ ไว้บนเครือข่ายท้องถิ่นของคุณ (เช่น
192.168.1.15) - การสตรีมภาพ: เมื่อคุณเข้าถึง IP นั้นจากพีซี ESP32 จะเริ่มจับภาพ JPEG และส่งสตรีมภาพต่อเนื่องผ่าน WiFi สร้างเป็นฟีดวิดีโอสด
- การเชื่อมโยงการควบคุม: ในโปรเจกต์นี้ ตรรกะการควบคุมจะถูกจัดการโดย Arduino Nano RP2040 Connect และซอฟต์แวร์ CASP บนพีซีโฮสต์ ซึ่งรับคำสั่งและส่งต่อไปยังไดรเวอร์มอเตอร์และเซอร์โว
ขับเคลื่อนฐานล้อหนักๆ พินเอาต์พุตของไมโครคอนโทรลเลอร์นั้นอ่อนเกินไปจะขับฐานรถหนักๆ ได้โดยตรง
- คุณต้องต่อคอนโทรลเลอร์เข้ากับไดรเวอร์มอเตอร์ที่เหมาะสม (เช่น TA6586 ที่ใช้ในนี้ หรือ L298N)
- คุณใช้สัญญาณ PWM เพื่อปรับความเร็วของล้อ
- ป้อมปืนแพน/ทิลท์: ตัวโมดูลกล้องจะถูกติดตั้งบนเซอร์โวมอเตอร์ขนาดเล็ก 2 ตัว การขยับเมาส์ในแผงจำลองบนพีซีโฮสต์ จะสั่งให้ไมโครคอนโทรลเลอร์หมุนเซอร์โว ทำให้กล้องสามารถ "มองไปรอบๆ" ได้อย่างอิสระจากตัวฐาน!
สิ่งที่ต้องมีสำหรับการประกอบระบบ
- โมดูล ESP32-CAM พร้อมกล้อง OV2640
- อินเทอร์เฟซไดรเวอร์มอเตอร์ (เช่น TA6586 หรือ L298N)
- แชสซีรถ 4WD
- ขายึดเซอร์โวมอเตอร์ขนาดเล็กแบบแพน/ทิลท์สำหรับกล้อง
- แบตเตอรี่พาวเวอร์พักทรงพลัง (เพราะทั้งการสตรีม WiFi และการควบคุมมอเตอร์กินไฟไม่เบาเลยนะน้อง!)
การพัฒนาซอฟต์แวร์
A) การตั้งค่า ESP32 Camera
ก่อนจะเอา ESP32 Camera ไปใช้ในโปรเจค ต้องโปรแกรมให้มันมี IP address ที่ถูกต้องก่อนนะน้อง เรื่องนี้มีตัวอย่างให้ดูเยอะแยะในอินเทอร์เน็ต ลองเสิร์ชหาดูได้เลย งานนี้เราจะใช้ CASP มาช่วยพัฒนาโมเดลให้กับ Arduino micro-controller (เป้าหมาย) และ host PC เร็วขึ้น ซึ่งเราจะต้องสร้างโมเดลขึ้นมาสองตัวเพื่อให้บรรลุเป้าหมาย
B) โมเดลเป้าหมาย (Target Model) ที่รันบน Arduino Nano RP2040 Connect ประกอบด้วย
- Blink logic ที่ใช้บอกว่าระบบกำลังทำงานอยู่
- WiFi101 block ที่รับสัญญาณควบคุมจาก host PC
- PWM และ servo blocks ที่แมปกับขาของ micro-controller
- Time delay block เพื่อรีเซ็ตเอาต์พุตของ PWM blocks เวลาเกิดข้อผิดพลาดในการสื่อสารหรือตอน host ไม่ได้เชื่อมต่อ

ขั้นตอนการโปรแกรมบอร์ดเป้าหมายให้ถูกต้อง มีดังนี้
- เชื่อมต่อบอร์ดเป้าหมายกับ host PC ด้วยสาย USB
- เช็คจากระบบปฏิบัติการของ host PC ว่า บอร์ดเชื่อมต่อกับพอร์ตซีเรียลหมายเลขอะไร
- เปิดโปรแกรม CASP แล้วโหลดโปรเจค 'rc_target'
- ในบล็อก WiFi101 ให้ตั้งค่าเป็นโหมด Station (สถานี) น้องอาจต้องกรอก SSID และรหัสผ่านของเครือข่ายที่อุปกรณ์จะเชื่อมต่อ ส่วนพารามิเตอร์ Local IP address ให้ตั้งตามที่ได้รับจาก DHCP client ของเครือข่ายนั้น
- ใน CASP ไปที่เมนู Home->Simulation->Setup Simulation Parameters ใต้แท็บ Target HW->General ให้ตั้งค่า 'Target Hardware Programmer Port' เป็นหมายเลขพอร์ตซีเรียลที่บอร์ดเชื่อมต่ออยู่
- บิลด์โมเดลและโปรแกรมลงบอร์ด โดยคลิกปุ่ม Run ได้เลยจ้า
C) โมเดลเนทีฟ (Native Model) ที่รันบน Host PC ประกอบด้วย
- Camera block ที่รับวิดีโอสดจาก ESP32 Camera โดยต้องกรอก IP address ของกล้องลงในพารามิเตอร์ของบล็อกนี้
- Image display block สำหรับแสดงวิดีโอสดจากกล้อง และยังถูกตั้งค่าให้ส่งสัญญาณคีย์บอร์ดและเมาส์ออกมาด้วย
- RC control block: เป็นบล็อกที่เราสร้างขึ้นเอง (custom block) รับสัญญาณคีย์บอร์ดและเมาส์จาก image display block แล้วสร้างสัญญาณควบคุมที่เหมาะสมสำหรับการเคลื่อนที่ของหุ่นยนต์และการเคลื่อนหัว (pan & tilt)
- GPIO blocks ที่แมปกับโมเดลเป้าหมายผ่านช่องทางการสื่อสาร WiFi

ขั้นตอนการรันโมเดลเนทีฟบน host PC มีดังนี้
- ก่อนอื่น ต้องแน่ใจว่า host PC เชื่อมต่อกับเครือข่าย WiFi เดียวกันกับอุปกรณ์ (บอร์ด) นะ
- โหลดโปรเจค 'rc_native'
- คลิกที่เมนู Home->Simulation->Configure Simulation IO
- หน้าต่าง 'Configure Simulation Hardware' จะเปิดขึ้น ใต้ส่วน Native Nodes และ GPIO Device Nodes ให้เปลี่ยน IP addresses ที่ทำเครื่องหมายไว้ในรูปด้านล่าง (โดยดับเบิลคลิกที่รายการ) เป็น IP address ของเครื่อง host และของอุปกรณ์ (บอร์ด) ตามลำดับ

- คลิกปุ่ม 'Connect Device' แล้วติ๊กถูกที่ช่อง 'Online Data' ตอนนี้โปรแกรมควรจะสื่อสารกับบอร์ดเป้าหมายได้แล้ว โดยมีรอบเวลาประมาณ 30 มิลลิวินาที บอร์ดเป้าหมายตอนนี้จะปรากฏเป็น endpoint 'EP0' ให้กับโมเดลเนทีฟ โมเดลเนทีฟสามารถใช้ endpoint นี้เพื่อเชื่อมต่อกับ IOs ต่างๆ บนบอร์ดเป้าหมายได้
- คลิกปุ่ม 'Save' เพื่อบันทึกการตั้งค่าแล้วปิดหน้าต่าง
- รันโมเดลโดยคลิกปุ่ม Run หน้าต่าง Simulation panel ควรจะเปิดขึ้นและเริ่มสื่อสารกับบอร์ด
- ภาพหน้าจอของ Simulation panel ที่รันบน host PC และแสดงวิดีโอสดจากกล้อง มีดังรูปด้านล่าง

การปรับแต่ง
- การต่อสายมอเตอร์ล้ออาจต้องสลับขั้วเพื่อให้เคลื่อนที่ไปหน้า/ถอยหลังได้ตรงกับปุ่ม W กับ S ที่กด
- ตรรกะสำหรับสั่งให้มอเตอร์หมุนไปหน้า/ถอยหลังถูกออกแบบให้เข้ากับไอซีขับมอเตอร์ที่ใช้ในโปรเจกต์นี้ (TA6586) ถ้าน้องใช้ไอซีขับมอเตอร์ตัวอื่น ก็ต้องปรับโค้ดส่วนนี้ให้เหมาะสมด้วยนะจ๊ะ
- เซอร์โวมอเตอร์อาจต้องปรับตำแหน่งตั้งต้นให้หันไปทางด้านหน้าของหุ่นยนต์ ให้ตรงกับมุมเริ่มต้นที่ตั้งค่าไว้ในพารามิเตอร์ของบล็อก rc_control
- ความเร็วพื้นฐาน, ขีดจำกัดความเร็ว และพารามิเตอร์อื่นๆ ที่เกี่ยวกับการเดินทาง สามารถปรับแต่งได้จากพารามิเตอร์ของบล็อก rc_control
วิธีการควบคุม
- หน้าต่างแผงจำลองที่เห็นด้านบน จะรับค่าจากคีย์บอร์ดและเมาส์ได้เมื่อมันเป็นหน้าต่างที่กำลังใช้งานอยู่
- ผู้ใช้สามารถใช้ปุ่มคีย์บอร์ดดังนี้:
- W = เดินหน้า
- S = ถอยหลัง
- A = หมุนซ้ายบนจุดศูนย์กลาง
- D = หมุนขวาบนจุดศูนย์กลาง
- สามารถกดปุ่มผสมระหว่าง W/S กับ A/D เพื่อเลี้ยวซ้าย-ขวาในขณะที่เคลื่อนที่ไปหน้าหรือถอยหลังได้
- ปรับความเร็วได้โดยใช้ปุ่ม Page Up และ Page Down
- มุมของเซอร์โวแนวตั้งและแนวนอน (ตั้งแต่ -90 ถึง +90 องศา) สำหรับควบคุมทิศทางหัวหุ่นยนต์ สามารถควบคุมได้ด้วยการขยับเมาส์
- ปุ่ม 'G' ใช้เพื่อตั้งเซอร์โวทั้งคู่กลับไปที่มุมตั้งต้น
- ปุ่ม 'L' ใช้สำหรับเปิด/ปิดไฟแฟลช LED ของกล้อง ESP32