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