- ประเภทของการขัดจังหวะ
- ขัดจังหวะใน Arduino
- การใช้ Interrupts ใน Arduino
- ส่วนประกอบที่จำเป็น
- แผนภูมิวงจรรวม
- การเขียนโปรแกรม Arduino Interrupt
- การสาธิตการขัดจังหวะ Arduino
พิจารณารถที่เคลื่อนที่เร็วหากจู่ๆก็โดนรถคันอื่นชนในทิศทางตรงกันข้ามสิ่งแรกที่เกิดขึ้นคือเซ็นเซอร์มาตรวัดความเร่งที่อยู่ในรถจะตรวจจับการลดความเร็วอย่างกะทันหันและกระตุ้นให้เกิดการขัดจังหวะภายนอกกับไมโครคอนโทรลเลอร์ที่อยู่ใน รถยนต์. จากนั้นตามการขัดจังหวะนั้นไมโครคอนโทรลเลอร์จะผลิตสัญญาณไฟฟ้าเพื่อปรับใช้ถุงลมนิรภัยทันที ไมโครคอนโทรลเลอร์ที่มีอยู่ในรถจะตรวจสอบหลาย ๆ อย่างพร้อมกันเช่นการตรวจจับความเร็วของรถตรวจสอบเซ็นเซอร์อื่น ๆ ควบคุมอุณหภูมิเครื่องปรับอากาศเป็นต้นแล้วอะไรที่ทำให้ถุงลมนิรภัยเปิดกะทันหันในไม่กี่วินาที คำตอบคือการขัดจังหวะเป็นสัญญาณขัดจังหวะจะใช้ที่นี่ซึ่งมีความสำคัญสูงสุดของทั้งหมด
อีกตัวอย่างง่ายๆของการขัดจังหวะคือโทรศัพท์มือถือหน้าจอสัมผัสซึ่งมีลำดับความสำคัญสูงสุดในการสัมผัส "Touch" อุปกรณ์อิเล็กทรอนิกส์เกือบทุกชนิดมีบางอย่างที่ขัดขวางเพื่อ 'ขัดจังหวะ' กระบวนการปกติและทำสิ่งที่มีลำดับความสำคัญสูงกว่าในเหตุการณ์หนึ่ง ๆ กระบวนการปกติจะกลับมาทำงานอีกครั้งหลังจากให้บริการขัดจังหวะ
ดังนั้นในทางเทคนิคInterrupts เป็นกลไกที่ I / O หรือการเรียนการสอนสามารถระงับการดำเนินการตามปกติของหน่วยประมวลผลตัวเองและได้รับบริการเหมือนว่ามันจะมีลำดับความสำคัญสูง ตัวอย่างเช่นโปรเซสเซอร์ที่ดำเนินการตามปกติอาจถูกขัดขวางโดยเซ็นเซอร์บางตัวเพื่อดำเนินการกระบวนการเฉพาะที่มีอยู่ใน ISR (Interrupt Service Routine) หลังจากรันโปรเซสเซอร์ ISR แล้วสามารถกลับมาดำเนินการตามปกติได้อีกครั้ง
ประเภทของการขัดจังหวะ
การขัดจังหวะมีสองประเภท:
การขัดจังหวะฮาร์ดแวร์:เกิดขึ้นเมื่อมีเหตุการณ์ภายนอกเกิดขึ้นเช่นพินอินเทอร์รัปต์ภายนอกเปลี่ยนสถานะจากต่ำเป็นสูงหรือสูงเป็นต่ำ
ซอฟต์แวร์ขัดจังหวะ:เกิดขึ้นตามคำสั่งจากซอฟต์แวร์ ยกตัวอย่างเช่นการขัดจังหวะจับเวลาเป็นซอฟแวร์การขัดจังหวะ
ขัดจังหวะใน Arduino
ตอนนี้เราจะมาดูวิธีใช้interrupt ใน Arduino Board มีการขัดจังหวะสองประเภท:
- การขัดจังหวะภายนอก
- Pin Change Interrupt
การขัดจังหวะภายนอก:
การขัดจังหวะเหล่านี้ถูกตีความโดยฮาร์ดแวร์และรวดเร็วมาก การขัดจังหวะเหล่านี้สามารถตั้งค่าให้ทริกเกอร์ในเหตุการณ์ที่ขึ้นหรือตกหรือระดับต่ำ
บอร์ด Arduino |
หมุดขัดจังหวะภายนอก: |
UNO, NANO |
2,3 |
เมกะ |
2,3,18,19,20,21 |
Pin Change Interrupts:
Arduinos สามารถเปิดใช้งานพินขัดจังหวะเพิ่มเติมได้โดยใช้การขัดจังหวะการเปลี่ยนพิน ในบอร์ด Arduino ที่ใช้ ATmega168 / 328 พินใด ๆ หรือพินสัญญาณทั้งหมด 20 พินสามารถใช้เป็นพินขัดจังหวะได้ นอกจากนี้ยังสามารถเรียกใช้โดยใช้ RISING หรือ FALLING edge
การใช้ Interrupts ใน Arduino
ในการใช้การขัดจังหวะใน Arduino จำเป็นต้องเข้าใจแนวคิดต่อไปนี้
Interrupt Service Routine (ISR)
Interrupt Service Routine หรือตัวจัดการการขัดจังหวะคือเหตุการณ์ที่มีชุดคำสั่งเล็ก ๆ อยู่ในนั้น เมื่อเกิดการขัดจังหวะภายนอกโปรเซสเซอร์จะเรียกใช้โค้ดเหล่านี้ที่มีอยู่ใน ISR ก่อนและส่งกลับไปยังสถานะที่ออกจากการทำงานตามปกติ
ISR มีไวยากรณ์ต่อไปนี้ใน Arduino:
attachInterrupt (digitalPinToInterrupt (พิน), ISR, โหมด);
digitalPinToInterrupt (พิน):ใน Arduino Uno, NANO พินที่ใช้สำหรับขัดจังหวะคือ 2,3 & ในเมกะ 2,3,18,19,20,21 ระบุพินอินพุตที่ใช้สำหรับการขัดจังหวะภายนอกที่นี่
ISR:เป็นฟังก์ชันที่ถูกเรียกใช้เมื่อการขัดจังหวะภายนอกเสร็จสิ้น
โหมด:ประเภทของการเปลี่ยนเพื่อกระตุ้นเช่นการล้มการขึ้น ฯลฯ
- RISING: เพื่อทริกเกอร์อินเทอร์รัปต์เมื่อพินเปลี่ยนจากต่ำไปสูง
- FALLING: เพื่อทริกเกอร์การขัดจังหวะเมื่อพินเปลี่ยนจากสูงไปต่ำ
- CHANGE: เพื่อทริกเกอร์อินเทอร์รัปต์เมื่อพินเปลี่ยนจาก LOW ไป HIGH หรือ HIGH ไป LOW (เช่นเมื่อสถานะพินเปลี่ยนไป)
เงื่อนไขบางอย่างในขณะที่ใช้ Interrupt
- ฟังก์ชัน Interrupt Service Routine (ISR) ต้องสั้นที่สุด
- ฟังก์ชัน Delay () ไม่ทำงานใน ISR และควรหลีกเลี่ยง
ในบทช่วยสอน Arduino Interruptนี้ตัวเลขจะเพิ่มขึ้นจาก 0 และใช้ปุ่มกดสองปุ่มเพื่อทริกเกอร์ Interrupt แต่ละปุ่มเชื่อมต่อกับ D2 & D3 LED ใช้เพื่อระบุการขัดจังหวะ หากกดปุ่มใดปุ่มหนึ่งไฟ led จะติดและจอแสดงผล interrupt2 และดับลงและเมื่อกดปุ่มอื่นไฟ led จะดับและจอแสดงผลจะแสดง interrupt1 และดับลง
ส่วนประกอบที่จำเป็น
- บอร์ด Arduino (ในบทช่วยสอนนี้ใช้ Arduino NANO)
- ปุ่มกด - 2
- LED - 1
- ตัวต้านทาน (10K) - 2
- จอ LCD (16x2) - 1
- คณะกรรมการขนมปัง
- การเชื่อมต่อสายไฟ
แผนภูมิวงจรรวม
การเชื่อมต่อวงจรระหว่าง Arduino Nano และจอ LCD 16x2:
LCD |
Arduino นาโน |
VSS |
GND |
VDD |
+ 5V |
V0 |
ไปยัง PIN ของศูนย์โพเทนชิออมิเตอร์ สำหรับการควบคุม Contrast ของ LCD |
อาร์เอส |
D7 |
RW |
GND |
จ |
D8 |
D4 |
D9 |
D5 |
D10 |
D6 |
D11 |
D7 |
D12 |
ก |
+ 5V |
เค |
GND |
ปุ่มกดสองปุ่มเชื่อมต่อกับ Arduino Nanoที่พิน D2 & D3 ใช้สำหรับการใช้อินเทอร์รัปต์ภายนอกสองตัวตัวหนึ่งสำหรับเปิด LED และอีกอันสำหรับปิด LED ปุ่มกดแต่ละปุ่มมีตัวต้านทานแบบดึงลง 10k ที่เชื่อมต่อกับกราวด์ ดังนั้นเมื่อกดปุ่มจะเป็นลอจิก HIGH (1) และเมื่อไม่กดจะเป็นลอจิก LOW (0) ตัวต้านทานแบบดึงลงเป็นภาคบังคับมิฉะนั้นจะมีค่าลอยที่ขาอินพุต D2 & D3
LEDยังใช้เพื่อแสดงให้เห็นว่าการขัดจังหวะได้รับการเรียกหรือปุ่มถูกกด
การเขียนโปรแกรม Arduino Interrupt
ในบทช่วยสอนนี้ตัวเลขจะเพิ่มขึ้นจาก 0 ซึ่งจะแสดงอย่างต่อเนื่องใน LCD (16x2) ที่เชื่อมต่อกับ Arduino Nano เมื่อใดก็ตามที่กดปุ่มซ้าย (พินขัดจังหวะ D3) ไฟ LED จะเปิดขึ้นและจอแสดงผลจะแสดง Interrupt2 และเมื่อกดปุ่มขวา (พินขัดจังหวะ D2) ถูกกด LED จะดับลงและจอแสดงผลจะแสดง Interrupt1
รหัสที่สมบูรณ์พร้อมวิดีโอที่ใช้งานได้จะได้รับในตอนท้ายของบทช่วยสอนนี้
1. ก่อนอื่นให้รวมไฟล์ส่วนหัว สำหรับจอแสดงผล LCD จากนั้นกำหนดพิน LCD ที่ใช้ในการเชื่อมต่อกับ Arduino Nano
# รวม
2. ภายในฟังก์ชันvoid setup () ขั้นแรกให้แสดงข้อความแนะนำบางส่วนบนจอ LCD เรียนรู้เพิ่มเติมเกี่ยวกับการเชื่อมต่อ LCD กับ Arduino ที่นี่
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("ArduinoInterrupt"); ล่าช้า (3000); lcd.clear ();
3. จากนั้นในฟังก์ชัน void setup () เดียวกันจะต้องระบุพินอินพุตและเอาต์พุต พิน D13 เชื่อมต่อกับแอโนดของ LED ดังนั้นต้องกำหนดพินนี้เป็นเอาต์พุต
pinMode (13, เอาท์พุท);
4. ตอนนี้ส่วนสำคัญหลักในการเขียนโปรแกรมมาถึงนั่นคือฟังก์ชัน attachInterrupt ()ซึ่งรวมอยู่ในการตั้งค่าโมฆะ () ด้วย
attachInterrupt (digitalPinToInterrupt (2), buttonPressed1, RISING); attachInterrupt (digitalPinToInterrupt (3), buttonPressed2, RISING);
ในที่นี้มีการระบุว่าพิน 2 สำหรับการขัดจังหวะภายนอกและฟังก์ชัน buttonPressed1 ถูกเรียกใช้เมื่อมี RISING (LOW to HIGH) ที่ขา D2 และพิน 3 ยังใช้สำหรับการขัดจังหวะภายนอกและฟังก์ชัน buttonPressed2 จะถูกเรียกเมื่อมี RISING ที่พิน D3
5. ภายใน void loop ()ตัวเลข (i) จะเพิ่มขึ้นจากศูนย์และพิมพ์บน LCD (16x2)
lcd.clear (); lcd.print ("COUNTER:"); lcd.print (ผม); ++ ผม; ล่าช้า (1,000);
ใน void loop () เดียวกัน digitalWrite () ถูกใช้กับพิน D13 ที่เชื่อมต่อขั้วบวกของ LED ขึ้นอยู่กับค่าใน เอาต์พุต ตัวแปรLED จะเปิดหรือปิด
digitalWrite (13, เอาต์พุต);
6. ส่วนที่สำคัญที่สุดคือการสร้างฟังก์ชั่นการจัดการการขัดจังหวะตามชื่อที่จะใช้ใน attachInterrupt () ฟังก์ชั่น
เนื่องจากใช้พินอินเทอร์รัปต์สองพิน 2 และ 3 ดังนั้นจึงต้องใช้ ISR สองตัว ที่นี่ในการเขียนโปรแกรมต่อไปนี้ใช้ ISR
buttonPressed1 ():
เป็นโมฆะ buttonPressed1 () { output = LOW; lcd.setCursor (0,1); lcd.print ("ขัดจังหวะ 1"); }
ฟังก์ชันนี้จะทำงานเมื่อกดปุ่มที่ขา D2 (RISING EDGE) ฟังก์ชันนี้จะเปลี่ยนสถานะของเอาต์พุตเป็น LOW ทำให้ LED ปิดและพิมพ์“ interrupt1” บนจอแสดงผล LCD
buttonPressed2 ():
เป็นโมฆะ buttonPressed2 () {output = HIGH; lcd.setCursor (0,1); lcd.print ("อินเตอร์รัปต์ 2"); }
ฟังก์ชันนี้จะทำงานเมื่อกดปุ่มบนพิน D3 ฟังก์ชันนี้จะเปลี่ยนสถานะของเอาต์พุตเป็นสูงทำให้ LED เปิดและพิมพ์“ ขัดจังหวะ 2” บนจอแสดงผล LCD
การสาธิตการขัดจังหวะ Arduino
1. เมื่อ PUSH BUTTON ทางด้านซ้ายถูกกด LED จะติดและ LCD จะแสดง Interrupt2
2. เมื่อกดปุ่ม PUSH ทางด้านขวาไฟ LED จะดับลงและ LCD จะแสดง Interrupt1
นี่คือวิธีที่การขัดจังหวะจะมีประโยชน์ในการทริกเกอร์งานสำคัญใด ๆ ระหว่างการดำเนินการปกติ