Simple MsTimer2.h Arduino Library with Ardino UNO

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

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

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

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

รูปที่ 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 มิลลิวินาที

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