Basic for External Interrupt Pins with Arduino UNO

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

รูปที่ 1 แสดงตำแหน่งขาอินเตอร์รัพท์ของบอร์ด Arduino ต่างๆ ที่นิยมใช้งาน [Picture by Ref.1]
รูปที่ 2 ตำแหน่งขาอินเตอร์รัพท์บอร์ด Arduino UNO (ในวงกลมสีแดง INT0,INT1) [Picture by Ref.6]

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

รูปที่ 3 การเขียนคำสั่งแบบ แนะนำและไม่แนะนำ เพื่อให้ใช้งานอินเตอร์รัพท์ขาอินพุต D2 หรือ D3 ได้ถูกต้อง [Picture by Ref.1]

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

รูปที่ 4 การกำหนดค่าตัวแปรให้กับคำสั่งอินเตอร์รัพท์ [Picture by Ref.1]

รูปที่ 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);   
}
Basic for External Interrupt Pins with Arduino UNO
รูปที่ 5 แสดงผลการทดลองที่ 1 เมื่อใช้โหมดรับสัญญาณแบบ CHANGE

การทดลองที่ 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);   
}
Basic for External Interrupt Pins with Arduino UNO
รูปที่ 6 แสดงผลการทดลองที่ 2 เมื่อใช้โหมดรับสัญญาณแบบ LOW

การทดลองที่ 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 นั้นเอง

Basic for External Interrupt Pins with Arduino UNO
รูปที่ 7 วงจรการต่อสัญญาณอินพุตอินเตอร์รัพท์ในการทดลอง
Basic for External Interrupt Pins with Arduino UNO
รูปที่ 8 ลักษณะการทดลองอินเตอร์รัพท์ขาอินพุต D2 ให้กับบอร์ด Arduino UNO

สำหรับการใช้งานฟังก์ชั่นอินเตอร์รัพท์ที่ตำแหน่งขา D2 หรือ D3 ของบอร์ด Arduino UNO นั้น สามารถนำไปประยุกต์ใช้งานได้หลายรูปแบบ โดยเฉพาะในวงจรดีซี ทู ดีซี คอนเวอร์เตอร์หรือวงจรสวิตชิ่งโหมดเพาเวอร์ซัพพลายในส่วนของการตรวจจับแรงดันเกิน (Over Voltage Protection) และการตรวจจับกระแสเกิน (Over Current Protection) ไม่ให้อุปกรณ์ขับกำลังสวิตชิ่งเสียหาย เช่น เพาเวอร์ทรานซิสเตอร์หรือเพาเวอร์มอสเฟต เป็นต้น

Reference

  1. https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
  2. https://www.arduino.cc/reference/en/language/functions/external-interrupts/digitalpintointerrupt/
  3. https://www.arduino.cc/reference/en/language/functions/interrupts/interrupts/
  4. https://circuitdigest.com/microcontroller-projects/arduino-interrupt-tutorial-with-examples
  5. https://www.tutorialspoint.com/arduino/arduino_interrupts.htm
  6. https://www.circuito.io/blog/arduino-uno-pinout/