[39호]BC ECO-Ship(블루투스 제어 친환경 배)
2016 ICT 융합 프로젝트 공모전 참가상
BC ECO-Ship(블루투스 제어 친환경 배)
글 | 한국해양대학교 박동욱, 공정배, 김희수, 강병조, 강윤성, 오성윤
심사평
뉴티씨 친환경 배라는 개념으로 쓰레기 수거 등에 쓰일 수 있는, 말하자면 바다의 드론을 구현한 좋은 작품이다. 바다에 버려진 많은 쓰레기들을 장기적으로 로봇배 등을 이용해 수거한다는 개념은 예전부터 있어왔지만, 실제로 구현한 사람들은 많지 않다. 이번에는 모터 선정이나 전원소스 등의 잘못된 선정과 계산으로 잘되지는 않았지만, 앞으로 좀 더 노력하면 좋은 작품이 나올 것으로 생각된다. 꼭 좋은 쓰레기 수거용 배를 만들어 우리의 해양환경이 조금이나마 깨끗해지기를 기대한다.
칩센 드론의 영역이 확대되는 시기에 활용목적을 심도 깊게 고민한 흔적이 보입니다. 해양을 운행할 내구성과 구동되는 전력을 감당하는 문제 및 비용의 문제는 지금 기성품으로 나와있는 드론(소형무인기기) 제품들도 풀어야 할 숙제입니다.
위드로봇 ECO-ship 작품은 아이디어가 좋습니다. 쓰레기를 치우는 과정을 시민들의 체험으로 바꾸는 발상이 재미있습니다. 단, 선체의 완성도나 전체 시스템의 완성도가 떨어지는 점이 아쉽습니다. 좀 더 보강하면 좋은 작품이 될 수 있을 것 같습니다.
작품 제목
Bluetooth Control Ecology Ship은 블루투스로 제어하는 친환경 배라는 뜻이다.
작품 개요
‘세계 경제포럼’에 따르면, 2050년까지 바다에 떠있는 플라스틱 쓰레기의 무게가 바다 속에 있는 물고기의 양을 넘어선다는 결과가 나왔다. 이러한 결과는 해상의 쓰레기들이 매우 심각한 문제로 성장해가고 있다는 것을 이야기한다.
해상 쓰레기 문제는 우리 생활 가까이서 관측할 수 있었다. 등교를 하며 보이던 바다쓰레기는 이의 심각성을 깨닫게 해주었고, 이에 획기적인 아이템을 만들어 저렴한 비용과 효과적인 방법으로 ‘바다생태계 문제해결’이 필요하다고 느꼈다. 이러한 발상에서 우리는 바다의 쓰레기를 수거해 해안가를 깨끗하게 하는 해상용 쓰레기 처리 드론의 개발에 착수했다.
해상의 쓰레기를 회수하는 방식은 해수면에 내밀어져 있는 그물 위에 있는 쓰레기를 들어 올려 선체에 담는 방식이고, 이때 쓰레기와 함께 수거되는 해수는 펌프를 통해 배출한다. 동력방식은 선체 위에 달려있는 프로펠러가 공기를 밀어내 풍압으로 움직이게 되고 조타부분은 프로펠러 뒤의 방향타가 진행할 풍향을 제어하는 방식이다. 이 드론을 사용자가 손쉽게 제어할 수 있도록 블루투스 통신 방식을 적용하였다. 이를 통해 현재 범용화된 기기인 스마트폰을 통하여 누구나 쉽게 제어가 가능하다. 이로써 시민들에게 색다를 체험을 하게 해주어 해상 쓰레기의 심각성을 전달할 수 있는 효과가 예상된다.
작품 설명
주요 동작 및 특징
(가) 주요 동작
본 작품의 구성은 5개의 파트로 구분된다.
· 쓰레기 처리부 : 해상쓰레기를 들어 올려 물을 뺀 후 선체에 보관한다.
· 동력부 : 조타 장치를 향해 팬을 돌려 추진력을 공급한다.
· 조타부 : 풍향을 바꿔 선체의 진행 방향을 전환한다.
· 펌프부 : 선체에 담겨진 쓰레기에 고이는 해수를 배출한다.
· 통신제어 : 블루투스 모듈로 선체와 어플리케이션간의 컨트롤 신호를 수신한다.
먼저, 선체의 앞에 달린 쓰레기 처리부에서는 해상쓰레기를 천천히 들어 올려서 물을 뺀 뒤 담을 수 있게 설계하였다. 그 모양은 그물과 선체의 접합부 양옆에 달린 서보모터가 그물을 들어 올리는 방식으로 되어있다. 그물의 들어 올리는 속도는 출력하고자 하는 목표치에 따라 전압을 달리주어 조절할 수 있다. 올리는 속도는 빠르게 하여 최대토크가 걸리게 했고 쓰레기를 담고 그물을 내릴 때는 토크를 비교적 약하게 걸어 천천히 내려오게 전압값을 조절했다.
선체 뒷부분에 있는 동력부는 해상드론이 진행할 수 있게 DC모터의 최대 RPM으로 프로펠러를 회전시켜 출력되는 공기의 힘으로 진행하게 해준다.
동력부 뒤에 연결한 조타부는 동력부에서 출력하는 풍압을 한쪽으로 쏠리게 만들어 방향을 제어하게 하는 역할을 한다. 형태는 ㅁ자 상자모양의 통풍 케이스 가운데에 두 개의 방향타가 병렬로 동시에 동작하도록 이루어져있으며, 좌·우 45도 꺾을 수 있다.
중앙에 있는 펌프부는 선체 앞에 달린 쓰레기 처리장치에서 미처 빼지 못해 선체에 고여 있는 해수를 해상으로 배출한다. 이때 흡기관을 몸체 바닥중앙에 놓고 배기관을 선체 바깥쪽방향으로 둔다.
마지막으로 무선통신부는 앞에서 설명한 4개의 동작을 모두 제어하는 통신방식으로 스마트폰 어플리케이션을 통한 블루투스 통신이 가능하게 한다. 블루투스로 스마트폰과 연결된 MCU에 입력한 명령어를 스마트폰 어플리케이션의 버튼에 설정해두고 누르면 MCU에 명령어가 입력되어 그 동작을 취하게 되는 방식이다.
육상에서 구동wnddls BC ECO-Ship |
(나) 특징
몸체는 방향전환이 자유로우면서 해상에 잘 뜨는 형태인 타원형으로 하고, 이에 적합한 소재로 일상에서 흔히 쓸 수 있는 전등갓을 사용하였다. 또한 부력의 부족함을 해결하기 위해 몸체 아래 부분에 고무 튜브를 고정시켰다.
물에서 쓰레기 처리장치의 올리는 힘이 부족함을 고려해 무게중심을 추가하기 위해 추를 매달아 적은 힘으로도 정지마찰력을 이겨낼 수 있도록 설계하였다. 또한 추는 안정적으로 그물을 들어 올리고 내리는 작용도 한다.
전등갓, 자전거 고무 튜브 외에도 방충망, 낚시 추, 밀폐용기와 같은 일상에서 흔히 쓸 수 있는 재료들을 가지고 만들어서 매우 친환경적이다.
작품의 동작 환경이 쓰레기가 떠다니는 부두 연안임을 고려한다면, 수중에서 스크류의 출력으로 이동할 경우에 쓰레기가 얽히는 문제가 생긴다고 판단하였다. 그래서 동작의 방식은 공기부양정의 이동방식을 응용해 해상드론의 윗부분에서 풍압으로 이동하는 방식으로 채택했다.
해상에서 사용하기 때문에 방수가 필수적이다. 배선을 길게 늘어뜨려 전선 피복이 누전을 방지하며, 전선이 들어가는 부분마다 글루건으로 봉합을 해주었다. 그리고 프로펠러 고정부위에 밀폐 용기를 두어, 뚜껑을 반대로 붙여넣을 것이다. 밀폐 용기에 구멍을 뚫어 선을 통과시킨 후 밀폐 용기 구멍에 통과한 선들 사이에 빈틈이 없도록 글루건으로 봉합을 해주었다.
전체 시스템 구성
그림 1. 전체 완성 사진 |
(가) 동작신호제어
전체적인 동작 시스템은 사용자의 스마트폰 어플리케이션을 통해 MCU가 제어하게 된다. 아두이노(MCU)와 사용자를 연결해주는 무선방식은 스마트폰 앱을 통한 블루투스 통신이 가능하게 한다. 블루투스 통신은 범용적인 통신 방식이며 거리는 10m 내 사용이 가능하고 사용자가 흔히 가지고 있는 스마트폰에 간단한 인터페이스를 통해 조절이 가능하다. 이를 통해 사용자는 자기가 원하는 동작을 해안가에서 배에 실시간으로 신호를 줘서 작동시키게 할 수 있다. 아두이노와 배 사이의 신호는 유선으로 연결되어 있다. 이로써 블루투스 컨트롤러로 각 key에 맞게 원하는 동작을 출력하여 쓰레기를 올려 담으며 선체에 남아있는 물을 빼거나 원하는 방향으로 진행할 수 있도록 기능별 다양한 모습을 나타낼 수 있다.
그림 2. 신호흐름구성도 |
(나) 전력시스템
전체 전력시스템은 12V 배터리에서 시작되어 동력부, 펌프부, MCU에 전력을 공급하고, MCU가 낮은 전압을 분배하여 출력을 컨트롤 하게 된다. 선체 앞의 해상쓰레기 처리 장치는 모터 쉴드로 부터 MCU가 공급을 제어하게 구성했고, 조타부는 저전력 서보모터로 구성하여 MCU에서 전력과 신호를 동시에 제어하게 하였다. 이 모든 것을 제어하는 사용자가 명령어를 전달받는 블루투스 모듈 또한 MCU 자체전력으로 공급하고 제어한다.
총 2개의 DC전력을 사용하였는데, 동력부와 펌프부에 공급하는 리튬폴리머 건전지와 아두이노에 공급하는 알카라인 건전지를 사용하였다.
전력공급을 따로 해주는 이유는 쓰레기 처리장치의 순간 출력이 커져 배터리가 쉽게 방전될 수 있기 때문인데, 이 때문에 12V를 AA사이즈 알카라인 건전지 8개로 분리시켰다. 그리고 비교적 일정한 전압을 쓰는 펌프부와 동력부에는 충전식 리튬폴리머 건전지를 사용하였다.
리튬폴리머 건전지(12v)로 작동되는 파트 : DC모터, 펌프
알카라인 건전지로 작동되는 파트(12.0v) : 아두이노, 블루투스통신, 쓰레기 처리부, 조타부
개발 환경(개발 언어, Tool, 사용시스템)
(가) Arduino IDE
아두이노 제품군을 제어하는 데에는 제조사에서 기본적으로 제공하는 통합개발환경(IDE)를 사용하였다. C언어 기반의 명령어를 사용하며, 제공하는 다양한 라이브러리와 기본적인 스케치 예시들을 활용하여 제작하려는 작품의 하드웨어를 스케치 하는데 적합했으며 Arduino 및 Make 포럼을 참고하여 작품 구현하는데 필요한 기술적 정보를 수집하는데 수월했다.
그림 3. Arduino sketch |
(나) Arduino UNO
ATMEGA328 기반으로 제작된 MCU인 Arduino UNO는 Arduino 제품들의 기준이다. 따라서 다른 Arduino 제품들과 하드웨어의 호환성이 높다고 판단하였고, 모터 쉴드를 다루는데 쉽게 접근할 수 있었다. 또한 작품에서 요구하는 하드웨어 제어능력은 모터 쉴드를 통해 DC모터 2개와 서보모터 3~4개와 제어하는 것, 그리고 블루투스 모듈을 사용해 스마트폰과 통신하는 것이었고, 이는 UNO의 스펙이면 충분한 연산능력이라고 판단하여 MCU로 Arduino UNO를 선택하고 작품을 제작했다. 아래 스펙을 보면 외부전원 연결시 최대 20V까지 버틸 수 있어 12V이하 기기를 다루는데 적합하다고 생각했다.
그림 4. Arduino specification |
(다) Bluetooth Controller
스마트폰 어플리케이션으로 블루투스 통신을 쉽게 해줄 수 있는 어플리케이션이어서 선택했다. Google play에서 무료로 배포되고 있으며 스마트폰에서 블루투스 통신을 통해 모듈에 명령어를 전송해주는 역할을 한다. AVR, ARM 등 임베디드 시스템에서 사용가능하다. 따라서 AVR기반의 아두이노 또한 사용이 가능하다.
사용 방법은 우선 스마트폰 설정에서 블루투스를 켜고, 화면 상단에 받은 데이터가 표시되고 키를 누르면 데이터를 보낼 수 있게 되어있다. 키 설정을 통해 키 이름과 데이터를 설정할 수 있다.
1. 장치검색을 눌러 장치를 연결한다.
2. 키 설정을 눌러 키 이름과 보낼 데이터를 설정한다.
3. 키를 눌러 원하는 데이터를 전송한다.
단계별 제작 과정
아이디어 회의
ICT 공모전에 따른 아이디어 회의를 시작하였다. 브레인스토밍을 통해다양한 의견이 나왔다. 그 중 “Sea bin Project”라는 오스트레일리아의 서퍼 2명(앤드류 터튼, 피트 세글린스키)이 바다에 버려진 수백만 톤의 쓰레기를 담는 해상쓰레기통 프로젝트에 이야기에 초점이 맞춰졌다. 결론적으로 기존의 부둣가 근처에서의 고정 장착식의 방식에서 벗어나 움직일 수 있는 해상용 드론 쪽에 무게를 두게 되었다. 해수면 표면의 쓰레기 수집이 목적이었고, 쓰레기 수거방식에 대해서는 컨베이어 벨트 방식, 흡입식, 뒤에 그물망을 따로 다는 방식, 로봇팔로 들어올리는 방식 등 다양한 의견들이 나왔다. 구동방식은 물속에서 스크류를 돌리는 방식, 돛을 이용한 방식, 노를 젓는 방식, 호버크래프트(공중부양선)등의 아이디어가 나왔다.
그림 6. 씨빈프로젝트 작동 사진 |
제작 초기
그림 7. 앤드류 터튼과 피트 세글린스키. 우측은 그들이 만든 제작도이다. |
제작 초기에는 몸체와 재료의 선택이 중요했다. 부력을 크게 해서 뒤집어지지 않게 하기 위해선 표면적이 넓은 아크릴 재질의 몸체가 필요했다. 일상에서 흔히 쓸 수 있는 전등갓의 형태가 적합하다 판단되었고 물 속에 띄운 결과 해수면과의 높이차가 작아 물이 많이 유입 될 것 같았다. 그래서 부력을 좀 더 주기위해 고무 튜브를 낚싯줄로 엮어 고정시켰다.
<그림9>와 같이 선체 앞부분 쓰레기 처리부는 쇠판과 철조망을 덧대어 레진으로 단단히 고정시켰다. 처음에는 컴퓨터에서 공급되는 MCU 내부전력만으로 쓰다가 실험 결과 전력이 부족해서 외부전력 9V를 달아 출력을 높였다. 지상에서의 실험 결과 처음에는 쓰레기 처리부분이 들어 올려 지지 않았지만 외부전력으로 바꾸고 나서는 쉽게 들어 올려졌다. 프로펠러의 지면과 마찰은 일정이상의 거리를 유지하도록 정비했다. 각 문제를 개선하고 해상에서의 1차 실험을 시도해보았다.
그림 9. 제작초기 Proto-model |
1차 해상실험
학교 앞 바다에서 실험을 진행했다. 외부전력(9V)의 힘에도 물을 머금은 쓰레기를 들어 올리지 못했다. 또한 무리한 동작요구에 회전부에 심한 손상을 발견했다. 이에 모터 교체 및 외부전력을 12V로 높였다. 이러한 조치에도 무게의 부담감은 여전히 존재했고, 이는 무게 추를 달아서 물체의 정지마찰력을 줄임으로써 해결했다. 이후 쓰레기 처리부의 원활한 동작을 확인하고 조타 제작에 돌입했다. 조타는 기존의 한 방향 진행을 좌우로 움직일 수 있도록 했다. 이번 1차 실험을 통해 쓰레기 처리 장치의 경량화 및 방향 조절 가능한 조타와 방수 기능을 첨가했다.
그림 10. 서보모터 교체작업 |
최종완성 및 시현 영상
1차 해상 실험 후 선체 앞부분 쓰레기 처리부를 가볍게 구성하기 위해 옷걸이를 사용하여 무게를 경량화 했고, 조타장치를 달아 방향조절이 가능하게 했다. 조타장치의 상단부분을 아크릴로 구성한 이유는 투명하게 하여 방향타가 제대로 작동되는지 확인하기 위해서이다.
그림 11. 해상에서 구동 이미지 |
작품의 가치
기존의 작품들과 차이점
현재 해상 쓰레기 문제는 연안에서만 이슈화되어 크게 논란이 되고 있지는 않다. 하지만 앞서 말한 세계 경제포럼에 따르면 해상 쓰레기 문제는 점점 확대되어 2050년에는 매우 심각한 세계 문제로 자리잡을 것이라 예측하고 있다. 이러한 문제를 해결하고자 ‘씨빈(Seabin)’과 ‘마린드론(Marine Drone)’ 같은 다양한 발명품이 있다. 그러나 이러한 발명품들은 큰 부피에 고정식으로 전력 또한 선착장에서 끌어서 오기 때문에 위험하고 비효율적일 수밖에 없으며, 따라서 고도의 기술과 전문가들의 취급을 요하게 되었다.
우리는 이러한 기존의 작품들의 문제점을 다른 방식으로 해결하고자 한다. 따라서 작품은 제작이 쉽고 일반시민들이 간편하게 사용할 수 있도록 만들어졌다. 다양한 계층의 사람들이 본인의 휴대폰만으로 편리하게 연결가능 하다는 데서 접근성이 뛰어나며 그와 함께 해양생태계를 아름답게 보존하는데 의의를 둔다.
한계점 및 개선방안
완성된 작품은 쓰레기의 무게를 나타내는 장치를 아직 구현하지 못했다. 이는 선체에 담긴 쓰레기양이 부력을 넘어서게 될 경우 침몰할 수도 있다는 의미이기도 하다. 이는 앞으로 감압센서와 같은 무게를 측정하는 센서를 설치하여 값을 LCD로 표현하고자 한다. 더불어 그 값을 휴대폰으로 전송하여 멀리서도 쓰레기의 양을 정확한 수치로 알 수 있게 된다.
기대효과
(가) 창의성
바다쓰레기의 많은 비중을 차지하는 플라스틱을 바탕으로 제작했다. 이는 실제 수거한 쓰레기들을 가지고 제작하여 비용 절감을 이끌어 낼 수 있다. 또 작품은 고정식이 아닌 유동성을 띄고 있어 원활한 작업 수행이 가능하다.
(나) 사업성
쓰레기가 많은 해안가에 해상용 드론을 대여해주고 kg당 일정금액을 받는다. 이런 시스템을 효율적으로 운영하여 해양쓰레기를 수요하는 3D프린트 오션 플라스틱 신발이나 예술작품에 사용한다. 이러한 제도는 시민의식을 고양하는 동시에, 국민들에게 신뢰받는 사업아이템이 될 수 있다.
(다) 경제성
해상용 드론 한 개를 만드는데 재활용품을 제외한 구입비용은 5만원이다. 기존에 나와 있는 씨빈이나 마린드론을 한 대를 제작하는데 드는 비용에 1000배 절감할 수 있고 각 인원들이 드론을 조정하기에 인원수만큼 영역범위가 넓어진다.
(라) 실용성
이 작품으로 관광산업이 활성화가 된다면 사용자를 국제적으로 늘릴 수 있다. 전 세계인이 동참하여 하는 활동이기에 쓰레기가 발생된 시간만큼 빠르게 줄어들 것으로 보인다. 처리방법과 비용에 대해 어떤 나라도 선뜻 나서지 못한 상황에서 핵심기술로 뽑히면 환경개선에 NO.1이 될 것이다.
기타(회로도, 소스코드, 참고문헌 등)
회로도
(가) 아두이노 회로도
모든 신호는 아두이노 MCU에서 받아들여 컨트롤하게 되어있다. 외부전압 12V를 아두이노에 인가하면 아두이노 내 MCU가 자동으로 전력을 제어하게 된다. 아두이노 우노 위에 모터 쉴드를 얹게 되면 모터쉴드는 핀 4번부터 7번까지 자동 할당받게 된다. 이 부분이 쓰레기 처리부의 서보모터이다. 무선통신을 위해 블루투스모듈을 받는 부분과 보내는 부분을 각 단자 2,3번에 꼽고 아두이노 자체전력 5V를 인가시킨다. 조타 모터 또한 블루투스와 같이 아두이노 자체 전력을 쓰지만 신호선은 하나만 있으면 된다. 그 외 동력부와 펌프부는 각 12번, 13번 핀에 신호를 연결하여 외부전력을 공급받는다. 외부전력 공급회로도는 다음 장을 참고 바란다.
그림 12. 아두이노 핀 번호별 용도 |
(나) 동력부, 펌프부 전력제어 회로도
12V를 사용하는 DC모터와 펌프는 아두이노만으로는 제어하기 힘들어, 아날로그 회로를 사용하여 증폭시켰다. 즉 아두이노 신호(5V)를 스위치 작용 효과를 내는 IC소자 FDS6990A를 달았다. 스위치 작용 효과란 게이트(G) 단자에 신호(5V)를 흘려보내면 드레인(D)과 소스(S) 사이에 전류가 인가되고 만약 (G) 단자에 신호(0V)가 없으면 D와 S가 닫히는 스위치 작용을 말한다.
FDS6990A란 IC소자는 두 개의 MOSFET으로 구성되어 있는 파워트렌치소자이다. 이 IC특징은 다이오드가 달려있어 역전류를 방지하여 트랜지스터를 보호해준다. 그리고 용량은 Vdss가 +30V까지 버틸 수 있고 Vgss는 -20 V에서 + 20V까지 신호를 받아들일 수 있어서 우리가 사용하는 신호 5V와 공급되는 전압 12V에 적합한 소자였다.
IC소자 하나로 동력부와 펌프부를 제어할 수 있게 한다. <그림11>와 같이 아두이노 13핀과 12핀에 펌프(P)와 DC모터(M)를 제어하기 위해 신호선을 배당한 뒤 G1. G2에 신호를 보내면 P와 M에 각각 Vds에 전류가 흐르게 되어 전력을 제어할 수 있게 된다.
그림 13. 전력계통 회로도 |
소스코드
#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial BTSerial(2, 3);
Servo myservo1;
Servo myservo2;
/* HC-06의 TX,RX을 pin 2,3에 연결 */
void setup()
{
int i;
for(i=4;i<=7;i++)
pinMode(i, OUTPUT); /*Arduino Motor Shield의 pin 4~7값 지정*/
Serial.begin(9600); /*PC와 연결*/
BTSerial.begin(9600);/*블루투스 연결*/
myservo1.attach(8); /* pin8에 servo를 부착 */
myservo2.attach(9); /* pin9에 servo를 부착 */
pinMode(12, OUTPUT); /* MOSFET의 Gate1과 12pin 연결 */
pinMode(13, OUTPUT); /* MOSFET의 Gate2와 13pin 연결 */
}
int EN1 = 5; /* Motor1의 아날로그 값 입력을 위해 pin5 지정 */
int EN2 = 6; /* Motor2의 아날로그 값 입력을 위해 pin6 지정 */
int IN1 = 4; /* Motor1의 디지털 값 입력을 위해 pin4 지정 */
int IN2 = 7; /* Motor2의 디지털 값 입력을 위해 pin7 지정 */
void Motor1(int pwm, boolean reverse)
{
analogWrite(EN1 ,pwm);
/*Motor1을 0에서 정지하고 255에서 최고속도를 내도록 PWM을 제어*/
if(reverse)
{
digitalWrite(IN1,HIGH);
}
else
{
digitalWrite(IN1,LOW);
}
}
void Motor2(int pwm, boolean reverse)
{
analogWrite(EN2,pwm);
/*Motor2를 0에서 정지하고 255에서 최고속도를 내도록 PWM을 제어*/
if(reverse)
{
digitalWrite(IN2,HIGH);
}
else
{
digitalWrite(IN2,LOW);
}
}
void loop()
{
if (BTSerial.available())
Serial.write(BTSerial.read());
/* 블루투스 신호 -> PC 시리얼모니터 */
if (Serial.available())
BTSerial.write(Serial.read());
/* PC 시리얼모니터 -> 블루투스 */
char val;
while(1)
{
val = BTSerial.read();
if(val!=-1) /* 블루투스 통신 제어가능 */
{
switch(val)
{
case ‘a’: /* 담기 */
Motor1(250,true);
Motor2(250,true);
break;
case ‘b’: /* 복귀 */
Motor1(150,false);
Motor2(150,false);
break;
case ‘c’: /* 쓰레기 처리장치 정지 */
Motor1(0,false);
Motor2(0,false);
break;
case ‘d’: /* 프로펠러 가동 */
digitalWrite(12, HIGH);
break;
case ‘e’: /* 펌프 가동 */
digitalWrite(13, HIGH);
break;
case ‘f’: /* 프로펠러 펌프 정지 */
digitalWrite(12, LOW);
digitalWrite(13, LOW);
break;
case ‘g’: /* 조타 왼쪽 */
myservo1.write(40);
myservo2.write(40);
break;
case ‘h’: /* 조타 0도 */
myservo1.write(20);
myservo2.write(20);
break;
case ‘i’: /* 조타 오른쪽 */
myservo1.write(-80);
myservo2.write(-80);
break;
}
}
}
}
참고문헌
아이디어 회의(Tool)
아두이노란 무엇인가? http://blog.naver.com/3demp/220378933583
개발환경(사용시스템)
블루투스 컨트롤 구글play 어플리케이션(https://play.google.com/store/apps/details?id=apps.BT)
아이디어 회의
씨빈 프로젝트 http://www.seabinproject.com/
[39호]아두이노 레오나르도를 품은 윈도우10 컴퓨터 LattePanda(라테판다)
아두이노 레오나르도를 품은 윈도우10 컴퓨터
LattePanda(라테판다)
글 | 금강초롱(blog.naver.com/crucian2k3)
임베디드 세계에 절대강자가 등장한 것으로 보입니다. 팬더곰 눈을 연상시키는 로고가 선명한 라테판다라는 보드인데요 널리 알려진 라즈베리파이를 통해 무언가를 해보려 하면 늘 상 아쉬운 것이 A/D컨버터가 없다는 점이며 아두이노 보드로 좀 근사한 무엇인가를 해보려고 한다면 성능에 대한 갈증을 느끼게 된다는 점입니다. 이러한 시장 상황에 따라 32비트 MCU를 장착하기도 하고 Wi-Fi, BT4.0 등으로 중무장한 보드가 이미 출시되어 있기는 합니다만 모두 PC 혹은 리눅스 운영체제와 연동하여 동작한다는 특성이 있습니다.
금번에 소개하는 라테판다는 윈도우10이 구동되는 초소형 PC에 ATmega32u4로 구성된 아두이노 레오나르도 칩이 코프로세서로 설치되어 있어 뭔가 재미난 일을 하게 해줄 수 있을 것 같은 기대감이 들기에 충분합니다.
PC로서의 성능은 인터넷 웹서핑을 하거나, 유튜브 동영상을 보거나, 지금 작성 중인 한글워드프로세서를 사용하는데 거의 불편함이 없는 수준입니다. 그냥 느끼는 피상적 성능은 넷북급 PC 내지는 이동성을 중시하는 저가형의 윈도기반의 태블릿PC 정도를 다루는 느낌 정도입니다.
개발환경은 PC 인지라 무엇을 설치하던 크게 상관이 없을 수 있습니다만 제작사 권장으로는 Visual Studio 2015를 설치하고 firmata라고 하는 프로토콜로 PC와 아두이노를 연결하여 여러가지 재미있는 실험을 해볼 수 있도록 제시하고 있습니다.
여기서 미리 언급해 두고 싶은 사항은 라테판다는 일반 고성능 PC가 아니므로 화려한 그래픽작업이나 3D게임 등을 염두해 두셨다면 재고해 보시라 하고 싶습니다.
이제 Windows10 + 무선랜 + 블루투스4.0 + USB3.0 + 아두이노 레오나르도로 탄탄하게 준비된 라테판다의 매력 속으로 빠져 들어가 보겠습니다. 여기에 덧붙여 7인치 IPS DISPLAY와 터치스크린을 장착하면 차량 등에서도 자유롭게 사용가능한 상태가 되며 이 제품을 활용하여 HMI(Human Machine Interface) 등 제어판넬 등으로도 손쉽게 적용을 수 있을 것으로 보입니다.
본 리뷰는 (주)엔티렉스의 지원을 받아 작성 하였습니다.
1. 개봉 및 Wi-Fi 안테나 설치하기
박스 외관은 라즈베리파이와 별반 다르지 않은 듯 합니다만 내용물은 많은 차이가 보입니다. 가장 눈에 띄는 부분이 금속 쉴드판이며 3핀 몰렉스 커넥터가 일렬로 쭉 늘어져 있어서 실험을 쉽게 해보라고 만들었구나 하는 생각이 들게 합니다.
제일 먼저 할 일은 Wi-Fi 안테나를 연결하는 작업입니다.
이러한 류의 보드는 인터넷에 연결되지 않으면 거의 정상적으로 사용하기 힘듭니다. 라테판다 박스를 열면 Wi-Fi 안테나용의 매우 작은 금도금커넥터가 붙은 안테나가 보이며 USB커넥터 부근에 붙이면 됩니다.
2. 윈도우10 인스톨
2.1. 라테판다용 파워서플라이 관련 사항
라테판다에 전원을 안정적으로 공급하기 위해서는 DC5V/2A 이상의 전원이 필요합니다. PC와 같은 수준의 능력을 발휘하는 제품이므로 안정적인 동작을 기대한다면 당연히 전원도 충분한 것으로 준비해야 합니다.
필자가 라즈베리파이 보드 테스트 등에 주로 사용하는 S사의 DC5V2A충전기는 라테판다보드에서는 적절하지 않았습니다. 잘 동작하는 듯 보이다가도 일순간 재부팅을 유발하더군요. 하는 수 없이 아래와 같은 자작 전원을 연결해 실험을 진행 하였습니다.
이 글을 읽는 독자님들 중 라테판다보드가 재부팅하는 증상이 있다면 우선 견실한 전원으로 교체해 보실 것을 권합니다.
2.2 라테판다 켜는 방법
위에서 언급한 바와 같이 안정적인 전력을 공급하는 직류전원을 라테판다에 연결합니다.
· 권장 : DC5V/2.5A
추가적으로 무선키보드&마우스 및 HDMI 케이블 연결 등을 해두어야 윈도우10 초기화를 원활히 진행할 수 있습니다.
약 5초 동안 적색램프가 켜졌다가 꺼집니다.
보드 초기화가 일어나는 과정으로 전원이 투입된 직후 단 한번 일어납니다. 이때는 다른 버튼 등은 만지지 마시고 적색램프가 꺼질때 까지 잠시만 기다려 줍니다.
적색램프가 꺼진 것을 확인한 후 약 1초간 파워버튼을 눌러주면 부팅이 진행됩니다.
만일 HDMI포트에 모니터가 연결된 경우나 LCD 디스플레이를 이미 끼워 두었다면 부팅장면을 보실 수 있습니다.
2.3. 지역정보 등 초기화
라테판다 32G 버전은 이미 Windows10이 라이센싱 되어 있습니다.
그렇다 하더라도 최초 설치는 필수 사항입니다. HDMI케이블, USB키보드, 마우스 등을 연결하고 전원을 투입합니다.
표준시, 국가 등 로케일 정보를 적절히 맞춰줍니다.
(대한민국 : Korea, Korean(Korea), Microsoft IME, (UTC+09:00)Seoul)
부팅하는 과정에서 무선랜 설정작업과 인터넷 접속이 진행됩니다.
라테판다를 사용할 유저 계정을 생성하면 일단 끝이 납니다.
아마도 한 이틀쯤 지나면 윈도우 업그레이드 안내창이 나올 것입니다.
3. 라테판다의 기술적 특성
3.1 라즈베리파이 재단의 최신 제품과 스펙 비교
참고 : www.dfrobot.com/index.php?route=product/product&product_id=1404 |
대표적인 차별점
· Co-Processor 장착 : Atmega32u4(아두이노 레오나르도 호환)
· 운영체제 설치 : 라이센싱 된 Windows10이 내장 출고됨(32G 버전)
· USB3.0 Port 지원 : 라테판다를 NAS 용도 등으로 활용시 위력 발휘 예상
· 고해상도 LCD DISPLAY 지원 : 1024×600의 고해상도 지원
3.2. 체리트레일 vs 베이트레일 CPU성능 비교
필자가 가끔 사용하는 10.1인치 윈도기반 태블릿 PC와 비교를 해봤습니다. DRAM의 용량이 1,947MB와 1,492MB로 라테판다가 약 500MB가 더 크며 그 외에는 별 차이가 없었습니다. 벤치마크 테스트에서는 수치상으로 약간 낮아 보이기도 합니다.
4. 개발환경 준비하기
4.1. Visual Studio2015 Community 설치하기
아래 주소에서 Visual Studio2015 Community를 다운받아 설치를 합니다.
www.visualstudio.com/downloads
이 글을 읽는 독자님들께서 좀 의아해 하실 수도 있습니다만 라테판다 자체가 PC이므로 PC기반의 각종 기능 구현을 위해서는 개발환경 중 무상으로 다양한 개발언어를 지원해주는 비주얼스튜디오2015커뮤니티 설치는 필수 불가결한 요소에 해당됩니다.
Free download를 누르면 아래와 같이 진행됩니다.
여기에서 중요한 것이 좌측편의 위 그림과 같이 “Custom”을 선택하여 개발환경이 모두 설치 되도록 선택하여야 번거로움을 덜 수 있습니다.
프로그램을 완전히 설치하는데 수 시간이 걸리므로 느긋하게 진행합니다.
4.2. 코프로세서(아두이노 레오나르도) 기본 기능 점검
보드에 있는 LED의 Blink테스트를 통해 기본적인 소통을 해 봅니다.
· 라테판다 바탕화면에 기본적으로 설치되어 있는 아두이노 아이콘을 더블클릭합니다.
· Blink 프로그램 예제를 files ▶ Examples ▶ 01.Basics에서 open 합니다.
· 시리얼포트를 Tools ▶ Serial Port에서 선택합니다.
· Upload를 합니다.
· 프로그램이 제대로 내려가면 청색 LED가 점멸하는 것을 볼 수 있습니다.
5. 보드 레이아웃
5.1. 각 핀의 특별한 기능 정리
· U1 : X-Z8300 코어
· U2 : ATmega32u4 코어
· 20핀 디지털 핀
· A0-A5, D0-D13, U2에 연결됨
· 5V신호체계, 40mA 입출력, 20k~50kΩ
· 풀업저항 내장 (기본 off)
5.2. 각 핀 기능
5.3. 보드 내 커넥터 정의
6. Visual Studio에서 아두이노 핀 제어하기
6.1. Firmata(퍼마타) protocol 환경 구성
라테판다에서는 기본적으로 c#상에서 돌려볼 수 있는 예제를 제시하고 있습니다.
여기에서 보드 내에 실장된 아두이노와 Windows10을 서로 소프트웨어적으로 연결해야 하는데 Firmata 프로토콜을 활용하고 있습니다.
Firmata 프로토콜은 원래 MIDI라는 전자악기에 사용된 시리얼 통신 프로토콜로 이를 변형시켜 PC와 아두이노 간에 데이터를 주거니 받거니 할 수 있도록 만들어진 것입니다. 이 Firmata를 사용하면 Visual C++와 같은 컴퓨터프로그램에서 아두이노의 I/O를 제어할 수 있게 됩니다. 이렇듯 아두이노와 PC가 연결되면 PC의 강력한 성능과 친근한 UI를 기반으로 사용하기 편리한 아두이노를 마음대로 제어할 수 있으므로 원격제어 원격모니터링 등을 매우 쉽게 소화해 낼 수 있을 것으로 봅니다.
에러처리를 위한 체크섬이나 CRC 등 검증바이트는 없는 방식이며 간편함과 단순함, 빠른 속도에 포커스를 두고 개발된 프로토콜로 보입니다.
6.2. 아두이노에 Firmata프로토콜 올리기
아두이노IDE ▶ 파일 ▶ 예제 ▶ Firmata ▶ StandardFirmata를 선택한 후 업로드를 합니다. 이 작업을 하면 아두이노와 PC가 Firmata 프로토콜로 서로 연결되게 됩니다.
잘 동작되는지 기본적인 테스트는 뒤에서 설명되는 BlinkYourBoard 프로그램으로 해보기로 합니다. 살짝 복잡해 보일 수도 있습니다.
6.3. C# 기반의 라테판다 제어용 라이브러리 살펴보기
6.3.1. 생성자(Constructor)
생성자는 아래와 같이 4가지 종류가 있습니다.
필요에 따라 적절한 것 하나를 선택할 수 있습니다.
6.3.2. 환경설정(Configuration)
핀 동작 환경을 설정합니다.
윈도우10 쪽에서 이 명령이 아두이노로 넘어가면 해당 핀이 적절히 초기화 됩니다.
6.3.3. 디지털 제어신호
□ 디지털 출력 : pinMode 메소드와 결합하여 디지털 신호를 토글링 합니다.
□ 디지털 입력 : 디지털 핀의 최종 상태가 읽혀져 반환됩니다.
□ 디지털 입력 : 입력 핀으로 설정된 핀의 값이 업데이트 됩니다.
6.3.4. 아날로그
□ PWM 출력 : 8비트 펄스폭변조(PWM) 기능을 활용하여 아날로그 신호를 내보낼 수 있는 기능을 제공합니다.
□ 아날로그 신호 입력 : 10비트의 분해능을 가진 신호 6개를 받을 수 있습니다.
□ 아날로그 신호 입력 : 아날로그 입력을 새롭게 받을 수 있습니다.
6.3.5. 서보제어
서보를 제어하기 위한 각도 값을 지정된 핀으로 출력합니다.
6.3.6. I2C(TWI)
□ I2C통신초기화 : I2C버스를 마스터로 초기화를 합니다. 최초에 1회만 수행합니다.
□ I2C통신요구 : I2C 디바이스 쪽으로 데이터를 내보내거나 받을 수 있으며 만일 수신시 내부적으로 didI2CDataReveive()가 호출됩니다.
□ I2C통신 이벤트
7. C# 기반의 프로그래밍 테스트
7.1. 프로그래밍 절차 정리
필자가 라테판다를 접하며 가장 난해하였던 부분입니다만 이 부분을 나름대로 이해하고 정리하여 아래에 서술해 보았습니다.
일반적으로 아두이노향 체계에서 테스트하는 것과 약간의 차이가 있으며, 더군다나 c# 환경에서 코드가 만들어지고 실행되므로 초심자는 좀 어려워 할 수도 있습니다만 아래를 따라서 차근차근 해볼 수 있도록 최대한 자세히 언급해보고자 합니다.
○ Intel CPU : GUI 제공
○ ATmega32u4 : 실제 실행 액션
○ 상호연동 : Serial, 57600bps
7.2 디지털 출력 함수(digitalWrite) 테스트
디지털 출력함수 동작을 통해서 아두이노의 온보드 빌트인 LED인 D13을 점멸시켜 보도록 합니다. 아두이노를 맨 처음 배우면 테스트해보는 LEDBlink의 라테판다 버전이라고 생각하시면 됩니다.
이 짧은 예제 하나를 성공시키면 라테판다, Visual Studio c#, Firmata, Arduino를 두루두루 섭렵해보게 되는 것입니다.
□ 회로구성
아두이노 우노 R3 버전의 제품은 기본적으로 D13핀에 LED가 연결되어 있는 전통에 따라 아두이노 레오나르도 향으로 설계된 라테판다에서도 D13에 LED가 연결되어 간단한 테스트를 해볼 수 있습니다.( D13의 출력 ▶ High : LED On, Low : LED Off)
□ 소스코드 구조
□ blinkYourBoard의 소스코드 (Program.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using LattePanda.Firmata;
namespace blinkYourBoard
{
class Program
{
static void Main(string[] args)
{
Arduino arduino = new Arduino();
arduino.pinMode(13, Arduino.OUTPUT);//Set the digital pin 13 as output
Console.WriteLine(“Blink Your Board.”); // 라테판다 화면에 메시지 출력
while (true)
{
// ==== set the led on or off
Console.WriteLine(“set the LED on”);
arduino.digitalWrite(13, Arduino.HIGH); //라테판다보드의 D13 LED on
Thread.Sleep(1000);//delay a seconds
Console.WriteLine(“set the LED off”);
arduino.digitalWrite(13, Arduino.LOW); //라테판다보드의 D13 LED off
Thread.Sleep(1000);//delay a seconds
}
}
}
}
□ blinkYourBoard 콘솔화면(도스창)
□ blinkYourBoard 프로젝트 소스코드 편집
7.3 디지털 입력 함수(digitalRead) 테스트
라테판다에 푸시버튼을 1개 연결하여 테스트를 해보기로 합니다.
본 리뷰의 주최 측에서 테스트를 위한 센서 세트를 배려해 주었으므로 지금부터는 여기에 담겨진 센서 등을 사용해서 간단한 테스트를 해 보도록 하겠습니다.
□ 회로구성
□ 소스코드 : digitalRead > Program.cs
새로운 솔루션을 하나 만든 후 아래 소스코드를 Program.cs에 부어 넣습니다. 또한 이전 예제에서 사용한 Arduino.cs도 솔루션에 포함시켜 컴파일 하여야 에러가 없이 정상적으로 컴파일이 됩니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using LattePanda.Firmata;
namespace buttonDemo//your project name
{
class Program
{
// 인스턴스를 생성하고 기본 파라메터들을 초기화 한다.
static Arduino arduino = new Arduino();
static void Main(string[] args)
{
// pin9를 디지털 입력포트로 초기화 한다.
arduino.pinMode(9, Arduino.INPUT);
// 핀9를 한번 읽어 상태를 저장해 둔다.
int Value = arduino.digitalRead(9);
Console.WriteLine(Value);
// 이벤트 리스너를 등록해 입력으로 설정한 핀에 변화가 있거든 이벤트가 생기도록 한다.
// 즉, 계속하여 해당 포트의 상태가 변하였는지를 읽는(폴링) 하는 행위를 하지 않아도 된다.
arduino.digitalPinUpdated += Arduino_digitalPinUpdated;
while (true);
}
// 해당 핀에 업데이트가 발생하면 이 함수가 자동으로 호출이 된다.
private static void Arduino_digitalPinUpdated(byte pin, byte state)
{
Console.Write(pin);
Console.Write(“: “);
Console.WriteLine(state);
}
}
}
7.4 PWM(Pulse Width Modulation) 테스트
D3, D5, D6, D9, D10, D11은 PWM 기능을 지원하며 이 핀에 고휘도 LED를 연결하면 디밍 동작을 관찰해 볼 수 있습니다.
□ 회로구성
□ 소스코드 : pwm
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using LattePanda.Firmata;
namespace analogWriteExample
{
class Program
{
// 인스턴스를 생성하고 기본 파라메터들을 초기화 한다.
static Arduino arduino = new Arduino();
static void Main(string[] args)
{
arduino.pinMode(9, Arduino.PWM);
while (true)
{
for (int i = 0; i <= 255; i++)
{
arduino.analogWrite(9, i);
Thread.Sleep(4);//delay 4ms
Console.WriteLine(i);
}
for (int i = 255; i >= 0; i–)
{
arduino.analogWrite(9, i);
Thread.Sleep(4);//delay 4ms
Console.WriteLine(i);
}
}
}
}
}
7.5 analogRead 테스트
아날로그 입력은 A0에서 A5까지에서 받을 수 있습니다.
□ 회로구성
□ 소스코드 : analogRead
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using LattePanda.Firmata;
namespace analogReadExample
{
class Program
{
// 인스턴스를 생성하고 기본 파라메터들을 초기화 한다.
static Arduino arduino = new Arduino();
static void Main(string[] args)
{
int Value = arduino.analogRead(0); // A0를 읽는다.
Console.WriteLine(Value);
// 아날로그 입력에 변화가 생기면 이벤트 핸들러가 실행 된다.
arduino.analogPinUpdated += Arduino_analogPinUpdated;
while (true) ;
}
private static void Arduino_analogPinUpdated(int pin, int value)
{
if (pin == 0)
{
Console.Write(pin);
Console.Write(“: “);
Console.WriteLine(value);
}
}
}
}
7.6 Servo 테스트
D9에 연결된 서보모터를 0도에서 180도까지 제어를 해봅니다. 실험에 사용된 서보는 RBD-702MG로 금속기어가 들어간 제품입니다.
어떤 서보를 사용하여도 실험은 문제가 없을 것입니다.
□ 회로구성
□ 소스코드 : servo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using LattePanda.Firmata;
namespace analogWriteExample
{
class Program
{
//
static Arduino arduino = new Arduino();
static void Main(string[] args)
{
arduino.pinMode(9, Arduino.SERVO);
while (true)
{
arduino.servoWrite(9, 170);//tell the servo motor go to the position in 180 degrees
Console.WriteLine(“–>servo motor go to the position in 180 degrees”);
Thread.Sleep(2000);//delay a seconds
arduino.servoWrite(9, 10);//tell the servo motor go to the position in 0 degrees
Console.WriteLine(“<–servo motor go to the position in 0 degrees”);
Thread.Sleep(2000);//delay a seconds
}
}
}
}
8. 7인치 디스플레이와 터치패널
라테판다는 외부에 7인치 IPS LCD와 10점 정전용량 감지방식(정전식) 터치패널을 연결할 수 있습니다.
외부에 HDMI를 통해 모니터가 연결되면 클론모드 혹은 확장모드로 운영할 수 있습니다. 이정도 가격의 제품에서 보여주는 이러한 기능은 놀라울 따름입니다.
해상도는 1024*600으로 매우 뛰어나며 터치 반응도 나쁘지 않다고 생각됩니다.
8.1 외관 살펴보기
□ 박스외관
박스는 7인치 LCD와 멀티터치 패널이 별도로 되어 있으며 커넥터가 매우 약하므로 주의하여 다뤄야 합니다.
□ 장착전 사진
버니어캘리퍼스로 측정해 본 결과 디스플레이면은 약 7.1인치가 나옵니다. 아직 시중에는 터치패널을 수납할 수 있는 case가 출시되지 않은 것으로 보여 집니다. 약간의 부주의로도 플랫 케이블이 손상 될 수 있으므로 주의하여야 합니다.
8.2. 라테판다 바탕화면 변경(테블릿모드)
Windows8.x 부터는 데스크탑과 태블릿모드가 동시에 지원되고 있습니다. 라테판다에 설치된 Windows10도 당연히 태블릿 모드가 되며 태블릿모드에서 어떻게 보여지는 지를 살펴보겠습니다.
□ 디스플레이 설정 변경하기
라테판다에 LCD패널이 연결되면 듀얼모니터 모드가 됩니다.
바탕화면>그래픽속성을 선택한 후 다중디스플레이에서 클론디스플레이를 선택하면 HDMI쪽 영상과 7인치 패널에서 동시에 화면을 볼 수 있습니다.
만일 7인치 LCD패널을 위주로 사용코자 한다면 태블릿 모드까지 변경해주는 것이 좋습니다.
전자액자와 유튜브 동영상을 돌려보고 있는 장면입니다.
커넥터가 매우 약하므로 실험 시 극도의 주의를 요합니다.
단 한번의 실수가 영구적 손상을 불러옵니다.
9. 스타터 센서 셋
라테판다는 6개의 3핀 몰렉스 커넥터를 실장하고 있습니다.
이 커넥터를 이용하여 디지털 3포트, 아날로그 3포트의 실험을 진행할 수 있으며 대체적으로 라테판다 및 아두이노 초심자를 타겟으로 한 센서들로 구성되어져 있습니다.
초등학생부터 중학생 정도의 학생들에게 아두이노의 개념을 설명하고 학습하는 데는 사용할만한 듯합니다.
신제품을 출시하면서 제품을 테스트해 볼 수 있는 센서키트까지 고려한 것을 보면 상당히 착실한 준비를 한 것으로 여겨집니다.
센서는 아두이노 진영이나 라즈베리파이 진영에서도 유명한 DFROBOT사 제품입니다.
참조 : https://www.dfrobot.com/index.php?route=product/category&path=36 |
다만 한 가지 유의사항이 있다면 몰렉스 3핀 커넥터는 5V전원이 인가되어 있으며 이 파워는 라테판다의 CPU에도 똑같이 사용되고 있습니다.
만일 DC모터, 서보 등 돌입전류가 큰 부하를 사용하는 경우 시스템이 재부팅하는 불상사가 생길 수 있습니다.
돌입전류가 큰 부하는 라테판다와 분리된 파워를 사용하는 것이 바람직해 보입니다.
10. 응용해 보기
라테판다는 윈도우기반 컴퓨터이므로 PC의 사용법에 익숙한 유저를 위한 GUI체계가 지원된다는 것은 매우 큰 강점이 아닐까 합니다.
열심히 구글링을 한 결과 github에 올려진 충분히 응용 가능성이 있는 Sample Code를 발견하였고 이를 바탕으로 실험 해본 결과물을 올려 봅니다.
우선 다음 주소에서 데모코드를 다운 받습니다.
github.com/LattePandaTeam/LattePanda-Development-Support
github에 올려진 파일을 윈도우 상에서 받는 방법은 동일합니다.
‘Clone or Download’를 클릭하면 zip 파일을 다운 받을 수 있습니다.
이렇게 다운받은 파일을 적당한 폴더에 풀은 후 Visual Studio에서 불러옵니다.
일전에 실험한 프로그램은 윈도우 콘솔상에서 I/O가 일어나는 프로그램이었으나 이 프로그램은 윈도우 상에서 라테판다의 UI를 구상하는 방법으로 구동이 됩니다.
보드에 실장된 D13 LED를 원격 제어해 ON/OFF 시킬 수 있으며 슬라이딩 바를 움직여 원하는 만큼 서보모터를 구동시킬 수도 있습니다.
또한 PWM을 활용하여 디밍 기능을 테스트해볼 수도 있으며 D11에 연결된 고휘도 LED의 밝기가 원격 제어됨을 확인할 수 있습니다.
□ 소스코드 : 윈도기반의 전형적인 프로그램 구조답게 Form파일과 어플리케이션이 혼합되어 있어 분량이 상당히 크므로 위 웹사이트에서 확인하거나 필자의 블로그(blog.naver.com/crucian2k3)에서 확인이 가능합니다.
11. 총평
한마디로 라즈베리파이의 장점과 아두이노의 장점만을 뽑아서 잘 다듬어 놓은 보드란 생각이 듭니다. PC로 무엇인가를 계획하고 있는 상황이고 가격과 사이즈가 걸림돌인 상황이라면 라테판다는 충분히 고려해 볼 만한 제품이 아닌가 생각됩니다. 또한 교육현장에서 아두이노를 비롯하여 IOT과목을 가르치는 상황에서 좀 더 고수준의 임베디드 프로그래밍을 목표로 하고자 한다면 이 역시 고려해볼 만하다고 봅니다. 즉, PC와 아두이노가 한 몸에 있으므로 매우 낮은 비용으로 효과적인 교육환경을 구성할 수 있게 됩니다. 외부에 5V/2.5A전원, 키보드, 마우스 그리고 와이드모니터가 한 대 있다면 훌륭한 교육장비가 완성됩니다.
이번 리뷰의 전 과정을 라테판다 상에서 작성해 본 결과 워드작업이나 웹서핑을 하는데 아무런 걸림돌이 없음을 알 수 있었습니다. 전자앨범, 동영상플레이어, 원격제어장치, 웹서버, NAS, GAME 머신 등의 용도는 실로 무궁무진할 것으로 봅니다.
필자가 금번에 사용한 모델은 2GB 모델로 다중작업이 아닌 상황에서는 크게 문제가 되지 않았으나 여러 창을 열고 작업을 하는 경우에는 램 부족에 따른 랙 현상이 간혹 보이는 것을 확인 하였습니다. 좀 더 쾌적한 윈도 환경을 원한다면 4GB램에 64GB모델을 검토해 보는 것이 바람직해 보입니다.
퓨전이라는 말을 현대사회에서는 자주 쓰곤 합니다만 금번에 출시된 라테판다는 진정한 퓨전 IOT기기가 맞겠다고 생각합니다. 출시와 동시에 발표된 7인치 IPS LCD와 정전식 10점 터치패널의 색상과 감도는 매우 우수하여 원한다면 태블릿 기기로의 전환도 어렵지 않게 꾸밀 수 있을 것으로 생각되었습니다. 라테판다가 아두이노를 기반으로 하는 IOT세계에 신선한 기폭제가 되기를 바라며 이번 리뷰를 마칩니다. 감사합니다.
자료참고
1. 라테판다 공식홈페이지 : www.lattepanda.com/docs/
2. DFROBOT 센서 : www.dfrobot.com/index.php?route=product/category&path=36
3. 성능 비교검증 www.dfrobot.com/index.php?route=product/product&product_id=1404
4. 임베디드 공작소 : cafe.naver.com/embeddedworkshop/book4866534/1320
5. 뚝뚝이파파님의 블로그(c#에 대한 정보) : blog.naver.com/ambidext/220210257499
6. 가스센서에 대한 정보 : deneb21.tistory.com/279
7. PIR센서에 대한 정보 : fribot.blog.me/60203002180
[39호]카멜레온 DIY LED 이야기 ⑤
카멜레온 DIY LED 이야기 5
LED ART 2 : 특별한 크리스마스 트리
글 | 신상석 ssshin@jcnet.co.kr
디바이스마트 매거진 독자 여러분, 안녕하세요. 앞으로 5회에 걸쳐 [카멜레온 DIY LED 이야기]를 진행할 신상석입니다. 이 이야기는 WS2812B라는 컬러 LED를 기반으로 제작된 [카멜레온 DIY LED] 시리즈를 이용하여 생활에 필요한 다양한 형상을 꾸며보고 이것을 다양한 컬러로 디스플레이 해보는 내용입니다. 앞으로 진행할 내용에 대하여 간단히 알아보면 다음과 같습니다. (약간 변경될 수도 있습니다.) 앞으로 즐겁고 유익한 강의가 될 수 있도록 많은 격려와 성원 부탁드립니다. |
디바이스마트매거진 독자 여러분, 안녕하세요. 반갑습니다.
[카멜레온 DIY LED 이야기] 다섯번째, 어느덧 벌써 마지막 시간이네요.
지난 시간에는 카멜레온 DIY LED(카DL)을 이용하여 [I ♥ U] 모양과 [변색 카멜레온]을 꾸미고 실행시켜 보았습니다. 오늘은 좀 더 멋진 프로젝트로 [특별한 크리스마스 트리] 만들기에 도전해 보겠습니다. 사슴도 만들고, 산타도 만들고, 커다랗고 멋진 눈 결정도 만들고… 그리고 이것들을 엮어서 크리스마스 트리를 만든 다음, 스마트폰으로 트리 점등을 해 보는데까지 씽씽 달려보겠습니다. 야호~ 신난다. “흰 눈 사이로 ♬ 썰매를 타고 ♬ GO~ GO~”
아이템(ITEM) 모듈
지난번 이야기에서 카DL의 기본 구성품 중 4종류의 모듈을 소개한 바 있습니다. BAR 모듈은 직선용, ARC 모듈은 곡선용, DIR 모듈은 방향 전환용, FIGURE 모듈은 기본 도형용으로 소개를 하였지요. 크리스마스 트리를 장식할 여러가지 형상을 만들기 전에, 카DL의 나머지 형상 모듈인 ITEM 모듈을 소개하는 것이 앞으로의 이야기 전개에 편리할 것 같아 이것을 먼저 간단히 살펴보고 가겠습니다. 아이템(ITEM) 모듈은 말 그대로 사람들이 자주 사용할만한 간단한 아이템을 형상화한 모듈입니다.
해(링), 달, 별, 작은화살표, 하트, 눈, 큰화살표의 7가지 모듈이 있는데, 이것은 개별 형상을 가지고 있으므로 단독으로도 사용할 수 있고, 다른 모듈과 조합하여 사용할 수도 있습니다. 창조적인 상상력을 동원하면 이 모듈들을 이리저리 엮어서 또 다른 멋진 아이템을 만들어 낼 수도 있겠습니다.
특별한 크리스마스 트리
카DL로 [특별한 크리스마스 트리]를 제작하기로 하였으므로 일단 어떤 모양으로 어떤 크기로 어떤 기능을 갖도록 만들 것인지를 먼저 고민하여 결정한 후 이것을 제작하도록 하겠습니다. 일단 하고 싶은 것을 죽 나열해 보기로 하지요.
· 내 키 정도 되는(1.5m ~ 2m) 크기의 녹색 트리에 장식한다.
· 카DL의 ARC 모듈을 사용하여 물결 모양의 형상을 만들고, 반짝반짝하는 느낌과 물결이 흘러가는 느낌을 주도록 프로그램한다.
· 카DL의 BAR, FIGURE, ITEM 모듈을 적당히 섞어서 사용하여 알록달록하고 다양한 색상이 나타나도록 프로그램한다.
· 손바닥 정도 크기의 크리스마스 상징물을 카DL을 이용하여 5-6개 만들어 배치하고, 각 상징물의 색상과 움직임이 구별되도록 프로그램한다.
· 얼굴정도 크기로 조금 큰 특별 형상을 1개 만들어 중앙에 배치하고, 은은하게 조금씩 변하도록 프로그램한다.
· 스마트폰으로 그룹별로 껐다 켰다 할 수 있게 프로그램한다.
(사실 이것들을 모두 한꺼번에 다 제작한다고 하면 비용이 꽤 많이 듭니다. 실제로는 자신이 해보고 싶은 것만, 마음에 드는 것만 부분적으로 구현하면 되겠습니다. 별 하나만 제작한다고 해도 충분히 특별한 크리스마트 트리가 될 수 있으니까요.)
어느 정도 아우트라인이 갖추어졌으므로 세부적인 것은 하나씩 구현해 가면서 구체화시켜 보겠습니다.
1단계 : 트리 구입 및 약간의 장식 구입
기반이 되는 트리가 있어야 실제로 구현하면서 적용해 볼 수 있으므로 트리를 우선 준비하여야 하겠습니다. 방울이나 종, 리본 등 크리스마스 기분을 내기 위한 약간의 장식도 함께 준비해 두면 더 예쁠테니 취향에 따라서 원하는 것을 구입하여 준비합니다.
2단계 : 필요한 형상 설계하기
두번째로 할 일은 지난 회에도 언급한 것처럼 형상을 제작하여야 합니다. 트리에 얹혀 있는 형태로 만들면 되므로 필요한 형상을 만들고 이것들을 케이블로 죽 이어가는 형태로 하겠습니다.
기본 형상은 있는 그대로 연결하면 되므로, 크리스마스 기분이 나는 손바닥만한 형상 5-6개와 얼굴만한 큰 형상 1개를 정해서 따로 만들겠습니다. 무엇이 좋을까요? 음… 심사숙고한 끝에…
십자가, 별, 트리, 지팡이, 싼타, 루돌프 이렇게 6가지 형상은 손바닥만한 크기로 만들고, 눈(SNOW) 결정은 얼굴만한 형상으로 조금 크게 구현하는 것으로 하겠습니다.
카DL로 이런 모양을 형상화하여 구현하려면 사실 디자인적인 감각이 약간 필요합니다만, 뭐, 그냥 자신이 원하는대로 만들어도 별 지장은 없습니다. 제 멋에 사는거니까요.
저는 다행히 주변에 디자이너가 있어서 도움을 받아 아래와 같이 형상 설계를 하였습니다.
AUTOCAD 같은 설계도구를 이용하여 만들었기 때문에 상당히 정교하게 제작되었는데, 이런 도구없이 손으로 대강 쓱쓱 그려도 무방합니다.
형상이 마음에 드시나요? 단순하지만 특징을 잘 잡아 잘 표현된 것 같습니다. 저는 매우 만족합니다.
와우~ [눈(SNOW) 결정] 형상! 이건 거의 예술이네요. FIGURE 모듈(JLED-TRI-6)과 ITEM 모듈(JLED-ARROW-9, JLED-SNOW-12) 그리고 BAR 모듈(JLED-BAR-1, JLED-BAR-2)의 5가지 모듈을 적절히 배치하여 아주 독특하면서도 멋진 [눈(SNOW) 결정]을 구현하였습니다. 이것을 보면 정말 웬만한 형상은 카DL의 기본 모듈로 모두 다 구현이 가능할 것이라는 확신이 듭니다. 이것은 매우~ 매우~ 만족입니다.
참, 지난 번에도 이야기한 것처럼, 이와 같은 형상을 만들 때는 연결성도 고려하면서 모듈을 배치해야 하는 것도 잊지 말아야 할 사항입니다. 나중에 LED에 불이 ON 될 때를 고려하면 나름대로 자신만의 규칙성을 가지고 LED에 불이 들어올 때를 상상하며 연결을 하는 것이 좋습니다.
만들어진 형상을 연결을 표시하여 다시 나타내 보겠습니다.
이 중, 십자가 형상은 CON-0 를 이용하여 연결하면 밑판 없이도 연결이 가능할 것 같고, 나머지 형상은 밑판을 대고 카DL을 꽂은 후 뒤에서 CABLE-MM-10이나 CABLE-MM-20과 같은 케이블로 연결하면 될 것 같습니다.
눈결정 형상은 좀 더 복잡한데, 여섯 방향의 메인 직선 형상을 먼저 연결한 다음, 주변의 나머지부분을 연결하는 형태로 된 것을 확인할 수 있습니다. 어쨓거나 자기 자신만의 룰을 이용하여 한 줄로 연결이 되도록 하면 됩니다.
나중에 형상 제작을 위하여 한 가지 팁을 더 말씀드리면 아래와 같이 그림을 그려 놓고 필요한 카DL의 종류와 개수를 적어 놓으면 나중에 모듈을 준비할 때 조금 더 편리할 수 있습니다.
3단계 : 형상 제작하기
자, 이제 설계(디자인)가 완료되었으니 구현할 차례입니다.
모든 카DL을 하나로 모두 연결할 수도 있겠지만 이 경우 전체 LED의 갯수가 너무 많아 제어하기가 어렵기 때문에, 여기서는 4개 그룹으로 나누고 각 그룹마다 아두이노를 하나씩 따로 연결하여 프로그램을 하는 것으로 하겠습니다.
제 1 그룹 연결
ARC 모듈은 기본 형상을 그대로 사용하므로 CON-0 및 CABLE-MM-10 케이블을 이용하여 직접 연결합니다. 최종적으로 만들어진 형상은 아래와 같습니다.
제 2 그룹 연결
BAR, FIGURE, ITEM 모듈도 기본 형상을 그대로 사용하므로 CABLE-MM-20 또는 CABLE-MM-10 케이블을 이용하여 직접 연결합니다. 최종적인 형상은 아래와 같습니다.
제 3 그룹 연결
제 3그룹은 손바닥만한 형상을 설계하여 만든 모듈인데, 이 중 십자가는 아무런 보조 도구 없이 그냥 CON-0를 이용하여 연결하면 되지만, 나머지 형상은 직접 연결만으로는 형상을 만들 수 없으므로 지난번에 살펴본대로 폼보드(2mm) 등을 밑판으로 하여 카DL을 관통하여 모양을 잡고, 뒤쪽에서 CON-0 커넥터와 CABLE-MM-10 또는 CABLE-MM-20 케이블을 이용하여 고정시키는 방법을 사용하여야 합니다. 참, 조립하기 전에 폼보드의 형상은 칼이나 가위 등을 이용하여 미리 알맞게 잘라놓는 것이 좋습니다. 아래는 트리의 경우 앞면과 뒷면의 조립 형상입니다. 직접 연결되는 부분은 CON-0를 이용하여 연결하고 조금 떨어져 있는 경우는 CABLE-MM-10을 이용하여 연결한 것을 알 수 있습니다.
조립을 좀 더 편하게 할 수 있는 팁을 하나 더 알려드리지요. 폼보드 위에 설계한(그린) 도안을 붙이고 이 위에 카DL을 하나씩 순서대로 꼽아가면 눈으로 보면서 조립하는 것 보다는 훨씬 편리합니다. 6가지 형상을 모두 조립한 후의 모습은 아래와 같습니다. 십자가 형상은 CON-0만으로도 연결이 가능하여 밑판없이 제작하였고 나머지 5개 형상은 모두 2mm 두께의 폼보드를 이용하여 밑판을 만든 후 제작하였습니다. 최종적인 형상은 아래와 같습니다.
제 4 그룹 연결
제 4 그룹에 속하는 것은 오직 눈결정 모듈 1개입니다. 제 3그룹의 6개 형상을 제작한 것과 동일한 방법으로 제작하면 됩니다. 최종적인 형상은 아래와 같습니다.
4 단계 : 아두이노 연결하기
이제 만들어진 형상을 제어하기 위하여 아두이노를 연결하도록 하겠습니다. 우리는 스마트폰으로 아두이노를 제어하기로 하였으므로 아두이노에도 무선 모듈을 연결(또는 장착)하여 이를 해결해야 합니다. 스마트폰에서 사용할 수 있는 무선 통신 방식은 와이파이(WIFI)를 이용한 이더넷 통신과 블루투스를 이용한 시리얼 통신이 있는데, 전송하여야 할 데이터의 양이 많지 않으므로 연결하기 쉬운 블루투스 통신 방식을 사용하는 것이 간편하므로 이것을 사용하는 것으로 하겠습니다.
아두이노 UNO를 비롯한 아두이노 모듈은 블루투스 모듈을 내장하고 있지 않으므로 이것을 가능하게 하려면, (1) 블루투스 실드를 장착하여 사용하거나 (2) 블루투스 모듈을 준비하여 케이블로 연결하거나 (3) 아예 블루투스 모듈을 내장한 아두이노를 사용하는 방법이 있습니다. 우리의 경우는 크기와 편의성을 위하여 (3)번 방식을 채택하도록 하며, 여기에 가장 알맞은 아두이노로 JARDUINO-UNO-BTmini(제이씨넷)를 선정합니다.
JARDUINO-UNO-BTmini는 아두이노 UNO와 기능이 호환되며, HC-05 블루투스시리얼 모듈을 내장하고 있는 새끼손가락만한 크기의 모듈입니다. 블루투스 포트 선택 스위치는 HC-05 블루투스시리얼 모듈의 TX/RX 연결 포트를 아두이노 내부의 RX(D0)/TX(D1) 핀으로 연결하거나 D4/D7 핀으로 연결하도록 선택하는 스위치인데, 우리는 이것을 D4/D7로 연결되도록 위치시키고, D4/D7 핀을 SoftSerial 포트로 선언해서 사용할 것입니다. 한편, 카DL 그룹의 첫번째 모듈의 I(Data Input) 핀에 연결할 핀은 임의로 D13으로 할당하겠습니다. 장시간 사용을 염두에 둔다면 안정성을 위하여 JLED-START-1을 JARDUINO-UNO-BTmini와 카DL 사이에 삽입하는 것이 좋지만 짧은 시간 사용하는 것이라면 이것을 생략하여도 무방합니다.
크리스마트 트리 제작에 있어 또 하나 고려할 점은 전원 공급 방식입니다. 몇 개 안되는 모듈을 사용할 때는 USB 케이블을 통하여 제공되는 전원(5V, 500mA)이나, 휴대폰 보조배터리로도 사용이 가능하겠지만, 이번과 같이 한 그룹 당 카DL에 사용된 WS2812B의 개수의 최대치가 약 150개 정도 될 것으로 예상되는 경우는 다른 전원 공급 방법을 사용하여야 합니다. 일단, 필요한 전류량을 계산해보겠습니다.
항목 | 필요 전류량 |
WS2812B 1개 (최대) | 60mA |
WS2812B 150개 (1개 그룹 최대) | 9A (60mA X 150) |
WS2812B 600개 (4개 그룹 최대) | 36A (9A X 4) |
WS2812B 600개 (실제 사용 최대) | 18A (최대치의 1/2 가정) |
이론적인 최대값은 WS2812B의 모든 R, G, B LED가 켜져 있는 상태를 가정한 경우이므로 실제 사용 최대값은 약 1/2 정도로 설정하여도 충분하리라 생각됩니다. 이 경우 전원 공급은 최대 10A짜리 파워서플라이 2개를 사용하여 2그룹씩 제공하여야 할 것 같네요. 물론 4개의 JARDUINO-UNO-BTmini에도 전류를 공급하여야 하는데 이것은 큰 전류량이 아니므로 이것은 한 쪽 파워서플라이에서 함께 공급하면 되겠습니다.
눈결정 그룹에 연결된 모습만 간단하게 나타내면 아래와 같으며, 다른 그룹도 같은 방법으로 연결할 수 있습니다.
5 단계 : 아두이노 스케치 프로그램하기
하드웨어는 모두 완성되었으므로, 이제는 스케치 프로그램을 작성할 시간입니다. 그동안 배운 라이브러리를 이용하여 자신이 원하는 대로 프로그램을 작성하면 되겠습니다. 모든 그룹에 대한 프로그램를 제시하는 것은 양도 너무 많으므로 가장 핵심이 되는 형상인 눈결정에 대한 스케치 프로그램만 살펴보도록 합니다.
스케치 프로그램의 큰 줄기는 아래와 같습니다.
· 블루투스 신호(TX/RX)는 아두이노 D4/D7 핀에 연결되어 있으므로 이것을 SoftwareSerial로 선언하고 처리한다.
· 블루투스 앱을 이용하여 휴대폰으로부터의 [켜짐] 또는 [꺼짐] 명령을 받아, [켜짐] 명령이 오면 LED 동작을 실행하고, [꺼짐] 명령이 오면 LED를 모두 끈다. 따로 명령이 오지 않으면 현재 상태를 지속한다.
· 눈결정 모양은 총 157개의 LED로 구성되는데, 이것을 크게 3부분으로 나누어 프로그램한다. 즉, 처음 108번째까지는 눈(SNOW) 형상의 MAIN 부분으로, 109번째부터 133번째까지는 SUB1 부분으로,
나머지는 SUB2 부분으로 나누어 처리한다.
· 단조로움을 피하기 위해 컬러 및 컬러 변화 시간을 결정할 때 random( ) 함수를 가능한 많이 이용한다.
· 카DL은 밝기가 상당히 밝으므로 눈으로 쳐다 보았을 때 눈이 많이 부시지 않는 정도의 밝기로 처리한다.
· 각 부분의 컬러는 아래의 기준으로 결정한다.
· MAIN : 청색과 녹색의 비중을 강하게 하고, 빨강의 비중은 약하게 함
· SUB1 : 청색과 녹색의 비중을 조금 강하게 하고, 빨강의 비중은 조금 약하게 함
· SUB2 : 청색과 녹색, 빨강 비중을 똑같이 함
· 모든 LED의 컬러가 흰색이 되는 경우와 각 LED의 컬러가 알록달록하도록 하는 경우도 구현한다.
이를 바탕으로 구현한 알고리즘은 아래와 같습니다.
자, 이제 스케치 프로그램을 작성해 보겠습니다. 알고리즘을 보면서 차근차근 구현하면 되겠습니다. 아래를 보시지요.
—————————————————-
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>
#define CDL 13 // 아두이노(JARDUINO-UNO-BTmini) 연결 핀 = D13
#define NUMPIXELS 157 // 눈결정에 사용된 카DL LED의 총 개수
#define SNOW_NUM1 108 // 눈결정 MAIN 골격에 사용된 마지막 LED 번호
#define SNOW_NUM2 133 // 눈결정 SUB1에 사용된 마지막 LED 번호
#define SNOW_NUM3 157 // 눈결정 SUB2에 사용된 마지막 LED 번호
#define BT_RX 4 // 블루투스가 연결된 RX핀 번호 (소프트시리얼로 연결)
#define BT_TX 7 // 블루투스가 연결된 TX핀 번호 (소프트시리얼로 연결)
#define CMD_ON ‘1’ // 휴대폰에서의 카DL 켜기(ON) 명령어
#define CMD_OFF ‘0’ // 휴대폰에서의 카DL 끄기(OFF) 명령어
int mode=CMD_ON; // 시작은 카DL이 켜진 상태
SoftwareSerial btSerial=SoftwareSerial(BT_RX, BT_TX); // 블루투스 시리얼 핀 할당
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, CDL, NEO_GRB + NEO_KHZ800); // 눈결정 구성 = (개수, 핀번호, 기타)
void setup()
{
pinMode(CDL,OUTPUT);
btSerial.begin(115200); // 115200 baud (JARDUINO-UNO-BTmin 기본 셋팅
pixels.begin(); //
randomSeed(analogRead(0)); // 랜덤 초기값 설정
for(uint8_t i = 0; i<=NUMPIXELS; i++)
pixels.setPixelColor(i,pixels.Color(0,0,0)); // 모든 카DL 꺼진 상태에서 시작
pixels.show();
delay(300);
}
void loop()
{
uint8_t r, g, b, command, dummy;
int i;
if (btSerial.available()) // 휴대폰에서의 명령 검사
{ // 휴대폰의 입력이 있으면
command = btSerial.read(); // 값을 저장하고,
while (btSerial.available()) // 기타 다른 입력이 혹시 있으면
dummy = btSerial.read(); // 모두 버림
if (command == CMD_ON) // [켜기] 명령어면
mode = CMD_ON; // [켜기] 모드 세팅
else if (command == CMD_OFF) // [끄기] 명령어면
mode = CMD_OFF; // [끄기] 모드 세팅
else ; // 그 외의 명령어이면 무시!
}
if (mode == CMD_ON) // [켜기] 모드이면
{
r = random(0,16); // 눈결정의 MAIN은 r, g, b를 약한 불빛으로 랜덤하게
g = random(32,64); // 단, 청색과 녹색이 많이 강하도록
b = random(32,64);
for(i = 0; i<=SNOW_NUM1; i++)
pixels.setPixelColor(i,pixels.Color(r,g,b));
pixels.show();
delay(random(100,1000)); // 지속 시간도 0.1초~1초로 랜덤하게
r = random(0,64); // 눈결정의 SUB1은 r, g, b를 약한 불빛으로 랜덤하게
g = random(32,64); // 단, 청색과 녹색이 조금 강하도록
b = random(32,64);
for(i=SNOW_NUM1+1; i<=SNOW_NUM2; i++)
pixels.setPixelColor(i,pixels.Color(r,g,b));
pixels.show();
delay(random(100,1000)); // 지속 시간도 0.1초~1초로 랜덤하게
r = random(0,64); // 눈결정의 SUB2는 r, g, b를 약한 불빛으로 랜덤하게
g = random(0,64); // 단, 모든 색상 가능
b = random(0,64);
for(i=SNOW_NUM2+1; i<=SNOW_NUM3; i++)
pixels.setPixelColor(i,pixels.Color(r,g,b));
pixels.show();
delay(random(100,1000)); // 지속 시간도 0.1초~1초로 랜덤하게
g = b = random(32,128); r = g/2; // (빨강은 광량을 줄여서 처리하여야 비슷하게 됨)
for(i=0; i<=NUMPIXELS; i++)
pixels.setPixelColor(i,pixels.Color(r,g,b));
pixels.show();
delay(random(100,1000)); // 지속 시간도 0.1초~1초로 랜덤하게
for(i=0; i<=NUMPIXELS; i++) // 눈결정의 LED 각각을 모두 랜덤한 다른 색상으로
{
r = random(0,64);
g = random(0,64);
b = random(0,64);
pixels.setPixelColor(i,pixels.Color(r,g,b));
}
pixels.show();
delay(random(100,1000)); // 지속 시간도 0.1초~1초로 랜덤하게
}
else // [끄기] 모드이면
{
for(i = 0; i<=NUMPIXELS; i++) // 모든 LED를 OFF
pixels.setPixelColor(i,pixels.Color(0,0,0));
pixels.show();
delay(1000);
}
}
—————————————————-
카DL의 색상이나 켜져있는 시간 등을 결정할 때 random() 함수를 많이 사용한 이유는 임의성을 주어 실행시 나타나는 패턴이 단조롭지 않게 하기 위함입니다.
6 단계 : 업로드하고 실행시키기
이제 프로그램까지 준비가 되었으니 업로드하고 실행시켜 보겠습니다.
JARDUINO-UNO-BTmini는 아두이노 UNO 호환이므로 업로드시 스케치 프로그램의 [보드] 선택 항목을 ‘UNO’로 선택하면 되고 나머지 업로드 방법은 일반적인 아두이노와 동일합니다. 자, 그러면 가볼까요? GO~
결과가 어찌 되었을까요?
오우~ FANTASTIC!!! 너무나 아름답습니다.
그동안 한 번도 보지 못했던 환상적인 컬러의 율동입니다.
계속 바라봐도 질리지 않는… 북극에서 오로라를 보는 것과 같은 감흥(?)이…
7 단계 : 트리에 장식하여 크리스마스트리 점등하기
나머지 3개 그룹에 대한 스케치 프로그램에 대한 제작 과정과 프로그램 소개는 생략하도록 하겠습니다. 각 그룹마다 다르게 구성된 카DL의 특징이 살아나도록 개별 스케치 프로그램을 작성하면 되는데, 예를 들어, 싼타나 지팡이 형상의 경우는 모자, 리본 장식 등의 형상마다 특징적인 색상을 갖도록 한다든지, ARC로 구성된 그룹의 모듈에 대하여는 물결이 흘러가는 듯이 컬러와 움직임을 구현하는 등이 그 예입니다. (실제로도 그렇게 구현했습니다.)
이렇게 모든 그룹에 대한 형상 제작과 스케치 프로그램 실행을 개별적으로 확인하였으므로, 이젠 드디어 전체 크리스마스트리를 완성할 시간이 되었습니다. 합동 공연의 모습은 어떨라나요?
아래와 같이 꾸며 놓고… 점등해 보면… 짜잔~!
아, 실제로 보면 컬러의 율동이 너무너무 환상적인데 사진으로는 이 느낌을 나타낼 길이 없네요.
어쨌거나 성공입니다!
8 단계 : 스마트폰으로 끄고 켜기
이제 마지막 마무리 단계로 스마트폰에 앱을 설치해서 스마트폰으로 크리스마트트리를 껐다 켰다 할 수 있도록 해 보겠습니다. 스케치 프로그램은 이미 블루투스로부터 들어오는 ‘ON’, ‘OFF’ 명령에 반응할 수 있도록 작성되어 있으므로 우리는 적당한 블루투스 앱을 스마트폰에 설치하여 실행하기만 하면 됩니다. 블루투스 앱은 상당히 많은 종류가 있는데 어떤 것을 사용하여도 무방하지만 여기서는 제가 익숙한 [Bluetooth Controller(블루투스 컨트롤)]라는 앱을 이용해 아래와 같이 실행해 보겠습니다. (해당 앱은 찾아서 설치하셔야 합니다.)
· [Bluetooth Controller] 앱을 실행(1)하면, 위와 같은 화면(2)이 나타납니다.
· [키설정]을 클릭하면 (3) 화면이 나타납니다.
· [키 이름]과 [데이터 설정]에 각각 화면과 같이 ‘ON’, ‘1’, ‘OFF’, ‘O’을 입력하고 아래쪽으로 스크롤하여 [OK]를 클릭하면 (4)의 화면이 나타납니다.
· [장치검색]을 클릭하여 (5) 화면이 나타납니다.
· ‘JARDUINO-XXXX(4자리수)’를 찾아 (6) 화면이 나타나면서 “연결되었습니다.” 라는 메시지가 나타나면 스마트폰과 JARDUINO-UNO-BTmini가 패어링되어 통신이 가능한 상태가 된 것입니다.
· 이제부터는 ‘ON’ 또는 ‘OFF’를 클릭하는 경우 JARDUINO-UNO-BTmini에 명령이 전달되어 크리스마스트리가 점등되거나 꺼지게 됩니다.
자, 그러면 이제 실제로 [OFF]를 클릭해 보지요. 1초, 2초, 오! 모두 꺼졌습니다. 다시 [ON]을 클릭해보면 1초, 바로 다시 동작합니다. 이것도 문제없이 성공! 다 잘 된 것 같네요.
이렇게 해서 오늘의 주제인 [특별한 크리스마스 트리 제작]은 잘 마무리가 되었습니다. 올해는 독창적이고 멋진 크리스마스 트리를 보면서 새해를 맞을 수 있겠네요. 여러분도 기회가 된다면 한 번 시도해 보시기 바랍니다.
참, 잊을뻔했네요. 마지막으로, [특별한 크리스마스 트리]에 사용된 다양한 형상을 디자인해 주신 신승현님(제이씨넷 디자이너)과 트리 제작 및 스케치 구현에 도움을 준 윤병우님(한밭대학교 학생)께도 깊은 고마움을 표합니다. 수고하셨습니다. 고맙습니다.
카멜레온 DIY LED 기타 응용
저는 이번 [특별한 크리스마스 트리]를 만들면서 카DL의 응용 범위가 상당히 넓어질 수도 있다는 것을 새삼 느끼게 된 계기가 되었습니다. 부분적으로 만들어 본 사슴, 산타, 눈결정 등의 모양을 만들면서 어떠한 형상도 제작이 가능할 것 같다는 확신도 생겼고, 스케치 프로그램 입장에서도 상당히 다양한 라이브러리를 구현해 볼 수 있는 기회가 되었습니다.
여기에 자세히 소개하지는 않았지만 카DL은 생활 속 소품으로 무드등, 건물 모형 미니어처, 자동차 뒷면 표시등 등의 다양한 DIY 응용에 적용해 본 예가 있으며, 앞으로 여러분의 무한한 상상력이 가미되면 멋진 생활 소품이나 기상천외한 작품도 제작될 수 있으리라 예상합니다. 많은 시도를 기대하겠습니다.
카DL 연재를 마치며
작년 1년은 [너무 쉬운 아두이노 DIY] 연재로, 올해 1년은 [카멜레온 DIY LED 이야기] 연재로 디바이스마트 매거진의 독자 여러분과 만나게 되었는데, 이번 회를 마지막으로 아쉬운 작별 인사를 드립니다. 그동안 두 연재물을 사랑해주신 독자 여러분과 미흡한 글에 지면을 할당해 주신 디바이스마트 매거진 담당자 여러분께 진심으로 감사의 말씀 드리며, 다음 기회에 더 맑고 건강한 얼굴로 만나겠습니다. 안녕히 계십시오.
[39호]Wearable Marionette
2016 ICT 융합 프로젝트 공모전 참가상
Wearable Marionette
글 | 목원대학교 진선기, 한승원, 김인창
심사평
JK전자 3D 모델링툴과 프린터를 이용해서 기구물을 제작하고 모터와 연결해 제어하는 과정에서 굉장한 노력이 보이고, 앞으로 다가올 개인 맞춤형 제품(장치)의 시대에 적합한 제작 방식에 대해서 후한 점수를 주었다. 하지만 소프트웨어 구현 부분이 아직 미흡하고 모터의 위치 제어에 대한 부분이 기성 제품과 소프트웨어의 도움을 받아 너무 간단하게 제작이 된 부분이 아쉽다.
뉴티씨 로봇을 직접 제작하고, 센서로 감지한 팔의 움직임을 로봇의 움직임으로 대체하려고 한 것은 매우 중요한 연구테마의 한 가지이다. 하지만, 현재 제작된 로봇팔의 토크 등이 부족하여 움직임이 자유롭지 못하였을 부분, 팔의 처짐 등이 있었다는 보고가 없으며, 이에 대한 대책 등으로 개선 사항 등이 없는 부분 등을 보면 전반적으로 동작이 원활치 않았음을 알 수 있다. 또한, 현재의 모터로는 필요한 토크를 전부 얻어서 동작하는 것이 어려워 보인다. 모터의 선들은 어떻게 처리하여, 각각의 모터들이 잘 동작할 수 있는 무게나 유연성 등의 부분도 연구가 좀 더 필요해 보인다. 어려운 주제인 로봇팔을 크게 제작하여 어려움을 겪었을 것으로 예상되며, 다음에는 좀 더 작은 것부터 섬세하게 움직이도록 제작하면 좋은 결과를 가져올 것으로 생각된다.
칩센 센서를 이용한 원격 로봇 제어 방식과 유사하다, 실제 로봇과 동일한 형식의 기기를 착용하여 제어한다는 개념은 신선하나, 내용상의 표현 처럼 더 불편 해 보인다. 하지만 나름 어려운 주제를 선택해서 노력한 부분이 보이고 실제 구현 후 얻은 교훈으로 더 발전할 수 있을 것 같다.
위드로봇 master-slave 구조의 tele-robotics 분야에서 master 조작기를 착용형으로 만든 연구 결과로 보여집니다. 시중에서 손쉽게 확보할 수 있는 모터-엔코더 셋트를 조합해서 빠르게 연구 결과를 도출한 아이디어를 높이 평가합니다. 단, 보고서 상에서는 결과 내용이 어떻게 되어 있는지 확인할 방법이 없어 아쉽습니다. 무엇인가를 만드는 것 만큼이나 실험 결과에 대한 분석도 중요합니다. 결과에 대한 분석, 부족한 부분에 대한 추후 보완 방법 등이 정리되었다면 훨씬 높은 점수를 받을 수 있을 겁니다.
작품 개요
작품 소개
· 3D Printer와 Dynamixel을 활용해 Wearable을 통한 로봇 팔 제어
· [그림1]은 작품형태를 이미지화 시켜놓은 그림이다.
작품의 개발 배경 및 필요성
여러 탐사로봇을 개발함에 있어 많은 문제점을 발견할 수 있었다. 그 중 탐사로봇을 섬세하게 조종하는데 있어 문제를 발견했고 보다 수월하고 섬세하게 제어할 수 있는 Wearable 제어기를 개발하게 되었다.
작품의 특장점
작품(Wearable)의 특장점
· 3D Printer를 이용한 Wearable 설계 및 제작
· Wearable Dynamixel의 모터 값(목표위치)을 이용한 로봇 제어
· OpenCM보드를 통한 Wearable 모터 값 전송
작품(로봇 팔)의 특장점
· 3D printer를 이용한 로봇 팔 설계 및 제작
· USB2Dynamixel를 이용한 모터 통신
· Dynamixel을 이용한 로봇팔 5자유도 구현
작품 설명
주요 동작 및 특징
3D Printer를 이용한 Wearable 및 로봇 제작
· 3D Printer를 활용 – 비용절감, 경량화
· Wearable 설계 및 제작
· 로봇 팔 설계 및 제작 : 프로파일 형식으로 프로파일과 연결 가능하도록 설계 및 제작
서보모터 Dynamixel을 이용한 Wearable 및 로봇 제어
· Dynamixel AX-18A : 무게 54.6g에 크기 32mm x 50.1mm x 40mm, 기어 비 254 : 1배로 전압 9~12V에서 작동한다. 통신 속도는 115200bps을 이용할 수 있다. 그러므로 DYNAMIXEL AX-18A는 사람과 좀 더 비슷한 자유도를 제작하기 위한 최적의 모터로써 로봇 팔 및 Wearable 관절부분에 사용했다.
Wearable Dynamixel의 모터값(목표위치)을 이용한 로봇 제어
OpenCM보드를 통한 Wearable 모터 값 전송
USB2Dynamixel를 이용한 모터 통신
Dynamixel을 이용한 로봇 팔 5자유도 구현
· Dynamixel AX-18A 5개를 활용하여 5자유도 구현
Dynamixel을 이용한 Wearable 관절 구현
· Dynamixel AX-12A 5개를 활용하여 5자유도 구현
· 사람 팔에 착용할 수 있도록 제작
C#을 이용한 프로그램Form 개발
· OpenCM 보드를 통해 받은 Wearable 모터 데이터 값을 C#으로 받아 프로그램Form에 출력하도록 한다.
개발환경(개발언어, Tool, 사용 시스템 등)
개발언어
· C# : C++에 기본을 두고 visual basic의 편의성을 결합하여 만든 객체지향 프로그래밍언어이다.(첨부1. C# 소스 첨부)
· ROBOTIS OpenCM : OpenCM9.04 임베디드 보드를 쉽게 프로그래밍하고 다운로드 할 수 있는 통합개발환경 소프트웨어이다.(첨부2. ROBOTIS OpenCM 소스 첨부)
단계별 제작 과정
작품계획 및 자료조사
· 작품계획 : 작품제작 및 일정 계획
· 자료조사 : Wearable 및 로봇 팔에 대한 자료(논문, 기사 등)조사
하드웨어 설계
· Solidworks를 통해 Wearable 및 로봇 팔 설계
· Dynamixel 플랫폼과 연결하기 위한 기구적 설계
· 프로파일 형식으로 프로파일과 연결 가능하도록 설계 및 제작
하드웨어 제작
· 3D Printer를 이용하여 로봇 팔 및 Wearable 제작
· 3D Printer를 활용함으로써 비용절감 및 경량화
프로그램 개발
· USB2Dynamixel를 통한 Dynamixel 제어
· C#으로 동한 프로그램 Form개발 및 데이터를 통한 모터 제어
· OpenCM보드를 통한 Wearable 모터 값을 C#으로 전송
· Wearable 및 로봇 팔에 대한 데이터 값을 PC에서 실시간 확인
테스트
· 진행된 작품의 완성도 및 오작동 여부를 테스트 하였다.
· 여러번의 테스트를 통한 문제점 발견(Wearable 착용 불편함)
작품 보완
· 작품 테스트에서 문제점(Wearable 착용 불편함)이 발견되어 착용감이 편하도록 보완하였다.
작품 제작 종료
· 최종 테스트 및 작품을 보완해 작품을 완성하였다.
기타(회로도, 소스코드, 참고문헌 등)
참고 사이트
· 로보티즈(다이나믹셀, openCM, USB2Dynamixel) 사이트 참조(이미지, 매뉴얼) : http://www.robotis.com/index/index.php
· XYZ 3D Printer 사이트 참조 (프로그램, 이미지) :
http://kr.xyzprinting.com/
C# 소스코드
· Port 설정
//Dynamixel
this.timer.Interval = 200;
this.timer.Tick += new EventHandler(timer_Tick);
this.timer.Enabled = true;
this.seriaport.BaudRate = 1000000;
this.seriaport.Encoding = Encoding.Default;
this.seriaport.Parity = Parity.None;
this.seriaport.DataBits = 8;
this.seriaport.StopBits = StopBits.One;
this.seriaport.Handshake = Handshake.None;
this.seriaport2.BaudRate = 1000000;
this.seriaport2.Encoding = Encoding.Default;
this.seriaport2.Parity = Parity.None;
this.seriaport2.DataBits = 8;
this.seriaport2.StopBits = StopBits.One;
this.seriaport2.Handshake = Handshake.None;
// initialize the components (controls) of the window
this.InitializeComponent();
string[] Ports = SerialPort.GetPortNames();
foreach (string i in Ports)
{
ComboBox1.Items.Add(i);
}
ComboBox1.SelectedIndex = ComboBox1.Items.Count – 1;
myDynamixel = new Dynamixel(this.seriaport);
string[] Ports2 = SerialPort.GetPortNames();
foreach (string i in Ports2)
{
ComboBox2.Items.Add(i);
}
ComboBox2.SelectedIndex = ComboBox1.Items.Count – 1;
myDynamixel2 = new Dynamixel(this.seriaport2);
}
·Wearable 값 읽기
private void serialPort_DataReceived2 (object sender,Serial Data Received Event Argse)
{
string buff;
buff = this.seriaport2.ReadLine();
if (buff.Length < 32) return;
//Console.WriteLine(buff.Length);
if (buff.Substring(0, 2) == “WM”)
{
_sensor[0] = Convert.ToInt32(buff.Substring(3, 4));
_sensor[1] = Convert.ToInt32(buff.Substring(8, 4));
_sensor[2] = Convert.ToInt32(buff.Substring(13, 4));
_sensor[3] = Convert.ToInt32(buff.Substring(18, 4));
_sensor[4] = Convert.ToInt32(buff.Substring(23, 4));
_sensor[5] = Convert.ToInt32(buff.Substring(28, 4));
}
}
· 모터 속도 조절
private void MotorSpeed()
{
if (this.seriaport.IsOpen)
{
for (int i = 0; i <= 10; i++)
{
myDynamixel.ax12_write2(i, Dynamixel.AX_GOAL_SPEED_L, 1023);
myDynamixel.ax12_write2(i, Dynamixel.AX_TORQUE_LIMIT_L, 1023);
}
}
}
void SendSerialData(SerialPort _serial, byte[] buffer)
{
try
{
_serial.Write(buffer, 0, buffer.Length);
}
catch
{ }
}
void SendSerialData(SerialPort _serial, byte[] buffer, int Length)
{
try
{
_serial.Write(buffer, 0, Length);
}
catch
{ }
}
· 모터 움직이기
private void moveVactor()
{
if (this.seriaport.IsOpen)
{
_motorData[0] = (1024 – (int)_sensor[1]);
_motorData[1] = (1024 – (int)_sensor[2]);
_motorData[2] = (1024 – (int)_sensor[3]);
_motorData[3] = (1024 – (int)_sensor[4]);
_motorData[4] = (1024 – (int)_sensor[5]);
if (_sensor[0] > 1000)
_motorData[5] = (int)(512 – ((int)((_sensor[0] – 7) / 100) * 1024 / 31));
else
_motorData[5] = 512;
myDynamixel.ax12_sync_write(Dynamixel.AX_GOAL_POSITION_L, 2, 10, _motorData);
}
}
· ROBOTIS OpenCM 소스코드
/* Minimum_Source*/
#include <stdio.h>
#define AX_START 255
#define AX_READ_DATA 2
#define AX_WRITE_DATA 3
#define AX_LENGTH 5
#define AX_TORQIUELIMIT 34
#define AX_NOW 36
#define sendData(args) (Serial1.write(args))
Dynamixel Dxl(1);
int pp[5];
char buff[50]={0};
int temp=0;
void setup() {
// put your setup code here, to run once:
Dxl.begin(3);
for(int i=1;i<=5;i++){
settorque(i);
}
}
void settorque(unsigned char ID)
{
unsigned int Checksum;
unsigned int MaxTorque = 1;
Checksum = (~(ID + AX_LENGTH + AX_WRITE_DATA + AX_TORQIUELIMIT + MaxTorque + (MaxTorque>>8)))&0xFF; //패킷설정
gpio_write_bit(PORT_TXRX_DIRECTION, PIN_TXRX_DIRECTION, 1);
sendData(AX_START); //시리얼 통신 보내기
sendData(AX_START);
sendData(ID);
sendData(AX_LENGTH);
sendData(AX_WRITE_DATA);
sendData(AX_TORQIUELIMIT);
sendData(MaxTorque);
sendData((MaxTorque>>8));
sendData(Checksum);
}
void stoptorque(unsigned char ID)
{
unsigned int Checksum;
unsigned int MaxTorque = 1023;
Checksum = (~(ID + AX_LENGTH + AX_WRITE_DATA + AX_TORQIUELIMIT + MaxTorque + (MaxTorque>>8)))&0xFF; //패킷설정
gpio_write_bit(PORT_TXRX_DIRECTION, PIN_TXRX_DIRECTION, 1);
sendData(AX_START); //시리얼 통신 보내기
sendData(AX_START);
sendData(ID);
sendData(AX_LENGTH);
sendData(AX_WRITE_DATA);
sendData(AX_TORQIUELIMIT);
sendData(MaxTorque);
sendData((MaxTorque>>8));
sendData(Checksum);
}
void loop() {
int AdcData = analogRead(2);
for(int i=1;i<=5;i++)
{
temp=pp[i-1];
pp[i-1] = Dxl.readWord(i,AX_NOW);
if(pp[i-1]>1000)
pp[i-1]=temp;
}
sprintf(buff,”WM %04d %04d %04d %04d %04d %04d”, AdcData,pp[0],pp[1],pp[2],pp[3],pp[4],pp[5]);
SerialUSB.println(buff);
}
[39호]HX711 Load Cell Amplifier (NER-16059) 출시
네로테크
HX711 Load Cell Amplifier (NER-16059) 출시
MCU보드 및 각종 모듈 전문 제조 업체인 네로테크에서 HX711 칩셋 기반 로드셀 앰프 모듈 (HX711 Load Cell Amplifier)을 출시했다. 일반적으로 로드셀이라 함은 하중을 가하면 그 크기에 비례하여 전기적 출력이 발생되는 힘 변환기의 총칭으로, Strain Gage식 로드셀을 의미한다.
이 제품은 무게를 측정하는 로드셀을 읽을 수 있는 HX711 IC를 위한 로드셀 앰프 모듈이며, 마이크로 컨트롤러에 연결하면 로드셀의 저항 변화를 읽을 수 있다. 또한 약간의 보정을 통해 무게를 아주 정확한 수준으로 측정할 수도 있다. 통신을 위해 2선 인터페이스(Clock, Data)를 사용하며, 마이크로컨트롤러의 GPIO 핀에 연결, 작동 가능하다. 로드셀은 HX711에 연결하기 위해 4선식 휘스톤브릿지(Wheastone Bridge Configuration)를 사용한다.
무엇보다도 HX711은 인터넷 상에 전용 라이브러리가 많이 존재하기 때문에 활용이 편리하다는 장점이 있다고 업체는 설명했다.
제품 사양
· 동작 전원 : 2.7V ~ 5V
· 동작 전류 : < 1.5mA
· 10SPS 또는 80SPS Output Data Rate 선택 가능 (기본 10SPS, 80SPS 설정 시 노이즈 증가)
www.neromart.co.kr
TEL.02-6679-8533