การลดสัญญาณรบกวนที่เข้ามาในบอร์ด arduino
โดยปกติแล้วถ้าเราสังเกตุดีๆจะพบว่ามีการสัญญาณที่ไม่พึงประสงค์เข้ามาโดยที่เราไม่ได้ทำอะไรเลย ซึ่งสัญญาณรบกวนเหล่านี้จะไปทำให้ค่าที่เราได้ไม่แม่นยำ แล้วเราจะทำอย่างไรได้บ้าง?
วิธีแก้ไขมีหลายวิธีแต่ในบทความนี้เราขอแนะนำการใช้สมการทางคณิตศาสตร์ในการแก้ปัญหาดังกล่าว โดยที่การแก้ปัญหาสัญญาณรบกวนนั้นถูกเรียกว่า Low pass filter หรือที่เรียกว่ากรองความถี่ต่ำผ่านนั่นเอง ซึ่งรายละเอียดปีกย่อยเราจะไม่พูดถึง สมการที่ใช้จะเป็นดังนี้ y(n)=(1-a)*x(n)+a*y(n-1) โดยที่ y(n) คือ สัญญาณที่ทำการฟิลเตอร์แล้วของลูปล่าสุด y(n-1) คือสัญญาณที่ถูกฟิลเตอร์แล้วแต่ว่าเป็นของลูปที่แล้ว ส่วน x(n) คือสัญญาณที่วัดได้ของลูปล่าสุด และ a คือค่าคงที่ของฟิลเตอร์ (มีค่าระหว่าง 0 ถึง 1) ถ้าใครไม่ทราบว่าจะให้ a มีค่าเท่าไร อาจจะเริ่มจา a=0.95 ก่อนก็ได้ ซึ่งจากการทดสอบค่า a = 0.95 จะเป็นค่าที่กลางๆครับ
ข้างล่างที่คือ code ที่ใช้สำหรับการกรองสัญญาณรบกวน (Low pass filter) สามารถนำไปใช้ได้ทันที
float newVal = 0.0;
float sensorVal = 0.0;
float filterConstant = 0.95; // filter constant
// the setup routine runs once when you press reset:
void setup() {
Serial.begin(9600);
}
void loop() {
// แสดงผล column ที่ 1 คือ ค่าสัญญาณที่มี nosie column ที่ 2 คือ ค่าที่ถูก filter แล้ว
Serial.println("\t");
Serial.print(sensorVal);
Serial.print("\t");
Serial.print(newVal);
Serial.print("\t");
Serial.print("");
// สร้างสัญญาณที่รับมาจาก sensor
sensorVal = analogRead(A4);
// เรียกใช้ฟังชัน lowpass filter
newVal = smooth(sensorVal, filterConstant, newVal);
delay(100);
}
// ฟังชั่น smooth หรือ lowpass filter
float smooth(float data, float filterVal, float smoothedVal){
smoothedVal = (data * (1 - filterVal)) + (smoothedVal * filterVal);
return smoothedVal;
}
ขอบคุณที่มาดีๆจาก arduitronics.com
www.arduino2robot.com
FB: arduino2robot.com