임베디드 개발보드‎ > ‎mbed‎ > ‎

[ARM mbed 강좌] 04. USB 가상 시리얼 포트를 통한 통신 맛보기

mbed (ARM Core + Online tools + Community)



1. 시리얼 통신 포트



mbed의 시리얼 통신 포트로는 아래의 그림과 같이 포트 9, 10, 포트 13, 14, 포트 26, 27의 3종류가 기본으로 되어 있으며, 추가적으로 현재 PC와의 접속에 사용되는 USB의 가상 시리얼 포트까지 총 4개를 지원하고 있다. USB 가상 시리얼 포트는 추가 구성 회로가 없으므로, PC와의 통신을 목적으로 한다면 USB 가상 시리얼 포트를 추천하고 싶다.

mbed와 PC의 통신으로 무엇을 할 수 있을까? 그 응용에는 수많은 사용 방법이 있겠지만 예를 들자면 아래와 같다.

1) mbed의 프로그램의 디버깅, 예를들어 처리중에 계산 결과값, 센서 값등을 PC 화면에 뿌리기.
2) PC로 부터 명령 받기, 예를들어 유선 조정의 경우에 PC의 화살표키로 방향 명령을 받아 로봇 움직이기.
3) PC에게 명령 주기, 예를들어 mbed에 연결된 센서 값에 따라 PC의 응용프로그램이 동작하게 만들기. 2번의 반대 개념.
4) 가상 시리얼 통신이 아닌, 일반 시리얼 통신을 이용한다면 블루투스 장비를 달아 무선으로 통신하기.

등등 많은 응용이 있을 수 있다.











2. PC와 통신하기 위한 준비


1) mbed USB 가상 시리얼 통신 드라이버 설치

mbed 사이트(http://mbed.org/handbook/Windows-serial-configuration)에 접속하여 Download latest driver 의 드라이버를 다운로드하여 설치한다. 설치는 디폴드 옵션으로만 설정해도 된다.

2) 터미널 프로그램 설치

TeraTerm 테라텀이라는 터미널 프로그램을 설치한다. 테라텀의 접속 설정 및 옵션 설정은 아래와 같다.


접속 설정 : File >> New Connection... 을 선택하면 아래와 같은 접속 설정 화면이 나오고, 이중 Serial 을 선택한 후, mbed Serial Port를 선택하자.




터미널 옵션 설정 : Setup >> Terminal... 을 선택하면 아래와 같은 옵션 설정 화면이 나올 것이다. 이 중 Receive 를 LF 로 설정해주자. LF는 Line Feed 이라는 뜻으로, 16진수 아스키 코드 0x0A, 캐릭터 문자로서는 '/n' = new line 에 해당되는 데이타이다. 즉, PC가 mbed 로 부터 수신받은 데이타 중 0x0A 가 있다면, 커서를 현재 행의 다음 행으로 바꿔주는 기능을 하게된다. 참고로, CR은 Carriage Return 이라는 뜻으로, 16진수 아스키 코드 0x0D, 캐릭터 문자로서는 '/r' = return 에 해당되는 데이타이다. 기능으로는 커서를 현재 행의 맨 좌측으로 옮기기를 수행하게 된다.


참고로, mbed의 시리얼 통신은 기본적으로 9600 baud,8 bits, 1 stop bit, no parity 로 설정되어 있다. 이는 프로그램에서 수정 가능하다.

이상으로 mbed의 USB 가상 시리얼 포트로 PC와의 통신하기 위한 설정이 모두 끝났다. 다음은 직접 통신 프로그램을 작성해보고, 테스트 해보도록 하자.


3. 통신 예제 소스 및 테스트


mbed 소스작성, 컴파일, 업로드와 관련해서는 이전 강좌에서 설명하였기에 넘어가고, 바로 소스를 보도록 하자.

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx

int main()
{
    int i=0;

    while(1)
    {
        pc.printf("Hello World![%d]\n",i++);

    if(i>99) i=0;
    }
}

간단히 테스트 목적으로 터미널창에 "Hello World![%d]\n" 를 뿌리도록 했다. %d 는 i 를 나태내며, 이 i 는 0부터 99까지 반복하게 된다. 그리고 \n 는 앞서 설명한것과 같이 터미널창에서 새로운 라인으로 옮기기 위해서 붙여줬다.

이렇게 작성한 프로그램을 컴파일 하고, 실행 파일을 다운로드 받아 mbed USB 드라이버에 옮겨주자. 그리고 PC에는 미리 설정해준 터미널 프로그램인 테라텀을 실행해두고, mbed의 리셋 스위치를 누르면 아래와 화면과 같이 출력되어 표시됨을 확인 할 수 있을 것이다.



이대로 끝나면 조금 아쉬운 느낌이 있어서 한가지 더 해보도록 하자. 좀 전의 테스트는 mbed -> PC 라는 단방향 통신만 하였기에 이번에는 mbed <-> PC 양방향으로 해보도록 하자. 소스는 아래와 같으며, 처음에 조작 메뉴를 PC로 보내게 되며, PC의 1번 숫자키를 누르면 mbed의 첫번재 LED가 켜지고, 2번 숫자키를 누르면 두번째 LED가 켜지는 프로그램이다. 같은 방법으로 3번, 4번 숫자기도 마찬가지이며, 0번 숫자키를 누르면 모든 LED 가 꺼지는 프로그램이다. 아무리 쉬운 예제라고는 해도 눈으로 보면 소용없으니 꼭 테스트 해보기 바란다. (※ 버튼을 누를때는 테라텀이 활성화 되어 있고, 테라텀 터미널 창에서 눌러야 한다.)

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx
PwmOut led1(LED1);
PwmOut led2(LED2);
PwmOut led3(LED3);
PwmOut led4(LED4);

int main()
{
    pc.printf("Press '1' On LED1\n");
    pc.printf("Press '2' On LED2\n");
    pc.printf("Press '3' On LED3\n");
    pc.printf("Press '4' On LED4\n");
    pc.printf("Press '0' Off All LED\n");
    
    while(1)
    {
        char c = pc.getc();

        if(c == '1') led1 = 1;
        if(c == '2') led2 = 1;
        if(c == '3') led3 = 1;
        if(c == '4') led4 = 1;
        if(c == '0')
        {
            led1 = 0;
            led2 = 0;
            led3 = 0;
            led4 = 0;
        }
    }
}


터미널 창은 아래와 같은 조작 메뉴가 표시된다.



참고자료

작성자: 표윤석(http://robotpilot.net/)

Comments