จะมาเล่าให้ฟังสักเรื่องเกี่ยวกับงานทดลองที่ท้าทายมากๆ งานนี้แหละที่แสดงให้เห็นว่าเทคโนโลยีโอเพนซอร์สมันเปิดโอกาสให้เราได้ขยายความรู้และเรียนรู้ในแบบที่ถ้าไม่มีมันก็คงทำไม่ได้เลย
มีบริษัทออกแบบจากอัมมานชื่อ Uraiqat architects เค้ามาพูดกับพี่เรื่องแนวคิดอยากสร้าง "คิวบ์" ที่ผิวสะท้อนแสง 100% และออกแบบเป็นพื้นผิวที่ประกอบด้วยชิ้นส่วนเล็กๆ (tessellated surface) ที่ขยับได้อย่างลื่นไหล ให้เอฟเฟกต์เหมือนคลื่นเคลื่อนไหวไปมา เป็นผลงานสำหรับงาน Amman Design Week ตอนเดือนตุลาที่ผ่านมา
พูดแบบเทคนิคแล้ว ทุกอย่างเป็นไปได้หมดแหละ และในความเป็นจริง การควบคุมมอเตอร์กว่า 500 ตัวพร้อมกัน เพื่อให้สามเหลี่ยมแต่ละชิ้นขยับแยกกัน แล้วรวมกันแล้วได้เอฟเฟกต์ทางเรขาคณิตออกมานั้น... มันทำได้อยู่
ในฐานะที่พี่เป็นสถาปนิกที่หันมาเล่นงานอินเทอร์แอคชันดีไซน์ พี่จะตระหนักอยู่เสมอถึงเส้นแบ่งระหว่างการหลงใหลในเทคโนโลยี กับการใช้เทคโนโลยีเพื่อทำในสิ่งที่วิธีอนาล็อกทำไม่ได้ บางครั้งแนวคิดหลักของงานอาจจะทำด้วยวิธีอนาล็อกอื่นก็ได้ แต่ดีไซเนอร์กลับเลือกวิธีที่ซับซ้อนกว่าแค่เพราะ "เราทำได้นี่!" และมันก็มีเส้นโค้งการเรียนรู้ที่ต้องเข้าใจด้วยว่า "ทำไมเราถึงทำสิ่งที่เรากำลังทำอยู่"
เวลาที่มีแค่ 6 สัปดาห์ ใน 6 สัปดาห์นี้ พี่ต้องออกแบบโครงสร้างคิวบ์ที่ให้ชิ้นส่วนทั้ง 550 ชิ้นขยับได้อิสระ โดยการเคลื่อนไหวและสถานการณ์การโต้ตอบนั้นจะต้องสื่อถึงแนวคิดเรื่อง "คุณเห็นตัวเองในเมืองอย่างไร" พี่ใช้เวลาคิดอยู่สัปดาห์นึงว่าจะรับปากดีมั้ย ถูกยั่วยวนด้วยโอกาสได้สร้างอะไรที่ใหญ่โต แบบก้ำกึ่งระหว่างงานสถาปัตย์ และด้วยความจริงที่ว่าเกือบทุกชิ้นส่วนในประเทศนี้ไม่มีขาย และไม่มีใคร (รวมถึงสถาปนิกเจ้าของไอเดียเองด้วยมั้ง) ที่เชื่อว่าสิ่งนี้จะสร้างได้จริง สุดท้ายพี่ก็บอกว่า "จัดไปวัยรุ่น" และการเดินทางก็เริ่มต้นขึ้น
ดังนั้นพี่ต้องหาวิธีควบคุมสามเหลี่ยม 134 ชิ้น (แต่ละหน้าคิวบ์มี 8 แถว แถวละ 17 ชิ้น) ให้ขยับเป็นจังหวะสอดคล้องกัน และผ่านการเคลื่อนไหวเหล่านั้น พี่ต้องออกแบบสถานการณ์ที่เผยให้เห็นถึงการมีปฏิสัมพันธ์ของพลเมืองกับเมืองและกับตัวเอง
แต่ละด้านของคิวบ์กว้าง 3 x 3 เมตร และโปรเจกต์นี้จะถูกจัดแสดงในที่สาธารณะ การสร้างการโต้ตอบที่ขยับตามเมื่อคุณขยับ ซึ่งเป็นสถานการณ์เริ่มต้นที่ออกแบบไว้สำหรับคิวบ์ มันคงไม่มีความหมายมากนักในที่ที่มีคนเยอะแยะ อีกตัวเลือกหนึ่งคือการสร้างประสบการณ์ส่วนตัว นั่นคือ คุณ ท่ามกลางฝูงชน กำลังเผชิญหน้ากับสิ่งมีชีวิตสะท้อนแสงนี้ ในบางครั้งคุณควบคุมการเคลื่อนไหวของมันไม่ได้ ในบางครั้งคุณเป็นศูนย์กลางของการเคลื่อนไหว และก็มีช่วงเวลาที่คุณมองคนอื่นแล้วคิดว่าเรากำลังเห็นภาพเดียวกัน แต่จริงๆ แล้วเรากำลังเห็นมุมมองที่ตรงกันข้ามกันเลย
เมื่อออกแบบด้วยวิสัยทัศน์นี้ แต่ละด้านทั้ง 4 ด้านของคิวบ์จึงมีสถานการณ์การเคลื่อนไหวที่แตกต่างกัน เพื่อเผยให้เห็นความหมายที่ต่างกันออกไป
ลงลึกแบบช่างๆ: วิศวกรรมระบบแมคคาทรอนิกส์ขนาดใหญ่
การติดตั้งมันหินในทุกขั้นตอนเลยว่ะ ตัวอย่างเช่น เซอร์โวมอเตอร์ต้องถูกปรับให้อยู่ที่มุม 90 องศา ก่อนที่จะติดตั้งขายึด (bracket) เพื่อให้ตำแหน่งภาพและตำแหน่งแนวนอนสัมพัทธ์ของมอเตอร์ตรงกัน สิ่งแรกที่ทำคือจัดตำแหน่งมอเตอร์และทำเครื่องหมายด้วยเส้นที่ลากจากเพลาไปยังตัวมอเตอร์ จากนั้นค่อยติดตั้งขายึด วิธีนี้ใช้ได้ แต่ในบางกรณี ทีมที่ติดตั้งชิ้นส่วนอาจขยับการวางแนวของเพลาไปขณะติดตั้งขายึดเข้ากับมอเตอร์ และการแก้ไขปัญหานี้มันยุ่งยากมาก ผมเลยตัดสินใจจ่ายไฟให้มอเตอร์ และรับสัญญาณให้อยู่ที่ 90 องศา ขณะที่กำลังติดตั้งขายึดอยู่
การจัดตำแหน่งแบบจ่ายไฟสด (Live-Power Alignment) เนี่ยสำคัญมาก การประกอบแบบดั้งเดิมมักทำให้เกิดการเยื้องศูนย์ (axial offset) แต่ด้วยการจ่ายไฟให้เซอร์โวทั้งหมดไปที่ตำแหน่ง "90 องศา" ในซอฟต์แวร์ ระหว่าง การติดตั้งขายึด เราจึงมั่นใจได้ว่าตำแหน่ง "โฮม" จริงทางกายภาพของสามเหลี่ยมสะท้อนแสงแต่ละชิ้น จะตรงกับตำแหน่งศูนย์ทางลอจิกของซอฟต์แวร์เป๊ะๆ



เซอร์โวเป็นมอเตอร์ที่น่าสนใจมาก ใช้พลังงานน้อยกว่า 1 แอมป์แต่ให้การเคลื่อนที่เชิงมุมที่หลากหลาย เนื่องจากข้อจำกัดเรื่องเวลา งบประมาณ และการขาดแคลนช่างผลิตที่ไว้ใจได้ ทีมจึงตัดสินใจใช้เซอร์โวกับขายึดมาตรฐานแบบเอียง — แบบที่ใช้ในแขนกลนั่นแหละ ตามร้านค้าทั่วประเทศ ผมหาขายึดแบบนี้ได้แค่ไม่กี่โหลเท่านั้น แค่จะทดสอบแถวเดียวให้ทำงานพร้อมกันยังแทบเป็นไปไม่ได้เลย แหล่งจ่ายไฟ (power supply) ที่หาง่ายในเมืองคือแบบ 24V ในขณะที่เซอร์โวต้องการ 5.5V-6V และการลดระดับแรงดัน (stepping down voltage) ก็ไม่ใช่ตัวเลือกที่ดีในแง่ประสิทธิภาพ อีกอย่าง ราคาและความน่าเชื่อถือของการใช้แบตเตอรี่ก็ทำไม่ได้เช่นกัน บริษัท Winston จากจีน รับผลิตแหล่งจ่ายไฟ 6V-20 แอมป์ให้ตามคำขอของผม (เป็นแหล่งจ่ายไฟเกรด IP7 ที่เจ๋งมาก) แต่ละด้าน (facade) ใช้แหล่งจ่ายไฟ 5 ตัว รวมเป็น 100 แอมป์ DC
การปรับแต่งแหล่งจ่ายไฟ (Power Supply Customization) เนี่ยจำเป็นมาก โซลูชันมาตรฐานอย่าง ATX หรือแบตเตอรี่ไม่เพียงพอสำหรับโหลดต่อเนื่อง 20A ต่อด้าน แหล่งจ่ายไฟ 6V เกรด IP7 ที่ผลิตขึ้นพิเศษนี้ ให้แหล่งจ่ายแรงดันต่ำที่มีความต้านทานต่ำและเสถียร ป้องกันปัญหา "แรงดันตกชั่วขณะ (Voltage Brown-outs)" ในช่วงที่มีการเคลื่อนไหวสูงสุด
ออกแบบการเชื่อมต่อแบบต้นไม้ (tree connection) เพื่อจ่ายไฟจากทั้งสองด้าน ชดเชยแรงดันตกเล็กน้อย มอเตอร์แต่ละตัวเชื่อมต่อกับบอร์ดต่อขนาดเล็กที่ทำขึ้นเอง (ดูรูปด้านล่าง) ซึ่งให้ช่องต่อ 17 ช่องต่อแถวในแต่ละด้าน (ลองคำนวณดูสิ!) ใช้สายไฟขนาด 1.6mm สำหรับจ่ายไฟ ส่วนสายสัญญาณเชื่อมต่อกับสายข้อมูล CAT8
การกระจายไฟกระแสสูง (The 100A Mesh) ต้องการกลยุทธ์ที่ไม่ใช่เชิงเส้น โทโพโลยี "Tree Connection" จ่ายไฟผ่านสายไฟขนาด 1.6mm จากทั้งสองปลายเพื่อชดเชย แรงดันตก (Voltage Drop) และรับประกันแรงบิดที่สม่ำเสมอในเซอร์โวทั้งหมด 134 ตัว สำหรับ ความสมบูรณ์ของสัญญาณ (Signal Integrity) ด้วยสัญญาณ PWM เป็นร้อยๆ สายและสายไฟกระแสสูงที่อยู่ใกล้กัน EMI เป็นความเสี่ยงสำคัญ การใช้ สายข้อมูล CAT8 มีชีลด์ ในการส่งสัญญาณ ช่วยแยกพัลส์ PWM ที่ไวต่อการรบกวน ออกจากสัญญาณรบกวนแม่เหล็กของแถวมอเตอร์


ตัวต่อไฟ DC แต่ละชิ้นราคาประมาณ 15 ยูโรในจอร์แดน ด้วยการเชื่อมต่อแบบต้นไม้ นั่นหมายถึงต้องใช้ปลั๊ก 2 ตัวต่อแถว เนื่องจากข้อจำกัดงบประมาณ การเชื่อมต่อแบบต้นไม้จึงถูกออกแบบมาโดยใช้ปลายขั้วต่อเป็นปลั๊ก MK สำหรับติดตั้งระบบ AC แม้จะดูแปลกๆ แต่ก็ใช้งานได้ดี!
สถาปัตยกรรมระบบควบคุม
การควบคุมเซอร์โว 134 ตัวพร้อมกัน มีตัวเลือกหลายทาง เช่น ก) ใช้สัญญาณเดียวกันควบคุมเซอร์โวหลายตัว ทำให้เซอร์โวหลายตัวขยับเหมือนกัน (ใช้ Arduino หลายตัว) ข) ใช้เซอร์โวเป็นตัวหลัก (master) และตัวตาม (slave) [แต่วิธีนี้พี่ไม่ค่อยชอบเท่าไหร่] หรือ ค) ใช้ไดรเวอร์ เพื่อควบคุมการเคลื่อนไหวของแต่ละตัวได้อย่างอิสระเต็มที่ นี่คือตัวเลือกที่สมเหตุสมผลและเข้าท่าที่สุดทางเทคนิค และในที่สุดพี่ก็เลือกใช้วิธีนี้
บอร์ด PCA9685 จาก Adafruit ใช้โปรโตคอล I2C และควบคุมสัญญาณ PWM ให้กับแต่ละมอเตอร์ได้อย่างอิสระ บอร์ดนี้รองรับมอเตอร์ได้ 16 ตัว และเราสามารถเชื่อมต่อบอร์ดเพิ่มเป็นกี่อันก็ได้ (daisy-chain) ซึ่งทำให้เราควบคุมมอเตอร์จำนวนมหาศาลให้เคลื่อนไหวพร้อมกันได้อย่างลื่นไหล เซอร์โวแต่ละแถว (17 ตัว) ต่อกับบอร์ด PCA9685 หนึ่งอัน จากนั้นบอร์ดทุกอันก็เชื่อมต่อไปที่ Arduino ตัวเดียว จบ!
นี่คือคลาสเรียนระดับมาสเตอร์ในเรื่อง I2C Bus Clustering เลยนะตัวนี้ Arduino Uno ทำหน้าที่เป็นบัสมาสเตอร์ คุยกับบอร์ด PCA9685 ที่ต่อกันเป็นทอดๆ แต่ละบอร์ดมีที่อยู่ (address) เป็นของตัวเองผ่านการเซ็ตด้วยจัมเปอร์ (A0-A5) ทำให้ Uno บอร์ดเดียวสามารถสั่งการช่อง PWM ทั้งหมดได้ โดยใช้พินแค่ 2 พิน (SDA/SCL) เท่านั้น
เคล็ดลับสำคัญที่ช่วยกำจัดอาการสั่น (jitter) ให้หมดไปคือ การทำให้ความถี่ของมอเตอร์ตรงกับที่ตั้งค่าในโค้ด (โค้ดตัวอย่างมักตั้งไว้ที่ 60Hz ซึ่งตรงกับเซอร์โวอนาล็อกส่วนใหญ่) ระวังเรื่องนี้ให้ดีในโค้ดของน้องนะ
เทคนิค Latent Frequency Nullification นี้คือกุญแจสำคัญ เพื่อกำจัดอาการ "สั่น" ที่เห็นด้วยตาในทั้งระบบ เฟิร์มแวร์จะซิงค์ออสซิลเลเตอร์ภายในของ PCA9685 ให้ตรงกับ 60Hz พอดี ซึ่งตรงกับความถี่การอัพเดตทางกลของเซอร์โวอนาล็อกเป๊ะๆ
อีกเทคนิคนึงที่พี่เสียดายไม่มีเวลาได้ลอง แต่คิดว่าน่าจะเจ๋งมาก คือ การใช้ Timer1 แทนที่จะเป็น Timer0 พี่เชื่อว่ามันน่าจะช่วยให้ควบคุมความเร็วได้ดีขึ้น แต่...ไว้โปรเจคหน้าละกันเนอะ เพราะว่า...ใครจะมาสร้างเซอร์โว 544 ตัวทุกวันล่ะ จริงมะ? :)
การออกแบบการโต้ตอบและสเกลระบบ
สามเหลี่ยมสะท้อนแสง 134 ชิ้นถูกจัดเรียงเป็น 8 แถว แถวละ 17 ชิ้น แต่ละแถวจะสิ้นสุดที่จุดเชื่อมต่อ "Pref-Board" ที่ออกแบบและทำขึ้นเอง ทำหน้าที่เป็นฮับกระจายไฟและสัญญาณในพื้นที่นั้นๆ ซึ่งช่วยให้การแก้ไขปัญหาในระบบเซอร์โว 544 ตัวมหึมาง่ายขึ้นเยอะ
โค้ดถูกออกแบบให้สร้างสถานการณ์ที่สามเหลี่ยมสะท้อนแสงทำตัวเหมือนพิกเซล โดยการปรับมุมผ่าน Sine-Wave Interpolation ลูกบาศก์จะสร้างเอฟเฟกต์ "การเลื่อนของภาพสะท้อน" ทำให้ผู้ชมเห็นภาพของเมืองและตัวพวกเขาเองที่แตกออกหรือรวมเข้าด้วยกัน ขึ้นอยู่กับระยะห่าง
บทสรุป
พี่เคารพในความกล้าของสถาปนิก ที่อยากจะผลักดันไอเดียที่เกินกว่าความคุ้นเคยของพวกเขาไปให้ไกลขึ้น พี่เคารพเทคโนโลยีโอเพนซอร์สอย่างมาก ซึ่งถ้าไม่มีมัน พวกเราก็คงไม่ได้เห็นชิ้นงานนี้เคลื่อนไหว มันเป็นประสบการณ์ที่เหลือเชื่อจริงๆ
โปรเจค "Omni-Servo" นี้ แสดงให้เห็นถึงความสามารถในการขยายขนาดของ Open-Source Mechatronics โดยการเชี่ยวชาญใน I2C Clustering, Tree-Topology Power Forensics, และ Synchronous PWM Actuation เราสร้างโครงสร้างจลนศาสตร์ขนาดใหญ่ที่รู้สึกเป็นธรรมชาติ ตอบสนองได้ดี และมีทั้งความน่าเชื่อถือและผลกระทบในระดับอุตสาหกรรม
ทีม: โค้ด Arduino ส่วนใหญ่ถูกเขียนขึ้นมาด้วยกันกับ Loay Ghannam (ต้องขอบคุณสำหรับความเร็วของเขาอย่างแรง!) ขอบคุณทีมอาสาสมัครและเพื่อนๆ ที่สุดยอด ที่ช่วยบัดกรี ติดตั้ง และสร้างชิ้นงานนี้ขึ้นมาจริงๆ: Zaid Marji (ถ้าไม่มีเขา ชิ้นงานนี้คงไม่เสร็จเลยมั้ง), Laila Atalla (เพื่อนที่ปรึกษากฎหมายของพี่ ที่บัดกรีเก่งมากด้วย), Zaid Saleh (คนที่หัวแร้งกระเด็นเข้าตาแล้วยังทำงานต่อ!), May Abrash และ Abdalla Hamad ขอบคุณทุกคนมากๆ เลย
อ้อ พี่มีแอคเคาต์นี้มา 5 ปีแล้ว ในนาม Maya นิรนาม แต่จริงๆ แล้วพี่คือ Moushira นะจ๊ะ :)
Design Technologist