Digital Filter Code Library for Arduino UNO

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

Digital Filter Code Library for Arduino UNO

สำหรับไลบารี่ที่ทดลองนำมาใช้งาน จะมีตัวอย่างให้ทดลอง 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() ตามลำดับ

Digital Filter Code Library for Arduino UNO
รูปที่ 1 การทดลองกำหนดให้ค่า singleEMAFilter = 0.2 ในการกรองความถี่
Digital Filter Code Library for Arduino UNO
รูปที่ 2 การทดลองกำหนดให้ค่า singleEMAFilter = 0.4 ในการกรองความถี่
Digital Filter Code Library for Arduino UNO
รูปที่ 3 การทดลองกำหนดให้ค่า singleEMAFilter = 0.6 ในการกรองความถี่

ในรูปที่ 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 ตามความเหมาะสมของการนำไปใช้งาน

Digital Filter Code Library for Arduino UNO

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

Reference

  1. https://docs.arduino.cc/libraries/singleemafilterlib/
  2. https://github.com/luisllamasbinaburo/Arduino-SingleEmaFilter
  3. https://github.com/luisllamasbinaburo/Arduino-SingleEmaFilter/blob/master/examples/SingleEMAFilterInt/SingleEMAFilterInt.ino
  4. https://gemini.google.com/