Simple MsTimer2.h Arduino Library with Ardino UNO

บทความนี้เป็นการทดลองใช้งานไลบารี่ (Arduino Library) สำหรับ Arduino เกี่ยวกับไทเมอร์ FlexiTimer2.h หรือ MsTimer2.h ซึ่งเป็นไลบารีหนึ่งที่มีประโยชน์มากในการประมวลผลของตัวไมโครคอรโทรลเลอร์ ซึ่งจะต้องทำคำสั่งโปรแกรมจำนวนมากด้วยความเร็วทั่วไปและความสูงในเวลาเดียวกัน โดยไลบารีที่นำเสนอนี้ช่วยให้เราสามารถแบ่งโปรแกรมคำสั่งที่ต้องการออกมาเป็นส่วนได้ ซึ่งจะช่วยให้การทำงานของโปรแกรมสำหรับไมโครคอรโทรลเลอร์มีประสิทธิภาพมากยิ่งขึ้น

Simple MsTimer2.h Arduino Library with Ardino UNO
รูปที่ 1 โฟลว์ชาร์ตแสดงการเขียนโปรแกรม Arduino ทั่วไป

ในรูปที่ 1 โฟลว์ชาร์ตการเขียนโปรแกรม Arduino ทั่วไป ซึ่งส่วนใหญ่จะประกอบไปด้วย void setup() และ void loop() ซึ่งคำสั่ง void setup() จะทำคำสั่งครั้งเดียวในช่วงเริ่มต้นการทำงานของโปรแกรม และในส่วนของ void loop() นั้น จะใช้ในการทำคำสั่งโปรแกรมที่เป็นลำดับขั้นตอนที่ผู้เขียนโปรแกรมกำหนด

Simple MsTimer2.h Arduino Library with Ardino UNO
รูปที่ 2 แสดงตัวอย่างการเขียนโปรแกรม Arduino ทั่วไป

ในรูปที่ 2 เป็นตัวอย่างของการเขียนโปรแกรม Arduino ในกรอบสีส้มจะเป็นตำแหน่งคำสั่ง void setup() จะทำคำสั่งครั้งเดียวในช่วงเริ่มต้น ถัดลงมา void loop() ในกรอบสีเขียวจะเป็นคำสั่งโปรแกรมทำงานเป็นลำดับ ซึ่งเขียนโปรแกรมด้วยภาษา C++

Simple MsTimer2.h Arduino Library with Ardino UNO
รูปที่ 3 แสดงโฟลว์ชาร์ตการเขียนโปรแกรม Arduino แบบใช้อินเตอร์รัพท์

รูปที่ 3 จะเป็นโฟลว์ชาร์ตการเขียนโปรแกรม Arduino แบบใช้อินเตอร์รัพท์ ในรูปจะเห็นว่าในส่วนของการแสดงผล (Display on Serial) มายังหน้าต่าง Serial monitor บนจอคอมพิวเตอร์นั้น จะใช้ในส่วนโปรแกรมย่อยอินเตอร์รัพท์ ทั้งนี้เพื่อให้ในส่วนของโปรแกรม void loop() ทำงานที่สำคัญมากกว่าและให้การแสดงผลมายังหน้าต่าง Serial monitor เป็นช่วงเวลาตามที่กำหนด

Simple MsTimer2.h Arduino Library with Ardino UNO
รูปที่ 4 แสดงตัวอย่างการเขียนโปรแกรม Arduino แบบใช้อินเตอร์รัพท์

รูปที่ 4 ตัวอย่างของการเขียนโปรแกรม Arduino คล้ายกับรูปที่ 2 ในส่วนของกรอบสีส้ม void setup() และ void loop() ในกรอบสีเขียว แต่จะมีลูปคำสั่งเพิ่มขึ้นในกรอบสีน้ำเงินจะเป็นคำสั่งโปรแกรมจากการเกิดอินเตอร์รัพท์ขึ้น void flash() โดยจะเกิดอินเตอร์รัพท์ขึ้นทุกๆ 200 มิลลิวินาที แต่ในช่วงเวลาปกติโปรแกรมจะแสดงข้อความ ” Test FlexiTimer2.h = ” ตามด้วยตัวเลขนับทุกๆ 2 วินาที

Arduino Library for FlexiTimer2-master

/*
  FlexiTimer2:
  Arduino library to use timer 2 with a configurable resolution.
  Based on MsTimer2 by Javier Valencia. It is called FlexiTimer2 because it
  is based on MsTimer2, but offers more flexibility,
  since it has a configurable timer resolution.
  MsTimer2 library: http://www.arduino.cc/playground/Main/MsTimer2

 For more details on FlexiTimer2 see: 
 http://www.arduino.cc/playground/Main/FlexiTimer2
 https://github.com/wimleers/flexitimer2

*/

#include <FlexiTimer2.h>

int count = 0;

void flash()
{
  static boolean output = HIGH;
  
  digitalWrite(13, output);
  output = !output;
  Serial.println(" Active ISR  ");
}

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
 // FlexiTimer2::set(500, 1.0/1000, flash); // call every 500 1ms "ticks"
 
  FlexiTimer2::set(2000, flash); // MsTimer2 style is also supported
  FlexiTimer2::start();
}

void loop()
{
  Serial.print(" Test FlexiTimer2.h = ");
  count = count+1;
  Serial.println(count);
  delay(200); 
}

สำหรับโปรแกรมที่แสดงข้างบนนี้จากตัวอย่างไลบารี FlexiTimer2.h [Ref. https://www.pjrc.com/teensy/td_libs_MsTimer2.html] และปรับปรุงเล็กน้อยเพื่อให้เข้าใจการทำงานได้ง่ายขึ้น โดยส่วนแรกจะเป็น void flash() สำหรับโปรแกรมย่อยของการเกิดขึ้นทุกๆ 2 วินาที ในส่วนที่สอง void setup() จะเป็นการกำหนดขาแสดงผลแอลอีดี pinMode(13, OUTPUT) การกำหนดอัตราส่งข้อมูลแสดงผลมายังจอคอมพิวเตอร์ Serial.begin(9600); และกำหนดการให้เกิดอินเตอร์รัพท์ที่คำส่ง FlexiTimer2::set(2000, flash); และ FlexiTimer2::start(); สุดท้ายในส่วนที่สาม void loop() จะเป็นคำสั่งแสดงข้อความ Serial.print(” Test FlexiTimer2.h = “); พร้อมนับจำนวนที่ละ 1 ค่าด้วยคำสั่ง count = count+1; และแสดงค่านับจำนวน Serial.println(count); ซึ่งในส่วนที่สามนี้จะกระทำทุกๆ 200 มิลลิวินาที

Simple MsTimer2.h Arduino Library with Ardino UNO
รูปที่ 5 แสดงผลการทดลองให้โปรแกรมทำงานตามตัวอย่าง

ในรูปที่ 5 แสดงผลที่ได้จากการทดลองโปรแกรม จะเห็นว่าในกรอบสีเขียวใหญ่จะเป็นการทำงานของ void loop() โดยจะแสดงข้อความ Test FlexiTimer2.h = ตามด้วยตัวเลขจำนวนนับ 10 ครั้ง จากนั้นจะแสดงข้อความ Active ISR ในกรอบสีแดง ซึ่งมีค่าเท่ากับ Test FlexiTimer2.h ทุกๆ 200 มิลลิวินาทีคูณ 10 ครั้งจะเท่ากับการแสดงข้อความ Active ISR คือ 2 วินาทีนั้นเอง และการทดลองการใช้งานไลบารี FlexiTimer2.h ครั้งนี้มีประโยชน์มาก สำหรับการนำไปใช้ในการออกแบบวงจรสวิตชิ่งโหมดต่างๆ อย่างเช่น สวิตชิ่งเพาเวอร์ซัพพลายและวงจรดีซี ทู ดีซี คอนเวอร์เตอร์ ซึ่งคิดว่าบทความที่นำเสนอนี้คงจะเป็นไอเดียให้กับผู้อ่านสามารถนำไปประยุกต์ใช้งานต่อไปครับ.

Reference

  1. https://forum.arduino.cc/t/mstimer2/493721
  2. https://www.arduino.cc/reference/en/libraries/mstimer2/
  3. https://www.ardu-badge.com/MsTimer2
  4. https://mypractic.com/lesson-10-timer-interrupt-in-arduino-library-mstimer2-parallel-processes/
  5. https://www.pjrc.com/teensy/td_libs_MsTimer2.html