Arduino ADK

发布于: 27 January, 2014
分享:

到底啥是 ADK?

可能很多开发者都听说过 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 模式工作: [caption id="attachment_165" align="alignnone" width="500"]

使用 Android 智能手机控制 Arduino ADK

 使用 Android 智能手机控制 Arduino ADK[/caption] 从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 #include #include #include #include #include #include #include

#include

#include

USB Usb; USBHub Hub1(&Usb); USBHub Hub2(&Usb); HIDBoot 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(); }   Arduino 编程并不复杂,只要会 C 语言即可,可以参见 Arduino 官方网站中的 Reference 文档。 Usb_host C 库可以参考 libraries/felis_USB_Host_Shield  的头文件。 注:通过这种连接方法,可以连接USB照相机,GPS, 步进电机等各种外设,可以实现使用Android来自动控制等。

分享:

0 留言

留言

您的留言将被人工审核,请勿发表色情、反动言论。