การขัดจังหวะเป็นคุณสมบัติที่ทรงพลังของไมโครคอนโทรลเลอร์ที่ช่วยให้คุณจัดการกับเหตุการณ์แบบอะซิงโครนัส ซึ่งแตกต่างจากการสำรวจซึ่งตรวจสอบเหตุการณ์อย่างต่อเนื่องขัดจังหวะตอบสนองทันทีเมื่อมีเหตุการณ์เฉพาะเกิดขึ้นเช่นการกดปุ่มหรือตัวจับเวลาล้น บทช่วยสอนนี้จะแนะนำคุณผ่านการทำความเข้าใจและใช้การขัดจังหวะกับ Arduino
สิ่งที่คุณต้องการ
- Arduino Uno (หรือคณะกรรมการที่เข้ากันได้)
- ปุ่มกด
- ตัวต้านทาน 10K-OHM (สำหรับการกำหนดค่าแบบดึงลง)
- LED และตัวต้านทาน 220-OHM (ไม่บังคับ)
- เครื่องหั่นขนมปังและสายจัมเปอร์
- Arduino IDE ติดตั้งบนคอมพิวเตอร์ของคุณ
ขั้นตอนที่ 1: การขัดจังหวะคืออะไร?
การขัดจังหวะหยุดการดำเนินการของโปรแกรมหลักชั่วคราวเพื่อจัดการเหตุการณ์เฉพาะ เมื่อมีการประมวลผลเหตุการณ์แล้วโปรแกรมจะกลับมาทำงานต่อ การขัดจังหวะได้รับการจัดการโดยใช้ฟังก์ชั่นพิเศษที่เรียกว่า รูทีนบริการขัดจังหวะ (ISRS).
ประเภทของการขัดจังหวะใน Arduino
- การขัดจังหวะภายนอก: ถูกกระตุ้นโดยเหตุการณ์บนพินที่เฉพาะเจาะจง (เช่นพิน 2 หรือ 3 บน Arduino UNO)
- การเปลี่ยนพินอินเตอร์รัปต์: ทริกเกอร์โดยการเปลี่ยนแปลงบนพินดิจิตอลใด ๆ
- ตัวจับเวลาขัดจังหวะ: ทริกเกอร์โดยตัวจับเวลาล้นหรือเปรียบเทียบการแข่งขัน
ขั้นตอนที่ 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: แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้การขัดจังหวะ
- ให้ ISRS สั้น: หลีกเลี่ยงความล่าช้าหรือการคำนวณที่ซับซ้อนใน ISRS เพื่อให้แน่ใจว่าการตอบสนองอย่างรวดเร็ว
- หลีกเลี่ยงการสื่อสารแบบอนุกรมใน ISRS: ฟังก์ชั่นอนุกรมอาจไม่ทำงานได้อย่างน่าเชื่อถือภายใน ISR
-
ใช้
volatile
สำหรับตัวแปรที่ใช้ร่วมกัน: ตัวแปรทำเครื่องหมายที่ใช้ร่วมกันระหว่าง ISRS และโปรแกรมหลักเป็นvolatile
เพื่อป้องกันปัญหาการเพิ่มประสิทธิภาพคอมไพเลอร์ - อินพุต debounce: จัดการตรรกะ debounce ในซอฟต์แวร์หรือฮาร์ดแวร์สำหรับสัญญาณที่มีเสียงดังเช่นปุ่มกด
-
ปิดการใช้งานการขัดจังหวะระหว่างส่วนที่สำคัญ: ใช้
noInterrupts()
และinterrupts()
เพื่อปกป้องส่วนรหัสที่สำคัญ
แอปพลิเคชันของการขัดจังหวะ
- กดปุ่มกดโดยไม่ต้องสำรวจ
- อ่านเครื่องเข้ารหัสโรตารี่
- เหตุการณ์สำคัญเหตุการณ์สำคัญ (เช่นการควบคุมมอเตอร์ที่แม่นยำ)
- กำหนดเวลางานเป็นระยะ
- ตอบสนองต่อสัญญาณภายนอก (เช่นเซ็นเซอร์เหตุการณ์การสื่อสาร)
การแก้ไขปัญหา
- ขัดจังหวะไม่กระตุ้น: ตรวจสอบให้แน่ใจว่ามีการกำหนดค่าพินและโหมดที่ถูกต้อง
- พฤติกรรมที่ไม่มั่นคง: สัญญาณเสียงดัง debounce และหลีกเลี่ยง ISR ที่ยาว
- ขัดแย้งกับห้องสมุด: ห้องสมุดบางแห่งใช้การขัดจังหวะภายใน (เช่น Servo, PWM) ตรวจสอบให้แน่ใจว่าไม่มีความขัดแย้งกับรหัสของคุณ
บทสรุป
การขัดจังหวะช่วยให้การจัดการเหตุการณ์ที่ตอบสนองและมีประสิทธิภาพในโครงการ Arduino โดยการเรียนรู้ที่จะใช้การเปลี่ยนพินภายนอกและการขัดจังหวะตัวจับเวลาคุณสามารถสร้างแอปพลิเคชันที่แข็งแกร่งและแม่นยำ ทดลองกับการขัดจังหวะประเภทต่าง ๆ เพื่อปรับปรุงโครงการของคุณและเพิ่มประสิทธิภาพประสิทธิภาพ!