ADK ( Accessory Development Kit ) 整合 arduino周邊附件開發過程


 

 

ADK 2012 年基於 Arduino 開源電子原型設計平臺,並且是一種開

放硬體設計。ADK 軟體下載中包含硬體設計檔和固件的原始程式碼。

ADK 包含兩個主要的物理硬體元件:

主要處理板包含微處理器、 USB 連接、 電源連接器和輸入/輸出針

腳。可以刪除此板,並從硬體的其餘部分單獨使用。包含感應器、 

Led、 輸入的控制項、 音訊放大器和揚聲器輸出,


ADK 的主要硬體特點如下所示:


ARM 32 bit Cortex M3 微型處理器
獨立的 USB 連接線 進行程式設計和調試 Android 設備和電腦連接

光照、 顏色、 近距離、 溫度、 濕度、 氣壓、 和加速度感應器


微型 SD 卡插槽  藍牙支援


Developing Accessories with ADK 2012

ADK 2012 年是一個硬體平臺和一套樣機 Android 周邊配件的軟體

庫。如何設置一個程式設計在 ADK 的發展環境,讓它做你想要什麼

,並測試軟體構建您自己的 Android 周邊配件。

 


  下載  ADK  -   Downloading the ADK Source   


   1 .  在電腦上載安裝 Git download  

   2.   在電腦上下載設定  repo tool 

 201200181


    3.  downloaded source files, initialize and synchronize

 

            $> mkdir android-accessories


            $> cd android-accessories


            $> repo init -u https://android.googlesource.com

             /accessories/manifest


            $> repo sync

 


 

Setting Up the Development Environment


      設置與執行 the ADK 2012 IDE:

       1. 安裝  jdk 6 or  higher .

       2. 下載  ADK 2012  ---   WINDOWS    MAC   LINUX 32   64 

           3. 解壓縮 ,  打開     ADK2012_IDE/ folder   和 

                       執行 the arduino file.

      

         成功安裝ADK 2012 IDE ,接下來設定   ADK 2012 library  

      1. 開始執行 the ADK 2012 IDE 和選擇 File > Preferences

  1. 2. 在 Preferences 對話框, 請記下 Sketchbook location 目錄.

    3. Copy

     the <adk-source-download>/adk2012/board/library/ADK2 

    目錄和其內容放進 yoursketchbook/libraries/ directory, 

    結果新增sketchbook/libraries/ADK2 directory.

    4. 停止並重新啟動 ADK 2012 IDE.

    5. 在 IDE 裏, 選擇 File > Examples > ADK2 然後選擇以下範例程式之ㄧ:

    clock
    BluetoothScan
    usbaccessory

     

    6. 發PC 透過 USB cable 連結 ADK 板

    7 .在 IDE 裏, 建立 the ADK 選擇 Tools > Serial Port串列埠連結

    8. 在 IDE 裏, 選擇 the ADK by selectingTools > Board > Google ADK2.

    9. 修改或新增你自己的 CODE

    10.選 File > Upload.上傳程式到 the ADK ;    成功傳送 , 

             the ADK 板 和 your Android 保持連結正常 !

  

 ===============================================

 

使用 ADK Alternativ build 系統


 

若要安裝環境:

 

下載 ADK 2012accessory 原始程式碼檔。
在終端視窗中,
打開 <adk-source-download>/adk2012/board/MakefileBasedBuild.
執行以下命令,並按照說明進行操作:
$>./setup

 

構建您的accessor y的程式:
放置 accessory 代碼在 MakefileBasedBuild/app 目錄中,包括所有必需的lib檔。
請參閱範例程式 app/main.c 檔。
執行以下命令,並按照說明進行操作:
$>./build

 

若要載入程式在您的accessory硬體上:

 

1. 運行上面的build過程,並確保您的程式編譯成功。
2. 通過 USB 將accessory 連到您的開發電腦。
3. 檢查accessory附加到哪個port 和在flash 腳本中的變數修改 UART 到正確的port位址 。
在 linux 機器上的port位址通常是在 /dev/ttyUSB0。
4. 執行以下命令,對accessory以載入該程式 :
$>./flash


==================================

 

[ADK 與 Android 設備的如何連接方式]

 


Android 的基本特徵是配件的其連接與溝通的 Android 設備的能力。
構建軟體的附件時,創建您的附件和 Android 設備之間快速和可靠的
連接是第一順序的業務。使用 ADK 2012,以便您可以將它們應用於發
展自己的 Android 配件的連接和通信要領。


 

[  ADK 通過藍牙連接  ]

 

ADK 2012 的應用程式和硬體配套使用藍牙序列埠設定檔 (SPP) 連接進行通信。

此連接允許兩種方式 ADK 配件和 Android 設備之間的通信。

 

注意: 在 ADK 硬體實施允許使用其他設定檔和多個連接。但是,ADK 2012 

accessory與 Android 應用程式之間的基本通信使用研究。

 


附件藍牙代碼

 

為了啟用藍牙通訊,clock.ino sketch 對ADK 2012 accessory 期間要啟用無

線電頻率通訊,並開始偵聽藍牙連接的 setup() 方法調用 btStart()

 

方法:

 


ADK L;
void setup() {
L.adkInit();
L.btStart();
}
...
void btStart(){
uint8_t i, dlci;
int f;

 

L.btEnable(adkBtConnectionRequest, adkBtLinkKeyRequest, adkBtLinkKeyCreated,
adkBtPinRequest, NULL);

 

dlci = L.btRfcommReserveDlci(RFCOMM_DLCI_NEED_EVEN);

 

if(!dlci) dbgPrintf("BTADK: failed to allocate DLCI\n");
else{

 

//change descriptor to be valid...
for(i = 0, f = -1; i < sizeof(sdpDescrADK); i++){

 

if(sdpDescrADK[i] == MAGIX){
if(f == -1) f = i;
else break;
}
}

 

if(i != sizeof(sdpDescrADK) || f == -1){

 

dbgPrintf("BTADK: failed to find a single marker in descriptor\n");
L.btRfcommReleaseDlci(dlci);
return;
}

 

sdpDescrADK[f] = dlci >> 1;

 

dbgPrintf("BTADK has DLCI %u\n", dlci);

 

L.btRfcommRegisterPort(dlci, btAdkPortOpen, btAdkPortClose, btAdkPortRx);
L.btSdpServiceDescriptorAdd(sdpDescrADK, sizeof(sdpDescrADK));
}
}

 


請注意 sdpDescrADK 物件包含通用唯一識別碼 (UUID) 在變數 BT_ADK_UUID

 中。此識別碼必須匹配的 UUID在Android 應用程式代碼中的 BluetoothSocket 

連接請求中提供的設備。一旦啟用了藍牙,上面所示的代碼,附件偵聽連接請求。

ADK 庫處理聽力和連接的詳細資訊,因此附件一次在每次迴圈執行過程中調用 

ADK::adkEventProcess():

 


void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}

 

如果已建立藍牙連接,任何命令傳送到 btAdkPortRx() 回檔方法 

(這註冊 ADK library作為 btStart() 方法的一部分),並進行相應處理。ADK

 附件發送回通過使用 ADK::btRfcommPortTx() 方法的藍牙連接的消息。有關

更多詳細資訊,查看 clock.ino sketch 中的這些具體方法。

 

 

 

Android 應用程式藍牙代碼

 

在ADK 2012 Android 應用程式,用於處理藍牙連接的代碼封裝在BTConnection

 類中。在此類中,應用程式請求對藍牙配接器的訪問,並協商與 ADK 2012 配件

的連接。這裡是有關代碼的摘要:

 


mAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = mAdapter.getRemoteDevice(address);
mSocket = 

device.createInsecureRfcommSocketToServiceRecord(ADK_UUID);
mSocket.connect();

 

注意到ADK_UUID參數。此識別碼必須與輸出的附件前面提到的 BT_ADK_UUID

 變數) 的識別碼匹配,否則協定協商失敗和 BluetoothSocket 則不會創建。

一旦建立連接,則您會獲得 InputStream 和 OutputStream 物件設置從通訊

端與Accessory進行通信:


mInStream = mSocket.getInputStream();

mOutStream = mSocket.getOutputStream();


 

檢查 BTConnection.java 檔,查看 ADK 2012 軟體下載中提供更多的實現

詳細資訊。

 

==========================================================


[  ADK 透過 USB 連接 ] 


 

ADK 2012 的應用程式和硬體配件也可以使用 USB 連接進行通信,

類似于原始 ADK。

 

Accessory USB 程式碼

 

ADK Library 處理包含大多數的 USB 連接的完成細節,Accessory的code必須

作幾個calls來初始化 USB 連接選項,包括設置的Accessory標識字串:

 

ADK L;
void setup() {
L.adkInit();
L.usbSetAccessoryStringVendor(...);
L.usbSetAccessoryStringName(...);
L.usbSetAccessoryStringLongname(...);
L.usbSetAccessoryStringVersion(...);
L.usbSetAccessoryStringUrl(...);
L.usbSetAccessoryStringSerial(...);

 

L.usbStart();
}
注: 標識字串必須匹配指定連接的 Android 應用程式中的 USB 附件篩選器設置

,否則應用程式無法連接的附件。

 

 

 


一旦啟用了 USB,如上所示的代碼,附件偵聽連接請求。ADK lib 處理listens和

連接的所須資訊,因此Accessory一次在每次迴圈執行過程中調用 

ADK::adkEventProcess():


 

void loop(void)
{
...
L.adkEventProcess(); //let the adk framework do its thing
...
}

 

Accessory然後必須檢查live的 USB 連接,以處理命令和發送消息。這裡是有

關程式碼的摘要:


 

void loop() {
if (L.accessoryConnected()) {
int recvLen = L.accessoryReceive(msg, sizeof(msg));
if (recvLen > 0) {
... // process message
}

 

L.accessorySend(outmsg, outmsgLen);
}
L.adkEventProcess();
}

 

有關更多詳細資訊,查看 clock.ino sketch中的這些具體方法。

 

Android App USB Code

 

在 ADK 2012 Android 應用程式,用於處理 USB 連接的代碼是在 

UsbConnection 類中封裝的。此類設置尤其以偵聽 USB 事件,然後嘗試連接

時接收到匹配的連接事件。這裡是有關代碼的摘要:


 

import com.android.future.usb.UsbAccessory;
import com.android.future.usb.UsbManager;

 

mUSBManager = UsbManager.getInstance(this);

UsbAccessory acc = mUSBManager.getAccessoryList()[0];
if (!mUSBManager.hasPermission(acc)) return;

 


ADK 2012 app 使用支援函式庫來實現 USB 輔助連接,以支援運行 

Android 2.3.4 (API 級 10) 的設備。如果您僅需要支援 Android 3.1 

(API 級別 12) 和較高的設備,您可以替換的第 4 行下面的代碼:


 

import android.hardware.usb.UsbAccessory
import android.hardware.usb.UsbManager

 

mUSBManager = 

(UsbManager) getSystemService(Context.USB_SERVICE);


UsbAccessory acc = (UsbAccessory)
intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);


 

請注意: 這款應用程式只接收事件,當 USB 的accessory標識資訊匹配在

 res/xml/usb_accessory_filter.xml 檔中 ,参考應用程式 manifest 宣告

 

<meta-data
android:name=

"android.hardware.usb.action.USB_ACCESSORY_ATTACHED"


android:resource="@xml/usb_accessory_filter" />


ADK 2012 Accessory 不會收到來自其他 USB 設備的連接。

 

一旦建立連接,則應用程式可以溝通通過檔輸入配件和輸出流,如下面的程式碼

示例中所示

 

ParcelFileDescriptor mFD = mUSBManager.openAccessory(acc);
if (mFD != null) {
FileDescripter fd = mFD.getFileDescriptor();
mIS = new FileInputStream(fd); // use this to receive messages
mOS = new FileOutputStream(fd); // use this to send commands

檢查 UsbConnection.java 檔,查看 ADK 2012 原始程式碼中提供了更多的

具體方法資訊。
}

 




 

 

 

arrow
arrow

    賈雷 發表在 痞客邦 留言(0) 人氣()