2019/04/21 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #1 - Atom + PlatformIO

2019/04/23 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #2 - Eclipse

2019/04/28 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #3 - Visual Studio

2019/05/06 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #4 - Xcode + embedXcode





아두이노 공식 개발툴을 대체할 수 있는 5가지 방법 중 마지막으로 embedXcode를 소개한다.

사실 마지막 5번째로 CLI(Command Line Interface: 명령 줄 실행 환경)이 있으나 고수들이 아니면 사용이

쉽지 않은 관계로 이번 정리에서는 제외를 하였다.


지난 번 이클립스 관련 포스팅에서 이클립스가 사용하기 무겁다고 하였지만 사실 Xcode에 비하면 이클립스는

양반이라고 할 수 있다. 만일 PC(Mac) 환경이 메모리 8Gb에 HDD를 사용 중이라면 개발은 포기하는 것이

좋을 것이다. 적어도 메모리 16Gb에 디스크는 퓨전 드라이브 정도는 써야 쓸만할 것이다.

어쨌든 Mac을 사용한다면 선택 가능한 툴이니 소개를 해본다.

Xcode + embedXcode

Xcode는 Mac의 App Store를 통해 다운로드 받을 수 있다. 그리고 embedXcode는 다음의 주소에서
다운로드 받으면 된다.

embedXcode 다운로드


embedXcode의 경우에도 세가지 버전이 있는데 +에디션 버전과 일반 버전이 있다. 일반 버전은 무료이고
+에디션 버전은 유료이며 +에디션의 경우 다시 2가지로 나뉘어 개인용은 29유로, 상용 라이센스는 99유로이다.



우선은 당연히 무료 버전으로 받아 설치를 하면 된다. 다운로드 받을 때 Xcode 10 버전용과 9 이하 버전용이

별도로 링크되어 있으므로 자신의 Xcode 버전에 맞는 embedXdoce를 다운로드 받으면 된다. 


설치가 모두 끝났으면 프로젝트를 만들어보자. Xcode를 실행 후 Create a new Xcode project를 선택하여
새 프로젝트를 만든다.





템플릿 선택 창이 뜨면 상단의 플랫폼 선택 메뉴에서 macOS를 선택한 후 화면 가장 하단에 있는 embedXcode를
선택한다.






프로젝트 정보 입력 창에서 가장 위에 있는 프로젝트 이름과 가장 아래의 2개, 프로젝트 scope와 board를 적절하게
선택한다.






생성된 프로젝트 구조는 다음과 같다. 상당히 많은 파일과 디렉토리들이 보이는데 메인 소스는 '프로젝트명.ino’이다.
프로젝트가 처음 생성된 상태에서는 모든 텍스트가 그냥 흰색으로만 보이는데 이 것은 상단 메뉴에서 선택을 해주면된다. 
메뉴는 Editor > Syntax Coloring > C++을 선택해주면 된다.







생성된 파일 중 중요한 파일이 하나 있는데 바로 ‘Makefile’이다. 이 것은 embedXcode의 가장 불편한 점 중

하나이기도 한다. Serial Port나 Baud Rate같은 중요 사항을 바로 이 파일에 직접 타이핑하여 설정해야 한다.





이렇게 모든 설정이 끝나고 나서 빌드를 하면 된다. 빌드를 할 때에는 target을 잘 지정해주어야 하는데

target에 대한 상세한 내용은 아래 링크에서 확인할 수 있다.


Select a target


빌드 및 업로드 로그는 Xcode의 좌측에 있는 Navigator창의 상단 가장 오른쪽에 있는 Report Navigator에서
확인할 수 있다.




정리

이렇게 해서 아두이노 공식 개발 IDE를 대체할 수 있는 4가지 방법에 대한 정리가 끝이났다.개개인마다 취향이 다르겠기에 
무엇이 가장 낫다고 단언할 수는 없지만 대체로 아두이노 스케치 프로그램의크기가 작다는 점을 생각한다면 역시나 처음 소개한
Atom을 이용하는 것이 가장 부담 없고 편하지 않을까하는 것이 개인적인 생각이다.

아무쪼록 아두이노를 활용하시는 많은 메이커분들의 선택에 도움이 되었으면 한다.


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



2019/04/21 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #1 - Atom + PlatformIO

2019/04/23 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #2 - Eclipse

2019/04/28 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #3 - Visual Studio

2019/05/06 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #4 - Xcode + embedXcode





앞서 소개한 2가지 툴의 경우 대부분의 OS에서 제약 없이 사용 가능한 툴이었다. 하지만 남은 2가지 툴의 경우
사용 OS에 제약이 있는 툴이다. 이번 포스팅에 소개할 Visual Studio(이하 VS)의 경우 Mac용도 있지만
Mac용 VS에서는 C/C++ 개발이 지원되지 않는다. 따라서 일반적으로 C/C++ 기반으로 개발을 하게 되는
아두이노 개발 역시 Mac에서는 할 수가 없다. 따라서 VS로 아두이노를 개발하기 위해서는 반드시 Windows
환경이 필요하다(애초에 Add-On 설치 프로그램의 확장자가 vsix로 Windows환경에서만 실행된다). 


또한가지 특이한 점이라면 공식 Arduino IDE가 설치되어있어야 하고 VS 설정에서 이 경로를 지정해주어야
한다는 점이다.


Visual Studio + Arduino Add-On


Add-On은 VS 환경에 설치 가능한 플러그인이라 생각하면 된다. 당연히 먼저 VS가 설치 되어 있어야 한다.

VS의 community 버전은 무료 라이센스이기 때문에 이 community 버전을 다운로드 받아 설치하면 된다.


Visual Studio 다운로드


VS가 설치된 상태에서 Add-On을 다운로드 받는다.


Arduino IDE for Visual Studio


다만 VS Add-On의 경우 완전한 무료가 아니며 무료로 사용할 수 있는 조건은 학생이 비상업적 용도로 사용할 경우

하루에 한 번(with once per day nag이라고 되어있는데 정확한 의미를 모르겠음…-.-) 무료라고 되어있어

실질적으로는 유료 라이센스라고 보면 될 것 같다.

설치가 모두 끝났으면 새로운 프로젝트를 만들어보자.






새 프로젝트 만들기를 선택하여 진행하면 최초 VS 설치시 선택한 옵션 여부에 따라 매우 다양한 언어 및 플랫폼 관련

프로젝트 템플릿을 선택할 수 있다. 찾기가 쉽지 않을 수 있으니 검색 창에 Arduino를 입력하여 검색하면 아래와 같이
아두이노 관련 프로젝트 목록만을 볼 수 있다.






Arduino Project를 선택하고 진행하면 기본 정보 입력 화면이 나온다.




기본 사항 입력 후 만들기 버튼을 누르면 프로젝트가 생성되고 메인 IDE 환경으로 넘어간다.




주요 설정 버튼들은 상단 툴바에 모여 있다. 먼저 공식 Arduino IDE 경로를 설정해준다.





툴바의 가장 아랫줄 오른쪽 선택 상자에서 보드 종류를 선택해준다.




Add Library 선택박스를 클릭하면 필요한 라이브러리를 추가하거나 라이브러리 관리를 할 수 있다.




툴바의 가장 아랫줄 중앙쪽에 있는 두 개의 버튼은 각각 Build와 Build and Upload 버튼이다. 아래 이미지의 좌측이

Build, 우측이 Build and Upload




지금까지으 설정들을 포함하여 모든 아두이노 프로젝트 관련 기능들은 툴바의 가장 아랫줄 맨 앞에 있는 vMicro 버튼을

클릭하여 설정할 수 있다. Serial monitor는 메뉴 중 View Port Monitor를 선택하면 볼 수 있다.





VS를 실행한 후 처음 빌드를 시도하면 아래와 같이 라이센스 확인 창이 뜬다. 일단 그냥 Close하면 빌드 및 업로드는

진행이 된다.




여기까지 기본적인 설치와 설정 그리고 빌드와 업로드가 모두 끝난 것이다 그런데 빌드를 했더니 오류가 발생을

하는데 아직 원인을 찾지 못했다. 뭔가 null 참조와 관련된 오류인 것 같은데 아무래도 개발 환경이 익숙하지 않다보니

원인을 잘 모르겠다…ㅠ.ㅠ





정리


이렇게 대체 가능한 아두이노 개발 환경 3번째 도구로 VS를 알아보았다. 하지만 VS는 여러모로 제약이 많은 도구였다.
우선 Mac을 쓰고 있는 입장에서는 아두이노 Add-On 자체가 사용 불가능이고, Windows 환경에서 사용한다 하더라도
라이센스 문제라든지 또는 본문 말미에 발생한 오류 등의 문제로 사용하기에는 가장 껄끄러운 툴이었다(물론 윈도우 기반의
개발환경에 익숙한 개발자라면 얘기가 다를 수 있다).


이제 다음 포스팅에서는 마지막으로 Mac 기반의 개발 툴인 Xcode에 대해 살펴보고 전체 시리즈를 마무리 하도록 하겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



2019/04/21 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #1 - Atom + PlatformIO

2019/04/23 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #2 - Eclipse

2019/04/28 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #3 - Visual Studio

2019/05/06 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #4 - Xcode + embedXcode




지난 포스팅에 이어 공식 Arduino를 대체할 수 있는 개발 툴의 두 번째로 Eclipse의 플러그인을 소개한다.

Eclipse의 경우 극명한 장단점이 있는 IDE인데 장점은 거의 무궁무진한 확장성과 범용성이고 단점은 바로

(과장 조금 보태서)무궁무진하게 메모리를 잡아먹는다는 점… 상당히 무겁다...ㅠ.ㅠ

아무튼 이번 포스팅에서는 Eclipse 기반의 아두이노 개발 환경에 대해 알아보도록 하자.


Eclipse + Eclipse C++ IDE for Arduino 3.0


Eclipse의 경우 처음부터 지금까지 가장 유용한 장점을 꼽으라면 바로 플러그인을 통한 확장이라고 할 수

있을 것이다. Eclipse 기반의 아두이노 개발환경도 바로 이 플러그인을 이용하여 설치하게 된다. 몰론 그 
전에 당연히 Eclipse를 설치해야 한다.


Eclipse 다운로드


최근의 Eclipse는 installer 형식으로 배포되어 installer를 실행하면 용도에 맞는 Eclipse를 설치할 수 있다.

어차피 다른 용도의 Eclipse도 플러그인 설치로 다 사용 가능하므로 무난하게 Java 개발용으로 설치하면 된다.

Eclipse 설치가 끝났으면 Help > Eclipse Marketplace…로 이동하여 Arduino로 검색을 하자. 여러개의
목록이 나올텐데 'Eclipse C++ IDE for Arduino 3.0’을 선택하여 설치해주면 된다.





설치가 모두 끝나면 이클립스를 재시작하고, 재시작한 이클립스의 툴바에 보면 새로운 컨트롤들이 생겨난 것을 볼 수
있다.






이제 설치가 모두 끝났으니 프로젝트를 생성해보도록 하자. New Project에서 C/C++을 선택하면 하위 항목에Arduino 
Project가 있는 것을 확인할 수 있다. 이후 프로젝트 생성 Wizard를 따라 쭉 진행하자.









이렇게 프로젝트를 생성하고 나면 소스 파일 1개로 이루어진 아주 썰렁한 프로젝트가 생성이 된다. 그런데 함수 호출 
코드들이 모두 에러 표시가 되어있다. 이 것은 지난 Atom 포스팅에서도 언급한 바와 같이 Eclipse도 확장자가ino가 
아닌 cpp로 되어있기 때문이고 “#include <Arduino.h>”를 소스 상단에 추가해주어야 한다.


또한 플러그인 설치 후 생긴 툴바의 도구들에도 뭔가 따로 선택할 수 있는 것들이 없다. 아두이노와 관련된 설정을

아무 것도 찾을 수가 없어 조금 당황할 수도 있을 것이다. 당황하지 말고 메뉴 표시줄의 Help 메뉴로 다시 가보자

Arduino Download Manager라는 못보던 메뉴가 추가되어 있을 것이다.






이 메뉴를 실행하면 팝업이 하나 열리는데 여기서 Platforn과 라이브러리들을 다운로드 받을 수 있다.










이제 필요한 내용들이 설치가 되었으면 새로 생긴 툴바의 on: 옆에 있는 셀렉트 박스를 열고 New Launch Target을
선택해주자. 그러면 새로이 팝업 창이 열리면서 공식 아두이노 IDE의 툴 메뉴에 있는 내용들을 설정할 수 있게 된다.






여기까지 기본적인 설치와 설정은 모두 끝이났다. 이제 툴바에서 Run 버튼을 클릭하면 빌드와 업로드가 연속해서 진행되고
콘솔 창으로 Arduino 공식 IDE와 동일한 내용의 로그가 보여진다.






정리


이렇게 해서 두번째 Arduino IDE 대안으로 Eclipse에 대해 알아보았다. 사실 Eclipse가 무겁다고는 했지만 뒤에 언급할
Xcode에 비한다면 양반이라고 할 수 있다…-.- 어쨌든 무겁다 하더라도 상당히 많은 개발자들이 아직도 Eclipse의 품을
벗어나지 못(안)하고 있고 그 폭넓은 범용성은 단점을 충분히 커버하고도 남기 때문에 훌륭한 대안이 될 수 있으리라 본다.


나머지 2개의 포스팅은 IT 공룡들인 애플과 마이크로소프트의 제품들을 이용하는 방법인데 두 제품 모두 제대로 활용을하려면 
비용을 지불해야 한다. 자세한 내용은 해당 제품 포스팅에서 알아보도록 하자.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



2019/04/21 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #1 - Atom + PlatformIO

2019/04/23 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #2 - Eclipse

2019/04/28 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #3 - Visual Studio

2019/05/06 - [Study/아두이노] - [아두이노] 선택 가능한 개발환경 알아보기 #4 - Xcode + embedXcode





오늘은 다양한 아두이노 개발 환경에 대해 정리를 해보겠다.


사실 그동안 아두이노 개발 시에는 공식 배포되는 Arduino IDE만을 사용해왔다. 뭐 공식 IDE에 특별히 불만은 없지만

다른 프로그램 개발 시 사용하는 IDE(Ecilpse, Xcode, Visual Studio 등)나 고급 편집기(Atom, Sublime Text 등)에

비하면 많이 아쉬운 것은 사실이다.


그러던 중 공식 IDE를 대체할 수 있는 5가지 개발 툴에 대한 기사가 있어 한 번 직접 설치해보고 실행을 해보았다.

그리고 그 결과에 대해 정리를 해보려고 한다.


Forget the Arduino IDE: 5 Awesome Alternatives


기사에서는 총 5가지 대체 개발 툴에 대해 언급을 하고 있으나 마지막 Arduino CLI의 경우 아무래도 고수들이나 해볼 법한

방법이고 범용성이 떨어지기에 링크로 대체하고 Atom, Xcode, Eclipse, Visul Studio의 플러그인들만을 대상으로

정리를 해보고자 한다.


Atom + Platformio

나도 사실은 무거운 IDE를 위주로 사용하는 터라 가벼운 텍스트 편집기 기반의 개발 툴은 별로 사용해본 적이 없다.

Atom의 경우도 마찬가지로 설치는 해보았으나 거의 사용은 안했었고 현재 주로 사용하는 편집기는 Sublime Text

이다. 그런데 이번에 새로 설치하고 찬찬히 살펴보니 기본 설치 상태의 가독성은 확실히 Atom쪽이 더 좋았다. 아마도

앞으로는 Atom을 즐겨 쓰지 않을까 한다.


우선 당연히 Atom을 먼저 설치해야 한다.


atom.io


설치는 매우 단순하다. Atom의 설치가 끝나면 바로 실행 시킨 후 설정 화면으로 가서 Platformio를 설치해주어야 한다.

Platformio는 IoT 개발을 위한 Atom기반의 플러그인다. 즉, 아두이노만 개발할 수 있는 것이 아니란 이야기다.

설치 방법은 아래 스크린샷과 같다.


1. 먼저 Atom의 Settings 화면으로 이동한다. 그리고 메뉴 중 가장 하단의 Install을 선택한 후 우측 메인 화면에서

platformio-ide로 검색한다. 목록에서 platformio-ide를 찾아 설치한다(스크린샷은 이미 설치한 상태에서 찍은

것이라 설치는 없고 설정/제거/비활성화만 있다).




2. platformio-ide가 설치되고 나면 Atom의 좌측에 새로운 아이콘 그룹이 생긴다. 이 아이콘들이 platformio를 사용하기

위한 것들이다.





3. 아이콘 중 가장 위에있는 집 모양의 버튼을 클릭하면 platformio의 홈 화면으로 이동한다. 이 화면에서 아두이노 관련

대부분의 설정을 할 수 있다.





. New Project 버튼을 클릭하면 새로운 프로젝트를 생성 할 수 있다.




. PlatformIO Home 화면의 좌측 메뉴 중 Libraries를 클릭하면 라이브러리 관리를 할 수 있다.




. PlatformIO Home 화면의 좌측 메뉴 중 Boards를 클릭하면 보드 관리를 할 수 있다.




. PlatformIO Home 화면의 좌측 메뉴 중 Platforms를 클릭하면 플랫폼 관리를 할 수 있다.





. PlatformIO Home 화면의 좌측 메뉴 중 Devices를 클릭하면 포트 관리를 할 수 있다.






프로젝트가 생성되면 다음과 같은 화면이 보여진다. Atom의 경우 기본 확장자로 ino가 아닌 cpp를 사용한다. 이렇게 확장자로

cpp를 사용하게 될 경우에는 소스코드에 "#include <Arduino.h>”문을 반드시 적어주어야 한다.





그밖에 빌드, 업로드, 시리얼모니터 등은 프로젝트 메인 화면의 좌측에 있는 platformio의 아이콘 그룹에서 찾아볼 수 있다.
그런데 빌드와 업로드를 동시에 진행하는 버튼을 찾지를 못했다. 원래 그런 기능이 없는 것인지, 내가 찾지 못한 것인지…

이 부분이 단점이라면 단점이다.


빌드나 업로드를 하게 되면 하단에 로그 창이 떴다가 작업이 완료되면 바로 사라지는데 좌측의 Toggle Build Panel 버튼을

클릭하면 로그 창이 계속 남아있게 할 수 있다.






정리


포스팅 한번으로 4가지 IDE를 모두 다뤄보려고 했는데 별 내용이 없음에도 불구하고 스크린샷이 많아서 그런지 상당한

분량이 되어버렸다. 그래서 하나의 IDE에 대해 한 개의 포스팅으로 소개하는 것이 좀 더 보기 편할 듯싶다.


처음 소개한 Atom의 경우 일단 개발 툴 자체가 무겁지 않고 전체적으로 폰트가 큼직하여 가독성 면에서 높은 점수를

줄 수 있을 것 같다. 앞으로 소개할 3개의 IDE는 그 자체로 무거운 툴들이다보니 과연 아두이노와 같은 작은 볼륨의

개발을 하는데 그렇게나 큰 IDE를 사용할 필요가 있을까 싶은 생각도 든다.

그래도 개개인의 취향이라는 것이 있으니 나머지 3개도 차근차근 알아보도록 하겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

 

2019/01/13 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #1

2019/01/21 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #2

2019/03/03 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #3

2019/03/11 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #4

2019/03/31 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #5  (이번 글)

아두이노 미니 드론 만들기 #5

흘러간 시간에 비해 진척이 없는 것이 좀 안타까운 현실이다.
지난 포스팅까지 새로운 부품을 구해 나름 보기 좋게 드론 프레임에 장착을 하였다. 이제 번거로운 하드웨어 작업이
끝났으니 슬슬 소프트웨어 작업만 시작하면 되겠거니 생각을 했건만…

오늘은 그냥 가볍게 발생한 문제에 대한 의문만 남겨본다.

하드웨어 보완

지난 번 부품을 얼키설키 연결을 시켜놓고 모양 잘나왔다고(?) 자아도취에 빠져 이리 저리 둘러보던 중…
아뿔싸…스위치가 없었다…ㅠ.ㅠ

다행이 예전에 미리 잔뜩 사다놓은 푸시락 버튼이 있어 주섬주섬 찾아다가 드론 프레임의 앞자리, 카메라 장치하는
공간에 끼워봤더니 얼추 잘 어울린다 싶어 연결을 하였다. 이것으로써 정말 하드웨어 조립은 끝을 맺게 되었다.
다만 드론이 구동을 안할 시 그 원인이 하드웨어쪽에 있다면…망한거다…ㅠ.ㅠ

 

테스트

그리고 이제 스케치 코드를 작성하고 테스트를 해볼 시간이다.
코드는 매우 간단하게 일반적으로 DC모터 드라이버를 사용하는 예제를 가져왔다.
코드는 다음과 같다.

 

void setup() {
  // 모터를 출력모드로 설정
  pinMode(3, OUTPUT);              // 3번핀을 출력모드로 설정합니다.
  pinMode(5, OUTPUT);              // 5번핀을 출력모드로 설정합니다.
  pinMode(6, OUTPUT);              // 6번핀을 출력모드로 설정합니다.
  pinMode(9, OUTPUT);              // 9번핀을 출력모드로 설정합니다.
}

void loop() {
  // 모터 돌리기
  analogWrite(3, 150);                   
  analogWrite(5, 150);              
  analogWrite(6, 150);                  
  analogWrite(9, 150);          
  delay(3000);           
  // 모터 정지         
  analogWrite(3, 0);             
  analogWrite(5, 0);                 
  analogWrite(6, 0);            
  analogWrite(9, 0);              
  delay(3000);                         
}

 

간단하게 모터의 동작만 테스트하는 아주 간단한 코드이다. 원래 MPU9250과 nRF24L01 예제 코드에 추가하여 테스트
하려고 했는데 뭔가 잘 안되는 것 같아 모터만 따로 테스트해보기로 했다.

하지만…그래도 잘 안된다….ㅠ.ㅠ


일단 delay 시간에 맞춰서 모터 드라이버에 LED도 불이 들어오고 전류가 흐르는 소리가 찌르르 나긴 하는데 정작 모터가 
돌아가지 않는다. 모터 드라이버가 전류를 잘 공급해주지 못하는 것일까? 아는 것이 없으니 어디를 의심해봐야 할지도
모르겠다…ㅠ.ㅠ 일단 증상은 아래의 영상과 같다.

 

 

 

그리고 실제 부품들과는 다르지만 회로 구성도도 함께 올려본다. 이 회로도는 미니 드론 만들기 작업을 처음 포스팅
할 때 올렸던 그림이다.

 

정리

오늘은 모터 구동 테스트를 진행해보았다. 하지만 결과는 썩 좋지 않았다. 이제부터의 과제는 과연 무엇이 문제의
원인인지를 찾아내는 것이다. 때문에 다음 주 주말에는 현재 부품이 아닌 다른 부품 (아두이노 프로 미니와 다른
DC모터 드라이버, 그리고 다른 모터들)을 이용하여 회로를 구성하고 정상적으로 구동이 되는지 확인을 해봐야겠다.

사실 현재 드론에 사용중인 Racerstar의 8520 코어리스 모터를 한 달 전에 banggood.com에서 추가로 주문을 
해놓았는데 무슨 일인지 배송이 안되다가 겨우 며칠 전에 선적되었다는 것을 확인할 수 있었다. 만일 새로 구성한 회로가 
잘 작동을 하고 새 모터가 무사히 도착을 한다면 기존 작업한 것을 버리고 새 회로와 모터 그리고 프레임도 새로 만들어
다시 시작을 해야겠다. (역시 정상 동작을 확인하고 납땜을 했어야 했는데…ㅠ.ㅠ)

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



2019/01/13 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #1

2019/01/21 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #2

2019/03/03 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #3

2019/03/11 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #4 (이번 글)

2019/03/31 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #5


아두이노 미니 드론 만들기 #4


미니 드론 만들기의 첫 번째 포스팅이 1월 13일이었으니…벌써 시작한 지도 2달여가 되어간다.
하지만 아직도 하드웨어 조립에서 맴돌고 있다…ㅠ.ㅠ


지난 주에 포스팅한 SMD 타입의 nRF24L01 모듈 구입과 보드의 소형화로 하드웨어 작업은 금방 끝이 날 것이라고 
생각했으나 여전히 납땜 할 부분들이 많아 선뜻 손이 가지 않았다. 그리고 지난 주 조립한 아두이노 프로 미니를 중심으로
한 모듈의 조립 상태도 높이가 조금 높아 구입한 프레임에 장착하기가 썩 만족스럽지 않은 상황이었다.


어쨌든 이제 모터 드라이버와 외부전원부까지 납땜을 마치고 하드웨어쪽은 마무리를 지으려는 찰나. 새로운 부품이
눈에 들어왔다.


초소형 DC 모터 드라이버


사실 미니 드론을 만드는 틈틈이 드론 이후 만들 싱글콥터에 대해 이것 저것 아이디어를 짜내고 있던 터였다.
프레임을 만들 플라스틱 용기도 몇 개 준비했고 그동안 사다놓은 모터 스펙도 다시 한 번 확인하고 배터리도 무게와 
용량을 가늠해보고…그리고 싱글콥터에서 가장 부담스러운 부분인 방향 제어를 위한 4개의 블레이드를 작동시킬
서보모터와 관련하여 적당한 서보모터 드라이버를 찾고 있었다.


현재 가지고 있는 서보모터 드라이버는 16개의 서버모터를 컨트롤하는 놈이다보니 크기와 무게 여러모로 부담스러웠다.
딱 4개만 컨트롤 가능한 드라이버가 있으면 좋으련만…그러던 중 그나마 가장 작은 크기로 6개의 서보모터를 컨트롤 할
수 있는 서보 모터 드라이버를 찾았다. 그리고 그 드라이버를 찾은 곳에서…초소형 DC 모터 드라이버를 발견하였다.


일단 크기는 아래 사진으로 확인할 수 있다. 기존 드라이버(요 것도 그나마 작다고 해서 구매한 것이었다)와의 비교, 
그리고 100원짜리 동전과의 비교이다.



작은만큼 허용하는 외부 전압은 10V까지이고 1.5A까지 모터에 공급할 수 있다. 어차피 사용하는 모터가 8520 코어리스
모터로 이정도 스펙이면 충분히 구동시킬 수 있을 것 같았다. 또한 아두이도와의 연결도 3.3V와 5V 모두 가능하여 크게
신경쓰지 않고 사용할 수 있었다.


최종 조립


새로운 초소형 DC 모터 드라이버의 사용으로 전체적으로 하드웨어를 재배치 할 수 있게 되었다. 기존 모터 드라이버가
드론 프레임의 아랫면을 모두 차지하여 나머지 중요 부품들을 프레임 상단에 배치할 수밖에 없었는데 이제는 가능한한
정확하게 수평을 맞추기 위해 MPU-9250 9축 자이로 센서만 프레임 상단에 부착하고 나머지 부품들은 모두 프레임의
하단에 배치시켰다. 드론 프레임과 거의 일체화 되었다고 봐도 될 정도로 잘 들어맞았다.


다만 케이블로 이어 납땜을 하는 과정에서 전선들이 너무 어지럽게 배치되어 보기 안좋게 된 것이 못내 아쉬울 뿐…


어쨌든 더 미룰 수도 없고 해서 납땜을 해야 할 부분은 모두 해버렸다. 이렇게나 열심히 해놓았는데 만일 납땜의 문제로
뭔가 작동을 하지 않는다면…비뚤어지고 말테다…-.-!





총 5개의 보드를 붙인 것 치고는 꽤 슬림하게 잘 배치가 되었다.


삽질…


납땜을 하는 과정에서 무지하게 삽질을 했다. 당연하게도 SMD 타입의 nRF24L01 모듈이 문제였다.
지난 포스팅에서 언급한대로 이번에는 칼팁이 아닌 송곳 팁으로 남땜을 해보았다. 확실히 사용했던 팁 중에 가장
수월하게 작업이 되었다. 하지만 그럼에도 불구하고 SMD 타입의 nRF24L01 모듈같이 작은 영역은 땜질하기가 
너무나 어려웠다. 


첫 번째 시도에서는 기존 코드가 동작하지 않았다. 육안으로도 얼핏 납이 엉겨붙은 부분이 보였는데 아마도 이 때문이 
아닐까 싶었다.


그런데 어렵게 땜질한 것을 다 뜯어내고 새 모듈을 다시 땜질하여 붙였는데 이번에도 작동을 하지 않는 것이었다. 
이번에는 육안으로(고배율 루페로 확인) 확인했을 때에도 특별한 문제가 없어보였는데 작동을 하지 않았다.
이번 주말에 번거로운 작업을 모두 마무리하자는 일념으로 귀차니즘을 무릅쓰고 다시 다 뜯어내고 이번에는 기존의
nRF24L01 모듈을 연결시켜보았다. 그런데 이번에도 역시 동작을 하지 않았다. 그래서 혹시나 하고 송신부를 켠 후
다시 확인해보니 그제서야 신호가 잡혔다.


처음 시도에서는 송신부를 켰음에서 안되었던 것으로 봐서 확실히 문제가 있었던 것 같은데 두 번째 시도에서는
깜빠하고 송신부를 켜지 않은 채 그냥 잘 안된다고 판단하고 뜯어버리고 말았다. 제대로 테스트를 해보았더라면
아마도 일찍 마무리 지을 수 있었을지도…ㅠ.ㅠ


앞으로는 소프트웨어적인 테스트에서도 빠짐없이 모든 경우의 수를 다 테스트 해봐야겠다. 


정리


이렇게 해서 하드웨어 조립은 모두 마쳤다. 하지만 이게 정상적으로 작동을 할 지는 아직 미지수이다. 사실 간단하게 모터
구동 테스트를 위한 코드까지 넣어놓긴 했지만 잘 안될 것이 두려워 실제로 구동시켜 보지는 못했다. 배터리만 연결하면
바로 확인이 되겠지만…ㅠ.ㅠ


진행하다보니 이게 드론을 만들자는 것인지 소형화된 부품을 찾자는 것인지 모르게 되어버렸지만 어쨌든 이제 납땜은
모두 마쳤으니 다음 주말에는 모터의 장상 구동 여부 확인 후 다행히 잘 동작을 하면 본격적인 드론 동작을 구현하는 
단계로 나가고 그렇지 않다면….다시 조립해야 하나…ㅠ.ㅠ?


그저 프로펠러가 돌기를 바랄 뿐이다…

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



2019/01/13 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #1

2019/01/21 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #2

2019/03/03 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #3 (이번 글)

2019/03/11 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #4

2019/03/31 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #5





아두이노 미니 드론 만들기 #3

갈길은 먼데…내 주력 PC인 2012년 산 맥미니가 말썽을 부렸다…
워낙 맥에 아두이노 관련 중국산 칩들의 호환성이 떨어지는지라 아무래도 윈도우 PC에서 작업을 해야 할 것 같은데
집에 있는 윈도우 PC는 아이들이 주로 사용하다보니 내가 사용할 수 있는 시간이 별로 없었다.


결국 Parallels를 이용하여 맥미니에 윈도우를 설치하고 거기서 작업을 하려고 했는데…
왜??? 맥용 소프트웨어들은 메이저 버전이 올라가면 돈을 새로 받냔 말이다…ㅠ.ㅠ 돈 좀 아껴보려고 크랙버전을 찾아
설치를 좀 해볼까 시도하다가 결국 맥미니가 맛이 갔다. 딱 느낌이 쥬토피아의 나무늘보 같았다…-.-


그리고 Mac OSX 모하비를 클린 설치하기를 수차례…겨우 지난 주말에야 정상 복구 시킬 수 있었다.
하지만 2012년 맥미니의 성능으로는 아무리 메모리를 16Gb 장착을 해도 가상 환경에서 윈도우를 구동하는 것이
만만한 일은 아니었다. 아무래도 2018년 맥미니을 구해야 하나…ㅠ.ㅠ


각설하고 이런 이유로 한동안 드론에 손을 못댔고 그나마 작업한 부분도 블로그에 정리할 수가 없어서 이제야 겨우
조금이나마 진행한 내용을 올려본다.


개선


그동안 진행한 작업이라고는 부품들을 조금이나마 부피를 줄여 조립한 것이 다이다.
현재 사용할 보드들은 아두이노 프로 미니, MPU-9250 9축 자이로 센서, 그리고 통신을 위한 nRF24L01+ 이렇게
3개이다. 모두 크기가 그닥 크지 않은 모듈들이긴 하지만 지난 포스팅에서 정리한 작업처럼 핀헤더를 붙이고 케이블로
연결해서는 답이 안나온다는 것을 확인했다. 내가 구입한 드론 프레임에 올리기에는 높이가 너무 높아져버렸다.


결국 다시 처음의 계획대로 핀헤더 없이 각 보드들을 케이블로 직접 연결하기로 하고 추가로 nRF24L01 모듈이 더 작은
사이즈로 만들어진 것이 있기에 이놈을 추가로 구매해서 부피를 더 줄였다. 아래 사진을 보면 기존 모듈과의 크기를
비교할 수 있다. 거의 절반 가까이 크기가 줄었다.



새로 구입한 소형 nRF24L01 모듈은 부피가 작아진 것은 좋은데 연결 핀이 SMD 타입으로 되어있어(소형화의 당연한
결과이겠지만…) 과연 제대로 땜질을 할 수 있을지 매우 불안했다. 일단은 땜질 하기 전에 어떻게 연결해야 하는지 확인을
해보자. 첫 번째 사진은 기존 모듈의 핀맵이고 두 번째 사진은 새로 구입한 모듈의 핀맵이다.




핀 맵을 확인한 후 인두기를 꺼냈다. 검색을 해보니 작은 부분을 땜질할 때는 칼팁으로 하는 것이 좋다는 말에 처음으로
칼팁을 사용해 보았다. 나는 현재 인두기가 3개가 있는데 제일 처음 샀던 저가형 자야 인두기…사실 이놈으로도 땜질을
잘만 했는데 어느날 땜납이 잘 녹지 않는 것이었다. 싸구려라 맛이 갔구나…생각했는데…선무당이 사람 잡는다고…나중에
보니 당시 사용한 납이 무연납이었던 것이다…ㅠ.ㅠ 어쨌든 당시에는 인두기가 맛이 갔다고 생각해서 다시 그 유명한 하코
인두기 중 가장 저렴한 980 이두기를 새로 구입했다. 이 때 추가로 하코 정품은 아니고 호환 제품으로 칼팁을 하나 더
구했다. 그러다가 다시 banggood.com 검색하다가 싼맛에 인두기를 추가로 하나 질렀는데 여기에는 팁이 5개 정도가
기본 포함되어있었다. 아래 사진의 위에서부터 중국산 인두기, 하코 980, 자야 인두기 이다.



아무튼…그동안 하코 인두기로 잘 썼었는데 팁 갈아 끼워 가면서 쓰기가 귀찮아서 중국산 인두기에 칼팁을 끼워 사용해
보았다. 아니나 다를까…노안과 수전증의 합작으로 막 옆에 핀과 같이 붙여주기도 하고, 가끔은 납이 에베레스트만큼 솟아
오르기도 하고, 물론 아주 가끔은 뿌듯할만큼 잘 붙기도 하고…암튼 솔더위크 엄청 써가면서 겨우겨우 땜질을 마쳤다.
아무래도 땜린이에게는 칼팁도 어려운 것 같고 다음에는 중국산 인두기에 딸려 온 송곳 팁을 써봐야겠다.


언제 어디서 단선이 되거나 쇼트가 날지 모를 아슬아슬한 상태로 땜질을 마치고 나니 제법 아담한 사이즈로 완성이 
되었다. 특히나 새로 구한 nRF24L01 SMD 모듈이 아두이노 프로 미니에 포~옥 안기는 형태가 되어 보기가 참 좋았다^^.
추가로 nRF24L01모듈에 컨덴서(커패시터)를 붙여주면 더 안정적으로 통신을 할 수 있다고 하기에 붙여주었다.






작동 테스트


지난 포스팅까지 진행한 작업에서는 MPU-9250 9축 자이로 센서 동작만 확인을 했다. 그 후 nRF24L01 모듈의
통신을 테스트 해보았는데…이게 뭔 조화인지 전혀 통신이 되지 않는 것이다. 분명 코드는 맞게 작성을 했고 
시리얼 모니터를 보면 nRF24L01 모듈도 정상적으로 연결이 되었는데 조이스틱쪽과 드론쪽의 통신이 되지 않았다.


그러다가 예전에 싱글콥터 만들 때 테스트 하던 아두이노 나노에 연결해서 하니 정상적으로 통신이 되는 것이 아닌가…
그리고 다시 아두이노 프로 미니에 연결을 했더니 그 뒤로 통신이 아주 잘된다…-.- 손톱만한 모듈들에 농락당하는 
삶이라니…ㅠ.ㅠ



일단 통신은 되었지만 수정할 부분이 좀 있다. 조이스틱쪽 코드가 예전에 싱글콥터 개발 시 작성된 코드라 지금 만드는
쿼드콥터에 맞게 수정을 해야 하고 드론쪽도 코딩을 시작해야 하고…일단은 간단하게 코드의 중요 부분만 올려본다.


정리


별로 한 것도 없는데 컴퓨터가 맛이 가는 바람에 시간을 많이 잡아먹었다.
그래도 어영부영 한 1/3은 온 것 같고 이제 진짜로 중요한 코딩과 드론의 최종 조립만 남았다. 이제 컴퓨터도 복구가 
되었으니 조금 더 서둘러서 진행을 해야겠다.

그나저나 모듈들을 이렇게 소형화 하고 나니 다시 싱글콥터에 대한 욕심이 스멀스멀 밀려온다. 이번 미니 드론 작업을
마치면 바로 이어서 싱글콥터 작업을 시작해봐야겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


2019/01/13 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #1

2019/01/21 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #2 (이번 글)

2019/03/03 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #3

2019/03/11 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #4

2019/03/31 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #5




아두이노 미니 드론 만들기 #2


지난 포스팅에서는 우선 부품 구매와 간단하게 가조립을 통해 부품들을 어떻게 배치하는 것이 좋을 것인지에 대해
정리를 해보았다. 무게가 좀 불만스럽기는 하지만 대체로 만들만 하겠다는 판단이 섰다. 그리고 이번 주부터는 본격적으로
부품을 조립하고 아두이노 스케치를 작성하는 작업에 들어가기로 했다.


두 번째 삽질…


지난 번 첫 포스팅을 페이스북에 공유했을 때 페이스북의 한국 아두이노 사용자모임에서 ‘현자’님이 DC 모터 드라이버
보다 모스펫을 이용하여 모터를 제어하는 것이 어떻겠냐는 댓글을 달아주셨다. 안그래도 DC 모터 드라이버가 덩치도
큰데다가 역방향 회전이라는 불필요한 기능도 포함되어있어 불만스러웠던 차에 모스펫 이야기를 듣고나니 한번 모터
드라이버를 자작해볼까 하는 생각이 들었다.


당장에는 못만들어도 언젠가 만들겠거니 하고 적절한 사양의 모스펫을 주문을 했는데…이게 SMD 타입으로 너무
작아서 만능기판에는 납땜하기도 힘들고 아무래도 제대로 회로 기판을 만들어 써야할 것 같았다…ㅠ.ㅠ



그래서 덩치가 큰 트랜지스터 형태의 모스펫을 주문을 했는데…아뿔싸…ㅠ.ㅠ 이게 모스펫이 아니라 트라이액이라는
소자네…ㅠ.ㅠ 그냥 모양은 똑같고 triac이라고 써있길래 모스펫 브랜드 이름인가보다 했는데(실제로 triac이 브랜드
이름이 맞긴 하다)…모스펫하고 아예 성격이 다른 놈이었다…ㅠ.ㅠ 


모스펫모스펫빌어먹을 트라이액...-.-



모스펫과 트라이액에 대한 설명은 링크로 대신한다.


모스펫 : https://ko.wikipedia.org/wiki/MOSFET

트라이액 : https://ko.wikipedia.org/wiki/사이리스터#쌍방향_사이리스터_(TRIAC)


결국 처음 예정대로 구입한 DC 모터 드라이버를 사용하고 드라이버 자작은 훗날로 미루기로 했다.


하드웨어 조립


뭐든 시작하기 전에는 설계를 하기 마련! 그래서 일단 Fritzing을 통해 도면을 좀 그려봤다. 사실 그리 많은 부품이
있는 것은 아니라서 복잡하지는 않지만 송수신 부분에 사용하기로 한 nRF24 모듈이 핀을 7개나 잡아먹다보니
은근히 거미줄같은 도면이 나왔다.



지난 포스팅에서 말한 바와 같이 메인 컨트롤러는 아두이노 프로 미니를 사용하고 DC 모터 드라이버 2개, 수신용
nRF24, 그리고 자세 제어를 위한 MPU-9250 9축 센서가 전부이다.


처음에는 가능한한 부피와 무게를 줄이기 위해 핀헤더를 붙이지 않고 AWG30짜리 래핑 와이어를 이용하여 바로
연결을 할 생각이었다. 그리고 번거로움을 피하기 위해 납땜도 하지 않고 그냥 와이어를 절연테이프로 고정시키려고
했는데…역시나 절연테이프로는 제대로 고정이 되지 않아 접촉 불량이 심했다. 결국 납땜은 피할 수 없는 선택이
되고 말았다.


게다가 래핑 와이어를 직접 납땜을 해보니 와이어가 너무 가늘어서 피복 부분까지 덮어씌우지 않으면 납땜한 위치에서
똑똑 부러지기가 일쑤였다. 아무래도 불안하여 처음 MPU-9250 센서만 래핑 와이어로 직결하고 나머지 부분은 
핀헤더를 붙이고 말았다.



모터 부분도 문제가 좀 있었는데 8520 모터에 달린 커넥터가 DC 모터 드라이버의 소켓보다 작은 사이즈라서 모터 
드라이버의 핀을 안쪽으로 약간 휜 후 억지로 욱여 넣었다…ㅠ.ㅠ 육안으로 식별이 안되어 제대로 들어간 것인지 
모르겠지만 일단 느낌상으로는 뭔가 들어간 것 같긴 하다…-.- 그리고 DC 모터 드라이버의 input쪽에는 연결을 
하나씩 빼주었다. 어차피 역방향 제어는 필요 없으니까…



다음으로 문제가 되는 부분은 전원 분배 문제였다. 만능기판을 이용하여 만들려다가 그냥 케이블만 연결을 시켰다.
게다가 사용할 배터리는 2핀짜리 molex 51005 커넥터였는데 현재 가지고 있지도 않고 파는 곳도 국내 검색으로는
잘 안나오고…일단 아두이노용 점퍼 케이블로 배터리와 아두이노 프로 미니를 연결하기로 하고 DC 모터 드라이버로
들어가는 부분은 8520 모터와 동일한 규격의 커넥터(1.25mm JST Plug)를 연결하여 꽂기로 했다. 



전체가 마무리 된 것은 아니지만 이렇게 해서 일단 1차 조립은 완료가 되었다.


아두이노 스케치 하기


아두이노 스케치는 시작 하기도 전에 문제가 있었다. 나는 매킨토시를 사용 중인데 많은 호환 칩들이 Mac에서 쉽게
작동하지 않는다. 게다가 드라이버 설치도 만만치 않고 심할 경우 Mac 자체가 맛이 가는 경우도 있어 드라이버
설치가 꺼려지는 것도 사실이다.


아두이노 프로 미니에 스케치를 업로드 하기 위해서는 USB to TTL 시리얼 컨버터를 사용해야 하는데 구입한 것이
FTDI 칩을 사용한 것이었고 역시나 이 칩 역시 Mac에 별도의 드라이버를 설치해야 했다. 집에 윈도우즈 노트북이
있어 거기서 하면 편하긴 하지만 주로 아이들 학습용으로 쓰이고 있고 100만년만에 윈도우 환경에서 작업을 하려니
집중이 잘 안된다…ㅠ.ㅠ


결국 구글링을 통해 무사히 드라이버를 설치한 후 정상적으로 아두이노 프로 미니가 연결이 되었다.


Mac에 FTDI 드라이버 설치하기 : https://youtu.be/Ir2PVz1870E

드라이버 다운로드 : https://www.ftdichip.com/Drivers/D2XX.htm


하지만 여기서 끝이 아니었다. 스케치를 업로드 하려는데 컴파일 단계에서 다음과 같은 오류가 발생하였다.


fork/exec /Users/mazdah/Library/Arduino15/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2/bin/avr-g++: no such file or directory


조금 당황스러웠으나 역시나 구글링을 통해 해답을 찾았다.


air-g++ 오류 관련 해결책 : https://forum.arduino.cc/index.php?topic=547545.0


이렇게 해서 겨우겨우 아두이노 프로 미니에 스케치를 업로드 할 수 있었다.


이렇게 준비를 마친 후 우선은 제일 먼저 연결을 한 것이 MPU-9250이기 때문에 이쪽 예제부터 찾아보았다.
에듀이노 오픈랩 사이트에 예제가 첨부되어있어 간단하게 다운로드 받아 실행을 해보았다. 실행은 잘 되는 것 
같은데 아직 값을 해석하는 방법을 몰라 공부를 좀 해야 할 것 같다.


MPU-9250(GY-9250) 예제 : https://blog.naver.com/eduino/220887867791


스케치를 업로드 한 후 모듈을 움직여보니 시리얼 모니터에 아래 동영상과 같이 값이 출력된다.



정리


삽질도 많았고 아직 모르는 내용도 많고 생각보다 만만치 않은 작업이었다. 그래도 납땜과 같은 번거로운 작업은
모두 마무리가 되었고 다음 주부터는 간단하게 점퍼 케이블 연결하고 아두이노 스케치에만 전념하면 된다(은근히 
판 벌리는 것을 싫어해서 납땜같은 작업은 정말 작심하고 해야한다…-.-).


사실 아직은 9축 자이로 센서가 드론에서 어떤 역할을 하는지도 잘 모른다…ㅠ.ㅠ 우선 다음 주에는 모터를 제어하는 부분부터 정리를 좀 하고 자이로 센서는 느긋하게 알아봐야겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^


2019/01/13 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #1 (이번 글)

2019/01/21 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #2

2019/03/03 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #3

2019/03/11 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #4

2019/03/31 - [Study/아두이노] - [아두이노] 미니 드론 만들기 #5



아두이노 미니 드론 만들기 #1


2017년 7월 경…아두이노를 이용하여 싱글콥터(프로펠러가 하나인 드론)을 만들겠다고 한참 삽질을 했었다.
물론 성공하지는 못했다. 다만 잠깐 띄우는 정도…(유튜브 영상 : https://youtu.be/sI5e4swuRTM)


다양한 시도를 하였지만 일부 구현되지 않은 기능(자이로 센서를 이용한 균형 잡기 등)과 적절하게 프레임을 구성하지
못하는 등의 한계로 보류를 해두었다.


그런데 겨울방학을 맞아 아이들이 다니는 태권도장에서 드론 만들기 수업을 한다고 하길래 아이가 하고 싶어하기도 하고
또 어떻게 진행되고 어떤 드론을 만들어 오는지도 궁금하여 시켜주려 하였는데 다른 곳에 돈을 쓰게 되어 결국은 시켜주지
못하게 되었다. 대신 아쉬워하는 둘째 아이를 위해 아빠가 직접 만들어주겠다고 호언장담을 해버렸다…ㅠ.ㅠ


그래서 한동안 묵혀두었던 부품들을 주섬주섬 꺼내고 또 일부 부품들은 새로 구입을 하여 드론 만들기에 돌입을 하였다.
물론 이번에는 싱글콥터가 아닌 쿼드콥터로…


구상


처음에는 시중에 판매하는 아두이노 드론 키트를 구매해볼까 하는 생각도 했다. 그런데 검색 사이트를 통해 아두이노 
드론 키트를 검색하게 되면 대부분 10만원이 넘는 금액의 키트들이 검색된다. 아무래도 비용이 애들 엄마의 허락 범위를
넘을 것 같기도 하고 또 뭔가 남이 상당부분 만들어놓은 것을 조립하는 것은 별로 재미도 없을 것 같아 밑바닥부터 직접 
만들어보기로 했다.


직접 만들기로 하면서 가장 문제가 되었던 것은 바로 프레임이었다. 이제는 3D 프린터가 있어 쉽게 만들 수 있을 것이라
생각했지만 내가 가진 3D 프린터의 출력 사이즈가 작다보니 한 번에 프레임을 찍어낼 수가 없는 상황이었다. 조금은
색다른 형태의 드론을 만들어보고 싶었지만 아무래도 다음 기회로 넘겨야겠다.


결국 프레임도 구매하기로 하고 나머지 부품들도 아두이노와 아두이노 관련 모듈들로 구매하여 조립을 해보기로 하였다.


부품의 준비


이렇게 결정한 후 구매한(혹은 이미 구매를 해놓은) 부품들을 하나씩 정리해보도록 하겠다.
일단 전체 부품들은 다음 사진과 같다.



각각의 부품들을 좀 더 상세하게 살펴보자.


드론 프레임 
- Q100 카피 제품으로 사진은 별도로 안찍었다. 위 사진의 프레임이다. 모터는 8520 모터를 사용
가능하고 프로펠러는 65mm까지 사용 가능하다. 가격은 4,260원


Flight Controller 
- 메인 컨트롤러는 아두이노 프로 미니 3.3v 8Mhz이다. 아두이노 프로 미니를 구매할 때 삽질을 조금
하였는데…아무 생각 없이 전에 하던대로 5V로 작동하는 제품을 선택한 것이다. 드론 자체는 3.7V로
작동을 해야 하는데 아두이노가 5V로 작동을 하게 되면 아두이노를 위해 별도의 배터리를 장착해야 하는
상황이 생긴다. 늦게서야 이 사실을 파악하고 부랴부랴 배송 전에 3.3V짜리로 교환 요청을 했다. 덕분에
배송은 좀 늦어졌지만…ㅠ.ㅠ 가격은 3,300원



자이로 센서 
- MPU-9250 9축 자이로 센서로 구입을 하였다. 원래 전에 구입해놓은 것이 있는데 찾지를 못해 새로
구입을 하였다…ㅠ.ㅠ 가격은 6,050원



DC 모터 드라이버 
- 현재 키트로 판매되고 있는 아두이노 드론들을 보면 베이스 보드라 하여 모터 드라이버 기능이 포함된 별도의
보드가 부품으로 포함되어있다. 내가 회로 설계를 할 줄 안다면 하나 만들어보겠으나 그런 재주는 없으니…-.-
이 부품으로 인해 무게에서 많은 손해를 보고 들어간다…ㅠ.ㅠ 일단 L9110 모터 드라이버 중 가장 작아보이는 
놈으로 골랐다. 보통 DC모터 드라이버가 드라이버 1개 당 DC모터 2개를 제어할 수 있으므로 2개를 구매했다. 
개당 가격은 3,740원



배터리 
- 배터리는 전에 구매해놓은 적이 있는 3.7V 500mah Li-Po 배터리를 사용하기로 했다. 
가격은 잘 기억이 안나지만 5,200원 선일 것이다.



8520 코어리스 모터 
- 모터 역시 예전에 구매해놓은 것인데 유튜브 영상에서 레이서스타 제품이 성능이 높게 나온 것을 보고 뱅굿에서
구매한 모터이다. 일단 RPM이 53500으로 보통 45000정도인 다른 제품보다 높다. 가격은 4개 한묶음으로
15,922원
유튜브 : https://youtu.be/AMWXXCHrHto



프로펠러
- 프로펠러 역시 모터와 함께 구매해 놓은 것으로 유튜브 동영상에서 가장 성능이 높게 나온 것으로 선택한 것이다.
킹콩 65mm 프로펠러이고 10쌍 가격은 5,679원 
유튜브 : https://youtu.be/VtKI4Pjx8Sk



수신기 
- DC 모터 드라이버와 마찬가지로 송수신기 역시 별도의 부품으로 만들어야 한다. 실내 공간이므로 블루투스로도
충분하지만 보다 저렴하기도 하고 예전에 싱글콥터 만들 때 이미 nRF24L01+ 모듈 기반으로 만들어 둔 송신기와 
코드를 재활용할 수도 있어 수신기 역시 nRF24L01+ 모듈을 선택했다. 가격은 1,100원



송신기
- 앞에서 말했듯이 2017년에 싱글콥터 만들 때 만들어놓은 송신기를 재활용 할 것이다. 송신기는 아두이노 나노와
듀얼 조이스틱 모듈 그리고 nRF24L01+ 모듈로 만들어져있다.


가조립과 무게


일단 모든 것을 직접 제작하기로 한 후 가장 걱정이 되는 것은 드론의 무게였다. 워낙에 무게가 적게 나가는 미니 드론이다
보니 1~2g도 영향을 크게 미친다고 하는데 많은 부품들이 기판에 소형화되어 올려진 전용 보드에 비해 개별로 부품을
사용하다보니 무게가 너무 많이 나가지 않을까 걱정이 되었던 것이다. 일단 부품들을 쌓아 올려 무게를 한 번 재보았다.
완성이 된다면 케이블 등으로 인해 무게가 조금 더 늘겠지만 일단 배터리를 포함한 부품만의 무게는약 60g이었고 여기서
배터리를 제외하면 약 42g으로 생각보다는 많이 나가지 않았다.




그리고 부품들을 프레임에 배치를 해보았다. 두 번째 걱정은 작은 프레임 안에 덩치가 큰 부품들을 제대로 배치할 수
있을까 하는 문제였다. 특히나 DC모터 드라이버가 덩치가 커서 조금 걱정이 되었는데 드론 바닥쪽으로 붙여보니 나름
적절하게 배치가 되었다.




정리


일단 이번 주말은 여기까지 진행을 해보았다. 아마 다음주부터는 제대로 골머리좀 썪을 것 같다.
우선 아두이노 프로 미니가 USP 포트가 없는 관계로 USB to TTL모듈을 이용하여 프로그램을 업로드 해야 하기도 하고
각 부품의 배선을 어떻게 하느냐도 문제다. 당연히 프로그래밍도…ㅠ.ㅠ


특히 부품간의 배선은 무게를 최소화 하기 위해 핀헤더라든지 아두이노용 점퍼 케이블은 사용하지 않고 굵기가 가는
래핑와이어를 사용하려고 하는데 납땜을 하자니 조금 귀찮고 그렇다고 절연 테이프로 하자니 그건 또 그것 대로 귀찮고…


일주일간 방법을 잘 모색해보고 다음 주말부터 본격적으로 시작해보자.


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^




아두이노를 이용한 온도/습도/먼지 측정기


일단 EMQ + Kafka + Hadoop + HBase + Spark의 구성으로 클러스터 구성 작업은 마무리가 되었다.
그리고 현재 시점에 추후 정리하겠지만 센서 데이터 처리를 위한 openTSDB와 시각화를 위한 Grafana까지
추가로 설치를 완료한 상태이다.


구슬이 서말이라도 꿰어야 보배라고 아무리 클러스터를 구성하고 각종 시스템을 그럴듯하게 설치를 해놔봐야
전기 먹는 하마 밖에 더 되겠는가? 각 시스템의 용도에 맞는 처리를 해보고 그 흐름을 알아야 진정한 목표를 이루는
것일 터다. 게다가 개발자의 역할을 갖고 있는 나로서는 아마 백날가도 운영을 위한 클러스터에 하둡을 설치할
기회는 없을 것이다. 이렇게 보면 진정한 목표는 이러한 빅데이터 생태계에서 개발자로서의 역할을 활용할 지점을
찾는 것이라 보아야 한다.


어쨌든 기본적으로 필요한 것은 데이터이고 그래서 우선 간단하게 아두이노와 온습도 센서, 먼지 센서 등을 이용하여 
센서데이터를 수집해보기로 했다. 하지만 전혀 간단하지 않았다…ㅠ.ㅠ 오늘은 그 힘든 여정을 살펴보자


흔하디 흔한…하지만 유니크한…


사실 내가 하는 작업의 대다수는 거의 4~ 5년 전에 이미 누군가 시도했던 일들이다. 앞서 진행한 클러스터 구성도
그렇지만 아두이노를 이용하여 온도/습도/먼지를 측정하고 이를 데이터로 저장한 후 챠트를 이용하여 시각화 해서
보여주는 작업은 웬만큼 아두이노를 아는 사람들이라면 이미 오래 전에 해보았던 작업들이다.


그런데…남들 보다 센서 하나 더 붙인 것이 이렇게 특이한 상황을 만들어낼 줄은 꿈에도 몰랐다…ㅠ.ㅠ


일단 구성품을 보자.


아두이노 MEGA 2560

아두이노 메가 2560


ESP8266-01 Wi-Fi 모듈

ESP8266-01


DHT22 온습도 센서

DHT22


GP2Y1010 미세먼지 센서

GP2Y1010


DS3231 RTC 모듈

DS3231


네오픽셀 LED 모듈

네오픽셀 LED


LCD 모듈 (Nokia 5110)

Nokia 5110 LCD


몇가지 부품들은 설명이 좀 필요할 것 같은데…우선 RTC 모듈은 시간의 흐름에 따른 데이터를 저장해야 하기에
시간 정보가 필요하였고 부가적으로 화면에 시간과 날짜를 표시하기 위해 추가하였다. 다음으로 네오픽셀 LED
모듈의 경우 먼지 센서의 측정값에 따라 직관적으로 농도를 표시하기 위해 LED가 필요했는데 일반 LED로 4가지
색상을 표시하거나 RGB LED를 사용하기에는 아두이노 나노에 남는 입출력 핀이 부족하여 조금 비싸지만 네오픽셀
LED를 사용하게 되었다.


주의사항


혹시라도 그럴리는 없겠지만… 이 글을 보면서 바로 작업을 진행하는 분들이 계실지 몰라 주의해야 할 사항을 먼저 
언급해 두어야겠다.


처음 작업을 시작할 때에는 완성품의 부피를 줄이고자 아두이노 나노로 시작을 하였다. 핀수가 적긴 하지만 그래도
위에 언급한 부품들을 꼭 맞게 연결할 수 있을 정도는 되었다. 그러나 다른 곳에서 문제가 생겼다. 많은 센서들을
연결하다보니 사용하는 라이브러리 수가 늘어났고 또 Wi-Fi 모듈을 통해 MQTT 통신을 해야 하다보니 문자열
코딩이 많아졌다.


사실 아두이노로 그래도 적지 않은 작업을 했지만 역시 문돌이는 문돌이라 여전히 모르는 것 천지다보니 처음에는
완성된 온습도계가 자꾸 리셋되는 이유를 몰랐다. 이곳 저곳을 검색한 후 아두이노의 메모리 문제라는 것으로 판단하고 
그 해결책으로 pgmspace를 include하여 문자열에 대해 F함수 처리를 하였지만(F(“string”)) 그것으로는 역부족이었다. 


결국 아두이노를 나노에서 메가로 교체를 하였다(사실 아두이노의 스펙을 잘 몰라 중간에 우노도 한 번 사용을 했다).
이렇게 교체되는 과정에서 아두이노 사이즈가 커지는 바람에 나노나 우노에 맞춰 만든 외장 케이스가 못쓰게 되어버렸다.
열심히 드릴질까지 해가면서 야심차게 만들었는데…ㅠ.ㅠ


참고로 아두이노에는 3가지 영역의 메모리가 있으며 그 중에 개발자들이 활용할 수 있는 영역은 SRAM이다.
아두이노 종류에 따른 메모리 용량은 아래 표와 같다(나노는 우노와 동일하다).



소프트웨어적으로는 MQTT 통신을 위한 PubSubClient 라이브러리에서 주의를 좀 해야 한다.
이 라이브러리를 초기화 하기 위해서는 Wi-Fi 객체가 Client 타입이어야 하며 이를 지원하는 라이브러리가
몇가지 있는데 나는 그 중에 WiFiEsp를 사용하였으며 이러한 라이브러리를 사용하기 위해서는 ESP8266 모듈의
펌웨어도 AT25-SDK112 firmware라는 펌웨어를 사용해야 했다.


결론은…많은 센서를 사용하게 된다면 입출력 핀 문제 뿐만 아니라 메모리 문제 때문에라도 아두이노 메가를 사용하는
것이 안전하다는 점이다.


아두이노와 센서들의 연결


워낙에 많은 센서들을 부착하다보니 전체 배선도를 표시하는 것은 그리기도 또 읽기도 쉽지 않을 것 같아
각각의 센서 연결도를 따로따로 보여주도록 하겠다.


ESP8266-01


DHT22


GP2Y1010


DS3231 RTC


네오픽셀 LED


Nokia 5110 LCD


코드 작성


전체 코드가 조금 길기는 하지만 우선 주석과 함께 모두 올려본다.


//  Wi-Fi 모듈을 PubSubClient와 함께 사용하기 위해 선택한 ESP8266용 라이브러리
#include <WiFiEsp.h>
#include <WiFiEspClient.h>

// MQTT 통신을 위한 라이브러리
#include <PubSubClient.h>

// DHT22 온습도 센서 라이브러리
#include <DHT.h>

// DS3231 RTC 모듈 라이브러리
#include <DS3231.h>

// Nokia5110 LCD 사용을 위한 라이브러리
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// 네오픽셀 LED 사용을 위한 라이브러리
#include <Adafruit_NeoPixel.h>

// 메모리 관리를 위한 F함수 또는 PROGMEM을 사용하기 위한 헤더파일. 아두이노 메가를 사용하는
// 시점에서 큰 의미는 없어졌음
#include <avr/pgmspace.h>

// MQTT 서버 주소
IPAddress server(123, 123, 123, 123);
// 공유기 SSID와 비밀번호
char ssid[] = "ABCDEFG";
char pass[] = "password";

// Wi-Fi 모듈 상태를 표시하기 위한 변수
 int status = WL_IDLE_STATUS;

// WI-Fi 모듈 객체 선언
WiFiEspClient espClient;
// Wi-Fi 객체를 파라미터로 MQTT 통신을 위한 clietn 생성
PubSubClient client(espClient);

// DHT22 사용을 위한 데이터 핀 설정과 모델 타입 매크로 선언
#define DHTPIN    5
#define DHTTYPE   DHT22

// DHT22 사용을 위한 객체 생성
DHT dht(DHTPIN, DHTTYPE);

// GP2Y1010 측정 핀과 측정을 위한 내부 LED 연결 핀 설정
int measurePin = A0;
int ledPower = 6;
 
// 먼지 측정을 위해 필요한 각종 변수 선언 (자세한 내용은 타 사이트 참조)
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
 
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

float totSum = 0;
float totCnt = 1.0;
float prevD = 0.0;

// DS3231 RTC 모듈 객체 생성
DS3231  rtc(SDA, SCL);
// 날짜와 시간 표시를 위한 변수
char *dateStr;
char *prevDateStr = "";

// Nokia 5110 LCD 사용을 위한 객체 생성
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 8, 9, 10, 11);

// 네오픽셀 LED  사용을 위한 핀 번호 및 LED의 index 매크로 선언
#define PIN 4   
#define LEDNUM 1  
// 네오픽셀 LED 사용을 위한 객체 생성
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDNUM, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  // 시리얼 초기화
  Serial.begin(9600);
  // Wi-Fi 모듈 사용을 위한 Serial1 초기화 
  Serial1.begin(9600);
  WiFi.init(&Serial1);

  // Wi-Fi 모듈 연결 여부 확인
  if (WiFi.status() == WL_NO_SHIELD) {
    while (true);
  }
  
  // AP에 접속
  while ( status != WL_CONNECTED) {
    status = WiFi.begin(ssid, pass);
  }

  // MQTT를 위한 서버 정보 설정 및 콜백함수 설정. 나는 MQTT publishing만 할 것이기에
  // 콜백 함수는 빈 함수로 남겨둠
  client.setServer(server, 1883);
  client.setCallback(callback);
  
  // 기타 설정들은 다름 함수로 뺌
  otherSetting();
  delay(2000);
}

void otherSetting() {
  // DS3231 RTC 모듈 초기화
  rtc.begin();

  // 시작 날짜와 시간을 설정하는 코드로 최초 사용시에만 필요함
//  rtc.setDate(25, 1, 2018);
//  rtc.setTime(23, 21, 45);
//  rtc.setDOW(4);
  
  // 네오픽셀 LED 초기화
  strip.begin();
  pinMode(ledPower,OUTPUT);

  // Nokia 5110 LCD 초기화
  display.begin();
  display.setContrast(65);
  display.setTextSize(1);
  display.setTextColor(BLACK);

  // DHT22 초기화
   dht.begin();
}

void callback(char* topic, byte* payload, unsigned int length) {
  //MQTT 통신에서 subscrib시 필요한 내용이나 나의 경우 publish만 하므로 그냥 비워둠
}

void loop() {
  // 메인 루프에서는 MQTT 통신이 끊어져있으면 연결을 하고 연결되어있으면 데이터를 모아서
  // MQTT 서버로 전송하는 작업을 진행함
  if (!client.connected()) {
    // 연결이 끊어져있으면 다시 연결 시도	
    reconnect();
  } else {
    // MQTT 서버에 연결되어있으면 데이터를 수집하여 MQTT 서버로 보냄
    getValueAndSendData();
    // 위 작업을 5초마다 한 번씩 수행
    delay(5000);
  }
}

void getValueAndSendData() {
  // 온도, 습도측정 값을 담을 변수를 선언하고 DHT22 센서로부터 측정값을 받아옴
  float temperature = dht.readTemperature(); 
  float humidity = dht.readHumidity();
  // 먼지 센서의 경우 조금 복잡한 계산이 필요하여 따로 함수 처리를 함
  float d = getdust();

    // 간혹 먼지 센서에서 노이즈값이 나오므로 이에 대한 처리를 해줌(값자기 100 가까운 값이
    // 나오기도 하나 음수에 대해서만 처리했음
    if (d < 0.0) {
      d = prevD;
    }

    prevD = d;

    // DS3231로부터 요일값을 받아옴
    dateStr = rtc.getDOWStr(FORMAT_SHORT);

    // 현재 먼지 센서의 측정 값을 순간값이 아닌 그 시점까지의 그날 평균으로 보여주고 있으며(1일 평균)
    // 날짜가 바뀌면 다시 처음부터 계산하도록 처리함
    if (prevDateStr == dateStr) {
      totSum += d;
      totCnt += 1.0;
    } else {
      totSum = d;
      totCnt = 1.0;
    }

    prevDateStr = dateStr;

    float avgD = totSum / totCnt;

    // 먼지 측정 값에 따라 네오픽셀 LED의 색상을 변경함
    if (avgD <= 30) {
      strip.setPixelColor(0, 0, 0, 255); 
    } else if (avgD <= 80) {
      strip.setPixelColor(0, 0, 255, 0); 
    } else if (avgD <= 150) {
      strip.setPixelColor(0, 255, 255, 0); 
    } else if (avgD >= 151) {
      strip.setPixelColor(0, 255, 0, 0); 
    }
    strip.show();

    // 센서 데이터들을 JSON 포맷으로 만들어 MQTT 서버로 전송함
    // 이 JSON 포맷은 시계열 데이터용 NoSQL인 openTSDB에 넣기 위한 포맷임
    // 주의할 것은 PubSubClient 라이브러리는 전송 가능한 패킷 사이즈가 128byte로 
    // 기본 설정되어 더 큰 크기의 패킷 전송을 위해서는 MQTT_MAX_PACKET_SIZE 값을
    // 변경해주어야 한다. 나는 넉넉하게 1024로 설정했다.
    char attributes[393];
    String dtStr = String(rtc.getUnixTime(rtc.getTime()));
    String payload = F("[");
          payload += F("{");
          payload += F("\"type\":\"Metric\"");
          payload += F(",");
          payload += F("\"metric\":\"mqtt.home.pcroom\"");
          payload += F(",");
          payload += F("\"timestamp\":"); payload += dtStr; 
          payload += F(",");
          payload += F("\"value\":"); payload += String(temperature); 
          payload += F(",");
          payload += F("\"tags\": {"); 
          payload += F("\"type\":\"temperature\",");
          payload += F("\"loc\":\"pcroom\"");
          payload += F("}},");
          
//    payload.toCharArray( attributes, 131 );
//    client.publish("/mqtt", attributes);
    //Serial.println(attributes);
    
          payload += F("{");
          payload += F("\"type\":\"Metric\"");
          payload += F(",");
          payload += F("\"metric\":\"mqtt.home.pcroom\"");
          payload += F(",");
          payload += F("\"timestamp\":"); payload += dtStr; 
          payload += F(",");
          payload += F("\"value\":"); payload += String(humidity); 
          payload += F(",");
          payload += F("\"tags\": {"); 
          payload += F("\"type\":\"humidity\",");
          payload += F("\"loc\":\"pcroom\"");
          payload += F("}},");

//    payload.toCharArray( attributes, 131 );
//    client.publish("/mqtt", attributes);
    //Serial.println(attributes);
    
          payload += F("{");
          payload += F("\"type\":\"Metric\"");
          payload += F(",");
          payload += F("\"metric\":\"mqtt.home.pcroom\"");
          payload += F(",");
          payload += F("\"timestamp\":"); payload += dtStr; 
          payload += F(",");
          payload += F("\"value\":"); payload += String(avgD); 
          payload += F(",");
          payload += F("\"tags\": {"); 
          payload += F("\"type\":\"dust\",");
          payload += F("\"loc\":\"pcroom\"");
          payload += F("}}");
          payload += F("]");
    
    // String 타입으로 만든 JSON 문자열을 byte 배열로 변경한 후 서버로 publishing
    // "/mqtt"는 토픽 이름
    payload.toCharArray( attributes, 393 );
    client.publish("/mqtt", attributes);

    //Serial.println(attributes);
    
    // 날짜, 시간, 요일, 온도, 습도, 먼지 등의 값을 LCD에 출력
    display.clearDisplay();   
    display.setCursor(0,0);
    display.print(rtc.getTimeStr(FORMAT_SHORT));
    display.print(F(" ["));
    display.print(dateStr);
    display.print(F("]\n"));
    display.println(rtc.getDateStr(FORMAT_LONG, FORMAT_BIGENDIAN, '-'));
    display.print(F("\nT: "));
    display.println(temperature, 1);
    display.print(F("H: "));
    display.println(humidity, 1);
    display.print(F("D: "));
    display.print(avgD, 1);
    display.display();
}

// MQTT 서버에 연결이 안되었을 시 재연결하는 함수
void reconnect() {
  while (!client.connected()) {
    // 아래 connect 함수를 통해 전달하는 3개의 문자열은 그냥 임의로 정해도 됨
    if (client.connect("ARDUINO", "mazdah", "abcdefg")) {
      Serial.println(F("connected"));
    } else {
      Serial.print(F("failed"));
      delay(5000);
    }
  }
}

// 먼지 측정을 위한 함수
// 고수들은 한번 측정된 값을 사용하지 않고 짧은 시간에 여러번 측정을 하여 그 평균을 사용함
float getdust(){
  digitalWrite(ledPower,LOW);
  delayMicroseconds(samplingTime);
  voMeasured = analogRead(measurePin);
  
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH);
  delayMicroseconds(sleepTime);
  
  calcVoltage = voMeasured * (5.0 / 1024);
  dustDensity = (0.17 * calcVoltage - 0.1) * 1000.0;
  return(dustDensity);
}


코드가 좀 길기는 하지만 어려운 코드는 없다. 다만 나의 경우 앞서 말한 것 처럼 메모리 용량이 적은 아두이노를 
사용했다가 원인불명(?)의 리셋으로 한참을 시간 낭비 했고 MQTT 라이브러리의 특성을 잘 몰라 또 한참 시간을 
낭비하게 되었다. MQTT 관련한 시간 낭비 중 하나는 코드에 주석처리한 전송 패킷 사이즈 문제였고 다른 한가지는
지속적으로 데이터를 송신하지 않으면 네트워크가 끊어지는 것이 당연한데 데이터를 보내지도 않으면서 자꾸
MQTT 네트워크가 끊어지는 것이 코드나 센서 이상이라고 생각해서 꽤나 고민했다. 결국은 내가 데이터를 보내기
시작하면서 이해를 하게 되었다.


결과물


처음 아두이노 나노와 우노를 이용해서 만들었을 때 그에 준하여 케이스를 만들었다. 예전에 샀던 블루투스
스피커의 아크릴 포장 케이스가 마침 딱 알맞은 크기였기에 거기에 공기를 통하게 하기 위한 구멍을 열심히
뚫어서 나름 예쁜 모양을 만들었는데…


메모리 문제로 아두이노 메가로 바꾼 후 더이상 아두이노와 센서들이 깔끔하게 케이스 안으로 들어가질 않는다.
결국 내장을 뽑아낸 채 이렇게 볼쌍 사나운 모습으로 열심히 데이터를 모으고 있다…ㅠ.ㅠ


사실 모듈 배치를 고려하지 않은 부분도 있었다. 아무래도 연결된 센서(특히 ESP8266)나 아두이노 자체에서도
발열이 있기에 아무리 구멍을 뚫었다 할지라도 좁은 공간에 함께 넣게 되면 온도 측정에 심각한 영향을 미치게
된다. 먼지 센서도 가급적이면 통풍이 잘되도록 신경을 써주어야 한다.


정리


시작할 때 생각했던 것보다 많이 어려웠고 또 시간도 많이 잡아먹었다.
하지만 그만큼 새로운 사실들도 많이 알게되어 결코 낭비만은 아니었다고 생각한다.


사실 애초에 온/습도 또는 먼지를 측정하여 처리하는 내용은 워낙 흔해서 수집할만한 다른 데이터가 없을지
많이 고민을 해보았다. 그런데 은근히 만만치가 않았다. 생각 외로 아두이노 센서 중에 데이터를 수집할만한
센서가 그리 많지 않았다. 어떤 데이터를 모을까 생각하며 시간을 축내기보다는 흔한 작업이지만 일단 데이터를
모아보자는 생각에 이와 같은 작업을 진행하게 되었다. 사실 중요한 것은 앞서 구성한 클러스터를 통해
정상적으로 데이터를 처리할 수 있는지 확인하는 것이 우선이었으니까…


다음 포스팅에서 정리하겠지만 우선 이렇게 만든 온습도계를 통해 데이터를 모아 MQTT 서버를 거치고 Apache
Kafka를 통해 openTSDB에 저장을 하고 Grafana를 통해 시각화 하는 부분까지는 정상적으로 된 것 같다
(하지만 세부적으로는 Kafka쪽에 더 살펴봐야 할 것이 남아있다). 맛보기로 현재 들어오고 있는 데이터에 대한
Grafana 챠트를 올린다.

grafana


일단 기본적인 작업을 성공하였기에 다음에는 조금 더 큰 작업을 해보려고 한다. 내 수준에서 가능할지는 모르겠지만
메카넘 휠을 사용한 차량형 로봇으로 모터의 회전 수와 회전 방향, 거리 센서를 통한 데이터, 충돌 센서 및 충돌 스위치 
센서를 통해 충돌시 실패 감지 등의 데이터를 수집하고 이를 인공지능으로 분석하여 낮은 수준의 자율주행차를 만들어
볼 계획이다. 내 지식 수준에서 바로 될 수는 없는 장기 목표라서 올해 말쯤에나 결과를 볼 수 있겠지만…^^;;;


이 작업이 성공하면 다음은 자율주행 드론에 도전!!!


암튼 하고 싶은 것이 널려서 참 행복한 한 해가 될 것 같다.
그래도 우선 다음 포스팅에서는 센서데이터 -> MQTT -> Kafka -> openTSDB -> Grafana로 이어지는 데이터
처리에 대해 알아보도록 하겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^