아두이노 혁명과 함께  많은 분들이  아두이노의 가능성을 좀더 넓히려는 시도를 하게되었습니다.

그 노력중의 하나가  USB Host 기능을 추가하여  PC와 같이  USB 마우스나  키보드 등의 USB 기기를 연결하여 작동할수 있도록 하는것이었습니다.   이를 지원하는 USB Host Shield 제품이 만들어졌으며, 이를 지원하는 공개 라이브러리가 발전되기 시작하였습니다.   

 

이후 구글은 Google IO 2011 행사에서 아두이노와 안드로이드기기의 연결을 지원해주는 Open ADK 를 공개하여 안드로이드 스마트폰 기기를 다양한 외부 기기(아두이노 연계)와 연동할 수 있는 가능성을 열어 줬습니다.  이때 모태가 된 기술이 바로 아두이노의 USB Host 연동 라이브러리입니다.

 

이후 공식 아두이노팀은 아두이노에 USB Host Shield 기능을 기본으로 내장한 Arduino ADK 제품을 발표하였습니다.

이를 통해 UNO 보드에 별도의 USB Host Shield 를 장착해야하는 불편이 없어졌으며,  ADK 보드를 사용하여 좀더 편리하게  공개된 라이브러리를 활용하여  USB 마우스나 키보드, 일부 Bluetooth Dongle 등과 연동하는 작품 제작이 가능해졌습니다.

 
한마디로 무궁무진한 가능성을 보유한 아두이노 ADK 보드입니다.

 

하지만  많은 분들에겐 왠지  어렵고  가까이하기엔 뭔 ADK 보드이며,

자칫 잘못하면 1주일을 헤매도 뭘 어떻게 사용해야하는지 답이 안나오는 ADK 보드이기도 합니다.

 

저 또한 많은 것을 알지는 못하지만,  직접 테스트해본 결과 아두이노에 대해 어느정도 경험이 있으신 분들이라면 많이 어렵지 않게 기본적인 사용이 가능한것으로 판단되어  미루고 미뤄왔던 ADK 보드의 기초 사용법을 적어봅니다. 

 

자,  시작해보십니다.

 

Mega ADK 보들 사용을 하시려면 일단  아래의 공식 제품소개 페이지를 참고하시면됩니다.

http://arduino.cc/en/Main/ArduinoBoardMegaADK?from=Main.ArduinoBoardADK

 

하지만 장황하고 혼돈되어 뭘 봐야할지 모르겠습니다.

 

2011년 처음 ADK보드가 나왔을때는 google ADK 공식 페이지에서  관련 SDK 와 함께 아두이노 예제소스가 제공되었습니다.

하지만  최근에 일반 USB_HOST_SHIELD 라이브러리가 보강되어  ADK보드에서도 조금만 손보면 간단히 사용 가능하게 되었으며, 구글 IO Open ADK 관련 페이지를 참고할 필요가 없게 되었습니다. 아래의 사이트에서 해당 파일을 다운로드하시면  필요한 라이브러리와 예제소스를 한번에 받으실 수 있습니다.

 

https://github.com/felis/USB_Host_Shield_2.0

 

 

1. 라이브러리와 예제소스가 포함된 파일을 다운로드 하세요

 

위 사이트에서 아래 파일을 받으시면 됩니다.

https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip

 

 

2. 라이브러리 설치 및 정상 설치 여부 확인

 

자, 이제 라이브러리부터 설치하기위해 다운로드한 파일을 압축해제합니다.

압축해제된 파일이 폴더에 들어있는데요

 

보통 USB_Host_Shield_2.0-master 라는 폴더명으로 압축이 풀리게됩니다.

아마도 대부분 이 폴더속에 동일명으로 또 하나의 폴더가 보일겁니다.

 

그 폴더 속에  *.h 파일과  *.cpp 파일이 보이고  examples라는 디렉토리가 보일겁니다.

이 폴더가 바로 라이브러리 폴더입니다.

이 폴더의 명칭을  USB_Host_Shield_2로 변경하시기 바랍니다. 

(현재의 제목으로는 특수문자가 포함되어 있어 라이브러리 설치시 오류가 발생합니다.)

 

 

이제 아두이노 SW를 엽니다.

현재 가장 기본으로 사용되는 아두이노 SW 1.0.5 버전을 기준으로 소개해드리겠습니다.

1.0버전 이전에는 직접 설치할 라이브러리 폴더를 아두이노 라이브러리 폴더에 복사해 넣었었는데요

최근 SW 에서는 라이브러리 설치를 위해 파일 복사를 할 필요가 없고,

 

메뉴에서 스케치 > 라이브러리 가져오기... >  위에서 폴더명을 변경해둔 "USB_Host_Shield_2" 폴더를 선택을 해주시면 자동 설치됩니다.

 

이후에 꼭 SW를 재 시작해주셔야합니다.

재시작 이후, 정상 설치 여부는 예제가 등록되었는지 확인하면됩니다.

 

메뉴에서 파일 > 예제 > USB_HOST_SHIELD_2 라는 폴더가 보이면 일단 설치완료입니다.

 

 

3. 라이브러리 및 예제사용을 위한 안내문 읽기

 

그리고 아래의 페이지에 있는 안내문을 꼭! 꼭! 꼭! 읽어보시기 바랍니다.

http://felis.github.io/USB_Host_Shield_2.0/

 

대부분의 공개 라이브러리나 예제소스들은 다운로드페이지나  소스코드 폴더에 

날좀 보셔(README)정보를 함께 제공합니다만,,,,

많은분들이 제작자가 힘들고도 친절하게 적어놓은 사용 안내문을 잘 살피지 않는것 같습니다.

하지만, 종종  "날좀 보셔" 를 안보실 경우  낭패를 보시게 되므로 꼭 읽어보시기 바랍니다.

 

즉, 위 라이브러리는  여러종류의 보드나 제품들에서도 사용할 수 있기때문에  사용자의 환경에 따라 수정이 필요한경우가 있으며, 이에 대한 정보를 README 에 안내하게되므로  꼭 참고하셔야합니다.

 

실제로,   Mega ADK 보드의 경우, 위 힌트글을 안보시고  아두이노 1.0.5에서 사용하시면  작동이 안되게됩니다.

안타까운건 이경우도  컴파일 및 업로드는 정상적으로 된다는 것입니다.

 

하지만 정상 작동이 안되게되고, 며칠을 고민해도 작동이 안되게됩니다.

그리곤 결국 보드 고장을 의심하시고,  구매처에 반품을 요청하게 됩니다. 

(정말 가슴 아픈 상황입니다 ^^;;)

 

해당 안내글을 참고하시면,  Mega ADK보드를 아두이노 SW 1.0.5 버전에서 사용하실경우

라이브러리 폴더에 있는 settings.h 파일에서 Mega ADK 관련 define문을 수정해야 함을 알수 있습니다.

 

4.  자신의 환경에 맞게 라이브러리 수정하기

 

아두이노 라이브러리 폴더에 설치된 해당 라이브러리 폴더속에 있는 settings.h 파일을 수정합니다.

(주의.  최초에 다운로드 한 라이브러리파일속에 있는 파일을 수정하는것이 아닙니다.)

 

아두이노 라이브러리 폴더의 위치는  메뉴에서 파일 > 환경설정 >"스케치북 위치" 를 보시면 됩니다.

윈도우 탐색기로 해당폴더를 찾으셔서 그속에 있는 Arduino 폴더내에 Libraries 폴더가 있습니다.

이곳에 USB_Host_Shield_2 폴더가 있으며 그 안에서 settings.h  파일을 열어서 아래의 항목을 수정해주시면 됩니다.

(단, 아두이노 Due 등의 보드 지원을 위한 아두이노 SW 1.5.5 이상을 사용시엔 수정을 안해도 된다고 안내되어있습니다.)

 

/* Set this to 1 if you are using an Arduino Mega ADK board with MAX3421e built-in */

 

아래의 문장을

#define USE_UHS_MEGA_ADK 0 // If you are using Arduino 1.5.5 or newer there is no need to do this manually

 

아래와 같이 숫자 0만 1로 변경하시면됩니다.

#define USE_UHS_MEGA_ADK 1 // If you are using Arduino 1.5.5 or newer there is no need to do this manually

 

10분도 안걸리는 참 간단한 작업이지만, 이 작업을 안하시면  며칠을 노력하셔도 제대로 작동이 안됩니다.

 

자, 이제  본격적으로 테스트를 해봅시다.  

 

 

1부.  ADK보드에 USB 마우스 키보드를 연결하여 테스트 해보기

 

 

자, 이제 대부분 이미 보유하고 계신 장비로도 쉽게 테스트가 가능한 예제를 실행해보겠습니다.

가령 아래의 예제들은 대부분의 USB 마우스나 USB 키보드로 테스트 가능합니다.

 

파일 > 예제 > HID > USBHID_desc     (USB 기기 디스크립션 확인 예제, 일반 마우스로도 테스트 가능)

파일 > 예제 > HID > USBHIDBootMouse (USB 마우스 예제)  

파일 > 예제 > HID > USBHIDBootKbd   (USB 키보드 예제)

 

일단,  Mouse 예제를 해보겠습니다.

 

1. 예제 불러오고 컴파일 및 업로딩

 

파일 > 예제 > HID > USBHIDBootMouse 예제를 컴파일하시고  업로드 하시면 됩니다. 

컴파일중 오류가 난다면  라이브러리를 잘못 설치하셨거나,

기존에 설치하셨던 라이브러리와 충돌하는경우로 여겨집니다.

 

2. 시리얼 모니터창 열고 세팅하기

 

정상 컴파일 및 업로딩이 되셨다면, 시리얼 모니터창을 열어주고 통신속도를 115200으로 맞춥니다.

컴파일 및 업로딩을 위한 보드설정, 통신포트설정 등에 대해 모르실 경우 아두이노 기초실습을 먼저해주시기 바랍니다.

 

3. 초기 메시지 확인

모니터창에   Start 라는 메시지가 뜹니다.  ADK 보드가  준비가 되었으니  USB 기기를 연결해도 좋다는 신호입니다.

 

4. USB 기기 연결

 

자 이제  ADK 보드의 USB Host 포트에  USB 마우스를 단자를 삽입합니다.

 

이후, 마우스를 움직이거나  버튼을 누르면 대응되는 정보값이 문자로 표기됩니다. (와우~ 활용도가 매우 높은 예제입니다!)

키보드 예제도 마찬가지 방법으로 시도해보시기 바랍니다.

 

 

ADK 보드에 USB 마우스를 연결하여  마우스 드래그 및 버튼 눌림 정보를 확인할 수 있습니다.

 

 

우측의 모니터창을 보시면  좌표이동 상태와  버튼 눌림 정보가 보입니다.

 

 

 HID_Desc 예제의 경우도  연결된 기기의 상태정보를 보여줍니다. 

가령 USB 마우스를 연결할경우 위와 같은 정보를 출력합니다.

 

이밖에도 다양한 예제가 있습니다만,  해당 예제들은 부가 장비가 필요하거나 좀더 난해하므로  여러분이 직접 공부하셔서 도전해보시기 바랍니다. 

 

2부.  Open ADK 보드와 안드로이드 폰의 연동 테스트해보기 

 

시작하기 전에,

Open ADK는 일부 안드로이드 스마트폰에서만 지원되므로 호환되지 않는 스마트폰에서는 테스트가 불가합니다.

저는 Nexus 5 (안드로이드의 최신 레퍼런스 폰)로 테스트 해봤습니다.  참고로, ADK가 지원되지 않는 폰의 경우도 기기 인식 및 앱설치까지는 가능할 수 있지만, 실제로 앱을 구동할때 오류가 발생되고 멈추게됩니다.  

 

이제는 Open ADK 예제 중  별도의 부품이 필요없는 가장 단순한 LED 켜고 끄기 예제를 해보겠습니다.

즉, ADK 보드에 기본장착된 LED를  안드로이드폰에서 실행되는 앱을 통해 켜고 끄는 예제입니다.

 

 

1. 예제 컴파일 및 업로딩

 

아래의 예제를 선택 후 컴파일 및 업로딩 합니다.

파일 > 예제 > USB_HOST_SHIELD_2 > ADK > ArduinoBlinkLED  

 

2. 스마트폰 연결

자, 이제 Nexus 5 폰이 연결된 USB 케이블을 USB Host 포트에 삽입합니다.

 

호환되는 기기이고 특별히 해당 기능을 막아두지 않았다면

아래와 같은 Open ADK 연결 안내문이 뜨게되며,  해당 기기와 연동에 필요한 안드로이드 앱이 필요하다는 안내와 함께, 해당 사이트에서 다운로드 할지 여부를 확인하게 됩니다.  

 

ADK 보드를 연결하면  엑세서리로 인식되며 연동될 앱이 없을경우 다운로드 할 수 있도록 안내해줍니다.  보기를 누르고 다운로드를 하시면됩니다.

 

 

3. 관련 앱의 다운로드

 

 

 

다운로드 확인 하시고,

 

 

 

다운로드가 완료되면  실행시켜줍니다.

 

 

4. 앱의 설치 실행

 

 

특별한 권한이 필요없는 안전한 앱입니다.  설치해줍니다.

 

 

 

5. 앱 사용 허용

 

해당 기기가 연결되때마다 이 앱을 사용할것인지 확인해줍니다.  이후 해당 기기가 연결될 때마다 해당 앱이 자동으로 실행되게 됩니다.  최초 앱 설치 후엔 자동 인식을 위해 ADK보드를 재 장착해야할 수 도 있습니다.

 

 

 

6. 앱의 테스트

 

앱이 시작되면 아래와 같이 단순한 버튼이 뜨며, 그하단에 Connected 라는 메시지가 보입니다.

 

 

버튼을 눌러주시면,  ADK 보드에 내장된 LED 가 켜지는 것을 확인할 수 있습니다. (초록색 원)

 

 

 

 

 

이상으로 기본적인  ADK 보드 사용안내를 마칩니다.  예제를 참고하셔서 멋진 응용작품 만드시기 바랍니다!

 

테스트에 사용된 제품들은 아래와 같습니다.

 

1부 준비물

1. 아두이노 ADK 보드 (제품 구입처 링크)

2. ADK 보드 프로그래밍 용 USB 케이블 ( 제품 구입처 링크)

3. USB 마우스 또는 USB키보드 ( 대부분 보유중이신 제품 활용 가능)

 

2부 준비물

Open ADK 가 지원되는 안드로이드 폰과 micro USB 케이블 

( 갤럭시 S2,  Nexus 5 등 일부 기기만 지원되며, 대부분의 다른 안드로이드 기기는 지원되지 않습니다.) 

 

 

 

사용하기 쉽고 응용처가 많은 NeoPixel(이하 RGB 칼라픽셀로 칭함) 제품의 사용법을 간단히 정리해보겠습니다.  이미 상점 간판을 돋보이는 용도로 RGB LED가 많이 사용되고 있습니다만, 많은 경우 단색이거나 모든 LED가 하나의 색상으로 켜지는 제품이 대부분입니다.   여기서 안내드리는 칼라픽셀 제품들은 RGB LED 하나당 전용 드라이버칩이 하나씩 내장되어 있고,  여러개의 LED모듈이 하나의 신호선을 통해 직렬로 연결되어 있어서 하나의 데이터 신호선으로 수십개 이상의 칼라픽셀을 개별 색상 제어할 수 있는 제품입니다.

 

이미 제조사에서 매우 잘 정리해 놓은 튜토리얼 페이지가 있습니다만 내용이 너무 많거나 영어 자료가 익숙하지 않으신 분들은 본 요약 안내글을 먼저 보시고 제조사 튜토리얼을 참고하시면 도움이 될것 같습니다.

 

현재 이글을 통해 소개중인 제품은  30개 모듈이 스트립형으로 연결된 제품입니다. 

 

주요 재료

아두이노 UNO, USB케이블
전선 4가닥(조금 두꺼운 단선 또는  점퍼와이어 가능, 단선으로 된 랜케이블도 가능)
전원커넥터 스크류타입 (또는  기본형 ,  브레드보드형 등)
정전압 아답터 5V 2A 형
RGB 칼라픽셀( NeoPixel 30 RGB Strip형)

 

프로그래밍 

 

1. 라이브러리와 예제소스를 다운로드합니다. (제조사 튜토리얼 해당 페이지에서)

 http://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library  페이지 에서 아래 링크 다운로드

  1. Select the “Download ZIP” button, or simply click this link to download directly.

 

2. 압축파일을 해제 및 폴더명 변경

압축해제된 폴더중  *.cpp  *.h 파일이 포함된 폴더의 폴더명을 Adafruit_NeoPixel 로 변경합니다.

 

3. 라이브러리 설치

최근 아두이노 1.0.5 프로그램에서는 라이브러리 복사 과정을 대신해주는 기능이 지원되므로 아래의 메뉴를 선택하여 위 폴더를 선택해주면 라이브러리가 설치됩니다.

 

메뉴> 스케치 > 라이브러리 가져오기 >  Add Library…  선택후  해당 폴더 선택

 

참고사항. 구 버전 아두이노 SW 에서는 위 폴더를 아두이노 라이브러리 폴더에 직접 복사해야합니다. (구 버전을 사용하시는 분들은 라이브러리 설치 관련 자료를 참고하시기 바랍니다.)

 

4. 아두이노 SW를 종료후 다시 실행합니다.

 

5. 라입러리 및 예제소스 설치 확인

라이브러리가 정상적으로 설치된 경우,

메뉴 > 파일 > 예제 리스트를 살펴보면 Adafruit_NeoPixel 폴더가 보입니다.

관련 예제가 두개 있는데 strandtest 예제를 선택하시면 됩니다.

 

6. 소스 수정.

 

제품종류나 칼라픽셀의 개수에 따라 NeoPixel 선언부에 설정되는 값이 변경되어야합니다.

 

Adafruit_NeoPixel strip = Adafruit_NeoPixel(30, PIN, NEO_GRB + NEO_KHZ800);

 

 

우리가 사용중인 제품은 픽셀 개수만 변경해주면 됩니다. 첫번째 인수가  픽셀의 개수이며 60으로 되어있는 값을 30으로 변경하기만 하면 됩니다.  (주석을 보면 어떤 내용인지 확인 가능)

 

 

7.아두이노 보드 종류와 COM번호 설정후 업로드한다.

 

참고로 데이타 전송용 핀번호는 6번으로 설정되어 있습니다. 이 값은 소스 상단에 있는 define 부분에 정의되어 있으며 필요시 다른 핀번호로 변경 가능합니다.

 

참고사항.  프로그램 업로딩은 항상  제품을 결합하기 전에 하는 습관을 갖기 바랍니다.  운이 나쁘면 기존에 어떤 프로그램이 들어있는지에 따라 아두이노와 부품에 손상을 가져올  가능성이 있습니다.



이제 회로를 연결합니다.

 

 

회로 연결은 매우 간단합니다.  아두이노 보드에 GND와 D6 핀 두개만 연결되면 됩니다.

하지만 많은 분들이 실수 하시는 부분이 있으니 아래 사항을 꼭 주의 하시기 바랍니다.

 

1. 제품을 잘 보시면 화살표가 있습니다. 전선 결합은 꼭 입력측에 해주셔야합니다. 즉, 화살의 꼬리측에 있는 GND, DIN, +5V 핀에 전선을 연결하여 아두이노측에 연결해주셔야합니다. 종종 사용중에 선을 변경하시다가 화살촉 부분에 연결하시게 되면 작동이 되지않습니다.

 

2. 아두이노상의 GND와 외부전원의 GND 둘 다 본 제품의 GND에 결합되어야 합니다. 외부전원을 사용하는경우 GND 공통 접지를 잊으셔서 작동이 안되는 경우가 많습니다.

 

 

3. 전원은 pixel 30개를 사용하는 경우 5V 2A 정전압 아답터 전원 사용을 권장합니다. 전압은 꼭 정전압 5V여야하고, 암페어(전류)규격은 2A 이상이면 됩니다. 3A , 5A 제품을 사용하실 수 있습니다. 또한 픽셀을 3개정도 만 잘라서 사용한다면 전류 소모가 작으므로 아두이도 5V 핀으로 부터 전원을 공급받아도 무관합니다. 픽셀이 많아질 수록 전력소모가 크며 적절한 전원을 공급하지 않으면 비정상 작동되거나 고장의 원인이 될 수 있습니다.

 
 
전선 납땜하기
30모듈형 칼라픽셀은 5미터 형 제품을 5등분한 제품입니다. 이때문에 대부분 전선이 연결되어 있지 않은 상태이므로 직접 전선을 납땜해주셔야합니다. 전선은 아두이노와 브레드보드 연결시 사용되는 점퍼와이어나 AWG22 규격정도의 단선, 또는 단선으로 된 랜케이블을 잘라서 사용하시면 됩니다. 중요한점은 GND부분에서 전선이 두가닥이 나와야 하나는 아두이노 GND에 나머지 하나는 외부전원 GND에 연결되게됩니다. 이때문에 총 4가닥의 전선이 필요합니다.

 
 
전원 소켓 준비하기
대부분의 정전압 아답터의 DC출력부는 5.5x2.1mm 규격의 둥근형태의 DC플러그입니다. 이 DC 플러그로 부터 전원을 공급받기 위해 전선을 잘라서 납땜하는것보다는 적절한 DC커넥터 제품을 이용하면 아답터 전원을 장착/탈착하기 편리합니다. 제경우 스크류 터미널로 납땜없이 전선 결합이 가능한 제품을 사용하였습니다. 이외에도 저렴한 일반 DC잭이나 브레드보드 호환 DC잭 활용도 가능합니다.
 
TIP.  현재 예제에서는 PC와 USB케이블로 연결하거나  별도의 9V아답터를 DC잭에 연결하여 아두이노 보드에 전원을 공급하고 있습니다만  정전압 5V 전원아답터를 사용하실 경우  아두이노 보드용 전원을 별도로 공급하지 않을 수 있습니다.  즉,  아두이노 보드에 연결된 USB케이블과  DC잭에 연결된 전원을 모두 제거하신 상태에서   정전압 5V 전원에서  5V전원선을 하나 더 연결하여 아두이노의 5V핀에 직접 연결해주시면  아두이노 보드도  정전압 아답터로부터 전원을 공급 받을 수 있습니다.  즉,  5V 단일 전원으로   아두이노 보드와  RGB 칼라픽셀을 모두 구동하실 수 있습니다.
 

 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

레이보우두이노 Rainbowduino   와  Rainbow Cube Kit( 4x4x4)  연동 작동하기

 

1. 아두이노 라이브러리 설치하기

아두이노 IDE 개발환경인 스케치 버전(1.0이상 또는 구버전)에 따라 다음 두개중 하나를 다운로드 후 설치합니다. 

(참고사항.  사용중인 아두이노 스케치의 소스파일명 확장자가  *.ino 이면 Arduino 1.0이상 이며,   *.pde 이면 구버전의 아두이노 스케치 입니다. 즉, Arduino 023 사용)

 

라이브러리 파일 설치위치:

다운로드 후 압축을 해제하면 안쪽에 Rainbowduino 라는 폴더가 있습니다.  이 폴더 통째로 아두이노가 설치된 디렉토리에 있는 libraries 디렉토리에 복사합니다.  즉,  arduinoDir\libraries\Rainbowduino  폴더가 있고  이안에는  Rainbowduino.cpp Rainbowduino.h 파일 등이 보입니다.

 

 

2.  Rainbowduino에 내장된 FTDI USB to Serial 드라이버 설치하여  COM 포트 인식시키기

Rainbowduino를 PC와 USB케이블로 연결후 다른 모든 부품(RainbowCube Kit 등)을 제거합니다.

PC에서 자동 인식되며 필요한경우 적절한 드라이버를 선택해줍니다.  Arduino 스케치 폴더에 있는 drivers 폴더에 있는 파일로 인식되지 않는경우엔  Windows 드라이버 자동찾기를 선택하하여 재설치해주면 update후 자동 설치됩니다.

 

3. 아두이노 스케치 환경 열기

( library 설치후엔 꼭 다시 실행해줘야합니다.)

Rainbowduno용 라이브러리가 정상 설치되었다면  파일 > 예제 메뉴 선택후 Rainbowduino 라는 메뉴가 보입니다.

이를 선택하면 아래와 같은 예제들이 기본 등록된것을 알수있습니다.

본 예제 파일들이 보이지 않는경우 라이브러리 설치가 제대로 되지 않은것이니 재 확인 바랍니다.

 

Cube1

Cube2

Cube3

..... 이하 여러개

 

 

PlasmaCube 를 선택해 봅니다.

 

4.  아두이노 보드 종류 및 COM 번호 선택하기

 

도구>시리얼 포트

COM 번호는 과정 2에서 확인된 COM번호를 선택하면됩니다.(제어창  장치관리자 COM 장치리스트에서 확인가능)

 

도구>보드:   아두이노 보드 종류는    Arduino Pro or Pro mini  5V 16MHz,  w/ATMega328  를 선택하면 됩니다.

 

5. 컴파일 및 업로드

컴파일시 오류가 없다면 업로드해봅니다.

 

6.  USB케이블을 제거후  RainbowcubeKit 과  Rainbowduino를 연결해줍니다.

RainbowCubeKit 에 포함된 전선으로  Vin / Gnd 라인(볼트로고정)을  Rainbowduino 상의 Vcc/ Gnd 라인(볼트로고정)에 공통 연결해줍니다.

RainbowCubeKit 에 7~9V 최소 1A 이상 정전압 전원을 연결해줍니다.

 

여러 패턴으로 작동되는것을 확인 할 수 있습니다.

 

주의.  LED 가 64개 작동되는 킷이므로  소형 9V 전지나  USB케이블을 통한 전원으로는 정상 작동이 보장되지 않으며 작동오류나 PC 파손등의 원인이 될 수 있으니  꼭  별도의 정전압 아답터 전원을 사용하시기 바랍니다.

 

 

관련 상품 리스트

Rainbowduino V3.0
RainbowCubeKit 납땜 자작형
RainbowCubeKit 완성형( Rainbowduino, 아크릴 케이스  및 전원 포함)
9V 1A 정전압 아답터
mini USB 케이블(Rainbowduino 와 PC연결용)

 

 

 

 

 

 

 

 

 

 

 

 

 

http://www.spikenzielabs.com/SpikenzieLabs/SolderTime_2.html

 

제품소개

아두이노 UNO와 동일한 MCU가 내장된 아두이노 호환 자작 전자손목시계킷 입니다.

이미 프로그램이 업로딩 되어 납땜 및 결합만 하여도 곧바로 시계로 작동이 가능하며,

능력이 되면 직접 원하는 소스코드를 업로딩하여 자신만의 방식으로 동작하는 전자시계를 만들 수 도 있습니다.

(안내.프로그램 업로딩을 위해서는 FTDI USB to 시리얼 변환기(별매)가 따로 필요합니다.)

 

제작 난이도가 높은 제품은 아니지만 납땜에  어느정도 익숙한 사용자에게 권장합니다.

납땜점 및 PCB가 미세하므로 (미숙련으로 인해) 반복하여 납땜할 경우 PCB가 손상될수있습니다.,

또한 크리스탈 부품은 가열 지속시 부품 파손될 수 있으므로 이점 양지하시기 바랍니다.

 

 

 

도구: 니퍼, 납, 인두기, 인두팁 클리너, 종이스티커나 납땜 보조 손잡이

 

 

제작법

 

제작시간:  납땜에 어려움이 없는경우 약 1시간이내

 

납땜 제작시

.버튼과 크리스탈은 접착면에서 잡아 뽑기보다는 니퍼로 커팅할것을 권장합니다.

.5X7 LED 세그먼트의 결합시 옆면에 라벨문자를 표식으로하여 제작안내 사진 방향으로 결합합니다.

 

마무리시

.플라스틱판은 보호비닐을 제거하고 사용합니다.

.circuit area등의 플라스틱판은 방향이 있으므로 제작안내에 포함되 그림을 자세히 보시고 결합하시기 바랍니다.

(크리스탈 부품 위치 고려 등)

.플라스틱판은  4장 또는 5장일수 있습니다.

( circuit area 판의 경우  얇은판 2개 일수도, 다른경우 두꺼운판 1개일수도 있음 )

 

초기 작동 테스트

전지를 넣으면 잠시동안 12:00 시간 표시가 되고 꺼집니다.

우측버튼을 누르면 현재시간을 잠시 보여주고 꺼집니다.

모든 LED 점이 정상적으로 작동되는지 테스트하려면

좌측버튼을 누른상태로 건전지를 삽입하면 촤측부터 한줄씩 모든 LED점을 순차점등 테스트 모드로 진입합니다.

 

 

시계 작동법

 

아래의 모드 및 세팅 상태도를 보고 세팅할 수 있습니다.

http://www.spikenzielabs.com/Downloadables/ST2IntFlow.jpg

 

시간설정, 알람설정 , 스톱워치(초단위 측정), 메시지 , 사인파 에니메이션(소리 점검)

 

알람이 설정되면 촤측 하단에 점이 추가됨.

 

 

 

(작성중인 문서입니다.)

 

 

수개월전 실내 테스트까지만 해왔던 기상측정 트위터 로봇을 중요한 프로젝트에 활용하신다는 분께 양도 후 새로 구하지 못해서 기다려오다 최근 다시 입수하게되었습니다.  ^^. 드디어 기다려왔던 실외 설치 후 실제 운영테스트를 해보게되었습니다.  눈도 오고 꽁꽁 얼어붙는 날씨인데도 아직 멀쩡히 작동하고 있습니다.  기존 스토리는 관련글 링크를 참고하시기 바랍니다.

이번엔 실외 설치를 위해 이더넷하우징 케이스에 모든 기능을 넣어버리는 시도를 하였습니다.  아두이노 보드 + 이더넷 쉴드를 이더넷일체형 아두이노보드로 변경한데 이어 관련 부품을 작은 케이스안에 넣고 UTP 케이블 단자만으로 결합이 되도록 구성하였습니다.  어떻게 하는지는 사진을 보시면 참고가 되실 것 같습니다.

우선은 관련 동영상과 이미지를 올려드리고,  상세한 부분은 조금씩 추가하도록 하겠습니다.

실외 설치 후 작동상태와 트위터봇의 외부 및 내부 이미지

 

 

 

 

 

관련글 링크
1.기상측정 기구 + 아두이노로 기상대 만들어요 (Arduino + Weather Sensor Assembly )

2.트위터(Twitter)에 자동 포스팅하는 기상관측 로봇

3.기상측정 트위터 로봇 - 실외 설치편 (현재 글)

RGB LED는 오색 찬란 무지개 색상을 자유롭게 표현할 수 있는 재료입니다. 하지만 여러개를 사용하기위해서는 회로나 프로그래밍이 복잡해져서 직접 제작하기엔 부담이 큽니다.  이를 위해 지금 소개해 드릴 20개단위로 LED 체인으로 구성된 제품을 사용하면 손쉽게 독립제어되는 다수의 RGB LED 사용이 가능해집니다.  관련제품 사용법을 알려드리겠습니다.

손쉽게 사용가능하도록 라이브러리와 아두이노 예제 소스가 제공됩니다.  한줄 만 수정하면 그대로 이용 가능합니다.
관련 동영상을 보신 후, 아래의 상세과정을 참고하시기 바랍니다. ^^.

- 이하 사용법 안내 -

라이브러리 설치 방법
1.압축해제후,
2. WS2801.cpp 등의 파일이 들어있는 폴더를 아두이노 설치폴더의 Libraries 폴더에 복사후,
3. 폴더명을 WS2801으로 변경하시기 바랍니다.
4. 아두이노 스케치를 재 시작합니다.

 

예제소스 및 수정
소스코드 폴더를 보시면 Example 폴더에 예제파일이 있습니다.
소스코드 상단주석과 설명을 보시면 설명이 되어있습니다.
해당 소스코드에서 통신용(data선, clock선)으로 사용되는 핀 2개의 번호를 확인하셔서 해당핀에 케이블을 연결하시면됩니다.
본 제품은 모듈(pixel)의 수가 20개이므로, 기본 25개로 되어있는 부분을 20으로 수정하시면 됩니다.

 int dataPin = 2;   // 데이타 전송용 데이타 핀번호 ( 다른핀으로 변경 가능)
int clockPin = 3; // 데이타 전송시 클럭용 핀번호 ( 다른핀으로 변경 가능)

WS2801 strip = WS2801(20, dataPin, clockPin);   //LED모듈 개수 25를 20으로 변경한 예

즉,  위 코드 한줄만 바꿔주시면 끝입니다.   20개 모듈체인 2세트를 연결시엔 40으로 변경해야겠죠

 

케이블 단자 안내 (시작 모듈 기준)

 

 BLUE  Clock
 GREEN  Data
 RED  VCC ( 5V전원입력선)
 WHITE (2라인)  GND (아두이노 및 외부전원 GND와 연결)

    (주의. 색상은 시작모듈 기준입니다, 두번째 모듈부터는 시작모듈 기준 배치와 동일하며 케이블 색상은 바뀔수 있으니 잘라서 사용시 주의하시기 바랍니다.아래 그림 참조)

 

  VCC -->   --> VCC 
  GND -->  RGB --> GND 
  DATA-->  모듈 --> DATA 
  CLK -->   --> CLK  

 

 

 

시작모듈/끝모듈 구분법
어디가 시작이고 어디가 끝인지를 구분하시기 위해 모듈 밑면에 있는 화살표를 참고하시면 됩니다.
시작모듈에 케이블을 연결하시면 됩니다.

 

관련제품

RGB LED 독립 색상 제어 20개 연결형
정전압 아답터 5V 2000mA SMPS
점퍼 와이어 M/F 10개형
아두이노 UNO
브레드보드 점퍼 케이블 ( Solderless Breadboard Jumper Wire 75 pcs )
브레드보드 호환형 DC 잭 아답터 (DC Barrel Jack Adapter - Breadboard Compatible)




 

 

 

 

 

 

 

 

아두이노와  GND,  CLOCK, DATA  핀  3개만 연결해주시면 됩니다.

 

 

 

아두이노와 Clock, Data 신호가 연결되는 시작모듈 을 찾기 위해서 모듈 뒷면을 보시면 화살표시가 있습니다.

 

 

 

Male/Female 점퍼 케이블을 이용하시면 케이블 작업이 손쉬워 집니다.

 

 

 

20개 묶음을 2세트(총 40개) 연결한 장면입니다. (단, 전원은 힘 좋은 녀석 사용이 필수겠죠 ^^.)

 

 

Tip. 기본 20개 체인형 제품이지만, 2세트를 묶어 40개를 연결하거나  1개나 N개 단위로 잘라서 사용도 가능한 .... 기특한 녀석입니다.

공식 아두이노의 최신 표준보드 UNO의 R3버전이 나왔습니다.(2011년 12월)

보통 UNO 하면 마이크로콘트롤러 칩 타입에따라 SMD타입과 DIP타입 두 가지가 있었지만, 이제 형제가 더 많아졌네요, 아직 R3버전의 SMD타입은 공개되지 않은것 같으므로 현재 아래와 같은 3종류의 UNO가 있습니다.
UNO R2 DIP형
UNO R2 SMD형
UNO R3 DIP형


[]R2와 R3의 차이점 요약
일단, R2나 R3나 주 마이크로콘트롤러는 ATMega328 칩을 사용하므로
프로그래밍 가능용량이나 제어핀의 개수와 사용방법이 모두 동일합니다.
다만, USB 인터페이스칩이 변경되었고 헤더핀의 개수가 3개 추가되었습니다.
그렇다고 기본성능이 업그레이드 된것도 아니어서 기존 R2와 동일하게 사용하시면 됩니다.


[]변경된것
1.USB 인터페이스칩이 atmega8u2에서 atmega16u2로 변경됨:
단, (주콘트롤러칩은 R2와 동일하므로) 이것이 아두이노 프로그래밍 가능용량의 증가를 의미하지는 않습니다.
단, USB제어칩을 개조하여 사용할 경우 유용할수있음.

2. 노출 헤더 구멍이 3+1개 추가됨:
AREF핀옆에 I2C 헤더소켓 2구가 추가되었음.
단, 여분의 i2c핀이 새로 추가된것이 아니고 기존의 i2c핀(Analog 4번 5번)에 중복 연결된것입니다.
(차후 Mega시리즈 같은 다른 아두이노 보드와의 쉴드 호환성을 위한 고려로 여겨짐)
더불어 IOREF 노출 헤더소켓 1구가 Reset핀 옆에 추가되었습니다.
(이는 쉴드에서 보드의 작동전원을 파악하는 용도로 사용될 것으로 여겨짐)
물론 이핀도 power pin의 노출 헤더출구 1개가 추가된 것일뿐 없던 제어핀이 새로추가된것은 아닙니다.
나머지 1 구는 미사용 예비용이라네요;;

[]변경되지 않은것
1. 모든 UNO(R2 R3)는 프로세서 속도 및 기억 용량이 동일합니다.
2. 제어가능한 핀의 개수도 동일합니다.
3. 보드 크기와 모양도 그대로 유지
4. 쉴드호환성 동일( R1 R2용 쉴드를 R3에서도 그대로 호환사용가능)
5. 드라이버도 동일
6. 업로딩속도도 동일 (스케치에서 보드 종류를 UNO로 선택하면됩니다.)

참고원문링크:

http://www.ladyada.net/library/arduino/unofaq.html



이하 영문 제품자료

Description: This is the new Arduino Uno R3. In addition to all the features of the previous board, the Uno now uses an ATmega16U2 instead of the 8U2 found on the Uno (or the FTDI found on previous generations). This allows for faster transfer rates and more memory. No drivers needed for Linux or Mac (inf file for Windows is needed and included in the Arduino IDE), and the ability to have the Uno show up as a keyboard, mouse, joystick, etc.

The Uno R3 also adds SDA and SCL pins next to the AREF. In addition, there are two new pins placed near the RESET pin. One is the IOREF that allow the shields to adapt to the voltage provided from the board. The other is a not connected and is reserved for future purposes. The Uno R3 works with all existing shields but can adapt to new shields which use these additional pins.

Arduino is an open-source physical computing platform based on a simple i/o board and a development environment that implements the Processing/Wiring language. Arduino can be used to develop stand-alone interactive objects or can be connected to software on your computer (e.g. Flash, Processing, MaxMSP). The open-source IDE can be downloaded for free (currently for Mac OS X, Windows, and Linux).

Features:

  • ATmega328 microcontroller
  • Input voltage - 7-12V
  • 14 Digital I/O Pins (6 PWM outputs)
  • 6 Analog Inputs
  • 32k Flash Memory
  • 16Mhz Clock Speed

Documents:

이미 소개해 드렸던 촬영된 이미지를 JPEG 포멧으로 압축하여 시리얼통신으로 전송해주는 카메라를 PC와 직접 연결하여 테스트해봤습니다.  시리얼 통신으로 촬영된 데이타를 전송해주므로  시리얼통신을 지원하는 모든 기기에 연결 가능합니다. 게다가 JPEG 이미지 포멧으로 압축하여 전송을 해주므로 저장만 해주면 PC에서도 그대로 확인이 가능해집니다.
본 동영상에서는 USB to 시리얼 변환기를 통해 PC와 연결한 뒤,  기본 제공되는 PC 용 테스트 프로그램을 이용하여  실시간 이미지 전송과 Single Shot(한장촬영) 기능을 테스트 및 해상도와 전송속도 조절기능도 사용해봤습니다. 

 

 

PC와 연결 구성

   PC USB포트<-> USB 케이블 <-> USB to Serial FTDI 변환기 <-> TTL Serial JPEG Camera

 

 

 

 

 

 

관련제품
 JPEG 시리얼통신 카메라
 USB to Serial 변환기 5V형

관련글 링크
 DIY 자작 휴대형 디지탈 카메라 만들기

오늘은 울트라 하이테크놀로지의 결합체인 디지탈 카메라를 만들어봤습니다.  "정말 피눈물나는 노력을 통해 완성한 나만의 아두이노 호환 똑딱이입니다." 라고 말씀드리면 거짓말이고요,  사실 제가 한 일이라곤 촬영된 이미지를 JPEG 포멧으로 시리얼통신을 통해 전송해주는 카메라와 이값을 수신하여 microSD메모리에 저장해주는 역활을 해주는 JPEG Trigger 아두이노 호환보드를 단순히 조립해주고 버튼한개 달랑 단것이 전부입니다.  아, 그리고 휴대용 카메라의 역활을 다할 수 있도록 3.7V Lipo충전지도 장착해줬습니다.  성능은 최신 카메라에 비길수 없겠지만 그래도 좋은건 센서연동 및 자유로운 제어가 가능한 아두이노 호환형 디지탈 카메라 시스템이라는 점입니다. 

시리얼통신 JPEG 카메라가 무엇인가?
시중에서 많이 구경할 수 있는 카메라들과 달리 촬영된 이미지를 JPEG 이미지 포멧으로 압축하여 시리얼 통신(TTL 레벨)으로 전송해주는 특수 카메라입니다.  즉, 시리얼 통신이 가능한 모든 기기에서 압축된 디지탈 이미지 데이타를 수신할 수 있습니다.(일반적인 video 신호 출력도 지원)  PC의 경우엔 FTDI USB시리얼 변환보드를 경유하여 카메라를 제어하고 이미지를 수신해 볼 수 있습니다. (

관련글 - 시리얼통신 카메라 PC연결하기 

)
그리고 무엇보다도 아두이노같은 8bit 저속 MCU 보드들에서도 시리얼통신으로 촬영된 이미지를 수신할 수 있게 되어 유용한 카메라입니다. 물론 압축된 이미지(JPG) 데이타라도 아두이노에서 실시간 처리를하는 것은 무리가 있습니다.  하지만 데이타를 SD메모리에 저장하고 참고하는 형태의 응용이라면 충분히 제 역활을 할수 있게되는데요,  이 역활을 하는 전용 보드(JPEG Trigger)가 있어 함께 사용하면 손쉽게 디지탈 카메라 기능 구현이 가능해집니다.

JPEG Trigger 보드
본 제품은 JPEG Camera와 짝을 이뤄 사용하도록 최적화된 아두이노 호환 보드이지만 몇가지 특수 기능을 갖쳐서 프로그램을 바꿔서 다른 용도로 사용하는것도 좋을 것 같습니다.   JPEG 이미지 저장용 microSD 메모리 인터페이스와   1V~ 5V 사이의 전원을 입력해주면 내장된 승압회로를 통해 5V전원으로 작동되도록 설계되어 건전지(1.5V or 3V)나 Lipo(3.7V) 충전지 하나만으로 작동이 가능합니다.  야호!  더불어 총 6개의 범용 IO핀( 아두이노 D2,D3,D4,A0,A1,A2) 홀이 제공되어 트리거(Trigger, 셔터눌러주기) 용도 및 기타 IO기능으로 사용이 가능합니다. 


오픈 소스 하드웨어
공개된 소스코드와 라이브러리를 설치해주면(이미 프로그램되어 있음) 원하는 방식으로 카메라 구현이 가능하므로 응용범위가 무궁무진해 집니다.



사진. 초간단 디지탈 카메라 구현 연결이미지
카메라 + 보드 + Lipo충전지 + 버튼 을 연결해주기만 하면 프로그래밍 없이도 바로 작동합니다.



동영상. 결합상태 확인 및 사진촬영 테스트

동영상 내용 소개
보드, 카메라, 충전지, 버튼이 연결된게 보입니다. 스위치를 켜주면 상태점검 후 상태 LED가 켜집니다.  이게 안켜지거나 깜빡거리면 카메라나 메모리에 문제가 있는것입니다.   초기상태의 경우  D2,D3,D4 버튼중의 하나를 GND에 연결하는 순간 카메라 셔터가 작동(촬영)되고 JPEG으로 압축된 이미지가 시리얼 통신으로 보드에 전달되고 이 정보가 SD메모리에 저장됩니다. 마침 네모로봇 군이 옆에 있어 버튼을 눌러 촬영을 해봤습니다.  이미지가 저장되는 중에 상태 LED가 깜빡거리는게 보입니다.  저장이 완료되면 상태 LED가 다시 켜집니다.  저장된 이미지는 PC에 연결하여 (변환과정 없이) 볼 수 있습니다.  (단, 초기 프로그램된 상태에선 확장자가 txt로 저장이되는 문제가 있어서 이를 PC에서 jpg 확장자로 변환해야 볼 수 있습니다. 신규 소스로 업로드하시면 이문제는 해결됩니다.)

사진. 촬영된 이미지 예



카메라와 보드 연결
JPEG카메라 <-> JPEG트리거보드
VCC -- 5V
GND -- GND
TXD -- D5(Rx)   주의. 카메라측 송신(Tx)단자가 트리거보드 측 수신(Rx)에 (교차)연결됩니다.
RXD -- D6(Tx)   주의. 카메라측 수신(Rx)단자와 트리거보드 측 송신(Tx)에 (교차)연결됩니다.
TV(미연결)  일반적인 video 신호출력선입니다. 본 예제에서는 사용안함.

전원
배터리 단자에 3.7V 정도의 Lipo충전지를 연결하여 사용하거나,
배터리 단자 옆에있는  GND와 1~5V 핀에   1~5V 전원을 연결해줍니다.
(입력된 전원은 5V승압회로를 통해 5V로 승압되어 공급되게됩니다.)
(FTDI USB시리얼 보드 연결시엔 usb 전원이 상시 연결됩니다.)

보드테스트
(카메라 및 메모리)아무것도 장착하지 않은상태에서
스위치 off상태에서 Lipo단자에 Lipo배터리 연결후, 스위치 on하고 몇초후 LED가 깜빡거려야함.


스위치 기능
배터리 입력전원을 승압회로에 연결여부를 선택해준다.(회로도를 꼭 참고하세요)
배터리 사용시 보드 ON/OFF 기능으로 사용됩니다.
(FTDI USB시리얼 보드 연결시엔 usb 전원이 상시 연결됩니다.)

사용법
카메라와 FAT 포멧된 메모리를 장착후 전원을 켜주면 LED가 ON된다.
메모리가 없거나 포멧상태 문제등으로 초기화가 안되면 LED는 깜빡인다.
카메라가 연결되지않은경우 LED가 안켜진다.
(단, 상태LED 모드는 펌웨어에 따라 다를수있으므로 해당 소스 상단 주석을 확인바랍니다.)

입출력핀
카메라 촬영신호를 받거나 I/O용으로 아래의 6개핀을 사용할 수 있습니다.
아두이노 디지탈핀 D2,D3,D4와
아두이노 아날로그핀 A0,A1,A2를 입출력
보드에는 손쉽게 전원활용을 할수있도록 각 입출력핀마다 GND,5V 홀(구멍)이 함께 있어서
총 18개의 구멍이 있습니다. 이때 GND, 5V 구멍이 안쪽에 있고 바깥쪽이 D2,D3,D4,A0,A1,A2 핀이므로 주의바랍니다.



카메라 촬영법
초기 제공되는 펌웨어(소스참조)의 경우
D2,D3,D4 핀을 GND에 연결하거나 (내부 Pullup되므로 별도 저항없어도 됩니다)
A0,A1,A2 핀을 5V에 연결하는 순간 카메라 촬영이 되고,이미지가 메모리에 저장됩니다.
이때 LED가 깜빡거리고, 저장이 끝날때까지는 재촬영이 안됩니다.


저장된 JPEG이미지
초기 제공되는 펌웨어의 경우,
저장된 이미지는 001.TXT 와 같이 확장자가 TXT로 저장되는 문제가있으며 이를 PC에서 JPG로 변경하셔야 이미지 확인이 가능합니다. 하지만 새로 제공되는 소스코드로 재프로그래밍 하시면 JPG확장자로 저장되므로 꼭 업그레이드 하시기 바랍니다.


주의사항:
보드가 켜있는 상태에서 메모리카드를 뽑지 마세요! 메모리 상태 및 보드 펌웨어 상태가 손상될 수 있습니다.
이경우 보드 펌웨어를 재프로그래밍하고 메모리를 재 포맷해야할 수 있습니다.


 

 

이번엔 기상측정기구와 이더넷 쉴드가 장착된 아두이노(Arduino)로 기상관측 자료를 트위터(Twitter)에 자동으로 올려주는 기특한 녀석을 소개시켜 드리겠습니다. 제법 시스템이라 불릴 만한 구성입니다.  바람의 방향과 속도 및 강수량을 측정할 수 있는 기상관측 기구로 부터 측정된 값을 모니터링하고 이를 곧바로 인터넷을 통해 트위터(twitter)에 올리는 것입니다.  기상 데이타 측정용으로 사용된

가상 관측기기에 대해선 관련글 링크

를 참고하시기 바랍니다.

본 글을 이해하기위해 필요한 사전지식:  기본적인 아두이노 스케치 개발환경 사용법, 라이브러리 설치법, 이더넷쉴드 사용경험, 트위터의 기본적인 이해, 기상관측 기구 센싱방법 등


트위터?
트위터(Twitter)가 뭔지는 저보다 여러분이 더 잘 알고 계실것 같습니다.  제경우 트위터 사용법도 잘 모릅니다만 순서가 뒤바껴서 트위터 포스팅해주는 로봇을 먼저 만들게 되었습니다;;;   이글을 이해하시려면 일단 트위터에 가입하셔서 트위(Tweet) 하나를 올려보시면 됩니다.

아두이노 + 이더넷 쉴드
썰렁한 아두이노(Arduino) 보드에 이더넷 쉴드를 얹으면 인터넷을 통해 전세계와 의사소통이 가능합니다. 더불어 천재적이면서 친절하기까지 하신 분들이 아두이노로 트위터에 메시지를 보내는 예제와 라이브러리를 공개해 주셨으므로 저와 여러분들은 손쉽게 엄청난?;; 시스템 구현을 할 수 있는 상황입니다.  이더넷 쉴드 사용 경험이 없으신 분들은 우선 공개된 정보와 아두이노 스케치IDE에 포한된 기본 예제를 참고하시기 바랍니다.


아두이노 + 이더넷 쉴드의 한계
이더넷 쉴드를 장착하면 아두이노 보드로 정보서비스를 제공해주는 서버 역활을 할 수 있습니다.  외부 접속이 가능한 IP주소를 사용한다면 전세계의 인터넷 접속가능 기기를 통해 정보를 제공받을 수 있습니다.  하지만 동시 접속수 제한이나 퍼포먼스 문제로 원할한 서비스 제공에는 한계가 있습니다. 이때문에 아두이노를 데이타 센싱이 용이한 현장에 설치 후 취합한 데이타를 웹서비스를 담당하는 PC급 서버로 전달하여 제대로된 웹서비스 환경에 응용하는 것이 더 안정적인 방법일 수 있습니다.

이때 손쉽게 사용가능한 서비스가 HTTP Client입니다. 즉, 아두이노는 웹클라이언트로써 웹서버에 필요할 때만 접속하여 데이타를 송/수신 하는 방식입니다.    이더넷 라이브러리와 함께 제공되는 기본예제(WebClient)를 조금만 수정하면 활용이 가능합니다.  IP주소로 접속이 가능한 웹서버가 있는경우 추천할만한 방법입니다.  다만 문제는 기본 이더넷 쉴드 라이브러리를 이용한 Web Client 로는 domain name ( http://robobob.co.kr 같은) 을 통한 서버 접속이 안되고  123.123.123.123  같은 숫자형식의 ip를 이용한 접속만 가능하다는 점입니다.  예전에는 ip주로를 통한 접속 주소를 지원하는 웹호스팅 서비스가 있었지만 요즘엔 이를 지원하지 않는곳이 대부분인것 같습니다. 때문에 특정 웹호스팅 서비스나 단독 호스팅서비스를 사용하지 않으면 Web Client 사용한 접속이 불가한 상황입니다.  (일반적인 URL 주소를 통한 아두이노의 HTTP Client 접속 방법을 아시는 분은 안내 부탁드립니다.)

트위터 활용
HTTP Client 활용에 문제가 있으나 오히려 더 효과적일 수 있는 데이타 공유 방법이 있으니 바로 트위터입니다. 짧은 단문을 포스팅하면 수많은 팔로워에게 전달되는 효과적인 데이타 공유시스템을 활용하는 것입니다. 게다가 요즘 대세인 스마트폰에서도 손쉽게 접근이 가능한 최신병기입니다. 그런데 방법이 어렵냐고요???  제가 해보니 생각보다 매우 간단했습니다.   트위터 엡 개발을 위해 API니 뭐니 습득하고 복잡한 절차가 필요한지 알았는데요, 그게 아니고 그냥 사용만 하면 되네요...


트위터 포스팅 방법
방법은 요 사이트에 잘 요약되어있습니다.

http://arduino-tweet.appspot.com/

별 설명이 필요없습니다만, 정리하자면 아래와 같습니다.
1. 트위터 앱(O Auth)에 접속하여 승인을 해주면 복잡한 문자열로 된 토큰 정보가 생성됩니다. 이 값을 복사하여 잘 보관합니다.
2. 관련 라이브러리들을 설치해줍니다. 두군데 정도 접속하여 파일을 받아서 아두이노 library 폴더에 적절한 이름으로 복사합니다.
3. 예제소스를 실행해봅니다.
   위 라이브러리를 제대로 설치하면 스케치 IDE  Examples 리스트에 Twitter가 생깁니다.
   File menu > Examples > Twitter > SimplePost 예제를 선택해줍니다.

이더넷 쉴드 사용시 수정해주는  ip주소와 네트웍정보 몇개만 수정해주시고 추가로  "YOUR-TOKEN-HERE" 부분을  위에서 발급받은 토큰값으로 대체해 주면 준비 끝~ 입니다.
이젠 잘 전송되는지 확인을 위해 시리얼 모니터링 창을 열고 속도(9600)를 맞쳐줍니다.

SimplePost 예제 소스 내용보기

#if defined(ARDUINO) && ARDUINO > 18   // Arduino 0019 or later
#include <SPI.h>
#endif
#include <Ethernet.h>
#include <EthernetDNS.h>
#include <Twitter.h>

// Ethernet Shield Settings
// 쉴드 밑면에 있는 mac 정보를 적어줍니다. 쉴드가 하나인경우 안바꿔도 무방
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 


// substitute an address on your own network here
byte ip[] = { 192, 168, 2, 250 };   //공유기에서 사용되지않는 IP값을 지정

// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("YOUR-TOKEN-HERE");   // 발급받은 토큰값을 이곳에 붙여넣으세요

// Message to post
char msg[] = "Hello, World! I'm Arduino!";   // 한글 전송도 가능합니다!

void setup()
{
  delay(1000);
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
 
  Serial.println("connecting ...");
//부팅시 1회 포스팅 시도합니다.
  if (twitter.post(msg)) {
    // Specify &Serial to output received response to Serial.
    // If no output is required, you can just omit the argument, e.g.
    // int status = twitter.wait();
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
    } else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } else {
    Serial.println("connection failed.");
  }
}

void loop()
{ //아무것도 안합니다. 
}

SimplePost 예제 소개
예제로 사용된 소스에는 아두이노가 부팅할때마다 1회 포스팅을 하고, 포스팅 될때마다 결과 상태를 시리얼 통신으로 전달해 줍니다. (참고로 시리얼 창 새로 열거나 통신속도를 변경하여도 아두이노가 재부팅이되어 새로 포스팅을 시도합니다.)
결과가 Okay로 뜬다면 잠시 후 여러분의 트위터 페이지에 새 트윗이 올라온것이 보일 겁니다.
Okay 외의 오류 메시지를 잘 살펴보시면 디버깅에 도움이 됩니다.

포스팅 시도후 오류메시지가 뜨는 경우가 종종 있는데요  제가 발견한 주요 오류 내용은 아래와 같습니다.
1. 동일한 내용을 중복하여 전송한 경우: 이경우 중복 전송된 값은 무시됩니다.
2. 트윗 작성 한계치 초과 :  시스템 보호를 위해 일정 시간당 한정된 개수의 트윗만 허용됩니다.   이 수량을 초과시 일정기간 동안 트위 작성이 불가하며 일정 시간이 지난뒤에 다시 작성이 가능해집니다.   가령  수십초에 한번씩 계속 트윗을 하신다면 얼마지나지 않아 트윗 등록이 거부될 겁니다.   아래의 예제에서는 1시간에 1회 트윗을 발신하게됩니다.




드디어 트위터 기상로봇

이제 포스팅될 정보를 여러분의 용도에 맞게 잘 구성해주시면 여러분만의 활용도 만빵인 트위터 포스팅 봇이 완성됩니다.
제 경우 이미 소개드렸었던 기상측정기기를 활용하여 1시간마다 기상데이타를 측정하여 전송해주는 예제를 만들어봤습니다.
실제 포스팅된 내용들을 아래의 페이지에서 확인 가능합니다.

로보밥 기상측정 로봇 트위터 메시지 보러가기 :  

http://twitter.com/artrobot_bot1

한동안 실내 테스트만 하다가 2012년 1월 29일 현재,  옥외 설치하여 운영중입니다.  위 링크에 가보시면 실제 기상자료를 참고하실 수 있습니다. (경기도 수원시 오목천동)

위에서 트윗된 메시지의 포스팅 시간을 보시면 (오차가 1분도 안되네요^^.)1시간 간격으로 전송이 된것을 보실 수 있습니다. 하지만 가끔씩  몇 시간에 한번만 트윗된 것도 보이실 겁니다. 이때는 테스트를 위해 실내에서 측정된 풍량/풍속/강수량 수치의 변화가 없어서 동일한 내용을 반복 포스팅한것으로 인지되어 무시된 경우입니다.  (계속 변화하는 시간값이나 랜덤숫자를 함께 전송하시면 이문제가 해결됩니다.)

사진. 기상측정 기구

+

사진. 아두이노로 만든 트위터 포스팅해주는 로봇

사용된 예제 소스 소개
값의 정밀도나 완성도를 무시하고 필요하신 분들에게 참고가 될 수 있도록 예제소스를 공개합니다.  풍향, 풍속, 강수량의 측정치 산정의 기준은 기상측정기기 제조사에서 제공한 데이타 시트를 참고하여 계산된 값입니다. 센서 연결 방법 및 기본 사용법 소개는 관련글 링크에 있는 글을 참고하시기 바랍니다.


/*
* 풍향, 풍속, 강수량을 Twitter에 포스팅하는 예제
  수정일시:  (2011.09.08a)  디버깅 및 기능개선을 위해 수시로 변경될 수 있습니다.

 풍향: 포스팅시 1회 계산 (16방위 중 하나로 측정)
 풍속: 20ms 주기로 10초간 모니터링 후 풍속계산
 강수량: 20ms 주기로 모니터링하여 1시간동안 누적(1시간에 1회 공식 데이타로 사용)
 
 핀연결
 풍향계: A0   풍향센서 전선 2개 중 하나는 GND에 나머지선은 A0에 연결 및 10k저항 거쳐 5V에 연결
 풍속계: D2   풍속센서 전선 2개 중 하나는 D2에 나머지는 GND
 강수계: D3   강수센서 전선 2개 중 하나는 D3에 나머지는 GND

 기타 핀 연결 (없어도 무방)
 D7: 풍속계 상태 LED
 D8: 강수량계 상태 LED
 D9: 버튼 ( 버튼을 누르면 10초내로 즉시 포스팅)

* http://ArtRobot.co.kr
* http://RoboBob.co.kr
*/

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetDNS.h>
#include <Twitter.h>
#include <stdio.h>

#define WIND_N    0
#define WIND_NNE  22.5
#define WIND_NE    45
#define WIND_ENE  67.5
#define WIND_E    90
#define WIND_ESE  112.5
#define WIND_SE    135
#define WIND_SSE  157.5
#define WIND_S    180
#define WIND_SSW  202.5
#define WIND_SW   225
#define WIND_WSW  247.5
#define WIND_W    270
#define WIND_WNW  292.5
#define WIND_NW   315
#define WIND_NNW  337.5

// Ethernet Shield Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //바꿔주세요

// substitute an address on your own network here
byte ip[] = { 192, 168, 100, 55 }; //바꿔주세요

// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("발급받으신 토큰값을 적어주세요");  //바꿔주세요

// Message to post
char msg[100] = "";

const int windVanePin = A0;  // 풍량계 센서 입력핀
int windVaneValue = 0;        //
float windSpeed = 0;
float rainGauge = 0;
float windDirection = 0;
char windName[4];  // N (North)  S South,   NS(north south)   NNS(north north south) etc

  unsigned long windSpeedTimer;
  int windSpeedState = true;
  int windSpeedPin = 2;
  int windSpeedCounter = 0;
  unsigned long rainGaugeTimer;
  int rainGaugeState = true;
  int rainGaugePin = 3;
  int rainGaugeCounter = 0;
  int buttonState = true;
  int buttonPin = 9;
  int postTrigger = false;
  int postingCounter = 0;

void setup()
{
  delay(1000);
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
 
  //wind speed sensor
  pinMode(windSpeedPin, INPUT);
  digitalWrite( windSpeedPin, HIGH);
 
  //rain gauge sensor
  pinMode(rainGaugePin, INPUT);
  digitalWrite( rainGaugePin, HIGH);

  //button for postMessge
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
 
  //wind speed sensor status LED
  pinMode(7, OUTPUT);
  digitalWrite(8,HIGH);
 
  //rain gauge status LED
  pinMode(8, OUTPUT);
  digitalWrite(8,HIGH);
 
}

// 문자배열변수값을 시리얼로 확인할경우만 사용
void printChars(char *msg, int len){
  if(len == 0) return;
  for(int i=0; i<len ; i++)
    Serial.print( msg[i]);
  Serial.println();
}

// sprintf함수에서 float형 print문제 대체용 함수 , float의 정수부인쇄
int f2h( float num){
  return int(num);
}

// sprintf함수에서 float형 print문제 대체용 함수 , float의 소수부인쇄
int f2p( float num){
  return (num - int(num)) * 100;
}


void loop()
{
  // 10초마다 샘플링 반복
  windSpeedTimer = millis() + 10000;
  windSpeedCounter = 0;
  while( millis() < windSpeedTimer ){
    delay(20); // 20ms 주기로 버튼이나 센서 스위칭 감시
    //wind speed
    if( (windSpeedState == true ) && !digitalRead( windSpeedPin) ){
        windSpeedCounter++;
        windSpeedState = false;
    }else if( (windSpeedState == false) && digitalRead(windSpeedPin) ){
        windSpeedState = true;
    }   
    //rain gauge
    if( (rainGaugeState == true ) && !digitalRead( rainGaugePin) ){
        rainGaugeCounter++;
        rainGaugeState = false;
    }else if( (rainGaugeState == false) && digitalRead(rainGaugePin) ){
        rainGaugeState = true;
    }       
   
    //button
    if( (buttonState == true ) && !digitalRead( buttonPin) ){
        postTrigger = true;
        buttonState = false;
    }else if( (buttonState == false) && digitalRead(buttonPin) ){
        buttonState = true;
    }      
    digitalWrite(7, windSpeedState);  
    digitalWrite(8, rainGaugeState);      
  }

  windSpeed = windSpeedCounter * 0.24;   // 1초당 1회 스위칭시 2.4km/h
  //Serial.print( "winSpeed: ");
  //Serial.println( windSpeed);

  rainGaugeTimer++;
  if( rainGaugeTimer > 360){  //1시간( 10 * 360 sec) 마다 postTrigger On
    rainGauge = rainGaugeCounter * 0.2794;
    rainGaugeCounter = 0;

    rainGaugeTimer = 0;
    postTrigger = true;
  }
  getWindDirection(); 

// 1시간마다 or 버튼이 눌릴때마다 Trigger 가 true가 되고 이때 포스팅된다.
  if( postTrigger ){ //post Message
    postTrigger = false;
    sprintf( msg, "[%d]기상측정로봇: 풍향:%s/%d.%d 풍속:%d.%d(km/h) 1시간당 강수량 %d.%d(mm/h).",postingCounter++ , windName, f2h(windDirection), f2p(windDirection), f2h(windSpeed), f2p(windSpeed),  f2h(rainGauge), f2p(rainGauge) );

    printChars( msg, sizeof(msg) );  //시리얼창으로 확인용, 생략가능
    postMessage();
  }

}

void postMessage(){
  Serial.println("connecting ...");
  if (twitter.post(msg)) {
    // Specify &Serial to output received response to Serial.
    // If no output is required, you can just omit the argument, e.g.
    // int status = twitter.wait();
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
    } else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } else {
    Serial.println("connection failed.");
  }
}

float getWindDirection(void){
 // 풍향센서의 출력 전압을 아날로그 센서로 읽어옴
  int readValue = analogRead(windVanePin);           
  // ADC입력치를 0~5V 범위로 변환, 데이타시트 값과 대응이 쉽도록.
  windVaneValue = map(readValue, 0, 1023, 0, 500); 
 
  // 해당 전압치에 따라 16가지 방향 중 하나의 풍향을 결정
  if( windVaneValue < 35){
    // DIR5  112.5  0.32v (31 32)    0~35
    windDirection = WIND_ESE;
    strcpy(windName ,"ESE");       
  }else if( windVaneValue < 43 ){
    // DIR3  67.5  0.41v(40 41)    ~42   
    windDirection = WIND_ENE;
    strcpy(windName , "ENE");       
  }else if( windVaneValue < 50 ){
    // DIR4  90  0.45v(44 45)      ~50   
    windDirection = WIND_E;
    strcpy(windName , "E");       
  }else if( windVaneValue < 70 ){
    // DIR7  157.5  0.62v(60 62)   ~70
    windDirection = WIND_SSE;
    strcpy(windName , "SSE");       
  }else if( windVaneValue < 100 ){
    // DIR6  135  0.90v(89 90)      ~100
    windDirection = WIND_SE; 
    strcpy(windName , "SE");       
  }else if( windVaneValue < 130 ){
    // DIR9  202.5  1.19v(119 120)  ~130
    windDirection = WIND_SSW; 
    strcpy(windName , "SSW");       
  }else if( windVaneValue < 170 ){
    // DIR8  180  1.40v(140 141)   ~170
    windDirection = WIND_S; 
    strcpy(windName , "S");       
  }else if( windVaneValue < 210 ){
    // DIR1  22.5  1.98v(198 199)  ~210
    windDirection = WIND_NNE; 
    strcpy(windName , "NNE");           
  }else if( windVaneValue < 250 ){
    // DIR2  45  2.25v(226 227)    ~250
    windDirection = WIND_NE; 
    strcpy(windName , "NE");           
  }else if( windVaneValue < 300 ){
    // DIR11 247.5  2.93v(293 294)  ~300
    windDirection = WIND_WSW; 
    strcpy(windName , "WSW");       
  }else if( windVaneValue < 320 ){
    // DIR10 225  3.08v(308 310)   ~320
    windDirection = WIND_SW; 
    strcpy(windName , "SW");       
  }else if( windVaneValue < 360 ){
    // DIR15 337.5  3.43 (343 345)  ~360
    windDirection = WIND_NNW; 
    strcpy(windName , "NNW");       
  }else if( windVaneValue < 395 ){
    // DIR0  0  3.84v(384~385)    ~395
    windDirection = WIND_N; 
    strcpy(windName , "N");
  }else if( windVaneValue < 415 ){
    // DIR13 292.5  4.04v(405 406)  ~415
    windDirection = WIND_WNW; 
    strcpy(windName , "WNW");   
  }else if( windVaneValue < 450 ){
    // DIR14 315  4.34(433 434)  ~450
    windDirection = WIND_NW; 
    strcpy(windName , "NW");       
  }else if( windVaneValue < 490 ){
    // DIR12 270  4.62v(461 463)    ~490
    windDirection = WIND_W; 
    strcpy(windName , "W");       
  }else{
   //error  알수없는 값범위
  }

}





관련제품
아두이노 (Arduino)
표준 아두이노 이더넷 쉴드
이더넷 일체형 아두이노
기상측정용 기구

관련글 링크

  • 기상측정 기구 + 아두이노로 기상대 만들어요 (Arduino + Weather Sensor Assembly )
  • 트위터(Twitter)에 자동 포스팅하는 기상관측 로봇 (현재글)
  • 기상측정 트위터 로봇 - 실외 설치편
  • 이더넷쉴드 관련   링크1   링크2

추가사항 (2011.11.29)
아두이노와 이더넷 쉴드를 하나로 결합한 Ethernet Pro 보드로 기상측정 트위터 기능을 구현할 수도 있습니다. 특히 PoE 케이블을 이용하시면 전원과 이더넷케이블을 하나로 줄일 수 있어 더욱편리합니다. 가령 위의 시스템을 아래의 이미지와 같이 간소화 시킬 수 있습니다.

+ Recent posts