เพื่อให้โครงการมีชีวิตชีวาขึ้นเราจำเป็นต้องใช้เซ็นเซอร์ เซนเซอร์ทำหน้าที่เป็นตาและหูสำหรับแอปพลิเคชันที่ฝังไว้ทั้งหมดซึ่งจะช่วยให้ไมโครคอนโทรลเลอร์ดิจิทัลเข้าใจสิ่งที่เกิดขึ้นจริงในโลกอนาล็อกที่แท้จริงนี้ ในการกวดวิชานี้เราจะมาเรียนรู้วิธีการเชื่อมต่อของอัลตราโซนิคเซนเซอร์ HC-SR04 กับไมโครคอนโทรลเลอร์
HC-SR04 เป็นเซ็นเซอร์อัลตราโซนิกซึ่งสามารถใช้ในการวัดได้ทุกระยะห่างระหว่าง 2 ซมเพื่อ 450cm (ทฤษฎี) เซ็นเซอร์นี้ได้พิสูจน์ตัวเองว่าคุ้มค่าด้วยการปรับให้เข้ากับหลาย ๆ โครงการซึ่งเกี่ยวข้องกับการตรวจจับสิ่งกีดขวางการวัดระยะทางการทำแผนที่สภาพแวดล้อมเป็นต้นในตอนท้ายของบทความนี้คุณจะได้เรียนรู้ว่าเซ็นเซอร์นี้ทำงานอย่างไรและวิธีการเชื่อมต่อกับไมโครคอนโทรลเลอร์ PIC16F877A เพื่อวัดระยะทางและแสดงผล มันบนหน้าจอ ฟังดูน่าสนใจ !! มาเริ่มกันเลย…
วัสดุที่ต้องการ:
- PIC16F877A MCU พร้อมการตั้งโปรแกรม
- จอ LCD 16 * 2
- เซ็นเซอร์อัลตราโซนิก (HC-SR04)
- การเชื่อมต่อสายไฟ
Ultrasonic Sensor ทำงานอย่างไร?
ก่อนที่เราจะดำเนินการต่อไปเราควรทราบว่าเซ็นเซอร์อัลตราโซนิกทำงานอย่างไรเพื่อให้เราเข้าใจบทช่วยสอนนี้ได้ดีขึ้น เซ็นเซอร์อัลตราโซนิกที่ใช้ในโครงการนี้แสดงไว้ด้านล่าง
อย่างที่คุณเห็นมันมีดวงตากลมสองดวงเหมือนเส้นโครงและหมุดสี่อันโผล่ออกมาจากมัน ตาสองข้างเหมือนเส้นโครงเป็นคลื่นอัลตราโซนิก (ต่อไปนี้เรียกว่าคลื่นสหรัฐ) เครื่องส่งและตัวรับ เครื่องส่งจะปล่อยคลื่นสหรัฐที่ความถี่ 40Hz คลื่นนี้เดินทางผ่านอากาศและสะท้อนกลับเมื่อสัมผัสกับวัตถุ เครื่องรับคลื่นที่กลับมาจะสังเกตเห็น ตอนนี้เรารู้เวลาที่คลื่นนี้สะท้อนและกลับมาแล้วและความเร็วของคลื่นสหรัฐก็เป็นสากลเช่นกัน (3400cm / s) การใช้ข้อมูลนี้และสูตรมัธยมด้านล่างเราสามารถคำนวณระยะทางที่ครอบคลุมได้
ระยะทาง = ความเร็ว×เวลา
ตอนนี้เรารู้แล้วว่าเซ็นเซอร์ของสหรัฐฯทำงานอย่างไรให้เราเชื่อมต่อกับ MCU / CPU โดยใช้หมุดทั้งสี่หมุดทั้งสี่นี้คือ Vcc, Trigger, Echo และ Groundตามลำดับ โมดูลทำงานบน + 5V และด้วยเหตุนี้ Vcc และพินกราวด์จึงถูกใช้เพื่อจ่ายไฟให้กับโมดูล อีกสองพินคือพิน I / O ที่ใช้สื่อสารกับ MCU ของเราพิทริกเกอร์ควรจะประกาศเป็นขาเอาท์พุทและทำให้สูงสำหรับ 10us นี้จะส่งคลื่นสหรัฐในอากาศ 8 วงจรระเบิดโซนิค เมื่อสังเกตเห็นคลื่นแล้วพิน Echo จะสูงขึ้นตามช่วงเวลาที่แน่นอนซึ่งถูกคลื่นของสหรัฐนำกลับไปที่โมดูลเซ็นเซอร์ ดังนั้นพิน Echoนี้จะถูกประกาศว่าเป็นอินพุตและจะใช้ตัวจับเวลาเพื่อวัดระยะเวลาที่พินอยู่สูง สิ่งนี้สามารถเข้าใจเพิ่มเติมได้จากแผนภาพเวลาด้านล่าง
หวังว่าคุณจะมาถึงวิธีเบื้องต้นในการเชื่อมต่อเซ็นเซอร์นี้กับ PIC เราจะใช้โมดูล Timer และโมดูล LCD ในบทช่วยสอนนี้และฉันคิดว่าคุณคุ้นเคยกับทั้งสองอย่างหากไม่โปรดกลับไปที่บทช่วยสอนที่เกี่ยวข้องด้านล่างเนื่องจากฉันจะข้ามข้อมูลส่วนใหญ่ที่เกี่ยวข้อง
- การเชื่อมต่อ LCD กับไมโครคอนโทรลเลอร์ PIC
- ทำความเข้าใจกับตัวจับเวลาในไมโครคอนโทรลเลอร์ PIC
แผนภูมิวงจรรวม:
แผนภาพวงจรที่สมบูรณ์สำหรับการเชื่อมต่อ Ultrasonic Sensor กับ PIC16F877Aแสดงไว้ด้านล่าง:
ดังที่แสดงไว้วงจรไม่ได้เกี่ยวข้องอะไรมากไปกว่าจอแสดงผล LCD และเซ็นเซอร์อัลตราโซนิกเอง เซ็นเซอร์ของสหรัฐอเมริกาสามารถใช้พลังงานได้ + 5V และด้วยเหตุนี้จึงขับเคลื่อนโดยตรงโดยตัวควบคุมแรงดันไฟฟ้า 7805 เซ็นเซอร์มีขาเอาต์พุตหนึ่งขา (ขาทริกเกอร์) ซึ่งเชื่อมต่อกับขา 34 (RB1) และขาอินพุต (ขาก้อง) เชื่อมต่อกับขา 35 (RB2) การเชื่อมต่อพินที่สมบูรณ์แสดงอยู่ในตารางด้านล่าง
ส. ไม่: |
หมายเลขพิน PIC |
ชื่อพิน |
เชื่อมต่อกับ |
1 |
21 |
RD2 |
RS ของ LCD |
2 |
22 |
RD3 |
E ของ LCD |
3 |
27 |
RD4 |
D4 ของ LCD |
4 |
28 |
RD5 |
D5 ของ LCD |
5 |
29 |
RD6 |
D6 ของ LCD |
6 |
30 |
RD7 |
D7 ของ LCD |
7 |
34 |
RB1 |
ทริกเกอร์ของสหรัฐฯ |
8 |
35 |
RB2 |
เสียงสะท้อนของเรา |
การเขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC ของคุณ:
โปรแกรมที่สมบูรณ์สำหรับบทช่วยสอนนี้มีให้ที่ส่วนท้ายของหน้านี้ด้านล่างฉันได้อธิบายโค้ดเป็นส่วนย่อยที่มีความหมายขนาดเล็กเพื่อให้คุณเข้าใจ ดังที่กล่าวไว้ก่อนหน้านี้โปรแกรมเกี่ยวข้องกับแนวคิดของการเชื่อมต่อ LCD และตัวจับเวลาซึ่งจะไม่อธิบายรายละเอียดในบทช่วยสอนนี้เนื่องจากเราได้กล่าวถึงในบทช่วยสอนก่อนหน้านี้แล้ว
ภายในฟังก์ชั่นหลักเราเริ่มต้นด้วยการเริ่มต้นพิน IO และรีจิสเตอร์อื่น ๆตามปกติ เรากำหนดพิน IO สำหรับเซ็นเซอร์ LCD และ US และเริ่มการลงทะเบียน Timer 1 โดยตั้งค่าให้ทำงานบน 1: 4 pre-scalar และใช้นาฬิกาภายใน (Fosc / 4)
TRISD = 0x00; // PORTD ประกาศเป็นเอาต์พุตสำหรับเชื่อมต่อ LCD TRISB0 = 1; // กำหนดพิน RB0 เป็นอินพุตเพื่อใช้เป็นพินขัดจังหวะ TRISB1 = 0; // ขาทริกเกอร์ของเซ็นเซอร์ US ถูกส่งเป็นขาออก TRISB2 = 1; // ขา Echo ของเซ็นเซอร์ US ถูกตั้งค่าเป็นขาอินพุต TRISB3 = 0; // RB3 เป็นขาเอาต์พุตสำหรับ LED T1CON = 0x20; // 4 pres-scalar และนาฬิกาภายใน
Timer 1 เป็นตัวจับเวลา 16 บิตที่ใช้ใน PIC16F877A ซึ่ง T1CON register จะควบคุมพารามิเตอร์ของโมดูลตัวจับเวลาและผลลัพธ์จะถูกเก็บไว้ใน TMR1H และ TMR1L เนื่องจากผลลัพธ์ 16 บิต 8 ตัวแรกจะถูกเก็บไว้ใน TMR1H และ 8 ถัดไปใน TMR1L ตัวจับเวลานี้สามารถเปิดหรือปิดได้โดยใช้ TMR1ON = 0 และ TMR1ON = 1 ตามลำดับ
ตอนนี้ตัวจับเวลาพร้อมใช้งานแล้ว แต่เราต้องส่งคลื่นสหรัฐออกจากเซ็นเซอร์ในการทำเช่นนี้เราต้องรักษาขาทริกเกอร์ไว้สูงเป็นเวลา 10uS ซึ่งทำได้โดยรหัสต่อไปนี้
ทริกเกอร์ = 1; __delay_us (10); ทริกเกอร์ = 0;
ดังที่แสดงในแผนภาพเวลาด้านบนพิน Echo จะอยู่ในระดับต่ำจนกว่าคลื่นจะกลับมาจากนั้นจะขึ้นสูงและอยู่สูงตามเวลาที่แน่นอนเพื่อให้คลื่นกลับ เวลานี้จะต้องวัดโดยโมดูล Timer 1 ซึ่งสามารถทำได้ตามบรรทัดด้านล่าง
ในขณะที่ (Echo == 0); TMR1ON = 1; ในขณะที่ (Echo == 1); TMR1ON = 0;
เมื่อวัดเวลาแล้วค่าผลลัพธ์จะถูกบันทึกในรีจิสเตอร์ TMR1H และ TMR1L รีจิสเตอร์เหล่านี้จะต้องถูกรวมเข้าด้วยกันเพื่อให้ได้ค่า 16 บิต ซึ่งทำได้โดยใช้บรรทัดด้านล่าง
time_taken = (TMR1L - (TMR1H << 8));
time_taken นี้จะอยู่ในรูปแบบไบต์เพื่อให้ได้ค่าเวลาจริงเราต้องใช้สูตรด้านล่าง
Time = (ค่าลงทะเบียน 16 บิต) * (1 / นาฬิกาภายใน) * (Pre-scale) Internal Clock = Fosc / 4ในกรณีของเรา Fosc = 20000000Mhz และ Pre-scale = 4 ดังนั้นค่าของนาฬิกาภายในจะเป็น 5000000Mhz และค่าของเวลาจะเป็น Time = (16-bit register value) * (1/5000000) * (4) = (16-bit register value) * (4/5000000) = (16-bit register value) * 0.0000008 วินาที (OR) เวลา = (ค่าลงทะเบียน 16 บิต) * 0.8 ไมโครวินาที
ในโปรแกรมของเราค่าของการลงทะเบียน 16 บิตจะถูกเก็บไว้ในตัวแปร time_taken และด้วยเหตุนี้บรรทัดด้านล่างจึงถูกใช้เพื่อคำนวณ time_taken ในไมโครวินาที
time_taken = เวลา _ ถ่าย * 0.8;
ต่อไปเราต้องไปหาวิธีการคำนวณระยะทางตามที่เราทราบระยะทาง = ความเร็ว * เวลา แต่ที่นี่ควรหารผลลัพธ์ด้วย 2 เนื่องจากคลื่นครอบคลุมทั้งระยะการส่งและระยะรับ ความเร็วของคลื่นเรา (เสียง) คือ 34000cm / s
ระยะทาง = (ความเร็ว * เวลา) / 2 = (34000 * (ค่าลงทะเบียน 16 บิต) * 0.0000008) / 2 ระยะทาง = (0.0272 * ค่าลงทะเบียน 16 บิต) / 2
ดังนั้นระยะทางสามารถคำนวณได้ในหน่วยเซนติเมตรดังนี้:
ระยะทาง = (0.0272 * time_taken) / 2;
หลังจากคำนวณค่าของระยะทางและเวลาแล้วเราก็ต้องแสดงบนหน้าจอ LCD
การวัดระยะทางโดยใช้ PIC และ Ultrasonic Sensor:
หลังจากทำการเชื่อมต่อและอัปโหลดโค้ดแล้วการตั้งค่าการทดลองของคุณควรมีลักษณะดังนี้ที่แสดงในภาพด้านล่าง
บอร์ด PIC Perf ที่แสดงในภาพนี้สร้างขึ้นสำหรับชุดการสอน PIC ของเราซึ่งเราได้เรียนรู้วิธีใช้ไมโครคอนโทรลเลอร์ PIC คุณอาจต้องการกลับไปที่บทเรียนไมโครคอนโทรลเลอร์ PIC เหล่านั้นโดยใช้ MPLABX และ XC8 หากคุณไม่ทราบวิธีเบิร์นโปรแกรมโดยใช้ Pickit 3 เนื่องจากฉันจะข้ามข้อมูลพื้นฐานเหล่านั้นทั้งหมด
ตอนนี้วางวัตถุไว้ก่อนเซ็นเซอร์และควรแสดงว่าวัตถุอยู่ห่างจากเซ็นเซอร์แค่ไหน คุณยังสามารถสังเกตเห็นเวลาที่ใช้แสดงเป็นไมโครวินาทีเพื่อให้คลื่นส่งและย้อนกลับ
คุณสามารถเคลื่อนย้ายวัตถุในระยะที่คุณต้องการและตรวจสอบค่าที่แสดงบนจอ LCD ฉันสามารถวัดระยะทางตั้งแต่ 2 ซม. ถึง 350 ซม. ด้วยความแม่นยำ 0.5 ซม. นี่เป็นผลลัพธ์ที่น่าพอใจทีเดียว! หวังว่าคุณจะสนุกกับบทแนะนำและเรียนรู้วิธีทำบางอย่างด้วยตัวคุณเอง หากคุณมีข้อสงสัยโปรดทิ้งไว้ในส่วนความคิดเห็นด้านล่างหรือใช้ฟอรัม
ตรวจสอบการเชื่อมต่อของเซ็นเซอร์อัลตราโซนิกกับไมโครคอนโทรลเลอร์อื่น ๆ ด้วย:
- การวัดระยะทางโดยใช้เซ็นเซอร์ Arduino และอัลตราโซนิก
- วัดระยะทางโดยใช้ Raspberry Pi และ HCSR04 Ultrasonic Sensor
- การวัดระยะทางโดยใช้ไมโครคอนโทรลเลอร์ HC-SR04 และ AVR