แอปวัดระดับน้ำทำงานอย่างไร: อธิบายมาตรวัดความเร่งในโทรศัพท์
โทรศัพท์ของคุณรู้ว่าทิศทางไหนคือด้านล่าง เพราะมันมีเซนเซอร์เล็ก ๆ ที่เรียกว่ามาตรวัดความเร่งแบบ MEMS เซนเซอร์ตัวนี้วัดว่าแรงโน้มถ่วงดึงตัวเครื่องไปในสามทิศทางพร้อมกันมากแค่ไหน แอปวัดระดับน้ำจะอ่านตัวเลขสามตัวนั้น คำนวณตรีโกณมิติเล็กน้อย แล้วแสดงมุมออกมาให้คุณเห็น มันทำแบบนี้หลายร้อยครั้งต่อวินาที ภายในชิปที่เล็กจนคุณแทบมองด้วยตาเปล่าไม่เห็น บทความนี้จะพาไปดูว่าจริง ๆ แล้วมันเกิดอะไรขึ้นบ้าง
- มาตรวัดความเร่งวัดว่าแรงโน้มถ่วงกระจายตัวไปตามสามแกนอย่างไร มันไม่ได้วัดการเคลื่อนที่ตอนที่โทรศัพท์วางนิ่ง
- มุมก้ม-เงย (pitch) และมุมเอียงซ้าย-ขวา (roll) ได้มาจากสูตร arctan ที่นำค่าแรงโน้มถ่วงสามค่านั้นมาคำนวณ
- Spirit Level Pro นำค่าดิบมาผ่านตัวกรองค่าเฉลี่ยเคลื่อนที่แบบเอ็กซ์โพเนนเชียล (alpha=0.15) เพื่อไม่ให้ฟองสั่นกระตุก
- เซนเซอร์ MEMS มีค่าที่เลื่อนไปตามอุณหภูมิ จึงควรปรับเทียบตรงจุดที่คุณทำงานจริง
- สำหรับโทรศัพท์ที่แนบนิ่งกับพื้นผิว มาตรวัดความเร่งทำงานได้ครบทั้งหมด คุณไม่จำเป็นต้องใช้ไจโรสโคป
มาตรวัดความเร่ง MEMS คืออะไร
MEMS ย่อมาจาก Micro-Electro-Mechanical Systems ชิ้นส่วนที่ทำหน้าที่ตรวจจับภายในมาตรวัดความเร่งของโทรศัพท์นั้นเล็กมาก กว้างไม่กี่ร้อยไมครอน เล็กกว่าเม็ดเกลือ มันอยู่บนแผ่นซิลิคอนเดียวกับวงจรอิเล็กทรอนิกส์ทั่วไป และผลิตด้วยกรรมวิธีเดียวกัน นี่จึงเป็นเหตุผลที่เซนเซอร์พวกนี้ราคาถูกและไปอยู่ในโทรศัพท์แทบทุกเครื่อง
กลไกของมันเข้าใจง่ายเมื่อคุณนึกภาพออก มีมวลจิ๋ว ๆ ห้อยอยู่บนสปริงซิลิคอนที่กัดเซาะขึ้นมาในตัวชิป เมื่อคุณเอียงชิป แรงโน้มถ่วงจะดึงมวลนั้นให้เคลื่อนออกจากจุดกลางเล็กน้อย การขยับนั้นทำให้ช่องว่างระหว่างซี่โลหะรูปหวีเปลี่ยนไป และเมื่อช่องว่างเปลี่ยน ค่าความจุไฟฟ้าระหว่างซี่ก็เปลี่ยนตาม ชิปอ่านการเปลี่ยนแปลงนั้นแล้วแปลงเป็นค่าความเร่ง วัดเป็นหน่วย g
ตรงนี้คือส่วนที่ทำให้เครื่องวัดระดับน้ำเป็นไปได้ เมื่อโทรศัพท์วางนิ่ง มาตรวัดความเร่งไม่ได้อ่านการเคลื่อนที่ มันอ่านว่าแรงโน้มถ่วงดึงไปตามแต่ละแกนในสามแกนมากแค่ไหน แรงโน้มถ่วงเป็นแรงคงที่ที่เรารู้ค่า เมื่อคุณรู้ว่ามันแบ่งไปตามสามแกนอย่างไร คุณก็คำนวณได้อย่างแม่นยำว่าโทรศัพท์เอียงไปเท่าไร
มาตรวัดความเร่งสามแกนวัดความเอียงได้อย่างไร
มาตรวัดความเร่งสามแกนกำหนดทิศทางของตัวมันเองให้โทรศัพท์ แกน X วิ่งจากซ้ายไปขวา แกน Y วิ่งจากบนลงล่าง และแกน Z วิ่งจากหน้าไปหลัง วางโทรศัพท์ราบบนโต๊ะ แรงโน้มถ่วงจะดึงลงตามแกน Z แทบทั้งหมด ดังนั้นแกน Z จะอ่านได้ราว 9.81 m/s² ส่วน X และ Y อ่านได้ใกล้ศูนย์ พอเอียงโทรศัพท์ แรงโน้มถ่วงก็เปลี่ยนไป ลงบน Z น้อยลง ไปที่ X และ Y มากขึ้น ตามสัดส่วนของมุม
การเปลี่ยนค่าสามตัวนั้นให้เป็นมุมคือตรีโกณมิติพื้นฐาน มุมก้ม-เงย (pitch) คือความเอียงหน้า-หลัง มุมเอียง (roll) คือความเอียงซ้าย-ขวา และทั้งคู่มาจากค่าอินเวอร์สแทนเจนต์:
สองบรรทัดนั้นคือแกนกลางทางคณิตศาสตร์ทั้งหมดของแอปวัดระดับน้ำ ป้อนค่าดิบสามตัวเข้าไป คำนวณ แล้วคุณจะได้ pitch และ roll เป็นเรเดียน คูณด้วย 180/π เพื่อแปลงเป็นองศา นั่นคือตัวเลขที่ขึ้นบนหน้าจอของคุณ
คุณอาจสงสัยว่าทำไมตัวหารถึงใช้รากที่สองของอีกสองแกน แทนที่จะใช้แค่แกนเดียว เหตุผลคือมันช่วยให้ค่ายังคงเสถียรตลอดการหมุนครบรอบ ถ้าคุณหารด้วยแกนเดียว คณิตศาสตร์จะรวนตอนเข้าใกล้แนวตั้ง เพราะแกนนั้นจะลดลงเหลือศูนย์ แล้วคุณก็ต้องหารด้วยค่าที่เกือบเป็นศูนย์ การใช้ขนาดรวมของอีกสองแกนช่วยหลีกเลี่ยงปัญหานั้น
Spirit Level Pro แสดงมุม pitch และ roll สด ๆ พร้อมการปรับให้เรียบแบบ EMA ค่าความคลาดเคลื่อนให้เลือกห้าระดับ และปรับเทียบด้วยการแตะครั้งเดียว ไม่ต้องดาวน์โหลด
ลองใช้ Spirit Level Pro ฟรีทำไมข้อมูลดิบจากเซนเซอร์ถึงมีสัญญาณรบกวนมาก
ค่าที่ออกมาดิบ ๆ จากมาตรวัดความเร่งกระโดดไปมามากกว่าที่คุณคิด แม้โทรศัพท์วางนิ่งสนิท ค่าที่อ่านได้ก็ยังสั่นไหวเล็กน้อย ส่วนหนึ่งมาจากสัญญาณรบกวนทางไฟฟ้าในตัวเซนเซอร์เอง ส่วนหนึ่งมาจากการสั่นสะเทือนที่ส่งผ่านพื้นผิว และอีกส่วนมาจากค่าที่ปัดเศษตอนแปลงสัญญาณแอนะล็อกให้เป็นตัวเลข ถ้าแสดงข้อมูลดิบนั้นบนหน้าจอ ฟองจะกระตุกไม่หยุด ซึ่งใช้งานจริงจังไม่ได้เลย
สัญญาณรบกวนมาจากหลายแหล่ง สัญญาณรบกวนเชิงความร้อนคือความผันผวนทางไฟฟ้าแบบสุ่มที่เกิดจากความร้อน คุณกำจัดมันไม่ได้ และมันกำหนดขีดจำกัดว่าเซนเซอร์เงียบได้มากที่สุดแค่ไหน สัญญาณรบกวนจากการสั่นสะเทือนมาจากสิ่งรอบตัวคุณ เช่น คอมเพรสเซอร์ตู้เย็น เสียงฝีเท้า หรือรถยนต์วิ่งข้างนอก และจุดศูนย์ของเซนเซอร์ก็ค่อย ๆ เลื่อนไปเองเมื่อเวลาผ่านไป แต่ละอย่างต้องแก้ด้วยวิธีต่างกัน
วิธีแก้ทางซอฟต์แวร์ที่ใช้กันคือตัวกรองความถี่ต่ำ (low-pass filter) มันปล่อยให้การเปลี่ยนแปลงช้า ๆ อย่างการเอียงจริงผ่านไป แต่กันการเปลี่ยนแปลงเร็ว ๆ อย่างการสั่นสะเทือนไว้ วิธีที่นิยมทำคือใช้ค่าเฉลี่ยเคลื่อนที่แบบเอ็กซ์โพเนนเชียล หรือ EMA ค่าที่อ่านได้ใหม่แต่ละครั้งจะถูกนับเป็นสัดส่วนหนึ่ง คือ alpha ส่วนที่เหลือยกมาจากค่าที่กรองไว้ครั้งก่อน:
Spirit Level Pro ใช้ EMA ที่ alpha=0.15 เราลงตัวที่ค่านี้หลังจากลองปรับค่าหลายแบบด้วยมือ ที่ alpha=0.05 ค่าที่อ่านนิ่งเรียบมากแต่ช้า และฟองตามหลังโทรศัพท์ตอนคุณขยับ ที่ alpha=0.3 มันตามได้ทันแต่กระตุกพอที่จะทำให้อ่านค่าแม่น ๆ ได้ยาก ค่า alpha=0.15 อยู่ตรงกลาง ฟองรู้สึกมีชีวิตชีวาโดยไม่กระวนกระวาย
ไจโรสโคปมีบทบาทอะไร
ไจโรสโคปวัดว่าโทรศัพท์กำลังหมุนเร็วแค่ไหน เป็นองศาต่อวินาที มันไม่ได้วัดว่าโทรศัพท์หันไปทางไหน ความต่างตรงนี้สำคัญ ไจโรสโคปเพียงลำพังบอกไม่ได้ว่าโทรศัพท์ได้ระดับหรือไม่ มันรู้แค่ว่ากำลังหมุนอยู่ไหมและหมุนเร็วเท่าไร สำหรับการอ่านระดับตอนโทรศัพท์วางนิ่ง มาตรวัดความเร่งมีข้อมูลที่คุณต้องการอยู่แล้ว
ไจโรสโคปจะมีที่ยืนตอนที่โทรศัพท์กำลังเคลื่อนที่ ด้วยการหลอมรวมเซนเซอร์ (sensor fusion) มาตรวัดความเร่งอ่านความเอียงตอนนิ่งได้ดี แต่จะช้าและมีสัญญาณรบกวนตอนเคลื่อนที่เร็ว ไจโรสโคปติดตามการหมุนเร็ว ๆ ได้ดี แต่ค่าจะเลื่อน เพราะความคลาดเคลื่อนเล็ก ๆ สะสมกันเมื่อเวลาผ่านไป ตัวกรองแบบคอมพลีเมนทารีหรือคาลมานจะผสานทั้งสองเข้าด้วยกัน ไจโรสโคปดูแลการเคลื่อนที่เร็ว ส่วนมาตรวัดความเร่งดึงค่าในระยะยาวกลับมาให้ตรง
แอปวัดระดับน้ำส่วนใหญ่ รวมถึง Spirit Level Pro ข้ามการหลอมรวมเซนเซอร์ไป เพราะงานนี้เป็นแบบนิ่ง คุณวางโทรศัพท์ลง มันนิ่งตัว คุณอ่านมุม มาตรวัดความเร่งจัดการเรื่องนี้ได้ดีด้วยตัวเอง การหลอมรวมเซนเซอร์สำคัญกว่าตอนที่มีบางอย่างกำลังลอยอยู่ เช่น โดรนที่ต้องติดตามการเคลื่อนที่ของตัวเอง มากกว่าตอนที่คุณกำลังเช็กชั้นวางของ
ทำไมการปรับเทียบถึงสำคัญมาก
เซนเซอร์ MEMS ทุกตัวออกจากโรงงานพร้อมค่าเบี่ยงเบนเล็ก ๆ ที่ติดตัวมา มันคือค่าไบแอสที่ตั้งไว้ตอนผลิต และเป็นค่าเดียวกันในทุกครั้งที่อ่าน คือค่าคงที่จำนวนหนึ่งในทิศทางคงที่ ดังนั้นชิปอาจอ่านคลาดไปหนึ่งถึงสององศา แม้โทรศัพท์วางราบจริง ๆ นี่คือเหตุผลใหญ่ที่สุดข้อเดียวที่ทำให้แอปวัดระดับน้ำดูเหมือนอ่านผิดตั้งแต่แกะกล่อง
การปรับเทียบแก้ปัญหานี้ด้วยการวัดค่าเบี่ยงเบนนั้นบนพื้นผิวที่คุณเชื่อว่าราบ แล้วเก็บค่าไว้ Spirit Level Pro บันทึกค่าไว้ใน localStorage ภายใต้ calibrationPitch และ calibrationRoll จากนั้นเป็นต้นไป ทุกค่าที่อ่านได้จะลบค่าที่เก็บไว้ออกก่อนขึ้นหน้าจอ ค่าเบี่ยงเบนก็หายไป
ความต่างนั้นมากทีเดียว ถ้าข้ามการปรับเทียบ โทรศัพท์ที่มีไบแอส 1.5° จะอ่านคลาด 1.5° ในทุกอย่าง มันอาจแสดง 0.0° ทั้งที่วางอยู่บนความลาด 1.5° จริง ๆ ปรับเทียบโทรศัพท์เครื่องเดียวกันแล้วมันจะลดลงเหลือแค่ไม่กี่ในสิบขององศา นั่นคือความแม่นยำที่เพิ่มขึ้นมากที่สุดในครั้งเดียวที่คุณจะได้ และมันแลกมาด้วยเวลาแค่ไม่กี่วินาที
อุณหภูมิส่งผลต่อความแม่นยำอย่างไร
เซนเซอร์ MEMS ตอบสนองต่ออุณหภูมิ สปริงซิลิคอนที่ยึดมวลอ้างอิงจะขยายและหดตัวเมื่อชิปร้อนขึ้นและเย็นลง ซึ่งทำให้จุดศูนย์เลื่อนไป ดังนั้นถ้าคุณหิ้วโทรศัพท์จากในรถที่อุ่นเข้าไปในโรงรถที่เย็น ค่าที่อ่านจะเลื่อนไปเล็กน้อยก่อนที่เซนเซอร์จะนิ่งตัวที่อุณหภูมิใหม่ มันไม่ใช่การเลื่อนที่มากมาย แต่ก็มีจริง
ข้อสรุปที่นำไปใช้จริงได้นั้นง่าย: ปรับเทียบที่อุณหภูมิที่คุณตั้งใจจะทำงาน การปรับเทียบในออฟฟิศที่อุ่นจะเอาไปใช้ในโรงรถที่เย็นได้ไม่เต็มที่ คุณไม่ต้องกังวลเรื่องนี้กับทุกงาน สำหรับแขวนรูปหรือเช็กชั้นวางของ ค่าที่เลื่อนน้อยเกินกว่าจะสังเกตเห็น แต่สำหรับงานละเอียดในระดับไม่กี่ในสิบขององศา ให้เวลาโทรศัพท์สักหนึ่งถึงสองนาทีให้นิ่งตัวหลังเปลี่ยนอุณหภูมิครั้งใหญ่ แล้วค่อยปรับเทียบ
iPhone กับ Android: ฮาร์ดแวร์เซนเซอร์ต่างกันไหม
ต่างกัน และมันสะท้อนออกมาในความรู้สึกตอนใช้แอป Apple สร้างชุดจัดการการเคลื่อนที่ของตัวเอง iPhone ตั้งแต่รุ่น 6s เป็นต้นมามีตัวประมวลผลร่วมสำหรับการเคลื่อนที่ของ Apple ที่จัดการข้อมูลเซนเซอร์แยกจากซีพียูหลัก เรือธง Samsung Galaxy พึ่งชิ้นส่วนของ STMicroelectronics ที่รวมมาตรวัดความเร่งสามแกนและไจโรสโคปสามแกนไว้บนไดตัวเดียว โทรศัพท์ Google Pixel เคยใช้เซนเซอร์ของ Bosch และ TDK InvenSense แล้วแต่ปี
หลังปรับเทียบ iPhone เรือธงกับ Android เรือธงออกมาพอ ๆ กัน ช่องว่างที่สำคัญจริง ๆ อยู่ระหว่างเครื่องเรือธงกับ Android รุ่นประหยัด โทรศัพท์รุ่นประหยัดใช้ MEMS ราคาถูกกว่าที่มีความละเอียดต่ำกว่า และค่าดิบที่ออกมามีสัญญาณรบกวนมากกว่า การปรับเทียบก็ยังดึงมันเข้าใกล้ได้ และสำหรับงาน DIY ส่วนใหญ่ ผลลัพธ์ก็ใช้ได้ดี
สิ่งที่ทำให้ iPhone โดดเด่นในแอปวัดระดับน้ำไม่ใช่มาตรวัดความเร่งเท่าไร แต่เป็นตัวประมวลผลร่วมสำหรับการเคลื่อนที่มากกว่า มันเก็บข้อมูลเซนเซอร์ที่อัตราสูงต่อเนื่องแม้ตอนแอปไม่ได้อยู่หน้าจอ ตัวกรองที่ปรับให้เรียบจึงมีตัวอย่างข้อมูลให้ใช้มากกว่า นั่นคือส่วนสำคัญที่ทำให้ iPhone รู้สึกลื่นไหลมากตรงนี้ แม้เทียบกับโทรศัพท์ Android ที่มีเซนเซอร์บนสเปกดีพอ ๆ กัน
คำถามที่พบบ่อย
แอปวัดระดับน้ำบนโทรศัพท์ทำงานอย่างไร
มันอ่านมาตรวัดความเร่ง MEMS ของโทรศัพท์ ซึ่งวัดว่าแรงโน้มถ่วงดึงไปตามสามแกน (X, Y, Z) อย่างไร พอเอียงโทรศัพท์ แรงโน้มถ่วงก็เลื่อนไปมาระหว่างแกนเหล่านั้น แอปคำนวณด้วยสูตร arctan เพื่อหา pitch และ roll ปรับผลลัพธ์ให้เรียบเพื่อลดสัญญาณรบกวนของเซนเซอร์ แล้วแสดงเป็นฟองในหลอดแก้วหรือเป็นตัวเลข ทั้งหมดนี้ทำงานหลายร้อยครั้งต่อวินาที
มาตรวัดความเร่งในโทรศัพท์แม่นยำแค่ไหนสำหรับใช้วัดระดับน้ำ
โทรศัพท์เรือธงที่ปรับเทียบแล้วอ่านได้ในระดับไม่กี่ในสิบขององศา โทรศัพท์ Android รุ่นประหยัดอ่านได้แย่กว่าเมื่อไม่ปรับเทียบ เพราะเซนเซอร์ราคาถูกกว่าและค่าต่างกันมากกว่าในแต่ละเครื่อง ปัจจัยสำคัญที่สุดข้อเดียวคือการปรับเทียบ มันกำจัดค่าเบี่ยงเบนจากโรงงานและดึงโทรศัพท์แทบทุกเครื่องเข้าใกล้ค่าจริง สำหรับงาน DIY และงานช่างส่วนใหญ่ โทรศัพท์รุ่นกลางที่ปรับเทียบแล้วก็แม่นพอ
แอปวัดระดับน้ำใช้ไจโรสโคปไหม
สำหรับโทรศัพท์ที่วางนิ่ง ไม่ใช้ มาตรวัดความเร่งบอกมุมเอียงให้คุณได้ด้วยตัวเอง ไจโรสโคปวัดความเร็วของการหมุน ไม่ใช่ตำแหน่ง จึงบอกไม่ได้ว่าโทรศัพท์ได้ระดับหรือไม่ บอกได้แค่ว่าหมุนเร็วเท่าไร บางแอปผสานเซนเซอร์ทั้งสองเพื่อให้ค่าลื่นขึ้นตอนเคลื่อนที่ แต่สำหรับการแนบโทรศัพท์กับผนังแล้วอ่านมุม มาตรวัดความเร่งทำงานได้ครบทั้งหมด
ทำไมแอปวัดระดับน้ำของฉันถึงอ่านคลาดเล็กน้อยแม้บนพื้นราบ
โดยทั่วไปคือค่าเบี่ยงเบนจากโรงงาน ชิป MEMS ทุกตัวมีค่าไบแอสเล็ก ๆ ที่ติดตัวมา ทำให้อ่านได้ไม่เป็นศูนย์แม้โทรศัพท์วางราบ การปรับเทียบบนพื้นผิวที่คุณเชื่อถือจะล้างค่านั้นออก สาเหตุอื่น ๆ ได้แก่ ค่าที่เลื่อนตามอุณหภูมิ เคสโทรศัพท์ที่ยกขอบด้านหนึ่งขึ้นจากพื้นผิว หรือฝุ่นใต้โทรศัพท์ ปรับเทียบบนโต๊ะกระจกที่สะอาดหลังเปลี่ยนอุณหภูมิครั้งใหญ่ ก็จัดการได้เกือบทั้งหมด
ภาพรวมทั้งหมด
แอปวัดระดับน้ำใช้งานได้เพราะฟิสิกส์เบื้องหลังมันเชื่อถือได้ แรงโน้มถ่วงคงที่ มาตรวัดความเร่งวัดมันตลอดเวลา และตรีโกณมิติเปลี่ยนตัวเลขสามตัวให้เป็นมุม เส้นทางจากชิ้นส่วนตรวจจับไปจนถึงฟองเป็นคณิตศาสตร์ที่แน่นอนตลอดทาง ไม่มีการเดาอยู่ในนั้นเลย
สิ่งที่ทำให้แอปวัดระดับน้ำตัวหนึ่งดีกว่าอีกตัวไม่ใช่ฮาร์ดแวร์ โทรศัพท์เรือธงทุกเครื่องมาพร้อมเซนเซอร์ที่ดีเกินพออยู่แล้ว ความต่างอยู่ที่ซอฟต์แวร์ กรองข้อมูลดิบได้ดีแค่ไหน เก็บและนำค่าปรับเทียบไปใช้อย่างไร ค่าความคลาดเคลื่อนที่ตั้งไว้ตรงกับงานจริงแค่ไหน ทำสิ่งเหล่านี้ให้ถูก แล้วชิป MEMS ราคาถูกก็สู้กับเครื่องมือเฉพาะทางที่ราคาแพงกว่ามากได้
การรู้ว่าเซนเซอร์ทำงานอย่างไรยังทำให้คุณใช้มันได้ดีขึ้นด้วย ปรับเทียบที่อุณหภูมิทำงานจริง ถอดเคสออกเมื่อต้องการค่าที่แม่นยำ ปล่อยให้ตัวเลขนิ่งสักครู่ก่อนจะเชื่อมัน นิสัยแต่ละอย่างเหล่านี้มาจากการเข้าใจว่าฮาร์ดแวร์กำลังทำอะไรอยู่โดยตรง