Arduino ขัดจังหวะการสอน

Arduino Interrupts Tutorial

การขัดจังหวะเป็นคุณสมบัติที่ทรงพลังของไมโครคอนโทรลเลอร์ที่ช่วยให้คุณจัดการกับเหตุการณ์แบบอะซิงโครนัส ซึ่งแตกต่างจากการสำรวจซึ่งตรวจสอบเหตุการณ์อย่างต่อเนื่องขัดจังหวะตอบสนองทันทีเมื่อมีเหตุการณ์เฉพาะเกิดขึ้นเช่นการกดปุ่มหรือตัวจับเวลาล้น บทช่วยสอนนี้จะแนะนำคุณผ่านการทำความเข้าใจและใช้การขัดจังหวะกับ Arduino


สิ่งที่คุณต้องการ

  1. Arduino Uno (หรือคณะกรรมการที่เข้ากันได้)
  2. ปุ่มกด
  3. ตัวต้านทาน 10K-OHM (สำหรับการกำหนดค่าแบบดึงลง)
  4. LED และตัวต้านทาน 220-OHM (ไม่บังคับ)
  5. เครื่องหั่นขนมปังและสายจัมเปอร์
  6. Arduino IDE ติดตั้งบนคอมพิวเตอร์ของคุณ

ขั้นตอนที่ 1: การขัดจังหวะคืออะไร?

การขัดจังหวะหยุดการดำเนินการของโปรแกรมหลักชั่วคราวเพื่อจัดการเหตุการณ์เฉพาะ เมื่อมีการประมวลผลเหตุการณ์แล้วโปรแกรมจะกลับมาทำงานต่อ การขัดจังหวะได้รับการจัดการโดยใช้ฟังก์ชั่นพิเศษที่เรียกว่า รูทีนบริการขัดจังหวะ (ISRS).

ประเภทของการขัดจังหวะใน Arduino

  1. การขัดจังหวะภายนอก: ถูกกระตุ้นโดยเหตุการณ์บนพินที่เฉพาะเจาะจง (เช่นพิน 2 หรือ 3 บน Arduino UNO)
  2. การเปลี่ยนพินอินเตอร์รัปต์: ทริกเกอร์โดยการเปลี่ยนแปลงบนพินดิจิตอลใด ๆ
  3. ตัวจับเวลาขัดจังหวะ: ทริกเกอร์โดยตัวจับเวลาล้นหรือเปรียบเทียบการแข่งขัน

ขั้นตอนที่ 2: การใช้การขัดจังหวะภายนอก

Arduino UNO รองรับการขัดจังหวะภายนอกบนพิน 2 และ 3 คุณสามารถกำหนดค่าการขัดจังหวะเหล่านี้เพื่อทริกเกอร์:

  • เพิ่มขึ้น: สัญญาณเริ่มจากต่ำถึงสูง
  • ล้ม: สัญญาณเปลี่ยนจากสูงถึงต่ำ
  • เปลี่ยน: สถานะการเปลี่ยนแปลงสัญญาณ (ต่ำถึงสูงหรือสูงถึงต่ำ)
  • ต่ำ: สัญญาณยังคงต่ำ

ตัวอย่างรหัส: การตรวจจับปุ่มกด

ตัวอย่างนี้สลับ LED เมื่อกดปุ่มกับ PIN 2

#define buttonPin 2 // Interrupt pin
#define ledPin 13   // Built-in LED

volatile bool ledState = false; // Shared variable between ISR and main code

void handleInterrupt() {
  ledState = !ledState; // Toggle LED state
  digitalWrite(ledPin, ledState);
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
  pinMode(ledPin, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}

void loop() {
  // Main loop does nothing; interrupt handles the LED
}

คำอธิบาย

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode): กำหนดค่าการขัดจังหวะ
    • pin: พินขัดจังหวะ (เช่นพิน 2 หรือ 3 บน Arduino uno)
    • ISR: รูทีนบริการขัดจังหวะเพื่อดำเนินการ
    • mode: เงื่อนไขการทริกเกอร์ (RISING, FALLING, CHANGE, หรือ LOW).
  • digitalPinToInterrupt(pin): แปลงหมายเลขพินเป็นหมายเลขขัดจังหวะ

ขั้นตอนที่ 3: ใช้การขัดจังหวะการเปลี่ยนพิน

การขัดจังหวะการเปลี่ยนพินช่วยให้คุณตรวจจับการเปลี่ยนแปลงบนพินดิจิตอลใด ๆ สิ่งนี้ต้องใช้ห้องสมุดเพิ่มเติมเช่น เปิดใช้งาน.

ตัวอย่างรหัส: การเปลี่ยนพินเปลี่ยนอินเตอร์รัปต์

#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor

void handlePinChange() {
  Serial.println("Pin state changed!");
}

void setup() {
  Serial.begin(9600);
  enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}

void loop() {
  // Main loop does nothing; interrupt handles the event
}

การติดตั้งห้องสมุด

หากต้องการใช้การขัดจังหวะการเปลี่ยนแปลง PIN ให้ติดตั้งไฟล์ เปิดใช้งาน ห้องสมุดผ่าน ARDUINO Library Manager


ขั้นตอนที่ 4: ขัดจังหวะตัวจับเวลา

การขัดจังหวะตัวจับเวลามีประโยชน์สำหรับการจัดตารางเวลาในช่วงเวลาที่แม่นยำ อ้างถึง บทช่วยสอนการจับเวลา Arduino สำหรับรายละเอียดเกี่ยวกับการกำหนดค่าการขัดจังหวะตัวจับเวลา

ตัวอย่าง: กระพริบ LED ด้วยการขัดจังหวะ Timer1

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);

  // Configure Timer1
  noInterrupts(); // Disable interrupts during setup
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
  TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt

  interrupts(); // Enable interrupts
}

ISR(TIMER1_COMPA_vect) {
  digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}

void loop() {
  // Main loop does nothing; Timer1 handles the LED
}

ขั้นตอนที่ 5: แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้การขัดจังหวะ

  1. ให้ ISRS สั้น: หลีกเลี่ยงความล่าช้าหรือการคำนวณที่ซับซ้อนใน ISRS เพื่อให้แน่ใจว่าการตอบสนองอย่างรวดเร็ว
  2. หลีกเลี่ยงการสื่อสารแบบอนุกรมใน ISRS: ฟังก์ชั่นอนุกรมอาจไม่ทำงานได้อย่างน่าเชื่อถือภายใน ISR
  3. ใช้ volatile สำหรับตัวแปรที่ใช้ร่วมกัน: ตัวแปรทำเครื่องหมายที่ใช้ร่วมกันระหว่าง ISRS และโปรแกรมหลักเป็น volatile เพื่อป้องกันปัญหาการเพิ่มประสิทธิภาพคอมไพเลอร์
  4. อินพุต debounce: จัดการตรรกะ debounce ในซอฟต์แวร์หรือฮาร์ดแวร์สำหรับสัญญาณที่มีเสียงดังเช่นปุ่มกด
  5. ปิดการใช้งานการขัดจังหวะระหว่างส่วนที่สำคัญ: ใช้ noInterrupts() และ interrupts() เพื่อปกป้องส่วนรหัสที่สำคัญ

แอปพลิเคชันของการขัดจังหวะ

  1. กดปุ่มกดโดยไม่ต้องสำรวจ
  2. อ่านเครื่องเข้ารหัสโรตารี่
  3. เหตุการณ์สำคัญเหตุการณ์สำคัญ (เช่นการควบคุมมอเตอร์ที่แม่นยำ)
  4. กำหนดเวลางานเป็นระยะ
  5. ตอบสนองต่อสัญญาณภายนอก (เช่นเซ็นเซอร์เหตุการณ์การสื่อสาร)

การแก้ไขปัญหา

  • ขัดจังหวะไม่กระตุ้น: ตรวจสอบให้แน่ใจว่ามีการกำหนดค่าพินและโหมดที่ถูกต้อง
  • พฤติกรรมที่ไม่มั่นคง: สัญญาณเสียงดัง debounce และหลีกเลี่ยง ISR ที่ยาว
  • ขัดแย้งกับห้องสมุด: ห้องสมุดบางแห่งใช้การขัดจังหวะภายใน (เช่น Servo, PWM) ตรวจสอบให้แน่ใจว่าไม่มีความขัดแย้งกับรหัสของคุณ

บทสรุป

การขัดจังหวะช่วยให้การจัดการเหตุการณ์ที่ตอบสนองและมีประสิทธิภาพในโครงการ Arduino โดยการเรียนรู้ที่จะใช้การเปลี่ยนพินภายนอกและการขัดจังหวะตัวจับเวลาคุณสามารถสร้างแอปพลิเคชันที่แข็งแกร่งและแม่นยำ ทดลองกับการขัดจังหวะประเภทต่าง ๆ เพื่อปรับปรุงโครงการของคุณและเพิ่มประสิทธิภาพประสิทธิภาพ!

แสดงความคิดเห็น

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.