레이블이 임베디드 시스템인 게시물을 표시합니다. 모든 게시물 표시
레이블이 임베디드 시스템인 게시물을 표시합니다. 모든 게시물 표시

2010년 6월 16일 수요일

mbed에 블루투스 모듈 연결 (Bluetooth interface for mbed)

mbed 에 블루투스를 추가해 보았다.
이번에 사용한 모듈은 myBleutooth-EX (27,100원) 라는 것으로 디바이스마트에서 구입하였다.
SPP를 지원하고 별다른 설정 없이 매우 쉽게 사용할 수 있다. 단 모듈에 연결하는 시리얼의 통신속도가 고정되어 있어 구입할 때 자신이 사용할 속도에 맞춰 구입해야 한다. 여기서는 모듈을 구입하러 갔을 때 38.4K밖에 재고가 없어 선택의 여지가 없었다.
 

CTS/RTS를 사용해서 플로우 컨트롤을 할 수도 있지만 그건 옵션이고 위의 5개 핀(Vcc, GND, TxD, RxD, RST)만 연결해주면 된다.



mbed 모듈로 자체적으로 USB시리얼을 지원하고 그 이외에 추가 시리얼포트를 가지고 있기 때문에 사용하기 매우 편리하다.


둘 다 2.54 피치의 핀헤더이기 때문에 만능기판에 와이어로 간단하게 연결해 주었다.


mbed 보드에서 USB 시리얼 <-> 블루투스 모듈에 연결된 시리얼 포트간에 서로 입력받은 데이터를 상대방에게 포워딩 해 주는 간단한 예제 프로그램을 만들어주면 바로 동작을 테스트 해 볼 수 있다.

#include "mbed.h"

Serial pc(USBTX, USBRX);
Serial bt(p28, p27);

int main() {
    char buf[256];
   
    bt.baud(38400);
   
    while(1) {
        if (pc.readable()) {
            bt.putc(pc.getc());
        }
   
        if (bt.readable()) {
            pc.putc(bt.getc());
        }
    }
}


mbed.org에서 IDE로 가서 위의 소스코드를 입력한다.


입력이 끝나면 Compile 버튼을 눌러 프로젝트를 빌드한다.

성공적으로 빌드가 끝나면 위와 같이 바이너리 파일이 생성되고 바로 컴퓨터로 다운받게 된다.

바이너리 파일의 이름을 지정하고 저장해주면 된다.


파일을 저장한 다음 mbed 보드를 USB포트에 연결하면 컴퓨터에 MBED라는 USB플래쉬 디스크가 만들어진다. 방금 다운한 바이너리 파일을 이 디스크에 복사해주면 된다. 복사가 끝나고 mbed 보드의 RESET 버튼을 눌러주면 가장 최근에 복사된 바이너리 파일이 mbed보드의 NXP 프로세서 프로그램 플래쉬로 복사되고 바로 실행된다. (별도의 플래쉬 라이팅 프로그램이 필요없어 매우 편리하다.)

단 테스트를 하기 전에 mbed보드에 전원을 연결하고 테스트 컴퓨터와 myBluetooth-EX 모듈간에 페어링을 해 줘야 한다. 컴퓨터와 디바이스간 페어링은 처음에 한번만 해 주면 이후에는 다시 할 필요가 없다. 아래는 맥에서 페어링 하는 예제이다.




테스팅 하는 구성은 다음과 같다.

컴퓨터에서 2개의 시리얼 터미널 프로그램을 실행시킨다.

첫번째 터미널은 블루투스 모듈과 SPP로 연결시킨다. 위에서 블루투스 모듈과 페어링 되면서 가상 시리얼 포트가 생성되었기 때문에 터미널 설정의 포트에 보면 myBluetooth-EX 가상포트가 보인다.


설정을 마치고 Connect 버튼을 눌러주면 블루투스 모듈과 커넥션을 만들기 위한 잠깐의 딜레이 후에 연결된걸 볼 수 있다.

두번째 터미널은 USB 시리얼 포트를 통해 mbed와 연결해 준다. mbed가 USB로 연결되면 usb serial 포트가 보이게 된다. 참고로 mbed의 USB 시리얼포트의 디폴트 통신속도는 9600 bps이다.

연결된 상태의 동작 예제이다. 위의 화면에서 왼쪽 터미널은 블루투스로 연결되었고 오른쪽은 USB 시리얼로 연결되었다. 각각 왼쪽 터미널에서 'bbb'를 눌렀고 오른쪽 터미널에서 'aaa'를 눌렀을 때 화면이다. 각각 상대방 쪽으로 데이터가 제대로 전송된 걸 확인할 수 있다.

다음번엔 Wiznet의 지원을 받아 임베디드 WLAN 모듈인 WIZ610wi를 연동시켜 보도록 하겠다.

2010년 6월 13일 일요일

아뒤노에서 긴 문자열 사용하기 (How to do big strings in Arduino)


아뒤노는 문자 스트링을 매우 쉽게 저장하고 사용할 수 있게 해 주지만 이 문자열들은 변수와 동일하게 램에 저장되기 때문에 많은 양의 문자열을 저장할 수 없다. 그러므로 긴 문자열을 read-only인 프로그램 메모리에 집어넣고 사용하는 법을 설명하겠다.

많은 스케치(아뒤노 프로그램)은 긴 문자열을 가지고 있는 경우가 많다. 간단한 CLI를 만들었거나 작은 웹 페이지를 저장하고 있을수도 있다. 일반적으로 아래와 같은 식으로 문자열을 저장한다.

char hellostr[] =  "<html><head><title>hello world</title></head>
                   <body><p align=center><h1>hello world</h1></p>
                   </body></html>";

// and then sometime later

Serial.println( hellostr );

문제는 hellostr이 다른 변수와 함께 램에 저장된다는 것이다. 아뒤노의 ATmega 칩은 단지 1KB의 램을 가지고 있다. 코드가 더 복잡해져서 긴 문자열과 여러개의 라이브러리를 사용하면 이해할 수 없는 신기한 문제가 생기기 시작할 것이다. 아뒤노는 프로그램이 칩이 가지고 있는것보다 더 많은 램을 사용하기 시작해도 경고를 해 주지 못한다.

이 문제를 해결하기 위해 문자열을 PROGMEM(PROGram MEMory)에 저장할 수 있다. 즉 프로그램 코드를 저장하는 플래쉬 롬을 사용하는 것이다. PROGMEM 문자열을 사용하는건 약간의 편법을 사용해야 하지만 아래의 printProgStr()이라는 함수를 사용하면 별다른 문제 없이 쉽게 사용할 수 있다.

const char hellostr[] PROGMEM = "...";     // notice added 'const' and 'PROGMEM'

// given a PROGMEM string, use Serial.print() to send it out
void printProgStr(const prog_char str[])
{
  char c;
  if(!str) return;
  while((c = pgm_read_byte(str++)))
    Serial.print(c,BYTE);
}

// and then at some point

printProgStr( hellostr );

문자열을 Serial.print() 이외에서 사용하려면 별도 함수를 만들어 거기에 글자별로 처리하는 코드를 넣어주면 된다.




2009년 4월 18일 토요일

Arduino 설치 및 프로그램 실행 (Installing and setup Arduino)

http://arduino.cc 에서 arduino 소프트웨어를 다운받을 수 있다. Mac OS X, Linux, Windows를 모두 다 지원한다.

또한 OS용 디바이스 드라이버도 이 사이트에서 다운받을 수 있다.

다운받은 압축파일을 풀어주면 프로그램을 가지고 있는 폴더가 생긴다. 별도 설치 할 필요가 없이 그 폴더에서 arduino 프로그램을 바로 실행해주면 된다.

프로그램을 실행하면 다음과 같은 창이 열리게 된다..

먼저 arduino 보드에 맞게 환경설정을 해 주어야 한다. Tools 메뉴로 가 보면 아래와 같은 서브메뉴가 나온다.

먼저 통신에 사용할 시리얼 포트를 지정해 준다. Arduino보드를 USB 케이블에 연결하고 디바이스 드라이버가 제대로 설치되어 있으면 아래와 같이 포트가 보이게 된다. 아래 화면은 맥의 경우이고 윈도우 인 경우 COMx 란 이름으로 보이게 된다. 보드를 연결했는데도 포트가 보이지 않는다면 디바이스 드라이버를 다시 설치하고 프로그램을 실행하면 보일 것이다.

그 다음은 보드를 설정해 준다. Arduino도 여러 종류가 있어서 그에 해당하는 보드를 선택해주면 된다.


여기서는 아래의 보드를 사용할 것이기 때문에 Arduino Diecimila를 선택해주면 된다.


설정이 끝났으면 예제 프로그램을 실행시켜 보겠다. 아래 화면에서처럼 File -> Sketchbook -> Example -> Digital -> Blink 를 선택해 준다.

그러면 Blink 예제 파일이 열리고 내용을 볼 수 있게 된다. 여기서 맨 왼쪽의 플레이버튼을 누르면 프로그램이 컴파일 된다.

컴파일이 정상적으로 끝나면 화면 아래쪽에 다음과 같은 메세지가 나온다.

하지만 컴파일이 끝났어도 아직 프로그램이 arduino 보드로 옮겨진건 아니다. 프로그램을 arduino 보드로 전송하려면 오른쪽 두번째 버튼을 눌러준다.

그러면 arduino 보드의 TX, RX LED가 빠르게 번쩍이면서 프로그램이 전송되는걸 볼 수 있다. 전송이 끝나면 컴파일의 경우와 마찬가지로 메시지 창에 업로드가 끝났다는 메시지가 표시된다.

프로그램이 전송되고 나면 arduino 보드는 자동으로 reset이 되면서 프로그램이 바로 실행된다. 이 예제 프로그램은 보드에 있는 LED를 깜빡이게 하는 것이기 때문에 아래의 LED가 1초 간격으로 반짝이는걸 확인할 수 있을 것이다.

또한 arduino에는 시리얼 터미널 기능도 가지고 있다. 위의 예제에서는 시리얼 포트를 사용하지 않았지만 프로그램에 따라서는 시리얼 포트를 통해 데이터를 주고받을 수 있다. 맨 오른쪽의 아이콘을 눌러주면 아래쪽 메시지 윈도우가 시리얼 터미널 역활을 하게 된다.

검은 부분에 수신한 데이터가 표시되고 송신할 데이터는 입력창에 넣어주면 된다. 또한 통신속도도 임의로 변경할 수 있다. 물론 arduino보드의 시리얼 포트 설정속도와 동일하게 맞춰줘야만 한다.