본문 바로가기
일상 이야기/외주 이야기

아두이노 서보모터로 인한 미세먼지센서 오작동에 대하여...

by DIYver 2022. 4. 22.

본 글은 일기같은 저의 경험과 주관적인 생각이 담긴 글입니다.

진행중에 생긴 문제점을 기록하고, 그에대한 고찰을 하기 위한 글입니다.

비공개로 하지 않고 공개로 공개하는 이유는

혹시 비슷한 문제로 고민하시는 분들의 경우 도움되실 부분이 있으실것이고,

해결하신 분들은 또 댓글로 방법을 남겨주셨으면 하는 마음에서 공개글로 작성합니다.


예전에 아두이노 코드 개발 의뢰를 해주셨던 의뢰자분께서 다시 의뢰를 맡기셨다.

내용은 미세먼지센서와 음성인식센서, 서보모터와 스텝모터, CDS센서를 사용하는 코드인데,

각각으로는 다 테스트 되었지만, 합치는 것을 못하겠다고 하셔서 의뢰를 맡기셨다.

 

내용을 보면 너무 단순한 코드들이었고, 쉽게 합쳐서 마무리를 하려고 했다.

그런데 여러가지 문제가 있었다.

코드가 내가 작성하는 코드 스타일과 다른 스타일의 코드여서 이해하는데 어려웠고...

실제로 합친 후에 문제가 발생한 부분이 있었다.

 

여기서는 코드를 합친 후에 생긴 문제에 대해서 설명해보려한다.

 

문제가 생긴 부분은 이렇다.

미세먼지 센서는 아두이노 메가의 A0에 연결되어 있고,

CDS센서는 A1 에 연결되어있으며, 서보모터는 D2에 연결된 상태에서

서보모터가 조도센서 값이 기준값 이상과 이하일때 움직이는데, 이 때마다 미세먼지 센서의 값이 튄다는 것이다.

 

주황색 선은 조도센서 값, 녹색선은 미세먼지 값을 나타낸다.

의뢰자분께 친절히 시리얼플로터로 볼 수 있는 코드를 제공해드리고, 스크린샷찍어서 보내달라고 했다.

그 결과 위처럼 서보모터가 움직일 때마다 저렇게 미세먼지 값이 요동치는 것이었다.

미세먼지 센서에만 먼지를 일으켰을때 나오는 센서값이다.

센서에는 문제가 없었다.

 

 

어떻게 서보모터가 움직이는 것이 A0에 영향을 줄 수 있지? 에 대해서 생각을 많이 해봤지만...

확실한 답이 떠오르지는 않았다.

다만 심증이 너무 차고 넘쳤다.

의뢰자분께서 실제로 테스트 하고 있는 환경의 사진이라고 보내준 사진이다.

USB-B 포트만 꽂혀서 작동되는 것임을 알 수 있었다.

그렇다면 이것은 200ma ~ 500ma 까지밖에 전류 공급을 못하는 컴퓨터 USB 전원에 물려서 사용중인것인가?

라는 생각이 들었고, 의뢰자분께 여쭤보니 그렇다고 하셨다...

 

여기서 문제가 서보모터 하나가 거의 200ma 를 필요로하고, 거기에 스텝모터도 전류를 꽤 많이 필요로 하는데

컴퓨터 단독전원으로 전원을 공급하는 것은 이 전체 시스템을 돌리는데에 있어서 문제가 있을 수 밖에 없다는 생각이 들었다.

 

그래서 의뢰자분께 우선은 외부전원을 추가로 공급을 해주면 해결이 될 것이라고 말씀드렸지만,

그건 어떻게 하는 것이냐고 하시던 의뢰자님...

 

그래서 결국 소프트웨어 방법으로 해결을 보기로 했다.

 

내가 제시한 해결책은 

1. 서보모터 전원을 아두이노 코드로 on off 제어를 해보자

2. 미세먼지센서의 센서 감지값에서 말이 안되는 값은 예외처리 하자

3. 서보모터 움직임을 천천히 움직이게 하자

였다.

 

 

 

1. 서보모터 전원을 아두이노 코드로 on off 제어를 해보자

서보모터 전원 제어는 필자의 블로그에 소개한 적이 있으니, 관련자료는 한번 읽어보시길 추천한다.

https://diyver.tistory.com/114

 

아두이노 내부전원으로 서보모터(SG-90) 여러개 사용하는 방법

<목표> - 아두이노 내부 전원은 매우 약하다. 각종 센서나 LED 사용에는 큰 문제가 없지만, 모터류를 사용할 때에는 문제가 항상 따른다. 전류가 부족한 문제로, 모터쪽으로 과전류가 흐르게 되면

diyver.tistory.com

 

위와 같은 코드의 사용을 통해 서보모터의 전원을 on off 할 수 있다.

이렇게 하면 전류를 아낄 수 있다.

 

 

2. 미세먼지센서의 센서 감지값에서 말이 안되는 값은 예외처리 하자

문제가 생겼던, 서보모터가 움직일때 미세먼지 센서의 변화에서 센서값이 음수가 되는 경우가 있었다.

센서값이 음수가 될 수 있나... 싶었다.

그래서 음수값이 들어온 경우 정상적인 센서값이 아님으로 처리했다.

 

 

3. 서보모터 움직임을 천천히 움직이게 하자

기존 코드는 서보모터를 너무 급작스럽게 움직이는 코드였다.

servo.write(180);

delay(300);

servo.write(0);

이런식으로 사용했다고 보면 된다.

현재 각도와 목표각도가 너무 차이가 많이 나는 상황에서

순식간에 모터를 제어하려는 명령을 보내면 전류가 너무 많이 소요되는 문제가 있다.

그리고 2번 문제에서 봤던 그래프를 보면

어찌보면 전류 계통에서 문제가 생긴것이 확실해 보인다.

모터가 급작스럽게 움직이는 구간에서만 미세먼지센서값이 요동치고 각도가 일정하게 유지되는 상황에서는 또 미세먼지 센서값이 정상적으로 읽히는 것으로 보면 그렇다.

모터가 움직이면서 전류가 부족하고 그러다보니 전압강하도 일어나고, 전압강하가 일어나다보니 센서값 읽어들임에 있어서 음수의 값이 읽힌것이 아닐까 하는 생각이 들었다.

아무튼 그래서 부드럽게 움직일 수 있는 코드를 적용하였다.

이렇게 하면 각도 변하는 것이 확실히 천천히 느려짐이 느껴질 것이다.

그리고 목표각도에 도달하면 전원을 꺼버려서 전류관리까지 하는 코드를 적용하였다.

 

 

이렇게 하였더니 일단 의뢰자분의 상황에서는 문제가 해결되었다.

하지만 완벽한 해결은 아니었던 것이 

서보모터를 강제로 움직이게 하는 상황에서 미세먼지 수치가 계속 이상하게 잡힌다는 것이었다.

이 문제는 내가 직접 외부전원을 충분히 주는 상태에서 테스트를 해봐야 알 듯 하다.

 

 

이 부분에 대하여 직접 경험하신 분이 있으시다면 그냥 지나치지 마시고 꼭 댓글로 남겨주셨으면 좋겠습니다~

 

 

 

아무튼 의뢰자분께서 만족하신다 하셨던 의뢰건이었습니다.

메세지 시각을 보시면 아시겠지만 오후 10시까지도 빠른 일처리를 위해서 작업해드립니다 :)

 

 

아두이노에 대해 궁금하신 점이 있으시거나

의뢰를 맡길게 있으시다면 편하게 연락주세요.

 

댓글