前面已经说过Android SDK ,NDK, APK, 现在有来了个ADK, 这么多K:-). 那么什么是ADK,ADK是Android Open Accessory Development Kit 的缩写。使用ADK使得不支持USB Host功能的Android设备也可以和其它USB设备交互。比如使用Android手机来控制步进电机,条码扫描仪,机器人等。

Android 设备支持各种各样的USB设备,即可以以USB Host模式工作,也可以以USB Accessory 模式工作:

从Android 3.1 (API Level 12) 开始Andriod平台开始支持USB Accessory 和 Host 工作模式,Google也通过附加库的方式中Android 2.3.4 (API Level 10) 支持USB Accessory 和Host 工作模式。

注意:对USB Host或Accessory 模式的支持最终取决于设备硬件,和平台OS的版本无关,比如Sumsung Galaxy Nexus 同时支持USB Host或Accessory 模式而Sumsung Nexus S 只支持USB Accessory 模式,尽管两种手机都采用了ICS 4.0.4平台。

本例介绍如何使用ADK 通过Arduino 连接QRCode Scanner 通过ADK 和Android应用通信。

其硬件连接图如下:

其中Arduino 控制板采用的Freetronics的UsbDroid控制板(和Arduino兼容),QRCode Scanner(工作中USB HID模式)。

由于手机的USB需要和Usb Hub 连接,因此本例需要Android 不通过USB数据线调试的方法。

本例没有采用http://developer.android.com/guide/topics/usb/adk.html 中介绍的软件和USB_Host_Sheild 库,是以为这个库不支持Usb Hub,需要将上图中连接Usb Hub的线直接连到手机,这样就无法再连接QR Code Scanner了。不过基本步骤是一致的。

1. 下载Ardunio软件和对应的USB库。

目前Ardunio的版本为1.0,如果你想使用Google 网站上的例子,你需要使用023版本。为方便起见,你可以从本站下载软件和USB库(支持USB Hub功能),其中USB库为Circuits @Home 提供。

2. 下载 对应的Android实例应用,本例使用Arduino terminal

3. 将firmware 安装到Arduino 控制板上。

本例使用adk 中adk-barcode 示例。其代码如下,可以参见

/**//* A sketch demonstrating data exchange between two USB devices- a HID barcode scanner and ADK-compatible Android phone *//**/#include <avrpins.h>#include <max3421e.h>#include <usbhost.h>#include <usb_ch9.h>#include <Usb.h>#include <usbhub.h>#include <avr/pgmspace.h>#include <address.h> #include <adk.h> #include <hidboot.h> USB Usb;USBHub Hub1(&Usb);USBHub Hub2(&Usb);HIDBoot<HID_PROTOCOL_KEYBOARD> Keyboard(&Usb); ADK adk(&Usb,"Circuits@Home, ltd.","USB Host Shield","Arduino Terminal for Android","1.0","http://www.circuitsathome.com","0000000000000001"); class KbdRptParser : public KeyboardReportParser{ protected:virtual void OnKeyDown    (uint8_t mod, uint8_t key);virtual void OnKeyPressed(uint8_t key);}; void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key){uint8_t c = OemToAscii(mod, key); if (c)OnKeyPressed(c);} /* what to do when symbol arrives */void KbdRptParser::OnKeyPressed(uint8_t key){const char* new_line = "\n";uint8_t rcode;uint8_t keylcl; if( adk.isReady() == false ) {return;} keylcl = key; if( keylcl == 0x13 ) {rcode = adk.SndData( strlen( new_line ), (uint8_t *)new_line );}else {rcode = adk.SndData( 1, &keylcl );} Serial.print((char) keylcl );Serial.print(" : ");Serial.println( keylcl, HEX );}; KbdRptParser Prs; void setup(){Serial.begin(115200);Serial.println("\r\nADK demo start"); if (Usb.Init() == -1) {Serial.println("OSCOKIRQ failed to assert");while(1); //halt}//if (Usb.Init() == -1... Keyboard.SetReportParser(0, (HIDReportParser*)&Prs); delay( 200 );} void loop(){Usb.Task();}


这里的ADK与Google提供的示例稍有不同,但大同小异。

4. 在手机上运行Arduino terminal (这不是必须的),当将USB线连接到手机时,会自动触发这个应用。这是因为:

Firmware中使用ADK定义

ADK adk(&Usb,”Circuits@Home, ltd.”,
USB Host Shield“,
“Arduino Terminal for Android”,
1.0″,
“http://www.circuitsathome.com”,
“0000000000000001″);

和Arduino terminal 的broadcast receiver 定义对应:

<activity android:name=”.StartServiceActivity” android:label=”@string/starter_app_name”
android:launchMode=”singleInstance” android:theme=”@android:style/Theme.NoDisplay”
android:excludeFromRecents=”true”>

<intent-filter>
< action android:name=”android.hardware.usb.action.USB_ACCESSORY_ATTACHED” />
< /intent-filter>

<meta-data android:name=”android.hardware.usb.action.USB_ACCESSORY_ATTACHED”
android:resource=”@xml/accessory_filter” />
< /activity>

xml/accessory_filter.xml 的定义如下:

<resources>

<usb-accessory manufacturer=”Circuits@Home, ltd.” model=”USB Host Shield” version=”1.0″ />
< /resources>

对于你自己的例子,你可以使用你自己定义的名称,只有保证这几个值在firmware 和Android应用中定义的值一致即可。

运行结果如下:

Arduino 编程并不复杂,只要会C语言即可,可以参见arduino-1.0 中的reference文档。Usb_host C库可以参考libraries/felis_USB_Host_Shield 的头文件。

注:通过这种连接方法,可以连接USB照相机,GPS, 步进电机等各种外设,可以实现使用Android来自动控制等。

更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. android中padding和margin的区别
  6. Android抽象布局——include、merge 、ViewStub
  7. android 按钮设计中state_selected属性
  8. Android之间互相的录屏直播 --点对点传输(tcp长连接发送h264)(一
  9. Android(安卓)Studio系列教程三--快捷键

随机推荐

  1. Android(安卓)studio 3.4.0+与gradle版本
  2. listview 详解 背景 转
  3. Android学习笔记---Layout的一些理解
  4. Android(安卓)Bitmap内存占用计算公式
  5. Android(安卓)Gradle学习(五):Extension详
  6. Android(安卓)NDK学习(3)使用Javah命令生成
  7. android 桌面斗地主
  8. Android开发之Toast全接触
  9. Android(安卓)LBS系列02 获取当前位置
  10. Android(安卓)程式开发:(一)详解Activity —