前面已经说过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 Activity 四大启动模式探究
  6. Android中SQLite数据库存储方式
  7. findViewById()使用常见错误
  8. Activity 的四种加载模式
  9. Android中使用ViewPager制作广告栏滚屏效果

随机推荐

  1. Android(安卓)之 自动提示功能(AutoCompl
  2. Android移动应用开发_点击切换图片形成图
  3. Android(安卓)笔记 - 圆形头像
  4. Android一些系统路径的使用
  5. Android(安卓)闹钟设置最新版
  6. sqlite3 常用命令 for android
  7. Intent 和 Intent Filter
  8. Both setBehindContentView must be call
  9. 不能创建处理器 Can't create handler in
  10. android 根据apk文件获取包名等信息 已经