Google I/O 2011で発表されたADK(Open Accessory Development Kit)がArduinoベースであることを知り、au版XOOMのAndroid3.1バージョンアップを待ってdemoボードを自作してみた。
配布されているサンプルを動作させるには、Arduinoといっても一般的なUnoとかDuemilanoveではなく、mega2560が必要。
ピンソケットは足の長いものが必要。
| 品名 | メーカ | 個数 | 備考 |
|---|---|---|---|
| Arduino Mega 2560 | Arduino | 1 | |
| USB Host Shield | Sparkfun | 1 | DEV-09947 |
| Arduino Mega用シールド基板 | サンハヤト | 1 | UB-ARD02WH |
| Arduino用シールド基板 | サンハヤト | 1 | UB-ARD01 |
| アナログジョイスティック | Top-Up Industry Corporation | 1 | 秋月電子P-04048 |
| 温度センサ(LM35DZ) | NS | 1 | 秋月電子I-00116 |
| 照度センサ(NJL7502L) | NS | 1 | 秋月電子I-02325 |
| タクトスイッチ | ??? | 3 | 秋月電子P-03648 |
| フルカラーLED(OSTA71A1D-A) | OptoSupply Limited | 3 | 秋月電子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 |
USBホストシールドをそのまま使うと、使い勝手が悪くなるので、mega用シールド基板とUSBホストシールドを合体して、上にそのままシールドを載せられるようにする。
![]() | ![]() |
| そのまま載せるとこんな感じ | 今回作るのはこんな感じ |
USBホストシールドがちょっと長いので、写真の部分で切断し、シールド基板と合体する。今回はたまたま手元にあったロープロファイルのピンヘッダで2枚の基板は結合させている。
配線は以下の通り。
| 信号 | USBホストシールド | megaシールド基板 | 備考 |
|---|---|---|---|
| RESET | 7 | D46 | |
| GPX | 8 | D49 | |
| INT | 9 | D48 | |
| SS | 10 | D53 | |
| MOSI | 11 | D51 | |
| MISO | 12 | D50 | |
| SCK | 13 | D52 | |
| GND | GND | GND | |
| VIN | VIN | VIN | Vccは接続しないので、外部電源必須 |
| RST | RST | RESET |
配線が済んだらピンソケットを半田付けして完成。
megaのシールドは、汎用GPIOが2x18のコネクタになっているが、2x20のピンソケットしか手に入らなかったため、2x2分をカットして使用。
念のため、USB_Host_Shield/examples/board_testで動作確認しておく。

オリジナルと全く同じ部品がを集めている訳ではないので、以下の差異がある。
| 機能 | オリジナル | もどき | 備考 |
|---|---|---|---|
| 温度センサ | MCP9700 | LM35DZ | 温度測定レンジの違いあり |
| ジョイスティック | I2C接続 | アナログ | アナログ入力 |
| リレー | 2個実装 | 未実装 | |
| タッチセンサー | 1個実装 | 未実装 |
普通のArduinoシールド基板を利用したため、アナログ入力が1つ不足。ブレッドボード用ワイヤで足している。(写真の緑色の線。これをA7に接続する)

ここから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