20130119 adkハンズオン発表資料
DESCRIPTION
20130119に開催した「ADKハンズオン」の発表資料です。 参考: http://www.zusaar.com/event/489057TRANSCRIPT
C-LIS
01.19, 2013 Copyright C-LIS CO., LTD. 20112
配布物の確認をお願いします
○ ブレッドボード○ LED (赤色)○ タクトスイッチ○ 抵抗器 1kΩ × 1○ 抵抗器 10kΩ × 2○ Cds○ サーミスタ
○ 配線材● 緑(長)× 1● 緑(長)× 2● 赤 × 2● 黒 × 2
作業中でも、線材や部品の不足に気づいたら、声をかけて下さい
2013/01/19
ADKハンズオン 2013
01.19, 2013 Copyright C-LIS CO., LTD. 20114
自己紹介 – 有山 圭二
○ 有限会社シーリスの代表
○ 普段はAndroidのアプリ開発とかしています
● たまにコントリビュートもしてるよ
○ 電子工作の経験は、約2ヶ月
01.19, 2013 Copyright C-LIS CO., LTD. 20115
今回は、
「発表ドリブン学習」です
01.19, 2013 Copyright C-LIS CO., LTD. 20116
発表ドリブン学習とは?
勉強会等での発表が決まってから、
ようやくその技術の勉強を本格的に始めること。
01.19, 2013 Copyright C-LIS CO., LTD. 20117
資料が出来上がったのは、午前3時頃でした
01.19, 2013 Copyright C-LIS CO., LTD. 20118
ADK(Accessory Development Kit) とは
○ Android端末にアクセサリを接続する規格AOA(Android Open Accessory)に準拠したデバイスや、対応アプリケーションを実装する開発キット
○ 2011年5月、Google I/Oで発表 (ADK 2011)○ Android端末とアクセサリはUSBで接続。Android側ではアク
セサリの認識と対応アプリケーションの立ち上げまでを担当○ Android端末とアクセサリの通信は、byte列の送受信で行う
01.19, 2013 Copyright C-LIS CO., LTD. 20119
ADK 2011の概要
○ オープンソースハードウェア”Arduino”に、Android端末を接続する「USBホスト機能」を付加したもの。
○ Androidとの通信をハンドリングするライブラリが配布されている。
01.19, 2013 Copyright C-LIS CO., LTD. 201110
Arduino とは
○ Arduino(アルドゥイーノ)は、AVRマイコン、入出力ポートを備えた基板、C言語風のArduino言語とそれの統合開発環境から構成されるシステム。 (Wikipediaより)
○ USB接続経由でプログラムの書き込みが出来る
01.19, 2013 Copyright C-LIS CO., LTD. 201111
“Arduino IDE”の取得とインストール
http://arduino.cc/en/Main/Software
01.19, 2013 Copyright C-LIS CO., LTD. 201112
シリアルドライバのインストール (Mac OS)
http://www.ftdichip.com/Drivers/VCP.htm
01.19, 2013 Copyright C-LIS CO., LTD. 201113
Arduino IDE の起動
01.19, 2013 Copyright C-LIS CO., LTD. 201114
はじめて の スケッチ
#define PIN_LED 13
void setup() {
pinMode(PIN_LED, OUTPUT);
}
void loop() {
digitalWrite(PIN_LED, HIGH);
}
adk-handson/led
01.19, 2013 Copyright C-LIS CO., LTD. 201115
Verify
01.19, 2013 Copyright C-LIS CO., LTD. 201116
Arduino へ 書き込み
01.19, 2013 Copyright C-LIS CO., LTD. 201117
Arduino MEGA ADK
PCへ接続 + 給電
Android端末へ
01.19, 2013 Copyright C-LIS CO., LTD. 201118
ArduinoをPCに接続
01.19, 2013 Copyright C-LIS CO., LTD. 201119
Arduinoを接続したポートを選択
01.19, 2013 Copyright C-LIS CO., LTD. 201120
Arduinoの種類を選択
01.19, 2013 Copyright C-LIS CO., LTD. 201121
書き込み
01.19, 2013 Copyright C-LIS CO., LTD. 201122
動作の確認方法は?
01.19, 2013 Copyright C-LIS CO., LTD. 201123
LED
短い方がGND
01.19, 2013 Copyright C-LIS CO., LTD. 201124
LEDを挿す
短い方がGND
01.19, 2013 Copyright C-LIS CO., LTD. 201125
LEDを点滅
#define PIN_LED 13
void setup() {
pinMode(PIN_LED, OUTPUT);
}
void loop() {
digitalWrite(PIN_LED, HIGH);
delay(1000);
digitalWrite(PIN_LED, LOW);
delay(1000);
}
adk-handson/blink_led
01.19, 2013 Copyright C-LIS CO., LTD. 201126
01.19, 2013 Copyright C-LIS CO., LTD. 201127
何を作っていたのか
01.19, 2013 Copyright C-LIS CO., LTD. 201128
電子回路
01.19, 2013 Copyright C-LIS CO., LTD. 201129
LEDが壊れるかも
01.19, 2013 Copyright C-LIS CO., LTD. 201130
抵抗を入れる
01.19, 2013 Copyright C-LIS CO., LTD. 201131
どこに?
01.19, 2013 Copyright C-LIS CO., LTD. 201132
Arduino上には、ほとんど部品が置けない
01.19, 2013 Copyright C-LIS CO., LTD. 201133
回路は外に作る
01.19, 2013 Copyright C-LIS CO., LTD. 201134
ブレッドボード
01.19, 2013 Copyright C-LIS CO., LTD. 201135
ブレッドボード (配線)
01.19, 2013 Copyright C-LIS CO., LTD. 201136
ブレッドボードに配線
01.19, 2013 Copyright C-LIS CO., LTD. 201137
ブレッドボードに配線
01.19, 2013 Copyright C-LIS CO., LTD. 201138
ブレッドボードに配線
13番ピンへ
GNDへ
01.19, 2013 Copyright C-LIS CO., LTD. 201139
LEDをゆっくりと点滅
#define PIN_LED 13
void setup() {
pinMode(PIN_LED, OUTPUT);
}
int light = 0;
int p = 1;
void loop() {
light += p;
if (light == 0 || light == 255) {
p *= -1;
}
delay(10);
analogWrite(PIN_LED, light);
} adk-handson/illuminate_led
01.19, 2013 Copyright C-LIS CO., LTD. 201140
オシロスコープで観察
01.19, 2013 Copyright C-LIS CO., LTD. 201141
PWM (Pulse Wave Modulation)Width
01.19, 2013 Copyright C-LIS CO., LTD. 201142
スイッチ - タクトスイッチ
01.19, 2013 Copyright C-LIS CO., LTD. 201143
スイッチでLEDをON/OFFする
01.19, 2013 Copyright C-LIS CO., LTD. 201144
SWTCH ILLUMINATE LED
#define PIN_LED 13
#define PIN_SWITCH 8
#define ON 1
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_SWITCH, INPUT);
}
boolean on = false;
int prevState = 0;
int light = 0;
int p = 1;
adk-handson/switch_illuminate_led
01.19, 2013 Copyright C-LIS CO., LTD. 201145
void loop() {
int state = digitalRead(PIN_SWITCH);
if (state == ON && state != prevState) {
on = !on;
light = 0;
p = 1;
Serial.println("State change.");
}
prevState = state;
if (on == true) {
light += p;
if (light == 0 || light == 255) {
p *= -1;
}
delay(10);
}
analogWrite(PIN_LED, light);
}
adk-handson/switch_illuminate_led
01.19, 2013 Copyright C-LIS CO., LTD. 201146
上手く動かない場合 - シリアルモニタ
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_SWITCH, INPUT);
}
void loop() {
int state = digitalRead(PIN_SWITCH);
if (state == ON && state != prevState) {
on = !on;
light = 0;
p = 1;
Serial.println("State change.");
}
// 省略
01.19, 2013 Copyright C-LIS CO., LTD. 201147
シリアルモニタの表示
01.19, 2013 Copyright C-LIS CO., LTD. 201148
シリアルモニタ
01.19, 2013 Copyright C-LIS CO., LTD. 201149
Cds - 光伝導体素子
01.19, 2013 Copyright C-LIS CO., LTD. 201150
明るさに応じてLEDをON/OFFする
01.19, 2013 Copyright C-LIS CO., LTD. 201151
暗くなると光るLED
#define PIN_LED 13
#define PIN_CDS A0
#define ON 1
#define LIGHT_THRESHOLD 700
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_CDS, INPUT);
}
boolean on = false;
int prevState = 0;
int light = 0;
int p = 1;
adk-handson/cds_illuminate_led
01.19, 2013 Copyright C-LIS CO., LTD. 201152
void loop() {
int state = analogRead(PIN_CDS);
Serial.println(state);
if (state > LIGHT_THRESHOLD && on
|| state < LIGHT_THRESHOLD && !on) {
on = !on;
light = 0;
p = 1;
}
if (on) {
light += p;
if (light == 0 || light == 255) {
p *= -1;
}
delay(10);
}
analogWrite(PIN_LED, light);
}
adk-handson/cds_illuminate_led
01.19, 2013 Copyright C-LIS CO., LTD. 201153
ADK 編
01.19, 2013 Copyright C-LIS CO., LTD. 201154
01.19, 2013 Copyright C-LIS CO., LTD. 201155
ADK 2011パッケージのダウンロード
https://dl-ssl.google.com/android/adk/adk_release_20120606.zip
http://developer.android.com/tools/adk/adk.html
01.19, 2013 Copyright C-LIS CO., LTD. 201156
ADK 2011ライブラリをコピー
arduino_libs以下を、Documents/Arduino/libraries にコピー
01.19, 2013 Copyright C-LIS CO., LTD. 201157
Arduino スケッチ - ADKへの対応
#include <usb.h>#include <AndroidAccessory.h>
#define PIN_LED 13
AndroidAccessory acc("C-LIS CO., LTD.", "ADK Test", "This is an ADK test.", "1.0.0", "http://www.c-lis.co.jp", "1234567890");
void setup() {
pinMode(PIN_LED, OUTPUT); acc.powerOn();}
void loop() { if (acc.isConnected()) {
digitalWrite(PIN_LED, HIGH); } else { digitalWrite(PIN_LED, LOW); }}
adk-handson/adk_led
01.19, 2013 Copyright C-LIS CO., LTD. 201158
Android端末との接続
01.19, 2013 Copyright C-LIS CO., LTD. 201159
Androidプロジェクトの作成
01.19, 2013 Copyright C-LIS CO., LTD. 201160
usb.jarをbuild pathに追加
[SDKをインストールしたディレクトリ]/add-ons/addon-google_apis-google-10/libs
01.19, 2013 Copyright C-LIS CO., LTD. 201161
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.co.c_lis.adktest" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17" />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:launchMode="singleInstance" android:theme="@style/AppTheme" > <uses-library android:name="com.android.future.usb.accessory" />
<activity android:name="jp.co.c_lis.adktest.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /> </intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/accessory_filter" /> </activity> </application>
</manifest>
AndroidManifest.xml
01.19, 2013 Copyright C-LIS CO., LTD. 201162
<?xml version="1.0" encoding="utf-8"?><resources> <usb-accessory manufacturer="C-LIS CO., LTD." model="ADK Test" version="1.0.0" /></resources>
res/xml/accessory_filter.xml
01.19, 2013 Copyright C-LIS CO., LTD. 201163
Android端末との接続
01.19, 2013 Copyright C-LIS CO., LTD. 201164
AndroidからArduinoの接続を処理する
01.19, 2013 Copyright C-LIS CO., LTD. 201165
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" >
<ToggleButton android:id="@+id/toggle_led" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textOff="LED OFF" android:textOn="LED ON" />
</RelativeLayout>
res/layout/activity_main.xml
01.19, 2013 Copyright C-LIS CO., LTD. 201166
import com.android.future.usb.UsbAccessory;import com.android.future.usb.UsbManager;// 以下、import 省略
public class MainActivity extends Activity { private static final String LOG_TAG = "AdkTest";
private static final String ACTION_USB_PERMISSION = "jp.co.c_lis.adktest.action.USB_PERMISSION";
private UsbManager mUsbManager = null; private PendingIntent mPermissionIntent = null; private boolean mPermissionRequestPending = false;
private UsbAccessory mAccessory = null;
private ToggleButton mLed = null;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mLed = (ToggleButton) findViewById(R.id.toggle_led);
mUsbManager = UsbManager.getInstance(this); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent( ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED); registerReceiver(mUsbReceiver, filter);
// 現在は非推奨。Fragment#setRetainInstance(boolean)を使う Object obj = getLastNonConfigurationInstance(); if (obj != null) { mAccessory = (UsbAccessory) obj; openAccessory(mAccessory); } }
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201167
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbAccessory accessory = UsbManager.getAccessory(intent); if (intent.getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED, false)) { openAccessory(accessory); } else { Log.d(LOG_TAG, "permission denied for accessory " + accessory); } mPermissionRequestPending = false; } } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) { UsbAccessory accessory = UsbManager.getAccessory(intent); if (accessory != null && accessory.equals(mAccessory)) { closeAccessory(); } } } };
MainActivity.java
1.19, 2013 Copyright C-LIS CO., LTD. 201168
@Override public void onResume() { super.onResume();
if (mInputStream != null && mOutputStream != null) { return; }
UsbAccessory[] accessories = mUsbManager.getAccessoryList(); UsbAccessory accessory = (accessories == null ? null : accessories[0]); if (accessory != null) { if (mUsbManager.hasPermission(accessory)) { openAccessory(accessory); } else { synchronized (mUsbReceiver) { if (!mPermissionRequestPending) { mUsbManager.requestPermission(accessory, mPermissionIntent); mPermissionRequestPending = true; } } } } else { Log.d(LOG_TAG, "mAccessory is null"); } }
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201169
private ParcelFileDescriptor mFileDescriptor = null; private FileInputStream mInputStream = null; private FileOutputStream mOutputStream = null;
private void openAccessory(UsbAccessory accessory) { mFileDescriptor = mUsbManager.openAccessory(accessory); if (mFileDescriptor != null) { mAccessory = accessory; FileDescriptor fd = mFileDescriptor.getFileDescriptor(); mInputStream = new FileInputStream(fd); mOutputStream = new FileOutputStream(fd); Log.d(LOG_TAG, "accessory opened"); enableControls(true); } else { Log.d(LOG_TAG, "accessory open fail"); } }
private void closeAccessory() { enableControls(false);
try { if (mFileDescriptor != null) { mFileDescriptor.close(); } } catch (IOException e) { } finally { mFileDescriptor = null; mAccessory = null; } Log.d(LOG_TAG, "accessory closed"); }
MainActivity.java
1.19, 2013 Copyright C-LIS CO., LTD. 201170
@Override public void onPause() { super.onPause(); closeAccessory(); }
@Override public void onDestroy() { unregisterReceiver(mUsbReceiver); super.onDestroy(); }
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201171
protected void enableControls(boolean enable) { mLed.setEnabled(enable); }
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201172
01.19, 2013 Copyright C-LIS CO., LTD. 201173
AndroidからArduinoを操作(データを送信)
01.19, 2013 Copyright C-LIS CO., LTD. 201174
public class MainActivity extends Activity implements OnCheckedChangeListener {
// 省略
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mLed = (ToggleButton) findViewById(R.id.toggle_led); mLed.setOnCheckedChangeListener(this);
// 省略 }
private void setLed(boolean on) { try { mOutputStream.write(on ? 0x1 : 0x0); mOutputStream.flush(); } catch (IOException e) { Log.e(LOG_TAG, "IOException", e); } }
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { switch (buttonView.getId()) { case R.id.toggle_led: setLed(isChecked); break; } }}
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201175
Arduino - Android端末からの情報を受信
void loop() { byte receive_msg[1]; if (acc.isConnected()) {
int len = acc.read(receive_msg, sizeof(receive_msg), 1);
if (len > 0) {
if(receive_msg[0] == 1) {
digitalWrite(PIN_LED, HIGH); } else { digitalWrite(PIN_LED, LOW); } } }}
adk-handson/adk_led
01.19, 2013 Copyright C-LIS CO., LTD. 201176
ArduinoからAndroidにデータ送信(データの受信)
01.19, 2013 Copyright C-LIS CO., LTD. 201177
ADK CDS ILLUMINATE LED
adk-handson/cds_illuminate_led
#include <Usb.h>
#include <AndroidAccessory.h>
#define PIN_LED 13#define PIN_CDS A0
#define ON 1#define LIGHT_THRESHOLD 700
AndroidAccessory acc("C-LIS CO., LTD.", "ADK Test",
"This is an ADK test?", "1.0.0", "http://www.c-lis.co.jp", "1234567890");
void setup() { Serial.begin(115200); pinMode(PIN_LED, OUTPUT); pinMode(PIN_CDS, INPUT); acc.powerOn();
}
01.19, 2013 Copyright C-LIS CO., LTD. 201178
boolean init_flg = false;boolean on = false;int light = 0;int p = 1;
void loop() { int state = analogRead(PIN_CDS); if (acc.isConnected()) { if (!init_flg) {
analogWrite(PIN_LED, LOW); init_flg = true; } byte receive_msg[1]; byte send_msg[1]; send_msg[0] = state / 4; acc.write(send_msg, sizeof(send_msg)); int len = acc.read(receive_msg, sizeof(receive_msg), 1); if (len > 0) {
if(receive_msg[0] == 1) { analogWrite(PIN_LED, 255); } else { analogWrite(PIN_LED, 0); } } } else { init_flg = false; // 以下、cds_illuminate_led の重複 }
}
adk-handson/adk_cds_illuminate_led
01.19, 2013 Copyright C-LIS CO., LTD. 201179
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" >
<ToggleButton android:id="@+id/toggle_led" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textOff="LED OFF" android:textOn="LED ON" />
<TextView android:id="@+id/tv_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/toggle_led" android:layout_centerHorizontal="true" />
</RelativeLayout>
res/layout/activity_main.xml
01.19, 2013 Copyright C-LIS CO., LTD. 201180
public class MainActivity extends Activity implements OnCheckedChangeListener {
// 省略
private ToggleButton mLed = null; private TextView mLabel = null;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
mLed = (ToggleButton) findViewById(R.id.toggle_led); mLed.setEnabled(false); mLed.setOnCheckedChangeListener(this);
mLabel = (TextView) findViewById(R.id.tv_label);
// 省略 }
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201181
private ParcelFileDescriptor mFileDescriptor; private FileInputStream mInputStream; private FileOutputStream mOutputStream;
private void openAccessory(UsbAccessory accessory) { mFileDescriptor = mUsbManager.openAccessory(accessory); if (mFileDescriptor != null) { mAccessory = accessory; FileDescriptor fd = mFileDescriptor.getFileDescriptor(); mInputStream = new FileInputStream(fd); mOutputStream = new FileOutputStream(fd); Thread thread = new Thread(mDataReceiveRunnable); thread.start(); Log.d(LOG_TAG, "accessory opened"); enableControls(true); } else { Log.d(LOG_TAG, "accessory open fail"); } }
private void closeAccessory() { enableControls(false);
try { if (mFileDescriptor != null) { mFileDescriptor.close(); } } catch (IOException e) { } finally { mInputStream = null; mOutputStream = null; mFileDescriptor = null; mAccessory = null; } Log.d(LOG_TAG, "accessory closed"); }
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201182
private int mCdsValue = 0; private final Runnable mDataReceiveRunnable = new Runnable() { public void run() { int len = 0; byte[] buff = new byte[1];
try { while (len >= 0) { len = mInputStream.read(buff); mCdsValue = ((int) buff[0] & 0xff); mHandler.sendEmptyMessage(HANDLE_RECEIVE_MESSAGE);
synchronized (this) { try { wait(1000 / 8); } catch (InterruptedException e) { } } } } catch (IOException e) { Log.e(LOG_TAG, "IOException", e); } } };
private static final int HANDLE_RECEIVE_MESSAGE = 0x01; private final Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case HANDLE_RECEIVE_MESSAGE: mLabel.setText("明るさ: " + mCdsValue); break; } } };
MainActivity.java
01.19, 2013 Copyright C-LIS CO., LTD. 201183
01.19, 2013 Copyright C-LIS CO., LTD. 201184
ADK開発の取り扱い
○ ハードウエアの設計・組み立て○ Arduino ←→ Android データ通信プロトコル設計○ Arduinoスケッチの実装○ Androidアプリの実装
01.19, 2013 Copyright C-LIS CO., LTD. 201185
参考書籍
http://www.amazon.co.jp/Arduino%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86-Make-PROJECTS-Massimo-Banzi/dp/4873113989
Arduinoをはじめよう今回のハンズオンのArduino編は、ほとんどこの書籍をなぞったもの。
後半がArduino言語のリファレンスになっているので、中級者以降にもお薦め。
ADKの話題は無し。
01.19, 2013 Copyright C-LIS CO., LTD. 201186
参考書籍
http://www.amazon.co.jp/Android-%E7%B5%84%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-Smart-Mobile-Developer/dp/4798125938
Android ADK 組込みプログラミング完全ガイド
深く知りたいならこの一冊。432pのボリュームで、基礎から丁寧に解説。
01.19, 2013 Copyright C-LIS CO., LTD. 201187
質疑応答
本資料の内容の一部は、Googleが作成、提供しているコンテンツを複製したもので、クリエイティブコモンズの表示 2.5 ライセンスに記載の条件に従って使用しています。
本資料は、有限会社シーリスの著作物であり、クリエイティブコモンズの表示-非営利-継承 3.0 Unported ライセンスの元で公開しています。
01.19, 2013 Copyright C-LIS CO., LTD. 201188
ご清聴ありがとうございました。
Arduinoスケッチ+Androidアプリのソースコードは、下記で配布しています
https://github.com/keiji/adk-handson