ไอเดียเจ๋งๆ ของโปรเจกต์นี้เริ่มต้นตอนที่พี่มองเห็นเจ้าโต๊ะหมุนของ IKEA นี่แหละ น้องๆ คงเคยเห็นตามร้านอาหารจีนใช่มั้ย:

ไอเดียก็ง่ายๆ ว่า ทำไมไม่ทำให้เจ้านี่มันหมุนอัตโนมัติซะเลยล่ะ โดยใช้สเต็ปเปอร์มอเตอร์ แล้วควบคุมด้วย ARDUINO สิ
พี่ก็เลยเริ่มต้นด้วยการปริ้นเกียร์ 3D บางชิ้นที่เข้ากับสเต็ปเปอร์มอเตอร์ที่พี่มีอยู่แล้ว

แต่ไม่นานก็รู้เลยว่าโครงสร้างนี้มันใช้การไม่ได้แน่ๆ สาเหตุง่ายๆ เพราะสเต็ปเปอร์มอเตอร์ตัวเก่ามันแรงไม่พอที่จะขับมวลของโต๊ะไม้หมุนนั่นเอง
พี่เลยไปหาสเต็ปเปอร์มอเตอร์ตัวที่แรงขึ้นมาใหม่ นั่นคือ NEMA 17 HS 34:

แม้ว่าโครงสร้างนี้จะทำงานได้ (แบบฝืนๆ) แต่สเต็ปเปอร์มอเตอร์ก็ยังแทบจะหมุนโต๊ะไม้หนักๆ ไม่ได้เลย เพราะแรงเสียดทานในเกียร์พลาสติก
พี่เลยตัดใจทิ้งไอเดียการใช้โต๊ะหมุน IKEA แล้วหันมาปริ้นโต๊ะหมุนของตัวเองซะเลย ซึ่งเบากว่าและหมุนด้วย NEMA 17 ได้สบายๆ!

หลังจากประกอบทุกอย่างเข้าด้วยกัน นี่ก็คือผลลัพธ์สุดท้ายของโปรเจกต์:

แน่นอนว่าความทะเยอทะยานของพี่มันมากกว่าแค่ให้วัตถุหมุน 360 องศา!
พี่อยากควบคุมกล้อง SONY HX400 ของพี่จากระยะไกล (แบบไร้สาย ผ่านบลูทูธ) และให้มันถ่ายภาพอัตโนมัติทุกๆ xx องศา เป้าหมายคือการแปลงภาพ 2D ทุกภาพให้กลายเป็นภาพ 3D และประมวลผลวัตถุเพื่อนำไปปริ้น 3D ต่อไป
ผลลัพธ์สุดเจ๋งดูได้ที่นี่เลย:
ในบทสอนต่อไป น้องๆ จะได้อ่านว่าโปรเจกต์นี้สร้างขึ้นยังไง
ขอให้อ่านกันอย่างสนุก และหวังว่าจะเป็นแรงบันดาลใจให้น้องๆ ไปสร้างอะไรเจ๋งๆ แบบนี้บ้างนะ สู้งานนะน้อง!
อุปกรณ์ต่างๆ
ส่วนประกอบฮาร์ดแวร์:
ดูได้ในขั้นตอนที่ 2 และ 3
เครื่องมือทั่วไปและอุปกรณ์ทดสอบ
แอปและบริการซอฟต์แวร์:
- Arduino IDE
- Fusion 360
- CURA
- Autodesk Fusion 360
- ClickCharts Diagram and Flowchart
- EasyEDA
- Fritzing
ขั้นตอนที่ 1: ออกแบบระบบ
การออกแบบฐานหมุน (Turntable) แสดงในแผนภาพด้านล่างนี้:

ระบบนี้ประกอบด้วย 2 ส่วนหลักๆ คือ:
- ชุดฐานหมุน (TurntableAssembly - TA) ที่ใช้ ESP32 เป็นไมโครคอนโทรลเลอร์ทำหน้าที่เป็นเซิร์ฟเวอร์:

- กล่องควบคุมกล้อง (CameraControl Box - CCB) ที่ใช้ ESP32 อีกตัวทำหน้าที่เป็นไคลเอนต์:

ส่วน TA จะติดตั้งหน้าจอ OLED ขนาด 0.96 นิ้ว ซึ่งทำงานร่วมกับปุ่มกดเพื่อสร้างส่วนติดต่อผู้ใช้ (HMI) ของระบบ:

HMI นี้ทำให้ผู้ใช้สามารถเลือกโหมดการหมุนของฐานและตรวจสอบสถานะได้
โหมดการหมุนที่มีให้เลือกมีดังนี้:
- ถ่าย 5 ภาพ โดยหมุนครั้งละ 72°
- ถ่าย 10 ภาพ โดยหมุนครั้งละ 36°
- ถ่าย 15 ภาพ โดยหมุนครั้งละ 24°
- ถ่าย 20 ภาพ โดยหมุนครั้งละ 18°
- หมุนต่อเนื่อง
มีปุ่มสีเขียว 3 ปุ่มสำหรับการกระทำต่างๆ เช่น:
- “go-to-Origin” เพื่อพาฐานหมุนกลับไปยังตำแหน่งเริ่มต้นที่กำหนดโดยสวิตช์กล (ติดตั้งไว้ใต้ฐานหมุน)
- “Start/Pause” ใช้เพื่อรีสตาร์ทระบบหรือเริ่มโหมดการหมุนใหม่
- “manual shot” ตั้งใจให้ส่งคำสั่งถ่ายภาพไปยังกล้อง แต่ในดีไซน์ปัจจุบันใช้เฉพาะในขั้นตอนการเลือกโหมดการหมุนเท่านั้น
ชิ้นส่วนอิเล็กทรอนิกส์ทั้งหมดสำหรับ MCU รวมถึงสเต็ปเปอร์มอเตอร์และไดรเวอร์ของมัน ถูกติดตั้งไว้ภายในโครงฐานหมุน
ไฟ LED สีน้ำเงินจะแสดงสถานะการเชื่อมต่อบลูทูธไปยังไคลเอนต์กล้อง
ระบบใช้ไฟเลี้ยงจากอะแดปเตอร์ 12V/3A ที่เสียบกับไฟบ้าน โดยไฟ LED สีแดงจะแสดงสถานะว่าเปิดไฟเลี้ยงแล้ว
ส่วน CCB เป็นกล่องพิมพ์ 3 มิติ ที่บรรจุ ESP32, ไฟ LED (3mm) และขั้วต่อสำหรับเสียบเข้ากับพอร์ต micro USB แบบหลายขาของกล้อง SONY HX 400V ไฟเลี้ยงสำหรับ CCB ใช้จากแบตเตอรี่ของกล้อง (3.3V) CCB ยังมีขั้วต่อสำหรับปลั๊ก 3.5mm เพื่อใช้เปิด-ปิดไฟสปอตไลต์ LED แยก สำหรับส่องสว่างวัตถุที่จะถ่ายภาพ
ไฟ LED 3 ดวง (นอกจากไฟสีส้มที่แสดงสถานะไฟเลี้ยง) มีหน้าที่ดังนี้:
- ไฟ LED สีเหลือง: แสดงว่ากล้องกำลังโฟกัส
- ไฟ LED สีเขียว: แสดงว่ากล้องกำลังได้รับคำสั่ง “SHOOT”
- ไฟ LED สีน้ำเงิน: แสดงสถานะการเชื่อมต่อบลูทูธกับเซิร์ฟเวอร์ฐานหมุน
ขั้นตอนที่ 2: การประกอบชุดฐานหมุน
อุปกรณ์ที่ใช้
ใช้วัสดุต่อไปนี้สำหรับสร้างฐานหมุน:
การออกแบบวงจรอิเล็กทรอนิกส์
การออกแบบวงจรอิเล็กทรอนิกส์แสดงในแผนภาพวงจรด้านล่าง ใช้ไฟเลี้ยง 12 V/3A ไฟ 5V ภายในสำหรับ ESP32 ได้มาจากไดรเวอร์มอเตอร์ L298N ในขณะที่ไฟ 3.3 V สำหรับจอ OLED ได้มาจากบอร์ด ESP32

แผนภาพด้านบนสร้างโดยใช้ EasyEDA
จอ OLED ขนาด 0.96 นิ้ว มีความละเอียด 128 * 64 พิกเซล และถูกใส่ไว้ในเคสพิมพ์ 3 มิติ:

สเต็ปเปอร์มอเตอร์ NEMA 17 และไดรเวอร์แสดงไว้ด้านล่าง:

รายละเอียดเทคนิคเพิ่มเติม: การทำ Micro-Stepping ของสเต็ปเปอร์มอเตอร์ NEMA
การหมุนวัตถุแบบต่อเนื่องไม่เพียงพอสำหรับการสแกนด้วย Photogrammetry 3D นะน้อง! การเบลอจากการเคลื่อนไหวจะทำลายอัลกอริทึมไปเลย! กล้องต้องนิ่งสนิท โปรเจกต์นี้ใช้ State Machine ที่ทำงานประสานกันอย่างเฉียบคม มันสั่งให้สเต็ปเปอร์มอเตอร์ตัวเบิ้มขยับวัตถุทีละนิดอย่างแม่นยำ หยุดมันแบบดุดันให้สนิท แล้วค่อยส่งสัญญาณชัตเตอร์ไปที่กล้องจากระยะไกล เพื่อให้ได้ลำดับการถ่ายภาพที่สมบูรณ์แบบ! งานนี้จัดไปวัยรุ่น!
ห้ามใช้มอเตอร์แรงบิดต่ำราคาถูกเด็ดขาดนะน้อง! มันไม่มีตำแหน่งที่แม่นยำเลยสักนิด
- โปรเจคนี้ใช้ มอเตอร์สเต็ปเปอร์แบบไบโพลาร์ NEMA 17 ตัวเบิ้ม
- สมการ 200 สเต็ป: สเต็ปเปอร์ NEMA มาตรฐานจะหมุนครบ 1 รอบได้ 200 สเต็ป (ขั้น) นั่นหมายความว่าแต่ละสเต็ปมันกว้างถึง
1.8 องศาถ้าเอาไปสแกนโมเดลเล็กๆ การหมุนจะกระตุกมาก! - โค้ด C++ จะสั่งงานไดรเวอร์มอเตอร์ (เช่น A4988 Stepper Driver)
เราสามารถตั้งค่า "ไมโครสเต็ปปิ้ง" ด้วยจัมเปอร์บนบอร์ดไดรเวอร์ได้เลย (
MS1, MS2, MS3) - ทางคณิตศาสตร์แล้ว มันจะบังคับให้ชิปไดรเวอร์สร้างสเต็ปย่อยๆ ระหว่างสเต็ปใหญ่ โดยการผสมสัญญาณ PWM แบบซับซ้อน!
จาก
200 สเต็ปจะกลายเป็น3200 ไมโครสเต็ปต่อการหมุน 1 รอบ!แผ่นหมุนจะเคลื่อนที่ได้ลื่นปรื้ดๆ แบบไม่น่าเชื่อ ที่0.11 องศา!
ฐานแผ่นหมุน (Turntable plateau) ออกแบบด้วย Fusion 360 และพิมพ์ด้วยเครื่อง Creality CR10S Pro รูตรงกลางก็พิมพ์มาพอดีกับแกนของมอเตอร์สเต็ปเปอร์เลย

การจัดตั้งเบรดบอร์ดสำหรับทดสอบและพัฒนาซอฟต์แวร์ด้วย ARDUINO IDE แสดงในภาพต่อไปนี้:

หมายเหตุ: เฟืองพลาสติกพิมพ์ 3D เป็นส่วนหนึ่งของแนวคิดการสร้างต้นแบบ ซึ่งอ้างอิงจากแผ่นหมุนของ IKEA

การประกอบชิ้นส่วนกลและไฟฟ้า
การประกอบชิ้นส่วนกลและอิเล็กทรอนิกส์ทั้งหมดแสดงในภาพด้านล่าง:

สังเกตว่าแผ่นหมุนทั้งหมดต้องการการเชื่อมต่อแค่ 1 สายเท่านั้น คือ สายไฟ 12V มีการเจาะช่องแยกในกล่องไว้สำหรับ (ชั่วคราว) เชื่อมต่อสาย micro USB ของบอร์ด ESP32 เพื่อใช้ในกรณีอัพเดทซอฟต์แวร์
แผ่นฐานสำหรับสร้างถูกตัดออกจากเขียง IKEA และทำให้พอดีกับกล่อง ACTION
การออกแบบซอฟต์แวร์
แผนภาพโฟลว์ชาร์ตต่อไปนี้แสดงการออกแบบระดับสูงของซอฟต์แวร์เซิร์ฟเวอร์แผ่นหมุน:

ในเฟสตั้งต้น (set up) จะมีการเรียกฟังก์ชันหลายตัว:
- ตั้งค่าการเชื่อมต่อบลูทูธ
WELCOME();// แสดงข้อความต้อนรับจนกว่าจะกดปุ่มแดงTURNTABLEMODES();// แสดงโหมดการทำงานของแผ่นหมุนที่เป็นไปได้HOWTOSET();// แสดงคำอธิบายวิธีเลือกโหมดแผ่นหมุนSETMODE();// ตั้งค่าโหมดแผ่นหมุนโดยกดปุ่มแดงและเลือกด้วยปุ่มเขียวORIGIN();// ควบคุมแผ่นหมุนไปยังตำแหน่งออริจิน
เมนูที่แสดงบนจอ OLED 0.96 นิ้ว จะปรากฏดังนี้:

ฟังก์ชัน "LOOP" หลักนั้นสั้นมาก แสดงดังด้านล่าง:
void loop() {
CONNECTION();
switch (turnmode) {
case 1: // Turnmode 1: 5 X 72 dgr)
STARTandTURN();
break;
case 2: // Turnmode 2: 10 X 36 dgr)
STARTandTURN();
break;
case 3: // Turnmode 3: 15 X 24 dgr)
STARTandTURN();
break;
case 4: // Turnmode 4: 20 X 18 dgr)
STARTandTURN();
break;
case 5: // Turnmode 5: CONTINUOUS
STARTCONTINUOUS ();
break;
}
}
สิ่งเดียวที่เกิดขึ้นในลูปคือ:
- สร้างการเชื่อมต่อบลูทูธ
- รันโหมดการหมุนที่ถูกเลือก (ตามที่ตั้งค่าไว้ในเฟส set up)
สเก็ตช์ ARDUINO เต็มสำหรับเซิร์ฟเวอร์แผ่นหมุนมีความยาวประมาณ 600 บรรทัด รายการโค้ดเต็มถูกรวมไว้เป็นส่วนหนึ่งของบทช่วยสอนนี้ โดยโค้ด ARDUINO มีคำอธิบายประกอบไว้อย่างละเอียด
Step3: สร้างฝั่งกล้อง (Camera client)
อุปกรณ์ที่ใช้
ของที่ต้องใช้สำหรับเจ้าเครื่องหมุนนี้มีดังนี้:
การออกแบบวงจรไฟฟ้า
เราเอาพาวเวอร์ซัพพลาย 3.3V ตรงๆ จากตัวกล้อง แล้วแปลงเป็น 5V เพื่อใช้เลี้ยง ESP32 (ซึ่งข้างในมันจะสร้าง 3.3V เองอีกที)
แผนภาพ Fritzing จะหน้าตาประมาณนี้:

ไม่มีอะไรดีไปกว่าวงจรไฟฟ้าที่ชัดเจนอีกแล้ว:

การเชื่อมต่อกับกล้อง SONY HX400V
กล้อง Sony DSC HX400V มีพอร์ต USB ที่หน้าตาเหมือนไมโคร USB ธรรมดา (ฝั่งเมีย) แบบ 5 พิน และแน่นอนว่าเราสามารถเสียบสายไมโคร USB ตัวผู้ปกติเข้าไปเพื่อชาร์จไฟ 5V และถ่ายโอนข้อมูลได้ (ดูตารางด้านล่าง):
จริงๆ แล้วพอร์ตของ Sony เนี่ย มันคือสิ่งที่ Sony เรียกว่า "Multi/Micro USB Terminal ที่รองรับอุปกรณ์ที่เข้ากันได้กับ Micro USB" ซึ่งมีพินเพิ่มมาอีก 10 พิน เพื่อใช้สำหรับควบคุมกล้องจากระยะไกลได้
ในโปรเจคนี้ เราใช้แค่พินต่อไปนี้ของคอนเนคเตอร์แบบมัลติพอร์ต:

ในอินเทอร์เน็ต พี่เจอแหล่งขายคอนเนคเตอร์มัลติพอร์ตที่เกี่ยวข้องอยู่ 3 ที่ (ลิงก์ต่างๆ พี่ลบออกแล้วนะน้อง อยากได้ลองเสิร์ชหาเอาเองได้) พี่ซื้อของพี่มาจากบริษัท MobileExcopter ในสโลวีเนีย เพราะค่าส่งถูกสุด (ส่งทางไปรษณีย์ EU)
พี่ใช้สายโทรศัพท์ 4 เส้นสำหรับเชื่อมต่อคอนเนคเตอร์เข้ากับ ESP32 การบัดกรีสายเข้ากับ...