- 전체
- android studio
- Android SDK
- Android NDK
- Android ADK
- Android Etc. Lib.
- Android dalvik VM
- Android 보안
- PhoneGap
- AOSP 개발
- MIT App Inventor 2
- kivy (python)
- ionic framework
- Kotlin (코틀린)
- React Native
Android ADK 구글의 새로운 시도, 구글 ADK의 이해
2014.05.15 15:41
구글의 새로운 시도, 구글 ADK의 이해
아이폰으로 촉발된 스마트폰 혁명은 구글의 안드로이드 운영체제가 출시되면서 새로운 전환기를 맞이했다. 물론 필자는 윈도우폰7을 주력으로 삼고 있는 만큼 윈도우폰7 운영체제가 스마트폰 운영체제의 큰 획을 그을 것으로 기대한다. 하지만 이번에 구글에서 필자의 흥미를 사로잡은 발표가 있어 연재를 통해 소개하고자 한다.
라영호 ratharn@naver.com | 마이크로소프트 윈도우 임베디드 분야 MVP. 윈도우폰7 관련 스마트폰 앱 개발과 윈도우 임베디드CE 관련 장치를 개발하고 있다. 개인 블로그(www.embeddedce.com)를 통해 임베디드 시스템 개발의 다양한 생각과 방법론을 공유하고자 노력 중이다. 최근 임베디드 시스템을 이용한 빠르고 안정적인 시스템 구현을 고민하고 있다. 또 개발부터 최종 제품이 나오기까지 거쳐야 할 다양한 테스트 및 신뢰성 문제에도 관심이 있다. ADK를 이용한 새로운 프로젝트를 기획 중이다.
오픈소스로 스마트폰 운영체제를 만든다는 것 자체로 안드로이드 운영체제는 큰 이슈였다. 라이선스 비용이 없어도 스마트폰을 개발한다는 장점 때문인지 단말기 개발업체들은 앞 다퉈 개발에 참여했다. 스마트폰부터 태블릿PC와 각종 임베디드 장치에 이르기까지 안드로이드 운영체제가 탑재된 제품이 속속 등장하고 있다. 그래서인지 구글 개발자 세미나인 ‘Google I/0 2011’에서는 흥미로운 주제들이 많이 발표됐다. 그 중 하나가 안드로이드폰에서 사용하는 주변기기들을 개발하는 ADK(Accessory Development Kit)다. 다시 말해 ADK는 안드로이드 운영체제를 탑재한 장치의 주변장치를 만들 수 있는 하드웨어 및 소프트웨어를 말한다.
구글이 소개한 ADK는 주변장치와 USB를 통한 인터페이스 방법 중 하나다. 구글은 안드로이드 운영체제를 탑재한 장치에 USB 호스트나 USB OTG 같은 장치만 있으면 누구나 사용할 수 있는 규격을 정했다. 그렇지 않은 경우 ADK를 사용해 구현하는 규격도 마련했다.
지금부터 본격적으로 ADK를 살펴보겠다. 연재에서는 ‘Open Accessory Development Kit’로 USB 호스트 기능이 없는 안드로이드 장치를 연결해 테스트해 보겠다. 원래 구글은 Open Accessory Development Kit라는 명칭을 사용하고 있지만 연재에서는 간단하게 ADK로 기술하겠다.
USB 클라이언트, USB HOST
ADK의 핵심은 인터페이스에 있다. 따라서 ADK의 목적은 안드로이드폰이나 태블릿에서 사용하는 USB 포트와 연결할 수 있는 저렴한 인터페이스 방법을 제공하는 것이다.
과거 PDA나 스마트폰은 별도의 포트를 할당해 고유의 통신방법을 만들어 냈다. 그러다 보니 수많은 PDA 및 기타 장치와의 호환성 문제가 발생했고, 이로 인해 다양한 부가장치가 나오지 못하는 결과를 낳았다.
이런 과오를 안드로이드는 PC와 연결할 때 표준으로 사용하는 USB 포트를 이용해 해결했다. 평상시에는 PC와 연결해 동기화나 충전을 하고 필요 시 부가장치와 연결하는 방법을 채택했다. 자연스럽게 안드로이드폰이나 태블릿의 USB 포트와 연결할 장치가 필요하게 됐고, 아두이노 플랫폼이 다른 부가장치와의 연결통로인 USB 호스트 역할을 담당했다.
여기에 안드로이드 운영체제를 USB 호스트 모드와 부가장치 모드를 모두 지원할 수 있게 만들면서 다양한 장치를 연결하는 소프트웨어적 지원도 잊지 않았다. 그렇게 탄생한 것이 구글의 안드로이드 부가 장치 통신 프로토콜(Android accessory com munication protocol)이다. 이는 안드로이드 운영체제를 탑재한 장치에서 USB 호스트를 탑재하거나 ADK와 연결돼 동작하는 부가장치 모드일 때 사용하는 프로토콜과 관련 API가 새롭게 마련된 것을 의미한다. 구글이 선보인 API 클래스는 두 가지다.
<표 1> USB 부가장치 모드 API 및 클래스
USB 부가장치 모드 API
USB 부가장치 모드를 지원, 즉 ADK를 지원하기 위해 사용되는 네임스페이스는 com.android.future.usb와 android.hard ware.usb 이다.
USB 호스트 모드 API
USB 호스트 장치를 탑재한 안드로이드 장치에서 사용하는 클래스다. PC 같이 USB 장치로 연결돼 관리 및 동작하는 USB 호스트 장치가 있는 상태에서 부가장치가 USB 디바이스 형태로 연결될 때 이를 관리를 위해 지원되는 클래스다. android. hardware.usb 네임스페이스로 지원되는 USB 호스트 모드 클래스 및 API는 <표 2>와 같다.
<표 2> USB 호스트 모드 API 및 클래스
<리스트 1>은 USB 호스트 API를 사용하는 응용 프로그램에서 쓰이는 매니페스트(manifest)파일의 예다. 여기서 android. hardware.usb.action.USB_ACCESSORY_ATTACHED를 사용해 원하는 USB 장치가 연결되었을 때는 동작해야할 메인 액티비티를 지정한다.
<리스트 1> USB 호스트 API 사용 매니페스트 파일 <manifest ...> <meta-data android:name="android.hardware. usb.action.USB_ACCESSORY_ATTACHED" |
< 리스트 2>는 res/xml/device_filter.xml에 저장되는 내용이다. 사용하려는 USB 부가장치의 벤더 및 장치 아이디를 지정해, 원하는 장치가 USB 호스트로 연결 시 동작하도록 지정할 때 사용한다.
<리스트 2> USB 장치의 밴더 및 장치 아이디 지정 소스 <?xml version="1.0" encoding="utf-8"?> <resources> |
USB 호스트 API를 사용한 장치구동은 마치 PC에서 USB 디바이스 드라이버를 설치해 필요한 장치가 연결되면 해당 장치의 장치 아이디를 이용해 제어하는 것과 유사하다. 이를 통해 우리는 안드로이드 운영체제에서도 제어방법이 제공되는 것을 확인할 수 있다.
Open ADK(Accessory Development Kit)
ADK는 ‘부가장치 개발 키트’라는 이름을 달고 있다. 하지만 실제로는 ‘아두이노(Arduino)’라는 공개 하드웨어 플랫폼 및 소프트웨어를 이용해 모터, 센서 같은 주변장치를 연결하는 하드웨어 및 소프트웨어 플랫폼을 말한다.
안드로이드폰이나 태블릿은 PC와 동기화시키기 위해 USB 연결 포트를 사용한다. 이 연결 포트를 사용해 손쉽게 다른 장치를 연결할 수 있다. 하지만 여기서 주목해야 할 것은 이러한 연결장치를 개발할 때도 구글은 오픈(Open)이라는 방법을 사용했다는 것이다.
안드로이드가 오픈소스로 공개되듯 주변장치를 개발할 때 필요한 각종 하드웨어 및 소프트웨어 정보를 다 공개해 자유롭게 개발할 수 있다. 물론 애플도 주변장치 개발을 위해 ‘Apple Made For iPod program(MFi)’라는 규정을 두고, 하드웨어 및 소프트웨어적 방법을 제공한다. 하지만 만만치 않은 라이선스 비용이 문제다. 이런 구글의 오픈정책은 안드로이드 장치를 위한 부가장치를 만드는 업체에게는 안드로이드폰이나 태블릿을 하나의 제어장치로 쉽게 사용하게 만드는 발판을 만들어줬다.
이런 구글의 오픈 소스 정책이 안드로이드 운영체제를 더욱 위협적으로 만들어준다고 필자는 생각한다. 아직 ADK가 알려진지 얼마 안돼서 ADK를 이용한 부가장치들이 정식 출시되진 않았다. 하지만 ADK가 무엇이고 어떤 구조로 돼 있으며, 하드웨어 구성은 어떻게 돼있고 어떤 방식으로 제어하는지 꼭 알아봐야 할 것이다.
아두이노(Arduino)
ADK의 중요 구성요소 중 하나가 오픈 하드웨어 프로젝트인 아두이노 장치이다. 아두이노는 오픈소스에 기반을 둔 전자 프로토타이핑 플랫폼으로, 예술가와 디자이너 취미 활동가 등 인터랙티브 객체와 환경 구축에 관심이 많은 이들을 위해 제작됐다.
사용 주체를 보면 알 수 있듯, 아두이노는 하드웨어에 대한 깊은 지식이 없어도 다양한 애플리케이션을 구축할 수 있다는 게 큰 장점이다.
<화면 1> 아두이노 하드웨어
기본적인 아두이노의 구성은 여느 개발 플랫폼과 동일하게 하드웨어와 소프트웨어로 구성돼 있다.
하드웨어는 미국 아트멜의 AVR이라는 저가 마이크로컨트롤러를 사용한다. 마이크로컨트롤러를 프로그래밍하기 위한 소프트웨어는 AVR을 제작하는 아트멜에서 무료로 제공한다. 아두이노는 오픈소스를 기반으로 두고 있어 하드웨어를 사용자가 직접 제작할 수도 있고 미리 조합된 제품을 구입할 수 있다.
또 프로그래밍에 사용하는 소프트웨어의 종류에도 제한이 없으며, 하드웨어를 설계하기 위한 회로도나 전자 기판을 만들기 위한 제작정보 그리고 아두이노 내부 소프트웨어와 아누이노 자체를 프로그래밍해 올리는 통합 개발환경까지 소스 형태로 공개하고 있다.
아두이노는 컴퓨터와 USB로 연결해 전원 및 제어를 할 수 있는 보드와 PC에서 아두이노 보드를 인식할 수 있는 디바이스 드라이버 그리고 통합개발환경(IDE)에서 개발한 프로그램을 USB로 다운로드해 실행하는 구조로 구성돼 있다. 이러한 간편함과 편리성 때문에 하드웨어 및 소프트웨어 엔지니어뿐만 아니라 초등학생의 교육 교재로도 사용된다.
<화면2> 아두이노의 통합 개발 환경
<화면 3> 아두이노 프로그램 작성 화면
아두이노 보드에 LED 같은 하드웨어를 연결하고 LED가 깜박이는 동작을 프로그래밍하는 것은 C나 C++의 지식이 조금만 있다면 쉽게 따라할 수 있다. 그렇다면 실제로 어떻게 프로그래밍하는지 살펴보자.
< 그림 1>은 아두이노 보드에 LED를 실제로 연결한 모습이고, <그림 2>는 회로도에서 LED가 어떻게 연결돼 있는지 설명하는 그림이다.
<그림 1> 아두이노 보드에 LED를 연결한 화면
<그림 2> 아두이노 LED 연결 회로도
그림에서 보듯 아두이노는 손쉽게 하드웨어 부품을 연결하고 테스트할 수 있는 구조로 설계돼 있다. 이렇게 연결한 LED를 프로그래밍 하는 방법이 <리스트 3>이다.
<리스트 3> 아두이노 LED 제어 프로그램 예제 /* void setup() { void loop() { |
왜 아두이노인가?
그렇다면 왜 구글은 아두이노를 안드로이드 플랫폼 액세서리와 인터페이스를 위한 플랫폼으로 선정했을까? 필자는 아두이노 프로젝트의 오픈소스 및 오픈 하드웨어 정책이 중요하게 작용했다고 생각한다. 오픈소스 및 오픈 하드웨어 정책은 구글의 안드로이드 운영정책과 일맥상통해 ADK를 탄생시킨 것이다.
하지만 아두이노 구조 그대로 부가장치로 만들어져 제품화 될지는 아직 의문이다. 또 ADK의 방향성을 두고 실패를 예상하는 개발자들의 목소리도 들린다. 왜냐하면 USB를 이용한 인터페이스 방식에 회의적이기 때문이다. 물론 ADK의 미래나 발전방향을 전망하기는 이르다. 필자와 같이 전자회로 만들기를 좋아하고 하드웨어 프로그래밍을 즐기는 사람에게는 안드로이드폰을 이용해 자바로 하드웨어를 제어하는 새로운 플랫폼이 생긴 것만으로도 즐거움이기 때문이다. 그래서 시간이 좀 더 지난 후 평가해야 한다고 생각한다.
사실 ADK 같이 안드로이폰으로 하드웨어를 제어하는 시도는 과거에도 있었다. 우연의 일치인지 몰라도 2011년 5월에 스파크펀(SparkFun)이란 사이트에서 ADK와 유사한 IOIO보드로 개발하는 방법이 소개됐다.
<화면 4> IOIO 보드
둘 중 어느 것이 먼저인지 자세히 알 수 없다. 다만 같은 생각을 가지고 무언가를 새롭게 시도하려는 노력이 중요하다고 본다. 또 저렴한 방법으로 하드웨어를 구성해 로봇 제어 같은 일을 ADK로 할 수 있다는 게 중요하다.
ADK나 IOIO는 모두 동일한 구조와 동작방식을 가지고 있다. ADK는 아두이노 하드웨어 플랫폼을 이용했지만 IOIO는 안드로이드에서 정식으로 지원하지 않아서 디버깅을 위해 사용한 ADB를 이용했을 뿐이다. 하드웨어 구성이나 방향은 거의 동일하다.
지금부터는 ADK의 구조 및 내부구성을 살펴보겠다. ADK는 구글 안드로이드 개발자 사이트(http://developer.android. com/guide/topics/usb/adk.html)에서 다운로드할 수 있으며, 하드웨어 정보와 소프트웨어 패키지로 구성되어 있다.
ADK 구성
앞서 말 한대로 ADK는 하드웨어 정보와 소프트웨어 패키지로 구성되어 있다. 좀 더 세부적으로 말하면 하드웨어 설계 시 필요한 하드웨어 기판 설계 정보와 제작 정보, ADK 하드웨어 구동에 필요한 소프트웨어, 안드로이드 운영체제에서 ADK 하드웨어와 연결해 테스트하기 위한 응용 프로그램으로 구성돼 있다.
하드웨어
ADK를 구성하는 하드웨어는 미국 아트멜의 ATMEGA2560 프로세서를 탑재한 MEGA2560 보드와 온도 센서, LED, 스위치 등의 제어 테스트를 할 수 있는 쉴드 보드로 구성돼 있다.
<그림 3> ADK 주 보드의 회로도
<그림 4> 쉴드 보드의 회로도
ADK 주 보드는 쉴드 보드와 연결할 수 있는 연결 커넥터가 제공되며, USB로 안드로이드 운영체제를 탑재한 장치와 연결할 수 있다.
쉴드 보드로 할 수 있는 제어 테스트는 캡센스(CapSene)라는 터치 장치를 이용한 터치 인터페이스, I2C를 이용한 하드웨어 제어, 서보 모터 제어, SPI 통신을 통한 장치 제어 등 매우 다양하다. 또한 로봇 및 센서를 이용한 다양한 장치도 개발할 수 있는 기능을 제공한다.
하드웨어 펌웨어
하드웨어 보드에 탑재된 펌웨어 프로그램은 demokit.pde로 제공된다. pde 확장자는 아두이노 통합 개발 환경에서 사용되는 확장자다.
demokit.pde는 \AndroidAccessory, \USB_Host_Shield라는 라이브러리 폴더에 있는 라이브러로 ADK 보드의 각종 기능과 센서를 제어할 수 있게 해준다.
<화면 5> 하드웨어 보드에 사용되는 프로그램
안드로이드 라이브러리
안드로이드 2.3.4(API 레벨 10) 버전에서는 애드온 형태의 라이브러리를 설치해 사용할 수 있다. 하지만 안드로이드 3.1(API 레벨 12) 버전에는 ADK에 관련된 라이브러리가 탑재돼 나올 것으로 전망된다.
ADK 펌웨어의 동작
demokit.pde 소스 내부에 있는 loop() 함수는 안드로이드 장치와 연결돼 있는지 지속적으로 확인한다. AndroidAccessory 클래스는 안드로이드 운영체제에 사용되는 부가 장치를 알려준다.
< 리스트 4>는 안드로이드 장치와 연결됐을 때의 동작을 나타내는 코드다. 과거 PC용 USB 장치 프로그램을 작성할 때와 유사하게 구성되고 있음을 알 수 있다. ADK와 안드로이드 장치가 연결되면 USB 부가장치 정보가 안드로이드 운영체제에 전달되고 통신에 필요한 정보가 전달된다.
<리스트 4> ADK의 내부 펌웨어 동작 .. AndroidAccessory acc("Google, Inc.", ... |
< 리스트 5>는 안드로이드 부가 장치 모드로 전환하도록 안드로이드 운영체제에 통보해 주는 소스이다. 즉, 안드로이드 부가장치 모드로 전환하여 부가 장치로써의 역할을 할 수 있도록 모드를 전환하는 것이다.
<리스트 5> ADK 보드와 안드로이드 장치의 연결 확인 bool AndroidAccessory::isConnected(void) if (!connected && err= usb.getDevDescr(1, 0, 0x12, (char *) devDesc); // USB 장치 정보 전달 if (isAccessoryDevice(devDesc)) { return connected; |
< 리스트 6>에서 안드로이드 부가장치 모드로 전환되고 통신을 위한 엔드포인트가 확인되면, 안드로이드 운영체제와 ADK간 통신 준비가 마무리 된 것이다. 그 다음은 <리스트 7>에서 보는 것처럼 read/write 함수를 이용해 안드로이드 응용 프로그램에서 ADK를 제어하면 된다.
<리스트 6> 안드로이드 부가 장치 모드로 전환 bool AndroidAccessory::switchDevice(byte addr) sendString(addr, ACCESSORY_STRING_MANUFACTURER, manufacturer); usb.ctrlReq(addr, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE, |
<리스트 7> 안드로이드 부가 장치 모드 통신 함수 int AndroidAccessory::read(void *buff, int len, unsigned int nakLimit) { int AndroidAccessory::write(void *buff, int len) { |
ADK 코리아 프로젝트
현재 구글의 ADK 보드는 발표된 하드웨어 정보를 참고로 해 몇몇 회사에서 출시되고 있다. 하지만 가격 및 구입이 아직 쉽지 않다. 그래서 필자는 ADK 보드 제작하고 관련 정보를 공유하며 더 나아가 ADK로 응용프로그램 개발하고 관련 정보를 공유하는 자리를 만들었다.
현재 네이버에 ‘Google Open Accessory Development Kit 연구회(http://cafe.naver.com/openadk)’라는 이름으로 카페를 개설해, 보드를 공동 개발하고 개발정보와 각종 센서 및 장치의 제어 내용을 공유하고 있다. 필자의 바람은 많은 개발자들이 참가해 새로운 안드로이드 장치를 위한 새로운 부가장치 및 기능이 개발되는 기회의 장이 됐으면 한다.
정리하며
지금까지 구글의 ADK의 구조 및 내용을 살펴봤다. 하지만 ADK가 무엇인지를 간략히 살펴봤을 뿐이다. 다음 연재에서는 안드로이드폰으로 ADK에 있는 장치들을 어떻게 제어하는지 ADK 보드를 이용해 살펴보겠다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 12 |
App Inventor - MySQL interface 앱 인벤터 mysql 연결
| 졸리운_곰 | 2018.04.07 | 7995 |
| 11 |
Connect App Inventor to MySQL Database 앱 인벤터와 mysql 데이터베이스 연결
| 졸리운_곰 | 2018.04.07 | 7273 |
| 10 |
Create an API (PHP) 앱 인벤터와 php 통합
| 졸리운_곰 | 2018.04.07 | 630 |
| 9 |
Using the WebViewer Control in App Inventor 앱인터에서 웹뷰 컨트롤 사용
| 졸리운_곰 | 2018.03.24 | 512 |
| 8 |
WebView Javascript Processor for App Inventor 앱 인벤터 웹뷰 자바스크립트 인터페이스
| 졸리운_곰 | 2018.03.24 | 505 |
| 7 |
Creating a digital wallet application in App Inventor 2
| 졸리운_곰 | 2017.05.01 | 287 |
| 6 | Creating a Custom TinyWebDB Service | 졸리운_곰 | 2016.05.18 | 201 |
| 5 |
TinyDB is a lightweight document oriented database
| 졸리운_곰 | 2016.05.16 | 270 |
| 4 |
구글 앱엔진에 의한 소형웹데이터베이스의 접속방법 tinywebdb
| 졸리운_곰 | 2016.05.15 | 547 |
| 3 |
App inventor 멀티스크린, 스크린 이동, 다중화면,
| 졸리운_곰 | 2016.02.17 | 779 |
| 2 |
Communicating with Web APIs
| 졸리운_곰 | 2016.02.17 | 1080 |
| 1 |
JSON data on the Android mobile with App Inventor 2
| 졸리운_곰 | 2016.02.17 | 364 |

