아두이노 코딩-92: 아두이노 코딩에 의한 RC 저주파 필터 회로 실험

in #kr6 years ago (edited)

noname01.png

아두이노에서 센서 데이터를 전압 형태로 입력하는 경우 노이즈가 포함된 신호가 입력될 수 있다. 노이즈란 센서에 아무런 변동이 없음에도 불구하고 자체 회로나 주위 환경에서 나타날 수 있다. 따라서 전자회로를 다룸에 있어서 이런 노이즈 출현이 예상된다면 당연히 제거할 필요가 있다. 드론에 흔히 사용되는 MPU6050 자이로 센서가 대표적으로 저주파 필터링이 반드시 필요한 센서이다.

noname02.png

특히 미세먼지 센서 측정기 배선에서 사용하는 150Ω 저항과 220uF 극성 콘덴서의 조합이 저주파 필터 회로의 대표적인 사례이다.

이 저주파 필터 회로를 아두이노에서 실험하기 위해서는 저항과 극성 콘덴서가 각각 1개씩 필요하다. 지금 연구실에 재고가 있어 눈에 띄는 100Ω 저항과 220uF 극성 콘덴서를 사용하였다. 저항은 LED 회로 구성에 자주 쓰는 220Ω을 사용해도 무방하다. 직렬로 연결된 저항과 콘덴서의 양단에 각각 3번 디지털 핀과 GND 핀을 연결한다. 아울러 콘덴서와 저항의 연결점을 아날로그 핀 A0에 연결한다.

아두이노 편집기에서 주 파형에 해당하는 1Hz 저주파와 노이즈 생성을 위해서 45Hz를 실수형으로 정의한다. 노이즈가 섞인 파형을 시리얼 플로터를 사용하여 시각적으로 확인할 수 있는 한계가 45Hz 이며 50Hz를 사용할 경우 확인이 되지 않는다.

noname03.png

아울러 어레이를 200개씩 정의 한다. sensorV에는 아두이노 코드에 의해 생성되며 그 범위가 0.0∼2.0V에 해당하는 인위적인 파형 신호를 저장한다. X는 아날로그 핀 A0에서 읽어들인 전압 값을 스케일링하여 저장한다.

setup()에서 아날로그 핀A0에서 측정하게 되는 전압 시작 값을 1.0V 로 설정한다.

noname04.png

1Hz 와 45Hz를 합성한 신호를 생성하여 sensorV 어레이에 저장하고 아울러 시리얼 플로터에 출력한다. 동시에 이 값들을 0∼255 사이의 값으로 표준화하여 물결 표시가 있는 즉 PWM 출력이 가능한 3번 핀에서 analogWrite() 명령을 실행하여 저주파 필터 회로에 0∼5V 사이의 입력 신호를 제공하도록 한다.

노이즈를 제거한 필터링된 신호는 저항과 콘덴서의 연결점에서 아날로그 핀 A0를 통해 읽어들이도록 한다. 아날로그 핀에서 읽어 들이는 0∼5V 사이의 전압 값은 정수 형태로 0∼1023 범위를 가지게 되므로 1023을 5V 로 하여 원래의 전압을 환산 후 어레이 X에 저장해 둔다.

시리얼 플로터에 sensorV 값을 출력하면서 여유있게 analogWrite() 명령 실행과 어레이 X 에 읽어들인 값을 저장이 가능하다. 이어서 어레이 X를 시리얼 플로터로 출력하면 노이즈가 제거된 매끈한 파형을 시각적으로 볼 수 있다.

noname05.png

특이할 점은 2초간의 파형이 끝나는 지점에서 아날로그 핀으로 읽어들인 어레이 X를 출력할때에 약간의 지연 현상이 있음을 알 수 있다. 이 부분은 신호파형 생성과 어레이 X 로 읽어들이는 시간 차이가 대단히 적은 반면에 3번핀에 전압 신호를 제공할 수 있도록 아두이노 코드가 실행되는데 걸리는 시간으로 볼 수 있다.

필터하면 큰 먼지를 걸러내는 엔진의 공기필터나 오일필터를 연상하는데 파형에서도 고주파 노이즈 성분이 감쪽같이 제거되었다. 참고로 이와 같은 저주파 필터링은 굳이 회로를 쓰지 않고 소프트웨어적으로도 동일한 결과를 얻을 수 있으며 필자의 외부 블로그인 아래 사이트 주소를 참조하기 바란다. 소프트웨어적인 저주파 필터링 기법은 실제 드론 비행제어 코드에서 사용되며 회로 사용 시에 나타나는 시간 지연 효과가 없는 장점이 있다.
http://blog.daum.net/ejleep1/477

아두이노 회로를 실제 제작하지 않는 분들은 동영상을 통해서 필터링 효과를 관찰해 보자.

//Low_pass_filter_circuit_01

float pi =3.1415629543;
float freqLow = 1.0;//Hz
float freqHigh = 40.0;//Hz
float sensorV[200];
float X[200];

void setup() {
Serial.begin(9600);
X[0] = 1.0;
for ( int i=1; i<201; i++ ) {
sensorV[i] = 1.0+0.8sin(2.0pifreqLowi/100.0)+0.2sin(2.0pifreqHighi/100.0);
Serial.println(sensorV[i]);
int volt = 255sensorV[i]/2.0;
analogWrite(3, volt);
X[i] = 2.0
analogRead(A0)/1023;
}
for ( int i=201; i<401; i++ ) {
Serial.println(X[i-200]);
}
}

void loop() {
}//끝

Sort:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
[제 0회 짱짱맨배 42일장]2주차 보상글추천, 1주차 보상지급을 발표합니다.(계속 리스팅 할 예정)
https://steemit.com/kr/@virus707/0-42-2-1
현재 1주차보상글이 8개로 완료, 2주차는 1개 리스팅되어있습니다!^^

2주차에 도전하세요

그리고 즐거운 스티밋하세요!

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

파도치는 게 멋지군요. ㅎㅎㅎㅎ

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.034
BTC 63688.35
ETH 3125.30
USDT 1.00
SBD 3.97