Android Open Accessory Development Kit demoボードもどき (2011.7.9)

Google I/O 2011で発表されたADK(Open Accessory Development Kit)Arduinoベースであることを知り、au版XOOMのAndroid3.1バージョンアップを待ってdemoボードを自作してみた。
demo+xoom

1. 材料

配布されているサンプルを動作させるには、Arduinoといっても一般的なUnoとかDuemilanoveではなく、mega2560が必要。
ピンソケットは足の長いものが必要。

品名メーカ個数備考
Arduino Mega 2560Arduino1 
USB Host ShieldSparkfun1DEV-09947
Arduino Mega用シールド基板サンハヤト1UB-ARD02WH
Arduino用シールド基板サンハヤト1UB-ARD01
アナログジョイスティックTop-Up Industry Corporation1秋月電子P-04048
温度センサ(LM35DZ)NS1秋月電子I-00116
照度センサ(NJL7502L)NS1秋月電子I-02325
タクトスイッチ???3秋月電子P-03648
フルカラーLED(OSTA71A1D-A)OptoSupply Limited3秋月電子I-02547
ピンヘッダ 1x20???1秋月電子C-00167
ピンソケット 1x8???5秋月電子C-04046
ピンソケット 1x6???1秋月電子C-04045
ピンソケット 2x20???3秋月電子店頭にあり
抵抗 1MΩ???1 
抵抗 75Ω???1 
抵抗 91Ω???6 
抵抗 150Ω???3 
セラミックコンデンサ 0.1μF???1 
セラミックコンデンサ 1μF???1 
電解コンデンサ 22μF???1 

2. USBホストボードの作成

USBホストシールドをそのまま使うと、使い勝手が悪くなるので、mega用シールド基板とUSBホストシールドを合体して、上にそのままシールドを載せられるようにする。

mega + USB hostmegahost
そのまま載せるとこんな感じ今回作るのはこんな感じ

USBホストシールドがちょっと長いので、写真の部分で切断し、シールド基板と合体する。今回はたまたま手元にあったロープロファイルのピンヘッダで2枚の基板は結合させている。
cut

配線は以下の通り。

信号USBホストシールドmegaシールド基板備考
RESET7D46 
GPX8D49 
INT9D48 
SS10D53 
MOSI11D51 
MISO12D50 
SCK13D52 
GNDGNDGND 
VINVINVINVccは接続しないので、外部電源必須
RSTRSTRESET 

配線が済んだらピンソケットを半田付けして完成。
megaのシールドは、汎用GPIOが2x18のコネクタになっているが、2x20のピンソケットしか手に入らなかったため、2x2分をカットして使用。

念のため、USB_Host_Shield/examples/board_testで動作確認しておく。

3. Demoボードもどきの作成

demo

circuit

オリジナルと全く同じ部品がを集めている訳ではないので、以下の差異がある。

機能オリジナルもどき備考
温度センサMCP9700LM35DZ温度測定レンジの違いあり
ジョイスティックI2C接続アナログアナログ入力
リレー2個実装未実装 
タッチセンサー1個実装未実装 

普通のArduinoシールド基板を利用したため、アナログ入力が1つ不足。ブレッドボード用ワイヤで足している。(写真の緑色の線。これをA7に接続する)
adkdemo

4. ソフトウェアの修正

ここからADK一式を取得し、手順通りに配置する。Android開発環境やArduino開発環境の構築手順は割愛。
Arduinoのスケッチはそのままでは使えないので、一部修正しておく。

Max3421e_constants.h 7行目付近
    
/* SPI pins for diffrent Arduinos */

#if defined(__AVR_ATmega1280__) || (__AVR_ATmega2560__)
  #define SCK_PIN   52
  #define MISO_PIN  50
  #define MOSI_PIN  51
  #define SS_PIN    53

  #define MAX_SS    53
  #define MAX_INT   48
  #define MAX_GPX   49
  #define MAX_RESET 46
#endif
#if  defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
  #define SCK_PIN   13
  #define MISO_PIN  12
  #define MOSI_PIN  11
  #define SS_PIN    10
  #define MAX_SS    10
  #define MAX_INT   9
  #define MAX_GPX   7
  #define MAX_RESET 8
#endif



/* "Breakpoint" pins for debugging */
    

スケッチはこちら

Android側アプリはそのままでも動くが、温度センサの値が不正になるため、一部修正(LM35DZは0度=0Vなので、オフセットが不要)。

InputController.java 36行目付近、

public void setTemperature(int temperatureFromArduino) {
    /*
     * Arduino board contains a 6 channel (8 channels on the Mini and Nano,
     * 16 on the Mega), 10-bit analog to digital converter. This means that
     * it will map input voltages between 0 and 5 volts into integer values
     * between 0 and 1023. This yields a resolution between readings of: 5
     * volts / 1024 units or, .0049 volts (4.9 mV) per unit.
     */
    double voltagemv = temperatureFromArduino * 4.9;
    /*
     * The change in voltage is scaled to a temperature coefficient of 10.0
     * mV/degC (typical) for the LM35D (0V = 0 degC, 200mV = 20 degC)
     */
    voltagemv = voltagemv / 10;
    /*
     * The change in voltage is scaled to a temperature coefficient of 10.0
     * mV/degC (typical) for the MCP9700/9700A and 19.5 mV/degC (typical)
     * for the MCP9701/9701A. The out- put voltage at 0 degC is also scaled
     * to 500 mV (typical) and 400 mV (typical) for the MCP9700/9700A and
     * MCP9701/9701A, respectively. VOUT = TC・TA+V0degC
     */
//		double kVoltageAtZeroCmv = 400;
//		double kTemperatureCoefficientmvperC = 19.5;
//		double ambientTemperatureC = ((double) voltagemv - kVoltageAtZeroCmv)
//				/ kTemperatureCoefficientmvperC;
//		double temperatureF = (9.0 / 5.0) * ambientTemperatureC + 32.0;
    mTemperature.setText(mTemperatureFormatter.format(voltagemv));
}
    

ソース一式はこちら
ADK_demo_modoki.zip

5. 動画