Basic for External Interrupt Pins with Arduino UNO

ในบทความนี้เป็นการใช้งานฟังก์ชั่นอินเตอร์รัพท์อีกแบบหนึ่งของบอร์ดควบคุม Arduino UNO ด้วยการรับสัญญาณอินเตอร์รัพท์จากภายนอก (External Interrupt) มายังขาอินพุต D2 หรือ D3 เพื่อให้ชิฟไมโครคอนโทรลเลอร์ประมวลผล (ATmega328P) ทั้งนี้การใช้งานขาอินพุตอินเตอร์รัพท์จากภายนอก ช่วยให้การประมวลผลในลูปโปรแกรมหลัก (void loop) ทำงานได้รวดเร็วขึ้นยิ่งขึ้น รวมทั้งการเข้าถึงฟังก์ชั่นภายในคำสั่ง (Interrupt Service Routine : ISR) ก็รวดเร็วด้วยเช่นกัน โดยในบทความนี้จะเป็นการทดลองและนำตัวอย่างคำสั่งมาใช้งาน


ในรูปที่ 1 และรูปที่ 2 แสดงตำแหน่งขาอินเตอร์รัพท์ของบอร์ด Arduino ต่างๆ ที่นิยมใช้งานทั่วไป สำหรับต่อใช้งานได้อย่างถูกต้อง โดยในการทดลองจะใช้บอร์ดควบคุม Arduino UNO ซึ่งตำแหน่งการต่อใช้งานอยู่ที่ตำแหน่งขา D2 และขา D3 แสดงในรูปที่ 2 วงกลมสีแดง INT0, INT1

สำหรับรูปที่ 3 เป็นการเขียนโปรแกรมคำสั่งอินเตอร์รัพท์ในลักษณะต่างๆ โดยจะมีลักษณะแตกต่างกันไป แต่ในการเขียนโปรแกรมตัวอย่างบรรทัดแรกเป็นการเขียนการเขียนโปรแกรมที่ตรงหลักไวยากรณ์ (Syntax) และแนะนำให้ใช้งาน

รูปที่ 4 การกำหนดค่าตัวแปรต่างๆ (Parameters) ให้กับคำสั่งอินเตอร์รัพท์ จะประกอบด้วยรูปแบบคำสั่งในการอินเตอร์รัพท์ (interrupt), ตำแหน่งขารับสัญญาณอินเตอร์รัพท์ (pin), ตำแหน่งฟังก์ชั่นการทำคำสั่งเมื่อเกิดการอินเตอร์รัพท์ (ISR) และรูปแบบของการรับสัญญญาณทริกเกอร์ขาอินพุตอินเตอร์รัพท์ (mode) ซึ่งมีให้เลือกใช้งานได้ 5 รูปแบบคือ LOW, CHANGE, RISING, FALLIN และ HIGH
/* Code Program For Basic for External Interrupt Pins with Arduino UNO [Test LAB 1] Arduino Code Ref : https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ */ const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = LOW; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); } void loop() { Serial.println(" interruptPin LAB "); delay(1000); } void blink() { Serial.println(" Active interruptPin "); delay(10); }

การทดลองที่ 1 เป็นการทดลองด้วยคำสั่ง attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE) ซึ่งเป็นโหมด CHANGE คือจะเกิดการอินเตอร์รัพท์เมื่อสัญญาณที่ป้อนเข้ามายังขา D2 เกิดการเปลี่ยนแปลงขึ้น อาจจะเป็นจากลอจิก 0 ไปเป็นลอจิก 1 หรือจากลอจิก 1 ไปเป็นลอจิก 0 โดยเมื่อได้รับสัญญาณอินเตอร์รัพท์ โปรแกรมจะเข้าไปยังฟังก์ชั่น blink เพื่อส่งข้อความ Active interruptPin ให้ทราบ ทั้งนี้ในช่วงการทำงานปกติโปรแกรมจะทำงานในลูปคำสั่ง void loop() ด้วยการส่งข้อความ interruptPin LAB ทุกๆ 1 วินาที นั้นเอง ในรูปที่ 5 การอบแสดงข้อความ Active interruptPin สีเขียว จะเกิดจากการเปลี่ยนจากลอจิก 1 ไปเป็นลอจิก 0 และการอบแสดงข้อความ Active interruptPin สีส้ม เกิดจากการเปลี่ยนจากลอจิก 0 ไปเป็นลอจิก 1
/* Code Program For Basic for External Interrupt Pins with Arduino UNO [Test LAB 2] Arduino Code Ref : https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ */ const byte ledPin = 13; const byte interruptPin = 2; volatile byte state = LOW; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), blink, LOW); } void loop() { Serial.println(" interruptPin LAB "); delay(1000); } void blink() { Serial.println(" Active interruptPin "); delay(10); }

การทดลองที่ 2 เป็นการทดลองด้วยคำสั่ง attachInterrupt(digitalPinToInterrupt(interruptPin), blink, LOW) หมายถึงโหมด LOW คือจะเกิดการอินเตอร์รัพท์เมื่อสัญญาณที่ป้อนเข้ามายังขา D2 เป็นลอจิก 0 เท่านั้น จากนั้นโปรแกรมการทำงานจะเข้าไปยังฟังก์ชั่น blink เช่นกัน เพื่อส่งข้อความ Active interruptPin ให้ทราบ ทั้งนี้ในช่วงการทำงานปกติโปรแกรมจะทำงานในลูปคำสั่ง void loop() ด้วยการส่งข้อความ interruptPin LAB ทุกๆ 1 วินาทีเช่นเดิม ในรูปที่ 6 การอบแสดงข้อความ Active interruptPin สีฟ้าจะเกิดจากการเปลี่ยนจากลอจิก 1 ไปเป็นลอจิก 0 ซึ่งจะส่งข้อความ Active interruptPin ตลอดเวลาจนกว่าจะเปลี่ยนจากลอจิก 0 ไปเป็นลอจิก 1 นั้นเอง


สำหรับการใช้งานฟังก์ชั่นอินเตอร์รัพท์ที่ตำแหน่งขา D2 หรือ D3 ของบอร์ด Arduino UNO นั้น สามารถนำไปประยุกต์ใช้งานได้หลายรูปแบบ โดยเฉพาะในวงจรดีซี ทู ดีซี คอนเวอร์เตอร์หรือวงจรสวิตชิ่งโหมดเพาเวอร์ซัพพลายในส่วนของการตรวจจับแรงดันเกิน (Over Voltage Protection) และการตรวจจับกระแสเกิน (Over Current Protection) ไม่ให้อุปกรณ์ขับกำลังสวิตชิ่งเสียหาย เช่น เพาเวอร์ทรานซิสเตอร์หรือเพาเวอร์มอสเฟต เป็นต้น
Reference
- https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
- https://www.arduino.cc/reference/en/language/functions/external-interrupts/digitalpintointerrupt/
- https://www.arduino.cc/reference/en/language/functions/interrupts/interrupts/
- https://circuitdigest.com/microcontroller-projects/arduino-interrupt-tutorial-with-examples
- https://www.tutorialspoint.com/arduino/arduino_interrupts.htm
- https://www.circuito.io/blog/arduino-uno-pinout/