티스토리 뷰

Processing

[Arduino with Processing] Serial Communication

생각많은 소심남 2012. 8. 13. 00:58

조금씩 목표를 향해서 전진중입니다. 이제 프로세싱과 키넥트, 아두이노를 접목시키기 위해서는 시리얼 통신이라는 것을 활용해야 합니다. 간단하게 말하자면 시리얼 통신이란 RS-232 라는 모듈을 통해서 서로 통신하는 환경을 말하며, 보통 마이크로 프로세서와 pc간의 통신에 많이 활용됩니다. 물론 지금은 이걸 직접할 수 있는 시리얼 포트가 없어졌지만 대신에 시리얼포트를 대신해서 usb를 활용한 통신이 이뤄지고 있습니다. 어딘가에 UART와 USB를 변환시켜주는 칩셋이 있기 때문이지요. 

 잘 찾아보시면 이 기술이 나온게 참 오래되었고, 왜 최신 기술을 도입하지 않고 이 시리얼 통신을 활용한게 많냐고 생각하시는 분이 계실텐데, 가장 큰 장점 중 하나가 범용성이 될겁니다. 플랫폼이 다르더라도 외부와의 통신을 위한 규격은 거의 시리얼 통신으로 이뤄지며 이 또한 쌍방향으로 이뤄집니다. 그래서 서로가 전달할 내용을 주고 받을 수 있는 것이죠.

 이 한가지 주제로만 이야기하자면 길어질테니 이 시리얼 통신을 활용해서 프로세싱과 아두이노를 연결하는 예제를 한번 보도록 하겠습니다. 참고로 이걸 진행하기 전에 유념할 것은 아두이노 자체가 디지털 0번과 1번 핀이 Tx와 Rx로 동작하기 때문에 이 포트들을 입출력으로 활용할 수 없습니다. 

 우선은 보드상의 LED를 제어하는 걸 해봅시다. 잘 보시면 아두이노 보드에는 LED가 여러개 있는데 그중 현재 불이 들어온 건 두개입니다.



그중에 붉은색 LED는 13번 포트와 연결된 On board LED인데요. 이걸 제어해보고자 합니다. 

먼저 아두이노 스케치를 다룹니다. 

맨처음 환경설정을 위해서 Setup을 처리해줘야겠지요. 참 이때 중요한 요소가 바로 baud rate이라는 건데요. 이게 송신과 수신의 동기화를 시켜주는 요소입니다. 다른말로 굳이 번역하자면 변조속도인데 일상적으로 통신하기 위해서는 이걸 동일하게 해줘야 합니다. 우선은 다음과 같이 선언해줍니다.



지금 begin안에 들어간 값은 baud rate의 속도를 결정한 것이며 1초당 9600번의 baud를 내보내겠다는 겁니다. 그다음에 13번을 출력으로 쓰겠다는 것이지요. 다음은 loop 부분입니다.



루프야말로 매순간마다 갱신되는 부분이므로 본격적인 내용을 적어 주는 것이 좋겠지요. 그래서 시리얼통신으로 무언가가 들어왔을 때 그 값을 byte형 변수인 input에다가 집어넣게 됩니다. 그래서 그 값에 따라 LED를 켜고 끄는 동작이 이뤄지게 됩니다.

그런데 여기서 의문을 가지실 분이 계실겁니다. 분명 LED를 켜는데는 전기신호상 HIGH, 1이 들어와야 켜질것이고 0이 들어오면 꺼질겁니다. 그런데 지금 조건문에 들어가 있는 1은 문자 '1'입니다. 숫자 1이 아니란 것이지요. 왜 이렇게 했을까요?


 사실 프로세싱과 아두이노는 전혀 다른 플랫폼이고 서로가 통신을 하기 위해서는 무언가의 번역이 필요합니다. 분명 아두이노 상에서 1은 binary로 따지면 00000001이 됩니다. 그런데 프로세싱이 아두이노한테 보내는 1은 그 숫자 1이 아니라 1이라고 생긴 데이터입니다. 이를 binary로 바꾸면 00110001 이 되는데 이때문에 아두이노가 값을 비교하기 위해서 문자 1로 집어넣은거죠. 아마 그냥 숫자 1로 조건문을 구성하면 항상 꺼진상태로 유지될겁니다. 이 상태로 아두이노에 프로그램을 넣습니다. 


이제는 프로세싱입니다. 우선 프로세싱에선 시리얼통신을 하기 위해 다음의 라이브러리를 추가합니다.


그래야 위와 같이 시리얼통신을 하기 위한 포트를 선언해줄 수 있습니다.

프로세싱을 통해서 만들고자 하는 것은 마우스의 위치에 따라서 LED의 동작을 제어하는 것을 확인할 것이기 때문에 마우스 위치를 감지할 틀을 만들어야 겠지요. 우선은 Setup에서 시리얼 통신에 대한 환경설정 및 틀을 만들어 놓습니다.


우선 portname에 들어가는 것이 Serial통신을 통해서 형성되는 포트의 리스트 중 가장 첫번째를 가져오겠다는 것이고 myport를 통해서 9600 baud rate의 속도로 설정을 한겁니다. 이제 draw에서 동작 로직을 구현하면 될겁니다. 아 참고로 list에서 몇번째 포트를 받아와야 하는지를 확인하려면 장치관리자를 들어가야 합니다.



보시면 포트에 위와 같이 포트가 두개 형성되어 있는데 지금 SerialPort로 되어 있는 것이 아두이노와 연결된 포트입니다. 배열상으로는 1번 리스트에 들어있겠지요. 따라서 위의 코드는 [0]번 리스트가 아니라 [1]번 리스트에서 받아와야 합니다. 로직은 매우 간단합니다.



그냥 평판 하나 만든 후 그 폭의 반을 넘어가면 켜지고 안넘어가면 꺼지는 형식입니다. 생각보다 간단하고 결과도 매우 간단합니다. 한번 보시지요.



마우스 포인터를 보시면 아시겠지만 마우스포인터의 위치에 따라서 LED가 동작하는 것을 확인할 수 있습니다. 

지금은 무척이나 단순한 시리얼 통신이지만 이를 조금만 더 확장시킨다면 더 멋있는 프로그램이 나오겠지요. 계속 시도해보고자 합니다. 

https://dl.dropbox.com/u/96808368/processing/SerialComm.zip

댓글