2012년 6월 12일 화요일

ADK DemoKit 실행하기

Android Open Accessory support는 3.1부터 소개되었고, 2.3.4로 백포팅 된 기능으로, 안드로이드 기기와 외부 기기가 USB를 통해 통신이 가능하게 합니다.

이 기능을 사용하기 위한 각종 도구가 ADK이며, 당연하게도 ADK에는 demokit 이라는 샘플 소스코드가 존재합니다.
Arduino Mega ADK와 GalaxyNexus를 이용해서 이를 실행하는 과정을 정리해 보겠습니다.


0. 관련 프로그램 설치

Arduino IDE를 설치합니다.
CapSense 라이브러리ADK software package를 다운로드, 압축을 적당한 곳에 풉니다.
압축을 푼 CapSense 디렉토리와 ADK software package의 arduino_libs/AndroidAccessory, arduino_libs/USB_Host_Shield 디렉토리를 <아두이노 설치 경로>/libraries/ 아래로 복사합니다.

아두이노 설치 경로는 우분투에서 우분투 소프트웨어 센터를 이용해 설치한 경우, /usr/share/arduino/ 가 됩니다. 기본적으로 <아두이노 설치 경로>/libraries/ 디렉토리의 권한에 쓰기 권한이 없으므로, sudo 등을 이용합니다.


1. 아두이노 보드에 DemoKit firmware 설치하기

Arduino IDE를 실행, 아두이노 보드를 연결합니다.
File > Examples > AndroidAccessory > demokit 을 선택합니다.
demokit을 위한 아두이노 프로그램의 소스코드가 열립니다.
바로 업로드 합시다. 곧바로 소스 코드가 컴파일 되고, 보드 위로 바이너리가 써집니다.
(firmware 라느니 바이너리라느니 관습적으로 쓰이는 용어를 쓰고 있는데, 아두이노에서는 아두이노에 사용되는 소프트웨어를 스케치라고 부르는 것 같습니다.)
이제, 우리의 아두이노 보드는 Android USB accessory 가 되었습니다.


1.5. 간소화된 demokit

구글이 제공하는 아두이노용 demokit 소스코드는 LED와 서보모터, 릴레이버튼, 빛/온도 센서 등등 여러 하드웨어를 구성한 보드를 가정 하에 작성되어 있으며, 이에 따라 동일한 하드웨어 구성을 해주지 않으면 demokit은 초기화 과정에서 멈추고 아무 동작도 하지 않습니다.
따라서, 아래의 간소화 되었으며 보드의 LED로 연결되는 13번 핀을 DemoKit 안드로이드 어플리케이션에서 릴레이 1 버튼으로 연결되게 한 다음 코드를 아래 링크에서 제공하고 있습니다.
이걸 사용합시다.
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

#define  LED1         13

AndroidAccessory acc("Google, Inc.",            // Manufacturer
                     "DemoKit",                 // Model
                     "DemoKit Arduino Board",   // Description
                     "1.0",                     // Version
                     "http://www.android.com",  // URI
                     "0000000012345678");       // Serial

void setup();
void loop();

void init_led()
{
  pinMode(LED1, OUTPUT);
}

void setup()
{
  Serial.begin(115200);
  Serial.print("\r\nADK Started\r\n");

  init_led();

  // Power On Android Accessory interface and init USB controller
  acc.powerOn();
}

void loop()
{
  byte data[3];
  if (acc.isConnected()) {
    int len = acc.read(data, sizeof(data), 1);
    if (len > 0) {
      if (data[0] == 0x3) {
        if (data[1] == 0x0) {
          digitalWrite(LED1, data[2] ? HIGH : LOW);
          Serial.print("Toggle LED\r\n");
        }
      }
    }
  }

  delay(10);
}


2. 안드로이드 기기에 DemoKit 안드로이드 어플리케이션 설치하기

ADK software package 아래의 app/ 디렉토리 아래에 DemoKit의 안드로이드 어플리케이션 소스코드가 있습니다.
이클립스에서 Create project from existing source 기능을 이용해 이 소스코드로부터 프로젝트를 생성합니다. 이 때, Build target은 Google APIs(platform 2.3.3, API Level 10)으로 합니다.
그러면 빌드에 실패하는데, DemoKit 은 태블릿을 걱정해서는 Holo 테마를 사용하기 때문입니다. AndroidManifest에서 테마를 바꿔주거나, Google APIs(platform 3.2, API Level 13)을 사용하도록 합니다.
전 어차피 갤럭시 넥서스를 사용하므로 후자의 방법을 사용했습니다.
빌드가 잘 된다면 자신의 안드로이드 기기(안드로이드 accessory 모드는 2.3.4 까지 백포팅 되어 있지만, 제조사에서 만들기에 따라 최신 버전일지라도 지원되지 않을 수 있다고 합니다. 전 진리의 레퍼런스, 갤럭시 넥서스를 사용합니다.)에 어플리케이션을 설치 합니다.

3. 합체

아두이노 보드는 컴퓨터와 연결한 채로, USB 포트를 이용해 아두이노 보드와 안드로이드 기기를 연결합니다.

연결된 USB 액세서리(이 경우 아두이노 보드)를 위해 DemoKit 어플리케이션을 실행하겠느냐는 다이얼로그가 뜹니다. OK 해주면 보드의 상태를 읽고, 특정 장치들을 안드로이드 기기에서 동작시킬 수 있습니다.
1.5에서 제공한 소스코드를 사용했다면 릴레이 버튼1을 이용해 보드의 LED를 켜고 끌 수 있습니다.




References:
http://www.iheartrobotics.com/2011/07/arduino-mega-adk-setup-notes.html