아두이노와 PC는 특별한 장치 없이 USB 케이블만 있어도 서로 통신이 가능합니다. PC에서 아두이노 개발환경(IDE)으로 스케치를 업로드 해야 아두이노가 우리 생각대로 움직일 수 있기 때문에 USB 통신은 아두이노의 필수 기능입니다.

PC와 통신할 때 아두이노에서는 D0, D1 핀으로 Serial 통신을 사용합니다. 그래서 Serial 통신을 USB 통신으로 변환하기 위해 중간에 번역을 해주는 칩을 탑재하고 있죠. 이 칩을 FTDI 또는 USB to UART(USB) 라고 부릅니다. 아두이노 UNO, Nano 등은 보드내에 이 칩을 탑재하고 있는데 아두이노 Pro Mini 같은 보드는 이 칩을 탑재하고 있질 않기 때문에 외부에 별도로 FTDI 모듈을 달아줘야 PC와 통신이 가능합니다.

일단 USB로 PC와 아두이노가 연결되면 아두이노에서는 Serial 클래스에 정의된 함수들로 데이터를 전송, 수신 할 수 있습니다. 보통 Serial.available(), Serial.read(), Serial.print(), Serial.println(), Serial.write() 함수를 사용합니다.

어쨌든 PC와 아두이노가 통신하는 것과 같은 원리로 아두이노와 휴대폰도 통신이 가능합니다. 그런데 PC와 아두이노가 연결될 때 PC는 Host, 아두이노는 Client가 됩니다. PC와 휴대폰이 연결될 때도 마찬가지입니다. 휴대폰이 Client 가 됩니다. 그런데 휴대폰과 아두이노가 직접 USB로 연결되면?? 둘 다 Client 가 되어버리겠죠.

otg_cable

그래서 필요한 것이 USB Host로 바꿔주는 케이블입니다. 보통 OTG(On The Go) 케이블이라고 부릅니다. OTG 케이블이 있으면 휴대폰을 USB Host로 바꿀 수 있습니다. 안드로이드 폰에서 이 기능은 v3.x (허니컴) 이상부터 사용이 가능한데 근래에 나온 폰들은 대부분 지원하는 기능입니다.

OTG 케이블을 이용해 아두이노와 안드로이드를 연결하면 이후부터 아두이노에서 Serial 클래스의 함수들로 통신할 수 있습니다. 그리고 한 가지 더, Serial-USB Host 통신을 위한 안드로이드 앱도 작성해야 합니다. 안드로이드용 앱을 작성하는 일이 그리 쉬운일이 아니기 때문에 일단은 기본 기능이 갖춰진 앱을 참고해서 사용하는 것이 좋을 것입니다. 그래서 기본 통신용 앱 – Arduino Serial Controller 를 제작해서 공유하고 있습니다.

https://github.com/godstale/Arduino-Serial-Controller

앱의 기능은 단순합니다. OTG 케이블 – USB 케이블을 통해 아두이노가 연결되면 앱이 자동으로 실행됩니다. 이후부터 아두이노가 보내주는 메시지를 받으면 화면에 표시해주고 직접 타이핑해서 문자열을 아두이노로 보낼 수도 있습니다. 그리고 “a”문자와 “z” 문자 사이에 데이터를 넣어 보내면 화면 중앙에 크게 표시해주기도 합니다.

arduino_serial_controller_test

이제 Arduino Serial Controller 앱을 이용해서 아두이노와 휴대폰을 쉽게 연동할 수 있습니다. 앱 소스는 모두 공개되어 있으므로 원하는대로 수정해서 프로젝트에 응용하세요. Arduino Serial Controller 앱 동작을 위해 두 개의 오픈소스 프로젝트를 참고했습니다. 안드로이드 폰에서 FTDI 칩용 드라이버를 제작하는 프로젝트들 입니다.

주의!!!  FTDI 칩의 종류가 굉장히 많기 때문에 사용된 FTDI 칩의 종류에 따라 동작이 안될 수도 있습니다. 주요한 FTDI 침은 모두 지원합니다만…

Arduino Serial Controller 소스코드에서 중요한 연결 설정 부분은 모두 아래 파일에 들어 있습니다.

Arduino-Serial-Controller/Android/ArduinoController/src/com/hardcopy/arduinocontroller/SerialConnector.java

initialize() 함수를 통해 USB 장치가 연결되면 드라이버를 로드하고 통신할 준비를 합니다. 그리고 SerialMonitorThread 를 실행시켜 USB로 들어오는 데이터를 계속 체크합니다. 데이터를 USB 장치로 보낼때는 sendCommand() 함수를 원하는 데이터와 함께 호출해주기만 하면 됩니다.

USB Host 기능, OTG 케이블을 이용한 아두이노 – 안드로이드 연결, 통신 방법은 다른 통신 방법에 비해 저렴하고, 쉽고 간단할 뿐 아니라 아두이노가 별도의 배터리를 탑재할 필요가 없는 장점도 있습니다. 간단하게 워킹 샘플을 만들어보거나 아이디어를 검증하는 목적 또는 항상 휴대폰과 연동할 필요 없이 필요할 때만 연결되어 사용하는 장치를 만들 때 USB 통신이 굉장히 유용합니다.

이 방법을 사용한 예제 프로젝트가 저서 [아두이노 통신 프로젝트]에 2개 소개되어 있습니다. 아래 두 개의 프로젝트를 USB Host 통신용으로 수정한 것입니다.

이 프로젝트를 USB Host 통신용으로 수정한 소스코드도 공유되어 있으니 참고하세요.

참고자료

banner_talkingarduino