ผู้จัดทำ
1.นางสาวณัฐธิชา ชนเก่าน้อย 011
2. นางสาวกุลจิรา ทองคง 003
หลักการทำงาน
HC-SR04 เป็นเซนเซอร์โมดูลสำหรับตรวจจับวัตถุและวัดระยะทางแบบไม่สัมผัส [1-2] โดยใช้คลื่นอัลตราโซนิก ซึ่งเป็นคลื่นเสียงความถี่สูงเกินกว่าการได้ยินของมนุษย์ วัดระยะได้ตั้งแต่ 2 – 400 เซนติเมตร หรือ 1 – 156 นิ้ว สามารถต่อใช้งานกับไมโครคอนโทรลเลอร์ได้ง่าย ใช้พลังงานต่ำ เหมาะกับการนำไปประยุกต์ใช้งานด้านระบบควบคุมอัตโนมัติ หรืองานด้านหุ่นยนต์ หลักการทำงาน จะเหมือนกันกับการตรวจจับวัตถุด้วยเสียงของค้างคาว ตามรูปที่ 1 โดยจะประกอบไปด้วยตัว รับ-ส่ง อัลตราโซนิก ตัวส่งจะส่งคลื่นความถี่ 40 kHz ออกไปในอากาศด้วยความเร็วประมาณ 346 เมตรต่อวินาที และตัวรับจะคอยรับสัญญาณที่สะท้อนกลับจากวัตถุ เมื่อทราบความเร็วในการเคลื่อนที่ของคลื่น, เวลาที่ใช้ในการเดินทางไป-กลับ (t) ก็จะสามารถคำนวณหาระยะห่างของวัตถุ (S) ได้จาก
S = 346 × 0.5t (1)
หลักการตรวจจับและวัดระยะห่างระหว่างวัตถุด้วยคลื่นเสียง
เพื่อให้การคำนวณหาระยะเป็นไปด้วยความง่าย โมดูลเซนเซอร์นี้จึงได้ประมวลผลให้เรียบร้อยแล้ว และส่งผลลัพธ์ของการคำนวณเป็นสัญญาณพัลส์ที่มีความกว้างสัมพันธ์กับระยะทางที่วัดได้
การต่อใช้งานโมดูล
โมดูลนี้มีจุดต่อใช้งานทั้งหมด 4 จุด การใช้งานบอร์ด STM32F4DISCOVERY การทดลองในเบื้องต้นสามารถต่อวงจรอย่างง่ายได้โดยใช้โปรโตบอร์ดและสายไฟต่อวงจรตามรูปที่ 2 ทั้งนี้ต้องตรวจสอบคุณสมบัติของพอร์ตของไมโครคอนโทรลเลอร์จากดาต้าชีท [3] ว่าสามารถทนระดับแรงดันลอจิก High (5V) ได้
- ขา VCC สำหรับต่อแรงดันไฟเลี้ยงไม่เกิน 5V
- ขา Trig เป็นขาอินพุตรับสัญญาณพัลส์ความกว้าง 10 ไมโครวินาทีเพื่อกระตุ้นการสร้างคลื่นอัลตราโซนิกความถี่ 40KHz ออกสู่อากาศจากตัวส่ง
- ขา Echo เป็นขาเอาต์พุตสำหรับส่งสัญญาณพัลส์ออกจากโมดูลไปยังไมโครคอนโทรลเลอร์ เพื่อตรวจจับความกว้างของสัญญาณพัลส์และคำนวณเป็นระยะทาง
- ขา GND สำหรับต่อจุดกราวด์ร่วมแรงดันและสัญญาณ
ตามคุณลักษณะของเซนเซอร์ จะต้องสร้างสัญญาณพัลส์ความกว้างไม่น้อยกว่า 10 msec ป้อนเข้าที่ขา Trig หลังจากนั้นอีกประมาณ 1.4 msec จึงจะเริ่มมีสัญญาณพัลส์เกิดขึ้นที่ขา Echo มีความกว้างของสัญญาณตั้งแต่ 150 usec – 25 msec ซึ่งถ้าหากกว้างกว่านี้จะถือว่าตรวจไม่พบวัตถุ หลังจากนั้นควรหน่วงเวลาออกไปอีก 10 mS จึงจะส่งสัญญาณ Trig ออกไปอีกรอบ ตามรูปที่ 3
รูปที่ 3 สัญญาณที่ขา Trig และขา Echo ของโมดูลเซนเซอร์อัลตราโซนิก HC-SR04
การตรวจจับความกว้างของสัญญาณใช้โมดูล PWM Capture ซึ่งให้เอาต์พุตออกมาเป็นเวลาในหน่วยวินาที และใช้สมการ (2) หรือ (3) เพื่อคำนวณหาระยะทางระหว่างวัตถุที่ตรวจพบ
ระยะทาง (cm) = ความกว้างของสัญญาณ Echo * 106 /58 (2)
ระยะทาง (inch) = ความกว้างของสัญญาณ Echo * 106 /148 (3)
ทดสอบการทำงานของเซนเซอร์เบื้องต้น
การทดลองนี้เป็นการทดสอบการทำงานในเบื้องต้นของเซนเซอร์ โดยอ่านข้อมูลจากเซนเซอร์แล้วส่งไปแสดงผลบนพีซี ให้ต่อเซนเซอร์โมดูลเข้ากับบอร์ดทดลอง aMG Lab Kit-F4 ตามรูปที่ 4 จากนั้นให้โปรแกรมตามรูปที่ 5 อาศัยข้อมูลคุณลักษณะของเซนเซอร์จากรูปที่ 3 โปรแกรมนี้ได้สร้างสัญญาณ Trig ความกว้าง 1 mS ความถี่ 27 Hz ออกทางขา PB7 ของไมโครคอนโทรลเลอร์ บล็อก PWM Capture ใช้สำหรับตรวจวัดความกว้างสัญญาณ Echo ที่เข้ามาทางขา PB6 และส่งข้อมูลซึ่งประกอบไปด้วย ความกว้างของสัญญาณ Echo, เปอร์เซ็นต์ดิวตี้ไซเคิลของสัญญาณ Echo, และความถี่ของสัญญาณ Trig ไปแสดงที่พีซีด้วยบล็อก USART
ให้โปรแกรมรับค่าที่ส่งมาจากไมโครฯ ตามรูปที่ 6 สัญญาณความกว้างพัลส์จะถูกแปลงให้อยู่ในหน่วยmsec และหารด้วย 58 เพื่อแสดงค่าระยะทางที่ตรวจจับวัตถุได้ในหน่วยเซนติเมตร
สรุป
บทความนี้เป็นการนำเสนอตัวอย่างการใช้บล็อก PWM Capture เพื่อวัดความกว้างของสัญญาณพัลส์ โดยใช้ตัวอย่างเซนเซอร์วัดระยะทางแบบไม่สัมผัสด้วยคลื่นอัลตราโซนิก เป็นกรณีศึกษาเพื่อให้ผู้ที่สนใจ หรือผู้ที่ทำโครงงานเกี่ยวกับไมโครคอนโทรลเลอร์จะได้นำเอาไปเป็นตัวอย่างเพื่อประยุกต์ใช้งานได้ ข้อแนะนำในการใช้งานเพื่อการวัดที่แม่นยำของเซนเซอร์นี้คือ มุมในการวัดควรอยู่ในช่วงไม่เกิน 15 องศา และพื้นผิวที่วัดควรจะเรียบมีพื้นที่ไม่น้อยกว่า 0.5 ตารางเมตร
อุปกรณ์
1. บอร์ด Arduino บอร์ด
2. สายไฟ ผู้-ผู้ 11 เส้น
3. LED 6 ดวง
4. สายUSB
5. ตัวต้านทาน 6 ตัว
6. HC-SR04 1 ตัว
code
#define trigPin 7
#define echoPin 6
#define led 13
#define led2 12
#define led3 11
#define led4 10
#define led5 9
#define led6 8
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance <= 30) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led,LOW);
}
if (distance < 25) {
digitalWrite(led2, HIGH);
}
else {
digitalWrite(led2, LOW);
}
if (distance < 20) {
digitalWrite(led3, HIGH);
}
else {
digitalWrite(led3, LOW);
}
if (distance < 15) {
digitalWrite(led4, HIGH);
}
else {
digitalWrite(led4,LOW);
}
if (distance < 10) {
digitalWrite(led5, HIGH);
}
else {
digitalWrite(led5,LOW);
}
if (distance < 5)
{
digitalWrite(led, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
delay(200);
digitalWrite(led, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
delay(200);
}
อุปกรณ์
1. บอร์ด Arduino บอร์ด
2. สายไฟ ผู้-ผู้ 11 เส้น
3. LED 6 ดวง
4. สายUSB
5. ตัวต้านทาน 6 ตัว
6. HC-SR04 1 ตัว
code
#define trigPin 7
#define echoPin 6
#define led 13
#define led2 12
#define led3 11
#define led4 10
#define led5 9
#define led6 8
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance <= 30) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led,LOW);
}
if (distance < 25) {
digitalWrite(led2, HIGH);
}
else {
digitalWrite(led2, LOW);
}
if (distance < 20) {
digitalWrite(led3, HIGH);
}
else {
digitalWrite(led3, LOW);
}
if (distance < 15) {
digitalWrite(led4, HIGH);
}
else {
digitalWrite(led4,LOW);
}
if (distance < 10) {
digitalWrite(led5, HIGH);
}
else {
digitalWrite(led5,LOW);
}
if (distance < 5)
{
digitalWrite(led, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
delay(200);
digitalWrite(led, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
delay(200);
}
คำอธิบาย
ถ้า ระยะทางตั้งแต่ 21 – 30 ซม. Led สีเขียวติด 2 ดวง
- ถ้า ระยะทางตั้งแต่ 11 – 20 Led สีเหลืองติด 2 ดวง (สีเขียว ยังคงติด)
- ถ้า ระยะทางตั้งแต่ 6 - 10 Led สีแดงติด 2 ดวง (สีเขียว และ เหลือง ยังคงติด)
- ถ้า ระยะทาง น้อยกว่า 6 ให้ Led กระพริบทั้ง 6 ดวง (ติด 0.3 วินาที ดับ 0.3 วินาที)
- ถ้าเงื่อนไขนอกจากนี้ให้ Led ดับทั้งหมด
บน serial monitor ให้แสดงระยะทางหน่วยเป็น ซม.
คำอธิบาย
ถ้า ระยะทางตั้งแต่ 21 – 30 ซม. Led สีเขียวติด 2 ดวง
ถ้า ระยะทางตั้งแต่ 21 – 30 ซม. Led สีเขียวติด 2 ดวง
- ถ้า ระยะทางตั้งแต่ 11 – 20 Led สีเหลืองติด 2 ดวง (สีเขียว ยังคงติด)
- ถ้า ระยะทางตั้งแต่ 6 - 10 Led สีแดงติด 2 ดวง (สีเขียว และ เหลือง ยังคงติด)
- ถ้า ระยะทาง น้อยกว่า 6 ให้ Led กระพริบทั้ง 6 ดวง (ติด 0.3 วินาที ดับ 0.3 วินาที)
- ถ้าเงื่อนไขนอกจากนี้ให้ Led ดับทั้งหมด
บน serial monitor ให้แสดงระยะทางหน่วยเป็น ซม.
ไม่มีความคิดเห็น:
แสดงความคิดเห็น