pulseIn() ใน arduino ทำงานอย่างไร ?

HC-SR04 กับ Arduino

การทำงานของฟังก์ชัน pulseIn() ใน Arduino

ฟังก์ชัน pulseIn() ใน Arduino ใช้สำหรับวัดระยะเวลาที่สัญญาณที่เข้ามาอยู่ในสถานะหนึ่ง (HIGH หรือ LOW) ซึ่งเหมาะสำหรับการวัดสัญญาณพัลส์หรือสัญญาณที่เปลี่ยนแปลงตามเวลา ณ ที่นี้จะเป็นการยกตัวอย่างกับเซ็นเซอร์ที่ได้รับความนิยมในการวัดหาค่าระยะทาง เช่น สัญญาณจากเซ็นเซอร์ HC-SR04

Syntax ของฟังก์ชัน pulseIn()

pulseIn(pin, value);
pulseIn(pin, value, timeout);
  • pin: ขาดิจิตอลที่ต้องการอ่านสัญญาณพัลส์
  • value: ระบุสถานะที่ต้องการวัด เช่น HIGH หรือ LOW
  • timeout: (ไม่บังคับ) เวลา (หน่วยไมโครวินาที) ที่จะรอการเริ่มต้นพัลส์ หากไม่มีพัลส์เกิดขึ้นภายในเวลานี้ ฟังก์ชันจะคืนค่า 0
HC-SR04 กับ Arduino

การทำงานของฟังก์ชัน pulseIn()

  1. จับสัญญาณแรก: เมื่อเรียกใช้ pulseIn() จะรอให้สถานะของขาที่กำหนดเปลี่ยนเป็นสถานะที่ต้องการ (เช่น จาก LOW เป็น HIGH) ซึ่งถือเป็นการเริ่มต้นพัลส์
  2. วัดความยาวของพัลส์: ฟังก์ชันจะเริ่มนับเวลาทันทีที่พบการเปลี่ยนสถานะจาก LOW เป็น HIGH (หรือจาก HIGH เป็น LOW ขึ้นอยู่กับค่าที่ตั้งไว้) และจะหยุดนับเมื่อสัญญาณกลับไปเป็นสถานะเดิม
  3. ส่งผลลัพธ์: ฟังก์ชันจะคืนค่าระยะเวลาที่สัญญาณอยู่ในสถานะที่ระบุ (HIGH หรือ LOW) โดยมีหน่วยเป็นไมโครวินาที

ตัวอย่างการทำงานของ pulseIn()


const int trigPin = 9;
const int echoPin = 10;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  long duration;
  float distance;

  // ส่งพัลส์สัญญาณออกจากขา Trigger
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // ใช้ pulseIn() เพื่อวัดระยะเวลาที่ Echo เป็น HIGH
  duration = pulseIn(echoPin, HIGH);

  // คำนวณระยะทาง
  distance = (duration * 0.0343) / 2;

  // แสดงผลระยะทาง
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  delay(1000);
}
    
pulseIn-logic

ในตัวอย่างนี้:

  • เมื่อเซ็นเซอร์ HC-SR04 ส่งคลื่นเสียงออกไปและรอสัญญาณสะท้อนกลับ pulseIn() จะใช้ในการวัดระยะเวลาที่สัญญาณ Echo เป็น HIGH (ระยะเวลาที่คลื่นเสียงเดินทางไปและกลับ)
  • ฟังก์ชันนี้จะคืนค่าระยะเวลาเป็นไมโครวินาที ซึ่งจะถูกใช้คำนวณระยะทาง

ฟังก์ชัน pulseIn() ทำงานอย่างไร

  1. เริ่มต้นจับสถานะสัญญาณ: pulseIn() จะเริ่มจับสัญญาณที่เข้ามาในขาดิจิตอลที่กำหนดและรอจนกว่าสัญญาณจะเปลี่ยนเป็นสถานะที่ต้องการ เช่น จาก LOW เป็น HIGH
  2. เริ่มนับเวลา: เมื่อพบการเปลี่ยนสถานะ ฟังก์ชันจะเริ่มนับเวลาทันที และจะหยุดนับเมื่อสถานะสัญญาณกลับมาเป็นสถานะตรงข้าม เช่น เมื่อ HIGH เปลี่ยนเป็น LOW
  3. คืนค่าระยะเวลา: เมื่อสิ้นสุดการนับ ฟังก์ชันจะคืนค่าระยะเวลาที่สัญญาณอยู่ในสถานะที่ต้องการ โดยระยะเวลานั้นมีหน่วยเป็นไมโครวินาที

ตัวอย่างการใช้ pulseIn() ร่วมกับ timeout

บางครั้งเราอาจต้องการกำหนดเวลาในการรอพัลส์ เช่น ถ้าพัลส์ไม่มีการเปลี่ยนแปลงภายในเวลาที่กำหนด ฟังก์ชันจะหยุดทำงานและคืนค่า 0 แทน:

long duration = pulseIn(echoPin, HIGH, 1000000); // รอพัลส์ 1 วินาที

ถ้าไม่มีพัลส์เกิดขึ้นภายใน 1 วินาที ฟังก์ชันจะคืนค่า 0

ข้อดีและข้อจำกัด

ข้อดี:

  • ง่ายต่อการใช้งานโดยไม่ต้องเขียนฟังก์ชันตรวจจับสัญญาณเอง
  • ใช้งานได้หลากหลาย เช่น การวัดระยะทาง การตรวจจับพัลส์ หรือการนับเวลาสัญญาณ

ข้อจำกัด:

  • ในขณะที่ pulseIn() ทำงาน โปรแกรมจะหยุดรอการตรวจจับพัลส์ ทำให้การทำงานอื่นใน loop ช้าลง หากเขียนโปรแกรมที่มีความซับซ้อน มีการอ่านค่าเซ็นเซอร์หลายๆตัว หรือปัจจัยอื่นๆที่เกี่ยวข้องกับเวลาในการทำงานให้พิจารณาตรงจุดนี้ด้วย
  • ถ้าไม่มีพัลส์หรือพัลส์ไม่เปลี่ยนสถานะ ฟังก์ชันอาจทำให้โปรแกรมหยุดทำงานได้ชั่วคราว (แต่สามารถใช้ timeout เพื่อป้องกันกรณีนี้ได้)

ฟังก์ชัน pulseIn() เหมาะกับการใช้งานที่ต้องการการวัดสัญญาณแบบพัลส์อย่างละเอียด แต่ควรใช้อย่างระมัดระวังในกรณีที่ต้องการประสิทธิภาพของการทำงานหลายอย่างพร้อมกัน