본문 바로가기

Software/MATLAB

MATLAB을 이용한 시리얼 통신

이 글 이전의 제 블로그에서 MATLAB관련 최신글이 2011년 5월 17일이더군요. 캬~~ 지금이 2013년 6월 초인걸 감안하면 참으로 오랜만에 MATLAB 관련글을 올릴려고 합니다. 뭐 거창한건 아니구요. 오늘 문득 뭔가를 확인할려고 MATLAB으로 시리얼통신을 할 일이 있었는데, 하도 오랜만이라 명령이 기억이 안나서, 제 블로그를 살짝 확인했더니 어라~ 시리얼통신에 대한 이야기를 한 적이 없더군요. 그래서 올립니다. ㅎㅎ 뭐 좋은 많은 스킬을 공개하면 좋겠지만, 그렇지는 않구요. 그냥 기초만 알려드릴려구요. 그리고, 뭔가 실습 대상이 있어야하니, 제가 예전에 개발했던 ARS를 대상으로 할려고 합니다.[바로가기]

당시는 제가 입사한지 초반이라 참 재미있게 진행했던 프로젝트였는데요. 오랜만에 다루니까 느낌이 새롭네요^^ 아무튼 이 아이는 시리얼통신으로 데이터를 보내주는데요.

핀맵이 이렇게 되어있습니다. CAN통신도 지원하지만, 저는 시리얼통신으로 사용할거니 1,2,3,6번핀만 매핑해주면 됩니다.

PC쪽 시리얼포트에 데이터라인과 GND를 연결하고, 전원은 별도로 연결해야합니다. 그리고, 요즘은 시리얼포트가 있는 PC가 없으니, 시리얼-USB 변환 젠더를 사용해야합니다. 뭐 몇 천원에서 만원이 조금 넘는 가격으로 다양하게 판매들을 하고 있더군요.

아무튼 이렇게 연결이 끝나고 나면 MATLAB에서 통신을 시도해보죠

언제나 그렇듯 기본이 되는 명령은 정말 별것 없습니다.

s = serial('COM6')

시리얼 통신을 사용할거라고 살짝 알려주구, 본인이 사용할 com port 번호를 COM6의 6에 적으면 됩니다. 저는 6번 포트를 열었거든요.

set(s, 'BaudRate', 115200)

set(s, 'Terminator', 'CR')

그리고, 시리얼통신으로 선언한 변수 s의 세팅을 해줍니다. 뭐 많이 할 것도 없구요. 통신속도(BaudRate)와 종료문자(CR = Carrige Return)만 선언합니다.

이게, 기본 사용 준비가 끝난겁니다. 응? 간단하죠^^

그리고 이제

fopen(s)

명령으로 시리얼포트를 열고,

작업을 하면 됩니다. 저는 ARS에 각도를 한 세트만 날려달라고 명령을 할 건데, 그 명령이 <CAO>거든요. 그래서 PC에서 센서로 <CAO>라는 명령을 시리얼 통신으로 날리면 됩니다. 명령은 fprint입니다.

fprint(s, '<CAO>')

그럼 ARS 센서 모듈은 현재의 pitch과 roll값과 각속도 이렇게 4개의 값을 날려줍니다. 그걸 읽어야죠.

out = fscanf(s);

이렇게 읽습니다. 이렇게 읽은 값을 가지고 원하는데로 작업을 하면 되겠죠. 그리고 작업이 다 끝나면

fclose(s)

이렇게 명령을 내려서 열린 com port를 닫아주면 됩니다.

그러면, 이제 위 명령을 가지고 작성한 full-code를 한번 보죠.

s = serial('COM6');
set(s, 'BaudRate', 115200)
set(s, 'Terminator', 'CR')
fopen(s);

fprintf(s, '<CAO>')
out = fscanf(s);

result = zeros(1,4);
tmpCounter = 1;
tmpResult = 0;

for tmp = 2:(length(out)-1)
    if out(tmp) == '-'
        tmp1 = -1;
    end
    if (out(tmp) == ',') || (out(tmp) == '>')
        result(tmpCounter) = tmpResult*tmp1;
        tmpCounter = tmpCounter + 1;
        tmp1 = 1;
        tmpResult = 0;
    end
    if (out(tmp)>='0') && (out(tmp)<='9')
        tmpResult = tmpResult*10 + str2double(out(tmp));
    end
end

result = result*0.001*180/pi

fclose(s)

응? 실컷 설명은 간단하다고 하구선 의외로 긴데? 하고 느끼실 수도 있습니다만, 사실 그렇지 않습니다. 제가 개발한 ARS 모듈은 그 결과를 한 문자씩 시리얼로 날려서 눈에 보기엔 숫자로 잘 나옵니다만, 사실 그건 문자거든요. 그래서, 위 코드 9번행부터 28번행까지 작업해서 그걸 숫자로, 그것도 degree 혹은 degree/sec로 표현한 겁니다. 

센서의 출력을 아무 가공없이 그냥 받은 것이 위 코드에서 7번행의 out이라는 변수인데 그걸 workspace에서 확인해보면 위 그림처럼 char형으로 됩니다. 그것도 1*15의 크기니까 15개의 문자가 들어간거죠. 게다가 애초 ARS는 원 데이터에 1000을 곱해서 radian 혹은 radian/sec로 데이터를 보내기 때문에 약간의 수정이 프로그램적으로 필요한 겁니다. 

그래서 위 코드의 for문에서 그걸 하고 있습니다. 뭐 저부분은 꼭 제가 설명할 건 없어 보여서, 또 블로그에 언능 올릴려고 개발새발 작성한거라 뭐 이렇게 하면 되는군... 정도로만 알아 주시면 됩니다.

그리고 마지막으로, serial 버퍼에 들어온 데이터가 없는데 fscanf로 데이터를 읽겠다고 하시면, 꽤 오랜시간 MATLAB이 멈춘듯이 보입니다. 그럼... 초 간단 MATLAB 시리얼 통신 설명을 언능 끝내고, 전 살짝 퇴장합니다. 저희 회사는 샌드위치 데이인 이번주 금요일이 쉬는 날이라 4일간의 연휴거든요..  아싸~~~~

반응형