오늘은 울트라 하이테크놀로지의 결합체인 디지탈 카메라를 만들어봤습니다.  "정말 피눈물나는 노력을 통해 완성한 나만의 아두이노 호환 똑딱이입니다." 라고 말씀드리면 거짓말이고요,  사실 제가 한 일이라곤 촬영된 이미지를 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 케이블을 이용하시면 전원과 이더넷케이블을 하나로 줄일 수 있어 더욱편리합니다. 가령 위의 시스템을 아래의 이미지와 같이 간소화 시킬 수 있습니다.

로보밥 얼뚱. 연구소에서 또 한가지 재밌고도 쓸만한 물건을 입수했습니다.
바로 RFID 스타터 킷 입니다.

 

 

 

 

 

 

 

[사진1. RFID 테스트 - 다양한 태그들]

RFID는 이미 버스, 전철, 신용카드, 아파트 출입구, 직원카드, 화물추적, 도서관 책, 상품 인식 및 보안용 태그 등으로 엄청난 양이 사용되고 있습니다.  수십년전 부터 많이 사용되오던 바코드와 유사하게 특정 값을 기억하고 손쉽게 리더기로 그 값을 읽어들여 신분확인이나 제품의 종류를 확인하는데 사용되고 있는데요  바코드가 아직은 더 저렴하고 일반적이지만 기억용량, 읽고 쓸 수 있는 능력, 자체 전원으로 원거리 인식 기능 제공등의 특수한 기능에 더 특화되어 응용될 수 있다는 장점으로 인해서 점점 더 영역을 넓혀 가고 있습니다.  참고로 최근의 최신 스마트폰에 내장된 NFC(Near Field Communication)도 전자기 유도현상이나 전자파를 통한 근거리 통신기술을 응용한 것으로 RFID와 유사한 기술의 하나로 볼 수 있습니다.

RFID는  주파수, 통신방식, 자체전원 여부 등에 따라 여러가지가 있습니다.
본 글에서는 가장 손쉽게 응용할 수 있는 읽기전용 카드 태그와 리더기 및 PC인터페이스 보드가 함께 제공되는 RFID 스타터킷에 대해 소개해 드리고자 합니다.

RFID 스타터킷의 구성품은 아래와 같습니다.
 .RFID 리더 모듈
 .PC USB통신용 FTDI 인터페이스 보드
 .카드형 RFID Tag(125KHZ형 ) 2개  [

제품링크

]

 

 

 

[사진2. RFID 모듈 뒷 모습 - 안테나 내장 ]

 

 

[사진 3. RFID모듈과 PC 인터페이스용 FTDI 보드 ]

관련 제품 링크
==

 

125KHZ형 RFID 태그와 리더기는 직원출입카드, 아파트 현관출입 카드 등으로 이미 많이 사용되고 있으므로 많은 경우 이미 보유하고 있는 카드를 그대로 이용하실 수 있습니다. 또한 RFID 리더 모듈은 안테나를 내장한 제품으로 아두이노 같은 손바닥 컴퓨터에 직접 연결하여 이동형 RFID리더 응용프로그램 개발이 가능하며, PC용 응용 프로그램을 제작할 때는 USB연결용 보드에 RFID 리더 모듈을 장착하면 PC측 USB포트에 연결하여 시리얼통신으로 RFID TAG의 코드를 인식하는 어플리케이션 개발도 가능하므로 활용성이 높습니다.


RFID 스타터킷 플래시 연동하기

플래시로 시리얼통신 장비와 연동을?

대부분의 시스템 프로그래밍 개발환경들은 시리얼 통신 제어가 가능하므로 RFID리더기로 부터 수신되는 데이타를 곧바로 처리할 수 있습니다. 하지만 아티스트 여러분들이 많이 사용하는 플래시는 아직 직접적인 시리얼통신을 할 수 없습니다.
때문에 시리얼통신을 플래시에서 지원되는 네트웍통신으로 중계해주는 프로그램을 사용해야 하는데요
가령 SerialProxy라는 프로그램이 있습니다.
본 글을 통해 실제 어떻게 프로그램들을 구성하는지와 네트웍 통신을 통해 수신되는 RFID 데이타를 어떻게 처리하여 응용할 수 있는지를 플래시용 예제 소스와 함께 소개해 드리고자 합니다.

일단, 예제 수행 동영상을 참고하시기 바랍니다.

[동영상1. 플래시 RFID 인식 시스템 구성 소개]

[동영상2. 플래시에서 RFID 인식하는 예제 수행]
태그 인식장면을 보기 쉽게 RFID리더를 모니터상단에 설치하였습니다.



RFID 스타터킷 + 플래시 인식 어플리케이션  준비 과정

1. RFID 설치
 RFID리더모듈을 PC연결용 보드에 장착후 USB케이블로 PC측에 연결해줍니다.
 이후, 운영체제가 장치를 인식하고 드라이버 자동설치를 시도하게 됩니다.
 운영체제에 따라 드라이버가 자동설치 될 수 도 있지만,
 자동인식이 안될 경우엔 FTDI 드라이버를 설치해 주시기 바랍니다.
 
 설치 완료후, 장치관리자>포트 리스트에서 해당 장치의 COM번호를 기억해 둡니다.
 
 간혹 케이블 연결 후 에도 장시간 아무런 반응이 없다고 문의주시는 분들이 있습니다.
 이경우, 케이블을 교체 후 연결해보시기 바랍니다.
 
2. SerialProxy 설치
시리얼프록시란 시리얼통신을 통한 데이타 입출력을 네트웍통신으로 중계해주는 프로그램입니다.

시리얼 통신만 가능한 장치도 이 프로그램을 이용하면 네트웍 통신이 가능해집니다.
반대로 네트웍통신만 지원하는 SW도 이 프로그램을 통해 시리엉 장치와 통신이 가능해집니다.
사람으로 치면 인터프리터(통역자) 정도 되는 녀석입니다.

다운로드하여 설치 후,
serproxy.cfg 파일을 수정하여 자신의 설정에 맞게 속도(9600), COM포트번호(가령 COM3)와 네트웍통신용 포트번호(가령 5331) 를 설정합니다.   또한가지 잊지말고  newlines_to_nils 가 false인지 확인해주시기 바랍니다.(false로 지정해야 불필요한 정보 전송이 안됩니다. true로 지정되면 플래시측 소스 수정요함)

 

설정파일 실제예

# Do not Transform newlines coming from the serial port into nils
newlines_to_nils=false

# Comm ports used
comm_ports=8

# Default settings
comm_baud=9600 
comm_databits=8
comm_stopbits=1
comm_parity=none
# Idle time out in seconds
timeout=300

# Settings for COM
net_port8=5331

 

 
 
3. 플래시 소스 수정하기
 플래시측 소스에서 SerialProxy와 통신을 위한 포트번호(가령 5331)를 확인하고 필요시 수정합니다.

4. SerialProxy 실행하기

5. 플래시 실행하기



RFID 내부 살펴보기

본 예제에서 사용된 태그의 경우 리더기로 값을 읽으면 태그 ID와 관련된 정보들이 Ascii코드로 시리얼 통신으로 전달됩니다.
아래와 같은 리더기 데이타 시트 정보를 참고하시면 해당 바이트의 의미를 파악할 수 있습니다.

 

 

 

[그림1. RFID리더기 데이타 출력 포멧 - 데이타 시트 참고 ]

 

리더기의 기본 출력 모드는 ASCII 코드 방식입니다.
가령 리더기에 태그를 인식시킬 때 마다 아래와 같이 16바이트 정보가 읽혀집니다.

02 34 35 30 30 42 38 45 45 43 42 44 38 0D 0A 03    //모두 16진수로 표기된 값입니다.

(위 정보는 시리얼 터미널 프로그램에서 시리얼 수신값을 16진수로 표시하면 볼 수 있으며,
아두이노 시리얼 모니터창으로 볼 경우 ASCII코드값으로 해석되어 다르게 출력되며 일부 문자가 깨져보이게 됩니다.)

16바이트의 정보는 각각 아래와 같이 해석할 수 있습니다.

0x02 // 1바이트 태그 정보의 시작을 알려주는 표시값 입니다.
0x34 // 10바이트 ASCII코드값의 시작
~     // 이 값들이 RFID의 고유 ID값 입니다.)
0x42 // 10바이트 ASCII코드값의 끝
0x44, 0x38  // 10바이트 id값의 2바이트 체크섬 (오류검사용, 보통 무시하거나 RFID ID값의 일부로 봐도 됩니다.)
0x0D // CR 캐리지리턴 (줄넘김 명령에 해당하는 ASCII 코드값)
0x0A // LF 라인피드(줄넘김 명령에 해당하는 ASCII 코드값)
0x03 // 태그 정보의 끝을 알려주는 표시값

위 정보를 시작 및 종료코드와 CR,LF 를 제외하고 ASCII코드로 표시하면 아래와 같습니다.

4500B8EECBD8

체크섬(D8)값을 제외하면 실질적인 태그의 고유 ID는 아래와 같이 표시 할 수 있습니다.

4500B8EECB
// ID값은 ASCII코드 중 숫자와 알파벳으로 표현 가능한 값으로 구성됩니다.

 

 

 

[그림2. 태그의 고유값 태그ID]

RFID 시스템에서는 위 ID값을 특정 사람이나 물건의 고유 ID값으로 설정해두고 리더기에서 위의 ID를 발견시 해당 사람이나 물건이 감지되었다고 인식하게 되는 것 입니다.

위의 플래시 예제에서도 미리 등록된 ID와 일치하는 경우 해당 이미지를 화면에 출력하였습니다. 만일 출입문에 응용된다면 출구를 열어주면되고, 도서관에서 도서대출시스템에 이용한다면 해당 ID의 책을 대출 처리하면 되는겁니다. 즉, 실제 응용방법은 바코드와 동일합니다.

본 스타터킷에서 사용되는 리더기와 태그는 태그의 ID값을 읽기만 가능하고 태그 ID는 미리 고정된 값으로 등록되어 있으므로 태그를 재프로그래밍할 필요가 없고 단순히 미리 지정된 태그값을 읽어서 일치하는 경우에 해당 업무를 수행하면 되므로 비교적 손쉽게 응용이 가능한 제품입니다.

스타터킷으로 손쉽게 다양한 RFID응용프로그램 개발을 경험해 보신 후, 좀더 본격적이고 복잡한 어플리케이션을 개발하실 경우 쓰기 지원 RFID시스템도 고려해 보시기 바랍니다.  추후 소개해 드릴 다른 종류의 RFID 모듈과 TAG의 경우 1KByte의 데이타를 태그에서 읽는 것은 물론이고 쓰기까지 가능한 제품도 있습니다.

 

 

 [사진4. 카드형 RFID Tag ]


 

 

[사진5. 유리캡슐형 RFID태크 - 동물의 체내 삽입용과 유사한 제품 ]
사람 몸에 넣으면 안되요;;


예제에서 사용된 플래시 소스를 첨부합니다. 

 

RFID-Tester.fla
다운로드

 

로보밥 아두이노 튜토리얼(Robobob Arduino Tutorial) 첫번째 이야기



RT1. 아두이노 설치하고 LED Blink 깜빡이 프로그래밍 하기


다루는 내용
. 아두이노 프로그래밍 환경(스케치) 설치하기
. PC에 아두이노 보드 인식시키기
. 프로그래밍한 뒤 아두이노에 전송하여 작동시키기

개요:
본글은 아두이노를 처음 사용하는분들을 위한 안내문입니다.
모든 아두이노 보드의 설치작업은 유사하며, 사용되는 USB시리얼 통신용 칩에 따라 드라이버 파일이나 inf설정 파일만 다릅니다. 본 글을 통해 아두이노 프로그래밍 환경인 스케치(Sketch)를 설치하고, 아두이노 보드를 PC에 인식시킨 후 아두이노에 기본 장착된 LED를 제어하는 프로그램을 전송하여 실행시키는 과정까지 다루고 있습니다.
아마도, 마이크로콘트롤러와 프로그래밍에 대해 아무것도 모르시던 분들도 1시간내에 아두이노에 장착된 LED를 제어해보고 그 가능성을 경험해보실 수 있을실 겁니다.

순서
.아두이노 스케치를 다운로드 받아서 설치하기
.아두이노를 PC에 인식시키기
.스케치(아두이노 개발환경)의 실행
.예제 소스 불러오기(Blink; LED깜빡이)
.예제 컴파일 및 아두이노에 전송
.작동 상태 확인

자, 그럼 차근 차근 하나 둘 순서대로 진행해 보겠습니다


1단계. 준비물 확인

준비물

CASE 1 :: 아두이노 보드 자체에 USB시리얼 변환기능이 포함된 제품의 경우
 .아두이노 UNO

, Mega2560

 .USB 케이블 (A to B 타입단자)  
CASE 2 :: 아두이노 FIO, Pro, Pro mini, LilyPad  등(내장 USB시리얼변환기가 없는 경우)
 .아두이노 보드 [

아두이노 리스트

]
 .FTDI USB시리얼 변환기 [

제품선택 가이드

]
 .A to mini-B 타입 USB케이블 [

 

]

아두이노는 Linux , Mac OS, Windows 모두를 지원하며 본 글은 Windows 환경의 경우를 기본으로 소개합니다.


2단계. 아두이노 개발환경 설치하기

그림을 그리듯 프로그래밍도 Sketch 하세요!

아두이노 공식 홈페이지인

Arduino.cc

에 가보시면, 아두이노(Arduino) 소개문이 있습니다.
이를 한 줄로 요약하면, 아두이노란 오픈소스 전자기기 프로토타입 플래폼이라는 얘기인데요, 간단히 말하자면, 전자기기 개발에 사용하는 소프트웨어와 하드웨어가 공개되어 있다는 겁니다.

바로 지금 설치하려는 Sketch(스케치) 프로그램이 아두이노 개발에 사용되는 공개형 개발환경입니다.
무료일 뿐만 아니라 소스코드도 공개되어 있습니다. 아래의 링크에서 최신버전을 다운로드하시기 바랍니다.

http://arduino.cc/en/Main/Software

 

사용하시는 OS용 파일을 선택하여 다운로드 합니다. 본 예제에서는 Windows 를 선택합니다.


다운로드 받은 파일은 zip압축파일이며 이를 원하는 위치에 압축 해제합니다.
(*가령 윈도우의 경우 파일명은 arduino-0022.zip(87MB) 이며 버전이 업그레이드되면 제목의 숫자가 증가됩니다.)

압축을 해제하면 arduino-0022 같은 폴더가 보이며 그안에 arduino.exe 실행 파일이 보입니다.
아두이노 개발환경(스케치)은 설치과정 없이 곧바로 실행할 수 있게 배포되므로 이것으로 설치과정이 완료되었습니다. ^^.
arduino.exe 를 실행하면 아두이노 개발환경이 열립니다. 일단 종료해 둡니다.

3단계. PC에 아두이노 연결하기

UNO와 대다수의 아두이노 보드들은 PC와 연결시 별도의 전원이 없이 작동이 가능합니다.
즉, USB케이블을 통해 시리얼통신 신호를 주고 받는것과 더불어 전원도 공급받게 됩니다.

호환되는 USB케이블로 PC와 아두이노를 연결합니다.
FIO나 Pro mini같은 아두이노의 경우 FTDI USB시리얼 변환보드를 경유해 PC와 연결합니다.
전원 ON상태 표시등(초록색 LED)에 불이 들어옵니다.


4단계. 드라이버 설치하기

아두이노(가령 UNO)와 PC를 케이블로 연결하면, 잠시 후 새장치를 발견하여 드라이버를 설치한다는 메시지가 나오게됩니다.
그리고 몇 초 동안 짱구를 돌리며 열심히 노력하던 우리의 윈도우OS는 결국 자동인식에 실패했다는 메시지를 남기곤 숨어버립니다. (단, 윈도우 환경과 보드 종류에 따라 드라이버를 자동인식하여 설치하는 경우도 있습니다.)

결국 여러분이 직접 드라이버를 골라서 설치해 주셔야하는데요,  많은 분들이 이미 이 작업에 익숙해져 있으실 겁니다. 가령 아래의 순서대로 하시면 됩니다.  (다른방법을 사용하셔도 되며, 드라이버 위치만 참고하시면 됩니다.)

.윈도우 시작 > 제어판 > 장치 관리자("장치 및 프린터" 그룹)  를 엽니다.
.장치리스트에서 "포트"를 선택하면, "Arduino UNO (COMxx)"라는 장치명이 보입니다.
.해당장치를 우측버튼으로 클릭한 뒤 "드라이버 업데이트"를 선택합니다.

.직접 드라이버 검색위치지정을 선택합니다.
UNO와 Mega2560 의 경우:
  > 2단계에서 다운로드 후 압축해제한 arduino-00xx 폴더내에 있는 drivers 폴더를 선택
Pro, Pro mini, FIO, LilyPad등의 FTDI시리얼 보드 사용제품의 경우:
  > drivers폴더안에 있는 FTDI USB Drivers 폴더를 선택

.위도우가 UNO 장치 인식을 완료하게됩니다.

장치 설치가 완료된 이후엔 장치관리자 "포트" 장치 리스트에서 인식된 아두이노 보드의 COM번호를 알아두는게 중요합니다.


4단계 순서대로 다시 보기
(드라이버 설치 과정 캡쳐이미지, WINDOWS 7 기준)
드라이버 설치과정을 아래의 캡쳐된 이미지 순서대로 다시한번 살펴봅니다.


아두이노와 PC를 연결합니다.
가령, UNO + USB Cable + PC USB 포트
가령, Pro mini + FTDI USB 시리얼 변환기 + USB mini Cable + PC USB 포트


윈도우가 장치를 발견하고 드라이버 자동설치를 시도합니다.

 

 

드라이버 자동설치에 실패합니다.

(아두이노 종류와 OS에 따라 자동설치 되는 경우도 있습니다.)

참고로, UNO와 Mega2560의 경우 MAC OS와 Linux에서 자동 인식된다고 합니다.

정상적으로 장치설치가 완료되면 포트(COM & LPT) 리스트에 등록되게 되지만,

정상인식이 되지 않아 장치관리자 "기타장치"에 Arduino UNO란 이름으로 등록되어있습니다.

 

다음의 절차를 통해 장치를 정상 인식시킵니다.

 

장치인식을위해 해당 장치(가령 Arduino UNO)를 우측버튼으로 클릭 후, 드라이버 소프트웨어 업데이트를 선택합니다.

 

자동검색을 하지말고,  수동으로 컴퓨터에있는 드라이버 찾아보기를 선택합니다.

 

찾아보기 버튼을 누르고, 해당 장치드라이버가 있는 폴더를 찾아 지정해줍니다.

 

UNO와 Mega2560의 경우, 2단계에서 설치한 아두이노 프로그램 폴더(arduino-00xx)내에 있는 drivers 폴더를 선택해줍니다.

FIO, LilyPad, Pro, Pro mini등은 drivers폴더안에 있는 FTDI USB Drivers 폴더를 선택해줍니다.

 

*참고사항: UNO와 Mega2560은 dirvers폴더에 들어있는 inf(설정)파일 한개만 있으면 됩니다.

 기타 구형 아두이노들은 FTDI칩을 사용하므로 FTDI칩 인식용 장치드라이버 파일들이 필요합니다.

 

 

보안경고가 나오면 설치 허용을 선택합니다.

 

 

 

 

장치 인식이 완료되었습니다.

 

장치관리자 > 포트 정보를 보면  Arduino UNO(COMxx)와 같이 새로운 COM포트로 등록된 것을 확인할 수 있습니다.

컴퓨터 환경에 따라 COM번호는 다른 번호로 할당될 수 있습니다.

위 과정은, Windows OS 버젼별로 약간의 차이가 있지만 거의 비슷합니다.

자, 이제 아두이노 프로그램 설치와 장치인식이 모두 완료 되었습니다.
이제 본격적으로 프로그래밍을 해보고 아두이노에 전송하여 작동시켜 보도록 합시다!


5단계. 아두이노 개발환경(스케치)을 실행합니다.

2단계에서 설치된 arduino.exe 를 실행합니다.
앞으로 자주 실행을 해야 하므로 단축아이콘을 만들어두면 편리합니다.

심플 담백한 스케치화면

6단계. 아두이노 보드종류 선택하기

'단순 무식한 컴파일러에게 아두이노의 종류를 알려주세요!'

아두이노 보드들이 많은 부분에서 호환성을 갖고 있지만, 구동속도( 8MHz, 16MHz),  전압레벨( 3.3V , 5V), 포트의 수, 프로그래밍 용량등의 차이가 있으므로 개발을 할때 이를 고려해 줘야 합니다. 스케치 개발환경에서 여러분이 사용하는 아두이노의 종류가 무엇인지 자동인식하지 못하므로 직접 보드 종류를 지정해 주는 과정을 꼭 하셔야합니다.

스케치 메뉴에서 Tools > Board를 선택한 뒤 목록에서 자신의 보드명을 찾아서 선택해 줍니다.( 가령, Arduino UNO)

 

7단계. 시리얼 포트 선택하기

'스케치에게 아두이노와 통신할 COM번호를 알려줍니다'

PC와 아두이노간의 프로그램 전송 및 데이타통신을 위해서는, 4단계에서 아두이노 통신용으로 등록된 COM번호(위 경우 COM9번)를 지정해줘야합니다.

스케치 메뉴에서 Tools > Serial Port를 선택한 뒤 연결된 아두이노 포트번호를 지정합니다.

연결된 시리얼 장치가 여러개일때 아두이노의 COM번호 식별이 안될경우, 아두이노를 케이블에서 제거할때 목록에서 사라지는 COM번호가 아두이노 할당 COM번호입니다. (4단계에서와 같이 장치관리자에서 포트 리스트를 확인해도 됩니다.)




8단계. Blink 예제 소스코드 불러오기

스케치 메뉴에서 File > Examples > 1.Basics > Blink를 선택하여 불러옵니다.
새로운 창이 뜨면서 아래와 같은 간단한 예제소스코드가 불러들여지게 됩니다.

아래의 소스는 아두이노 13번핀을 1초마다 ON, OFF를 반복하게 합니다.

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);    
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}


9단계. 컴파일 및 아두이노에 전송하기

 

 

verify & compile 하기 (생략 가능)
소스코드를 검증하고 컴파일하기 위해  재생버튼같이 생긴 verify & compile 버튼을 눌러줍니다.

Verify/Compile

참고로, 컴파일이란 사람이 이해가능한 소스코드를 기계어로 번역하는 과정입니다.
컴파일을 하기전에는 아두이노의 종류에따라 일부 설정을 달리하여 컴파일하므로 자신이 사용중인 아두이노 보드의 종류를 잘 설정(6단계 참고)해줘야합니다. 보드 종류가 틀리면,  컴파일 결과를 전송하거나 전송 후 작동시 문제가 될 수 있습니다.
앞으로 소스코드를 수정한 뒤 검증이 필요할때마다 이 버튼을 눌러주면 소스코드 검증이 이뤄지고 문제시 오류메시지를 확인할 수 있습니다.

컴파일 과정

컴파일이 완료되면 Done compiling 메시지가 뜨고 하단 메시지창에 프로그램 용량이 표시됩니다.

UNO가 약 30KB 프로그램 용량을 지원하므로 1/30 정도 크기입니다.

 

upload 하기
이제 컴파일된 정보를 아두이노로 전송하기위해 upoad 버튼을 눌러줍니다.  ctrl-U 단축키를 눌러도 됩니다.

Upload to I/O Board

참고로, verify & compile 버튼을 누르지 않고 곧바로 upload버튼을 눌러도 됩니다.
(이경우, 자동으로 컴파일 과정이 수행된 후 업로드가 이뤄지게 됩니다. 그리고, 소스코드 수정 후 곧바로 upload 버튼을 눌러주는 것 보다는 verify버튼을 눌러서 코드검증을 한 뒤에 문제가 없는경우 upload하는 것을 추천드립니다. )



10단계. LED Blink - 발광다이오드의 깜빡임 확인하기


upload버튼을 누르면 아두이노 시리얼통신 관련 Tx RX  LED들이 빠르게 점등되는것 을 볼 수 있습니다.
아두이노와 PC가 서로 정보를 주고(Tx, Transmit) 받기(Rx, Receive) 하면서 컴파일된 정보를 전달하는 과정입니다.
이과정은 UNO의 경우 5초도 안걸립니다.

소스코드에서 정의한대로 아두이노 보드를 보면 LED 하나가 1초 주기로 점등하는 것을 확인 할 수 있습니다.
UNO를 비롯한 최근의 모든 공식 아두이노 보드들은 디지탈 13번 핀에 LED와 저항이 달려있으므로 별도로 LED를 장착하지 않아도 간단한 LED 제어 테스트를 해볼 수 있습니다.

unoBlinking.swf
다운로드

UNO LED Blink 예제 실행 장면

11단계. 문제처리
 내용추가 예정


12단계. 참고사항

. LED사용할땐 꼭 저항과 함께 사용하세요
 직접 원하는 핀에 LED를 장착하여 작동하려면 저항과 함께 연결해 주시기 바랍니다.  [

]


손바닥 프린터 사용기

오늘도 재밌는 제품을 소개 시켜드리겠습니다.
누구보다도 제가 갖고싶었던 아이템인지라 손에 잡히는 날(오늘)로 사용테스트를 해봤습니다.
예전부터 손바닥만한 휴대형 프린터를 갖고 싶었는데 아직 세상에 그런 제품이 안나왔네요.
대신, 도처에서 이미 많이 활용되고 있는 열전사 방식의 소형 프린터를 입수하게 되었습니다.
여기서 소개하는 제품은 TTL 레벨(5V) 시리얼 통신 제어로 간단히 제어가 되는 10만원 이하의 일명(자칭)

손바닥 프린터

입니다.

쉽게말하면, 전원선 빼고 전선 2가닥만 TX/RX핀에 연결해주면 아두이노 같은 손바닥 컴퓨터로 곧바로 제어가 가능합니다. 정말 군침도는 아이템이네요 ^^.

간단한 문자 출력과, 바코드 출력, 비트맵 출력이 가능하므로 다양하게 응용이 가능합니다.

참고로, 아두이노 UNO는 하드웨어 시리얼 통신포트가 1개 있으나, 본 예제에선 편리한 테스트를 위해서
하드웨어 시리얼 통신포트는 PC와의 연결에 사용하고, 실제 프린터와의 통신은 소프트웨어 시리얼을 사용하였습니다.
이렇게하여 PC측에서 사용자 입력을 받아서 프린터 테스트를 할 수 있게됩니다.
물론, PC없이도 아두이노 만으로도 모든 기능의 작동이 가능합니다.

※ 소프트웨어 시리얼 이란?
 아두이노와 같은 마이크로 콘트롤러들을 대게 하드웨어 시리얼포트를 제공합니다.
하드웨어 지원이라 속도,안정,사용편리성이 모두 우수합니다만 개수 제한이 있으며
아두이노 UNO의 경우 1개만 제공됩니다.(참고로, Mega 2560은 4개 지원)
이럴때 여러기기와 시리얼 통신이 필요할 경우에 사용하는 것이 소프트웨어 시리얼입니다.
범용 디지탈핀을 소프트웨어적으로 제어하여 시리얼 통신을 가능케하는것이므로,
성능과 충돌가능성에 좀더 제약이 있는편입니다.
하지만, 적절히 사용하면 편리하게 이용할 수 있겠죠.
현재 아두이노 스케치에서도 기본적으로 소프트웨어시리얼 라이브러리가 포함되어 있습니다.
본, 예제에선 기본제공 라이브러리가 아닌 다른버전의 라이브러리를 사용하므로 따로 설치 해줘야 합니다.


자 이제, 정말 되는지 예제소스를 바로 실행해봤습니다.
아래의 절차를 참고하시기 바랍니다.


A. 하드웨어 준비

 1. 전원선 연결(vcc,gnd)
프린터 + - 전원선을 5V ~ 9V 전압에 연결해줍니다. (5~9V 정전압, 최소  2A 이상 전력 요함)
프린터 자체 전력소모가 큰 편이므로 PC측 USB케이블로 공급되는 전원을 사용하면 절대 안되고
전용 아답터전원을 이용하시기 바랍니다. 제 경우 테스트 전용 PC파워에서 공급되는 5V전원을 사용하였습니다.
(작동시 1.3A정도의 전류가 소모되므로 최소 2A이상 지원되는 전원 요함, 9V 1A급 전원에서 정상작동이 안되는것을 확인하였습니다.)


 2. 통신선 연결(tx,rx,gnd) 

아두이노 하드웨어 시리얼포트로 프린터와 연결할 경우,
프린터 TX단자 출력선을 아두이노 측 RX입력(D0)에 연결하고
프린터 RX단자 출력선을 아두이노 측 TX출력단자(D1)에 연결합니다.
GND는 아두이노 GND에 연결합니다.

하지만, 본 사용기(예제소스)에서는 아두이노 하드웨어 시리얼포트(D0핀, D1핀)를 PC측 디버그 통신용으로 사용하므로
프린터 TX단자 출력선(녹색)을 D2(소프트웨어 RX핀)에 연결하고
프린터 RX단자 출력선(노란색)을 D3(소프트웨어 TX핀)에 연결합니다.
프린터 GND와 아두이노 GND를 공통 연결합니다.

참고로, 여기서, D2, D3은 아두이노 디지탈 핀번호이고, 소프트시리얼 핀 정의에 따라 다른 핀을 사용할 수 도 있습니다.

참고로, 소프트웨어 시리얼 통신을 위해서 본 예제는 NewSoftSerial 라이브러리를 사용했습니다.
라이브러리 이용법은 아래에서 설명


B. 예제소스 실행 준비

 제품소개 페이지에 링크된 아두이노 예제 소스를 다운받아서 살펴봅니다.
 아마도 예제를 실행하면 오류가 뜰겁니다.
 본 예제는 특정 소프트웨어 시리얼 라이브러리를 사용하므로 NewSoftSerial 라이브러리를 설치해줘야 정상 작동하기 때문입니다.
물론, 응용에따라 하드웨어 시리얼포트를 사용하거나 다른 라이브러리를 사용할수도 있습니다.
 위 아두이노 예제소스를 테스트하려면 아래와 같이 준비해야합니다.
 
 일단, pbe소스 상단에있는 안내문을 주의깊게 읽어주시기 바랍니다.
 
 NewSoftSerial 라이브러리는 아래의 링크에서 다운받을 수 있습니다.

 
.newSoftSerial 소개 페이지 [링크]
.newSoftSerial 라이브러리 [파일링크]
 
※ 라이브러리 설치방법
  다운로드 받은 라이브러리(zip파일)의 압축을 해제하면 나오는 NewSoftSerial폴더를,
  아두이노 개발환경(Sketch)폴더내에 있는 libraries폴더안에 복사합니다.
 
  가령, arduino-0022\libraries\NewSoftSerial 의 경로로 복사해주면 됩니다.
  구조가 이해가 안되면 이미 있는 라이브러리 폴더의 파일들과 비교하여 복사하시기 바랍니다.
  이제 스케치를 닫았다 다시 엽니다.
  새로운 라이브러리가 인식되면 스케치 예제에 NewSoftSerial 예제가 등록되니 참고바랍니다.
 
이제 예제를 실행하면 정상 작동됩니다.
물론, 말안해도 아두이노 종류와 포트번호는 정확히 지정해줘야 하는건 아시죠^^.
 

C. 프린터 작동 테스트

컴파일과 전송이 완료되면,  시리얼 모니터 창을 열고 통신 속도를 38,400으로 지정합니다.
 
아래와 같은 명령 메시지가 아두이노로 부터 수신됩니다.

Thermal Printer Testing
1) Print Hello World!
2) Type to print
3) Dull boy
4) Printer status
5) Reverse white/black
6) Print characters upside down
7) Adjust heat settings
8) Adjust print settings
9) Print factory test page
a) Print entire character set
b) Print numberic barcode
c) Print alpha barcode
d) Bitmap test
:

원하는 명령번호/알파벳을 입력하여 전송합니다.

특정 기능에따라,
가령 2)Type to Print같은 기능 수행시
시리얼 모니터 "no line ending" 을 carriage return등으로 설정해줘야합니다.

전압별 설정
사용 전압에 따라 heat interval 값을 다르게 세팅해야 합니다.
제 경우 5V전원을 사용했으므로 소스에서 heat interval을 5로 조절하였습니다.
위 값이 제대로 설정되지 않으면 작동이 제대로 되지 않습니다. 제 경우 다른 소스는 수정한것이 없습니다.
기타 상세한 옵션은 아두이노 소스 주석을 참고하시기 바랍니다.

문제해결
.제품소개 페이지상의 예제소스는 아두이노의 하드웨어 시리얼 핀(0,1번)을 PC와의 연결용으로 사용하고 프린터와의 통신은 softwareSerial을 이용합니다. 이곳에 프린터를 연결하거나 다른용도로 사용하시면 통신이 되지 않으니 필요시 소스를 수정하여 사용하시기바랍니다.
.명령전송 후에 약간의 미동만 있고 인쇄가 되지 않는다면,  전원의 허용전류가 부족하거나 위에서 말씀드린 전원에 따른 인수값 설정이 잘못된 경우입니다. 2A 이상의 전류를 지원하는 5~9V 전원을 이용하시고  주석부분의 설명을 참고하셔서 인수값을 조정하시기 바랍니다.
.USB케이블로 공급되는 PC전원만으로는 작동되지 않으며 아두이노와 PC에 무리를 줄 수  있으므로 반드시 프린터 독립 전원을 사용하시기 바랍니다.


비트맵 인쇄
80x80 points 크기의 비트맵 인쇄의 예는 아래와 같습니다. 
메뉴얼에서 DC2 * r n  타입 명령을 사용한 예입니다.

      //Bitmap example
      Serial.println("Print bitmap image");
     Thermal.print(18, BYTE); //DC2
      Thermal.print(42, BYTE); //*
      Thermal.print(80, BYTE); //r   (80줄을 의미합니다.)
      Thermal.print(10, BYTE); //n  (한줄의 폭: 10바이트는 80비트이므로 80개의 점 데이타로 대응됩니다.)

      for(int y = 0 ; y < 80 ; y++) {
        for(int x = 0 ; x < 10 ; x++){
          Thermal.print(0xF0, BYTE); //0b.11110000  
        }
      }

      Thermal.print(10, BYTE); //Paper feed
      Thermal.print(10, BYTE); //Paper feed

      Serial.println("Print bitmap done");





기술자료 링크:
 
테스트 사진 및 동영상들

 

 

 

 

 

 

 

 

 






아두이노 FIO는 독특한 기능을 여럿 갖고 있습니다.

1. LiPo 배터리 충전기능 내장
2. 충전위한 USB포트 제공 ( PC에 꽂아두면 충전이 됨)
3. XBee소켓내장 ( XBee를 꽂으면 무선통신이 가능해집니다.)

즉, LiPo배터리를 꽂아두면,  휴대형/ 충전형 아두이노 디바이스가 되고
사용후 PC에 꽂아두면 충전이 되므로 전원에 대해 신경쓸 일이 줄었습니다.

게다가 무선통신을 위해 많이 이용되는 XBee모듈 장착용 소켓이 내장되어 있어서
이곳에 XBee를 꽂아주면, 시리얼 통신으로 PC를 비롯한 외부 장치들과 연동이 됩니다.  Wow~

이래저래 매우 유용한 제품임이 분명합니다. 기능으로 볼 때 아직까지 보급이 많이 안 된 제품인것이 이상할 정도네요;;

아래의 사진을 보시면 여러 기능을 이해하실 수 있을겁니다.


[사진1]기본형태 -  XBee 장착용 소켓이 보입니다.
반대편엔 Atmega328P AU 칩과 리셋버튼이 있습니다.



[사진2]옆면에  USB포트와 JST 배터리 커넥터가 보입니다.
USB포트는 USB시리얼 변환기와 무관하며, 단순히 USB케이블로부터 전원을 받아오는데 사용됩니다.
이 전원으로 JST소켓에 장착된 LiPo배터리를 충전하는 기능이 내장되어 있습니다.


[사진3] JST커넥터로 Lipo배터리 연결한 장면


[사진4] USB케이블을 연결하여 충전이 되고 있습니다.  CHG 표시 LED에 불이 들어온것이 보입니다.


[사진5] XBee를 장착한 장면입니다.



[사진6] XBee와 Lipo배터리 장착한 상태


[사진7] 외부케이블 연결을 위해 핀헤더소켓을 장착한 상태입니다.


[사진8] FTDI USB시리얼 변환기를 이용해 프로그래밍 하기위한 접속예입니다.


참고로, 아트로봇에서 판매중인 FTDI USB시리얼 변환기는 아두이노 Pro, Pro mini, FIO, LilyPad 모두와 호환되는 핀배열을 갖고있어서 핀헤더만 장착하면 그대로 연결할 수 있습니다.  (단, 5V형과 3.3V형 제품은 구분해줘야 합니다.)



(2012.4월 추가사항)
헤더 납땜없이 FTDI 보드로 Fio에 프로그래밍을 할경우 아래의 이미지를 참고하시기 바랍니다.   임시 결합시 18mm 핀헤더를 사용하시고 아래의 이미지 같이 금속핀을 양쪽에 균등하게 배분한 뒤 FTDI보드와 Fio에 연결후  Fio 와의 결합을 정확히 하기 위해 약간 힘을 줘서 기울여준 상태로 프로그램을 Uploading 하시면됩니다.   접촉상태가 좋지않으면 프로그램 업로드시 오류가 뜹니다.

 

 

 

 

 

+ Recent posts