Digital Filter Code Library for Arduino UNO

สำหรับบทความนี้เป็นการกรองความถี่แบบดิจิตอลด้วยบอร์ดประมวลผล Arduino UNO เช่นเดิม แต่จะเป็นการใช้ไลบารี่เกี่ยวกับการกรองความถี่ (Digital Filter) ที่มีแขร์สำหรับให้ใช้งาน ซึ่งหลายเว็บไซต์ที่เราสามารถทดลองนำมาใช้งาน ทั้งนี้ในโครงงานที่ Arduino ควบคุมการทำงานต่างๆ ไม่มากนัก การนำไลบารี่มาใช้งานจะช่วยลดเวลาในการพัฒนาโครงงานต่างๆ ได้มากขึ้น โดยในบทความนี้ขอแนะนำไลบารี่จากลิ้งก์อ้างอิงท้ายบทความ

สำหรับไลบารี่ที่ทดลองนำมาใช้งาน จะมีตัวอย่างให้ทดลอง 2 แบบคือ แบบประมวลผลด้วยตัวเลขจำนวนเต็ม (integer) และแบบตัวแปรเลขที่มีจุดทศนิยม (float) โดยในบทความนี้จะเป็นการใช้ตัวอย่างแบบตัวเลขจำนวนเต็มเพื่อให้เข้าใจได้ง่าย โดยตัวอย่างโปรแกรมแสดงข้างล่าง
Download Digital Filter Code Library Click !!!
/* Credit Arduino Library By : https://github.com/luisllamasbinaburo/Arduino-SingleEmaFilter */ #include "SingleEMAFilterLib.h" SingleEMAFilter<int> singleEMAFilter(0.2); // 0.2, 0.4, 0.6 void setup() { Serial.begin(9600); } void loop() { // int rawMeasure = getMeasure(); int rawMeasure = random(1,1023); int fdelay = random(1,300); delay(fdelay); //----------- Calc EMA Filter ------------- singleEMAFilter.AddValue(rawMeasure); Serial.print("Raw: "); Serial.print(rawMeasure); Serial.print("\tLowpass: "); Serial.print(singleEMAFilter.GetLowPass()); Serial.print("\tHighpass: "); Serial.println(singleEMAFilter.GetHighPass()); }
สำหรับโปรแกรมกรองความถี่ตำ่และสูงผ่านที่แสดงข้างบน จะแบ่งออกเป็น 4 กลุ่มคือ
กลุ่มแรก จะเป็นการประกาศค่าตัวแปรต่างๆ สำหรับใช้การคำนวณ,ไลบารี่ (SingleEMAFilterLib.h) ในช่วงต้นๆ ของโปรแกรม โดยจะรวมทั้งการกำหนดอัตราการสื่อสารพอร์ตอนุกรม Serial.begin(9600);
กลุ่มที่สอง จะเป็นคำสั่งสร้างสัญญาณอะนาลอกด้วยการสุ่มขึ้นมาจากการใช้คำสั่ง int rawValue = random(1,1023); ซึ่งในส่วนนี้จะกำหนดขนาดแอมปริจูดและที่คำสั่ง int fdelay = random(1,300); และ delay(fdelay); จะทำหน้าที่กำหนดความถี่ที่แตกต่างกัน ทั้งนี้เพื่อนำค่าที่สุ่มขึ้นมาได้ใช้ในการทดสอบการทำงานของโปรแกรมกรองความถี่
กลุ่มที่สาม จะเป็นโปรแกรมคำสั่งเพื่อส่งค่าไปยังฟังก์ชั่น singleEMAFilter.AddValue(rawMeasure); สำหรับใช้ในการประมวลผล
กลุ่มที่สี่ จะเป็นคำสั่งสำหรับแสดงผลการทำงานของโปรแกรมที่ โดยจะสามารถดูผลที่เกิดขึ้นที่เมนู Serial Plotter ซึ่งจะแสดงในส่วนของสัญญาณอินพุต (rawMeasure), สัญญาณความถี่ต่ำผ่าน singleEMAFilter.GetLowPass()และสัญญาณความถี่สูงผ่าน singleEMAFilter.GetHighPass() ตามลำดับ



ในรูปที่ 1 ถึงรูปที่ 3 แสดงผลการทดลองโปรแกรม Digital Filter โดยทำการเปลี่ยนค่าตัวแปร singleEMAFilter ให้เป็น 0.2, 0.4 และ 0.6 ตามลำดับ เพื่อสังเกตผลการทดลองที่ได้ ในรูปที่ 1 ถึงรูปที่ 3 จะเห็นรูปสัญญาณอินพุตเดิม (rawMeasure) จะเป็นสีแดง, สัญญาณกรองความถี่สูงผ่าน (singleEMAFilter.GetHighPass) จะเป็นสีดำ และสัญญาณสัญญาณกรองความถี่ต่ำผ่าน (singleEMAFilter.GetLowPass) จะเป็นเหลือง โดยจะสังเกตเห็นว่าที่ค่า singleEMAFilter เท่ากับ 0.2 สัญญาณเอาต์พุตความถี่สูงสามารถผ่านได้มาก แต่สัญญาณเอาต์พุตความถี่ต่ำสามารถผ่านได้น้อย ในทางกลับกันเมื่อกำหนดให้ singleEMAFilter มีค่าเท่ากับ 0.4 และ 0.6 จะทำให้การตอบสนองสัญญาณเอาต์พุตความถี่สูงสามารถผ่านได้น้อยลงและสัญญาณเอาต์พุตความถี่ต่ำสามารถผ่านได้มากขึ้นตามลำดับ ทั้งนี้เราสามารถปรับค่า singleEMAFilter ตามความเหมาะสมของการนำไปใช้งาน

สำหรับบทความนี้เป็นการแนะนำโปรแกรมไลบารี่เกี่ยวกับการกรองความถี่แบบดิจิตอลสำหรับบอร์ด Arduino และตัวอย่างโปรแกรมการนำไปใช้งาน รวมทั้งการทดลองเบื้องต้นให้เห็นผลการทดลองที่ได้จากคำสั่งต่างๆ และเป็นแนวทางให้ผู้อ่านสามารถนำไปแก้ไขเพิ่มเติมตามความเหมาะสม
Reference