สวัสดีครับ ในบทความนี้ผมจะนำเซ็นเซอร์วัดระยะด้วยคลื่นอัลตร้าโซนิคหลายหลายรุ่น หลากหลายการสื่อสาร มารีวิวเทียบกัน พร้อมทั้งอธิบายการใช้งานโดยละเอียดในแต่ละตัวด้วยครับ ซึ่งจะมีตัวอย่างโค้ดของ Arduino ให้ สำหรับท่านผู้อ่านที่ไมโครคอนโทรลเลอร์ที่ไม่ใช่ Arduino ท่านสามารถอ่านหลักการติดต่อสื่อสาร การคำนวณ เพื่อนำไปปรับใช้เพื่อสร้างโค้ดสำหรับไมโครคอนโทรลเลอร์ตะกูลที่ท่านใช้งานได้เลยครับ
คลื่นอัลตร้าโซนิค เป็นคลื่นความถี่เหนือความถี่สัญญาณเสียง โดยปกติแล้ว มนุษย์จะสามารถได้ยินเสียง หรือรับรู้ได้ที่ความถี่ 20Hz ถึง 20kHz แต่คลื่นอัลตร้าโซนิคนั้น ระบุเพียงว่าเป็นคลื่นที่มีความถี่เหนือคลื่นความถี่เสียง แต่ไม่ได้บอกว่าความถี่เท่าใด
ความถี่อัลตร้าโซนิคนั้น ที่นิยมใช้งานในเซ็นเซอร์วัดระยะรุ่นต่าง ๆ จะมีความถี่ที่ประมาณ 40kHz ข้อดีของการใช้ความถี่นี้ คือมีลักษณะของความยาวคลื่นที่สั้น ส่งผลให้คลื่นไม่แตกจายออกเป็นวงกว้าง และสามารถยิงคลื่นตรงไปชนวัตถุใด ๆ ก็ได้ และนอกจากนี้ความถี่ 40kHz ยังเป็นความถี่ที่มีระยะเดินทางเพียงพอกับการใช้งาน หากใช้ความถี่สูงขึ้น จะทำให้คลื่นเดินทางได้ในระยะทางที่ลดลง ทำให้เมื่อนำมาใช้งานจริงจะวัดระยะได้ในระยะที่สั้น
รูปที่ 1 ค้างคาวใช้คลื่นอัลตร้าโซนิคในการตรวจหาเหยื่อ
หลักการที่สำคัญของการวัดระยะด้วยคลื่นอัลตร้าโซนิค คือการส่งคลื่นอัลตร้าโซนิคจำนวนหนึ่งออกไปจากตัวส่ง (Transmitter) เมื่อคลื่นวิ่งไปชนกับวัตถุ คลื่นจะมีการสะท้อนกลับมา แล้ววิ่งกลับไปชนตัวรับ (Receiver) ด้วยการเริ่มนับเวลาที่ส่งคลื่นออกไป จนถึงได้รับคลื่นกลับมานี้เอง ทำให้เราสามารถหาระยะห่างระหว่างวัตถุกับเซ็นเซอร์ได้
รูปที่ 2 การทำงานของเซ็นเซอร์วัดระยะด้วยคลื่นอัลตร้าโซนิค
ระยะเวลาที่ได้จากการวัดช่วงเวลาการเดินทางไปและกลับนี้ เราสามารถนำค่าที่ได้ไปเปรียบเทียบกับอัตราเร็วที่เสียงสามารถเดินทางได้ไปในอากาศได้เลย โดยอัตราเร็วเสียงที่เดินทางได้ในอากาศสามารถหาได้ตามสูตร
อัตราเร็วของเสียงในอากาศ = 331 + (0.606 * อุณหภูมิในหน่วยองศาเซลเซียส) m/s
สังเกตุว่า อัตราเร็วของเสียงที่เดินทางในอากาศนั้น จะขึ้นอยู่กับอุณหภูมิ ณ ขณะนั้นด้วย ดังนั้นในเซ็นเซอร์อัลตร้าโซนิคบางรุ่น จึงมีเซ็นเซอร์วัดอุณหภูมิมาด้วย ทำให้สามารถวัดระยะทางได้แม่นยำมากยิ่งขึ้น สำหรับในรุ่นที่ไม่มีเซ็นเซอร์วัดอุณหภูมิ ท่านสามารถนำเซ็นเซอร์วัดอุณหภูมิมาต่อเพื่อแก้ค่าความผิดพลาดเองได้ หรือใช้ค่าอุณหภูมิเฉลี่ยทั้งปีของประเทศไทยได้ โดยอุณหภูมิเฉลี่ยของประเทศไทยทั้งปีจะอยู่ที่ 27 องศาเซลเซียส
รูปที่ 3 กราฟแสดงค่าอุณหภูมิเฉลี่ยของประเทศไทยในแต่ละภาค
ในโมดูลเซ็นเซอร์อัลตร้าโซนิคนั้น จะมีวงจรที่แตกต่างกัน เนื่องจากแต่ละรุ่นมีความสามารถที่แตกต่างกัน แต่ยังคงมีหลักการทำงานงานที่สำคัญที่เหมือนกัน
รูปที่ 4 ไดอะแกรมการทำงานของเซ็นเซอร์วัดระยะด้วยคลื่นอัลตร้าโซนิค
จากรูปที่ 4 จะเห็นว่า เมื่อมีการส่งสัญญาณเข้าไปที่ Trig วงจรภายในจะเริ่มสร้างความถี่ 40kHz จำนวน 8 ลูกคลื่นออกไป โดยใช้ความถี่จากคลิสตอลเป็นตัวอ้างอิง แล้วตัวส่งที่เปรียบเสมือนลำโพง จะส่งสัญญาณออกไป จากนั้นเมื่อคลื่นวิ่งกลับมาที่ตัวรับ ที่เปรียบเสมือนเป็นไมโครโฟน สัญญาณไฟฟ้าจะผ่านตัวประมวลผล แล้วให้ค่าเอาต์พุตออกมาทางขา Echo
จะเห็นว่า แกนหลักของเซ็นเซอร์จะเป็นตัวประมวลผล ซึ่งตัวประมวนผลนี้ ในแต่ละรุ่นก็จะแตกต่างกัน อย่างในรุ่น HC-SR04 จะใช้ไอซีไมโครคอนโทรลเลอร์เบอร์ ATtiny24 ในรุ่น US-100 ก็จะใช้ไมโครคอนโทรลเลอร์แบบเดียวกัน แต่ไม่ทราบเบอร์ เนื่องจากเบอร์ไอซีบนโมดูลโดนลบ
หลักการใช้งานจะแบ่งออกได้หลายแบบ ซึ่งจะขึ้นอยู่กับบัสที่ใช้สื่อสาร สามารถแบ่งได้ดังนี้
เซ็นเซอร์หลายรุ่น ใช้วิธีนี้ในการติดต่อสื่อสารกับไมโครคอนโทรลเลอร์ ซึ่งในแต่ละรุ่นจะใช้จำนวนสายไม่เท่ากัน ในบางรุ่นจะใช้สาย 2 เส้น คือ Trig สำหรับส่งสัญญาณ และ Echo สำหรับรับสัญญาณกลับมา และในบางรุ่นจะใช้เส้นเดียว คือทั้ง Trig และ Echo อยู่เส้นเดียวกันเลย และใช้วิธีแบ่งเวลารับ - ส่งข้อมูล (หลักการเหมือน 1-wire bus)
ในการสื่อสารแบบทริกสัญญาณ เริ่มต้นจะต้องให้สัญญาณขา Trig มีสถานะทางลอจิกเป็น LOW เสียก่อน จากนั้นจึงเริ่มทริกสัญญาณ โดยให้ขา Trig มีสถานะเป็น HIGH ค้างไว้อย่างน้อย 10uS แล้วจึงปรับสถานะเป็น LOW
จากนั้น ที่ขา Echo ให้เตรียมรับสัญญาณทริก HIGH กลับมา เมื่อมีการส่งสัญญาณ HIGH กลับมา ให้เริ่มนับเวลาที่สัญญาณเป็น HIGH และเมื่อสัญญาณขา Echo กลับเป็น LOW ให้สิ้นสุดการนับเวลา แล้วจึงนำค่าเวลาที่นับได้ ไปคำนวณอีกที ซึ่งในการคำนวณนั้น จะขึ้นอยู่กับรุ่น ในบางรุ่นสามารถใช้ค่าอัตราเร็วเสียงมาคำนวณได้เลย แต่ในบางรุ่น ต้องใช้สูตรคำนวณเฉพาะ
รูปที่ 5 Timing Diagram ของเซ็นเซอร์วัดระยะด้วยคลื่นอัลตร้าโซนิค HC-SR04 (ขอบคุณรูปภาพจาก SRF04 Technical Documentation)
โดยส่วนใหญ่แล้ว จะใช้ค่าอัตราเร็วเสียงหาร 2 ได้เลย ที่นำมาหาร 2 เพราะระยะทางที่วัดได้ คือระยะทางทั้งขาไป และขากลับ เมื่อนำมาหาร 2 เราจะได้แค่ระยะห่างตอนขาไป หรือขากลับนั่นเองครับ
ตัวอย่างของโค้ดที่ใช้กับ Arduino มีดังนี้
จากโค้ดด้านบน หากโมดูลใช้อัตราเร็วของเสียงในการคำนวณ ท่านสามารถแทนที่ ??? ด้วย 0.0173681 ได้เลย โดยค่านี้หามาได้จากสูตรหาอัตราเร็วของเสียงที่กำหนดให้อุณหภูมิ ณ ขณะนี้เป็น 27 องศาเซลเซียส
เมื่อ
อัตราเร็วของเสียงในอากาศ = 331 + (0.606 * อุณหภูมิในหน่วยองศาเซลเซียส) m/s
อัตราเร็วของเสียงในอากาศ = 331 + (0.606 * 27) m/s
อัตราเร็วของเสียงในอากาศ = 347.362 m/s
จากนั้นให้พิจารณาว่า ฟังก์ชั่น pulseIn(pin, value) จะส่งค่ากลับมาในหน่วยไมโครวินาที (uS) เราจึงต้องแปลงให้ค่า 347.362 m/s ให้เป็นหน่วย m/uS โดยนำไปคูณด้วย 10 ^ -6 ต่อมาเราต้องการให้ค่าออกมาในหน่วยเซ็นติเมตร (cm) ให้นำไปคูณ 10 ^ 2 (เพราะ 1 เมตร = 100 เซ็นติเมตร) จึงจะได้ค่าออกมาในหน่วย เซ็นติเมตร ต่อ ไมโครวินาที (cm/uS)
อัตราเร็วของเสียงในอากาศ = 347.362 * 10 ^ -6 * 10 ^ 2 cm/uS
อัตราเร็วของเสียงในอากาศ = 347.362 * 10 ^ (-6 + 2) cm/uS
อัตราเร็วของเสียงในอากาศ = 0.0347362 cm/uS
เนื่องจากสัญญาณเดินทางทั้งไป และกลับ จึงต้องนำค่ามาหารด้วย 2 จึงได้ 0.0173681 นั่นเองครับ
ระยะห่างระหว่างวัตถุกับหน้าเซ็นเซอร์ = เวลาที่ได้จากขา Echo ในหน่วยไมโครวินาที * 0.0173681 cm
การสร้างฟังก์ชั่น pulseIn()
หัวใจสำคัญของการสื่อสารแบบทริกสัญญาณ คือการนับเวลาที่สัญญาณเป็น HIGH ในไมโครคอนโทรลเลอร์ตะกูลอื่น ๆ หรือไม่ได้ใช้ Arduino IDE จะไม่มีฟังก์ชั่นนี้ให้ เราสมารถฟังกั่น pulseIn() ได้เอง โดยสามารถเลือกใช้ทั้ง Timer หรือใช้ฟังก์ชั่นเกี่ยวกับ delay ก็ได้ ตัวอย่างโค้ดด้านล่างนี้ เป็นโค้ดที่แสดงการสร้างฟังก์ชั่น pulseIn() ขึ้นมาใช้งานเอง โดยตัวอย่างนี้ยังเป็นของ Arduino อยู่
และในโค้ดตัวอย่างด้านล่างนี้ เป็นโค้ดที่ใช้กับ MPLABXpress Evaluation Board โดยเขียนโค้ดบน MPLAB Xpress Cloud-based IDE
สำหรับโปรเจคเต็ม ๆ ท่านสามารถกดดูได้ที่ HC-SR04 to LED
โมดูลรุ่น US-100 นอกจากการสื่อสารผ่านการทริกสัญญาณแล้ว ยังสามารถใช้การสื่อสารแบบ UART ได้อีกด้วย ทำให้เราสามารถใช้งานได้ง่ายมากยิ่งขึ้น เพราะเพียงส่งค่าบางอย่างไปให้ ตัวโมดูลก็จะตอบค่าที่วัดได้ออกมาให้เลย
การสื่อสารแบบ UART แบ่งออกเป็น 2 ส่วน คือส่วนส่งข้อมูลไป และส่วนรับข้อมูลกลับมา โดยตัวอย่างโค้ดที่ใช้กับ Arduino เป็นไปดังนี้
โดยสามารถแก้ตรง ??? ให้เป็นค่าที่ส่งไปขอค่าได้เลย และแก้ตรง ??? ให้เป็นสูตรที่ผู้ผลิตกำหนดให้
โมดูลรุ่น US-016 ให้ค่าสัญญาณออกมาในรูปแบบของสัญญาณอนาล็อก หรือแรงดันไฟฟ้าตั้งแต่ 0 - 5V สามารถเปลี่ยน Range ระยะที่จะวัดได้ โดยมีให้เลือก 2 ระยะ คือระยะ 1 เมตร และระยะ 3 เมตร ตัวอย่างการใช้กับ Arduino สามารถใช้ฟังก์ชั่น analogRead() ในการอ่านค่าระยะออกมาได้เลย กรณีใช้ระยะ 3 เมตร เพียงนำค่าไปคูณ 3 ก่อนนำไปใช้
รุ่น HC-SR04 เป็นรุ่นที่ถูกนิยมใช้งานมากที่สุด การสื่อสารกับไมโครคอนโทรลเลอร์จะใช้วิธีทริกสัญญาณ ขาใช้งานจะมี 4 ขา คือขา VCC Trig Echo และ GND ในรุ่นนี้รองรับแรงดันไฟเลี้ยงที่ 5V กรณีที่แรงดันไฟเลี้ยงน้อยกว่า 5V โมดูลจะไม่สามารถทำงานได้ตามปกติ
รูปที่ 6 การเชื่อมต่อสายกับโมดูล HC-SR04
รูปที่ 7 การเชื่อมต่อ HC-SR04 เข้ากับบอร์ด Arduino Uno R3
การคำนวณหาระยะห่าง สามารถคำนวณโดยใช้สูตรอัตราเร็วของเสียงได้เลย ทำให้เมื่อคำโค้ดในหัวข้อ การทริกสัญญาณ มาใช้ เพียงแก้ตรงส่วน ??? ให้เป็นค่าอัตราเร็วของเสียง โค้ดที่ได้หลังแก้แล้ว ได้ออกมาดังนี้
รุ่น HY-SRF05 เป็นอีกรุ่นหนึ่งที่นิยมใช้งานกัน โดยการใช้งานจะเป็นแบบเดียวกับ HC-SR04 ดังนั้นสามารถนำโค้ดของ HC-SR04 มาใช้ได้เลย ข้อแตกต่างคือรุ่นนี้จะมีขา OUT เพิ่มขึ้นมา (แต่ไม่มีข้อมูลว่าขา OUT ใช้ทำอะไร)
รูปที่ 8 การเชื่อมต่อสายกับโมดูล HY-SRF05
รูปที่ 9 การเชื่อมต่อ HY-SRF05 เข้ากับบอร์ด Arduino Uno R3
รุ่นนี้มีความพิเศษตรงที่ ภายในตัวมีเซ็นเซอร์วัดอูณหภูมิเพิ่มขึ้นมา ทำให้สามารถวัดค่าได้แม่นยำมาก และมี 2 โหมดการสื่อสารให้เลือกใช้ คือแบบทริกสัญญาณ และแบบ UART ในการเลือกโหมดนั้น จะต้องถอด หรือเสียบจั้มเปอร์ด้านหลังโมดูล หากเสียบไว้จะเลือกใช้งานผ่านโหมด UART และหากถอดออก จะเปลี่ยนเป็นโหมดทริกสัญญาณ
รูปที่ 10 การเลือกโหมดสื่อสารด้วยจั้มเปอร์
การใช้งานในโหมด UART
รูปที่ 11 การเชื่อมต่อสายกับโมดูล HY-SRF05 ในโหมด UART
รูปที่ 12 การเชื่อมต่อ HC-SR04 เข้ากับบอร์ด Arduino Uno R3 ในโหมด UART
ความเร็วในการสื่อสาร (Baud rate) จะอยู่ที่ 9600 สามารถส่งคำร้องขอข้อมูลได้ 2 แบบ คือ
จากข้อมูลด้านบน สามารถนำมาเขียนโค้ดใน Arduino ได้ดังนี้
การใช้งานในโหมดทริกสัญญาณ
รูปที่ 13 การเชื่อมต่อสายกับโมดูล HY-SRF05 ในโหมดทริกเกอร์
รูปที่ 14 การเชื่อมต่อ HC-SR04 เข้ากับบอร์ด Arduino Uno R3 ในโหมดทริกเกอร์
ข้อมูลจากผู้ผลิต มีรายละเอียดการใช้งานไว้ในเอกสาร ข้อแตกต่างจากการโค้ดของ HC-SR04 HY-SRF05 มีดังนี้
เมื่อนำข้อมูลด้านบนมาแก้โค้ด จึงได้ตัวอย่างโค้ดใช้งานกับ Arduino เป็นไปตามด้านล่างนี้
รุ่นนี้ใช้วิธีการสื่อสารกับไมโครคอนโทรลเลอร์ผ่านสัญญาณอนาล็อก มีขาสำหรับเลือกโหมดที่ขา Range หากไม่ต่ออะไร จะวัดได้ในระยะสูงสุด 1 เมตร และหากต่อเข้า VCC จะสามารถวัดได้สูงสุด 3 เมตร สามารถใช้โค้ดในหัวข้อ อ่านค่าสัญญาณอนาล็อก ได้เลย
รูปที่ 15 การเชื่อมต่อ US-016 เข้ากับบอร์ด Arduino Uno R3
รูปที่ 16 ตารางเปรียบเทียบคุณสมบัติของเซ็นเซอร์วัดระยะด้วยคลื่นอัลตร้าโซนิค
จากตารางด้านบน จะช่วยให้ท่านสามารถตัดสินใจเลือกซื้อได้ง่ายมากยิ่งขึ้นครับ อย่างไรก็ตาม อย่าลืมช่วยกันอุดหนุนร้าน IOXhop กันด้วยนะครับ ขอบคุณล่วงหน้าครับ :-)
สำหรับบทความนี้ ก็ขอจบเพียงเท่านี้ ลองติดตามบทความหน้า ว่าจะเป็นบทความเกี่ยวกับอะไรกันได้นะครับ
~ สวัสดีครับ ~
เอกสารอ้างอิง