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/