20130119 adkハンズオン発表資料

88
C - LIS

Upload: keiji-ariyama

Post on 17-May-2015

9.689 views

Category:

Documents


5 download

DESCRIPTION

20130119に開催した「ADKハンズオン」の発表資料です。 参考: http://www.zusaar.com/event/489057

TRANSCRIPT

Page 1: 20130119 adkハンズオン発表資料

C-LIS

Page 2: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 20112

配布物の確認をお願いします

○ ブレッドボード○ LED (赤色)○ タクトスイッチ○ 抵抗器 1kΩ × 1○ 抵抗器 10kΩ × 2○ Cds○ サーミスタ

○ 配線材● 緑(長)× 1● 緑(長)× 2● 赤 × 2● 黒 × 2

作業中でも、線材や部品の不足に気づいたら、声をかけて下さい

Page 3: 20130119 adkハンズオン発表資料

2013/01/19

ADKハンズオン 2013

Page 4: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 20114

自己紹介 – 有山 圭二

○ 有限会社シーリスの代表

○ 普段はAndroidのアプリ開発とかしています

● たまにコントリビュートもしてるよ

○ 電子工作の経験は、約2ヶ月

Page 5: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 20115

今回は、

「発表ドリブン学習」です

Page 6: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 20116

発表ドリブン学習とは?

勉強会等での発表が決まってから、

ようやくその技術の勉強を本格的に始めること。

Page 7: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 20117

資料が出来上がったのは、午前3時頃でした

Page 8: 20130119 adkハンズオン発表資料

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列の送受信で行う

Page 9: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 20119

ADK 2011の概要

○ オープンソースハードウェア”Arduino”に、Android端末を接続する「USBホスト機能」を付加したもの。

○ Androidとの通信をハンドリングするライブラリが配布されている。

Page 10: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201110

Arduino とは

○ Arduino(アルドゥイーノ)は、AVRマイコン、入出力ポートを備えた基板、C言語風のArduino言語とそれの統合開発環境から構成されるシステム。 (Wikipediaより)

○ USB接続経由でプログラムの書き込みが出来る

Page 11: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201111

“Arduino IDE”の取得とインストール

http://arduino.cc/en/Main/Software

Page 12: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201112

シリアルドライバのインストール (Mac OS)

http://www.ftdichip.com/Drivers/VCP.htm

Page 13: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201113

Arduino IDE の起動

Page 14: 20130119 adkハンズオン発表資料

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

Page 15: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201115

Verify

Page 16: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201116

Arduino へ 書き込み

Page 17: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201117

Arduino MEGA ADK

PCへ接続 + 給電

Android端末へ

Page 18: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201118

ArduinoをPCに接続

Page 19: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201119

Arduinoを接続したポートを選択

Page 20: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201120

Arduinoの種類を選択

Page 21: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201121

書き込み

Page 22: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201122

動作の確認方法は?

Page 23: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201123

LED

短い方がGND

Page 24: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201124

LEDを挿す

短い方がGND

Page 25: 20130119 adkハンズオン発表資料

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

Page 26: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201126

Page 27: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201127

何を作っていたのか

Page 28: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201128

電子回路

Page 29: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201129

LEDが壊れるかも

Page 30: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201130

抵抗を入れる

Page 31: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201131

どこに?

Page 32: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201132

Arduino上には、ほとんど部品が置けない

Page 33: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201133

回路は外に作る

Page 34: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201134

ブレッドボード

Page 35: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201135

ブレッドボード (配線)

Page 36: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201136

ブレッドボードに配線

Page 37: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201137

ブレッドボードに配線

Page 38: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201138

ブレッドボードに配線

13番ピンへ

GNDへ

Page 39: 20130119 adkハンズオン発表資料

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

Page 40: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201140

オシロスコープで観察

Page 41: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201141

PWM (Pulse Wave Modulation)Width

Page 42: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201142

スイッチ - タクトスイッチ

Page 43: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201143

スイッチでLEDをON/OFFする

Page 44: 20130119 adkハンズオン発表資料

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

Page 45: 20130119 adkハンズオン発表資料

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

Page 46: 20130119 adkハンズオン発表資料

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.");

}

// 省略

Page 47: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201147

シリアルモニタの表示

Page 48: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201148

シリアルモニタ

Page 49: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201149

Cds - 光伝導体素子

Page 50: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201150

明るさに応じてLEDをON/OFFする

Page 51: 20130119 adkハンズオン発表資料

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

Page 52: 20130119 adkハンズオン発表資料

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

Page 53: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201153

ADK 編

Page 54: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201154

Page 55: 20130119 adkハンズオン発表資料

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

Page 56: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201156

ADK 2011ライブラリをコピー

arduino_libs以下を、Documents/Arduino/libraries にコピー

Page 57: 20130119 adkハンズオン発表資料

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

Page 58: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201158

Android端末との接続

Page 59: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201159

Androidプロジェクトの作成

Page 60: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201160

usb.jarをbuild pathに追加

[SDKをインストールしたディレクトリ]/add-ons/addon-google_apis-google-10/libs

Page 61: 20130119 adkハンズオン発表資料

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

Page 62: 20130119 adkハンズオン発表資料

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

Page 63: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201163

Android端末との接続

Page 64: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201164

AndroidからArduinoの接続を処理する

Page 65: 20130119 adkハンズオン発表資料

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

Page 66: 20130119 adkハンズオン発表資料

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

Page 67: 20130119 adkハンズオン発表資料

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

Page 68: 20130119 adkハンズオン発表資料

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

Page 69: 20130119 adkハンズオン発表資料

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

Page 70: 20130119 adkハンズオン発表資料

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

Page 71: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201171

protected void enableControls(boolean enable) { mLed.setEnabled(enable); }

MainActivity.java

Page 72: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201172

Page 73: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201173

AndroidからArduinoを操作(データを送信)

Page 74: 20130119 adkハンズオン発表資料

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

Page 75: 20130119 adkハンズオン発表資料

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

Page 76: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201176

ArduinoからAndroidにデータ送信(データの受信)

Page 77: 20130119 adkハンズオン発表資料

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();

}

Page 78: 20130119 adkハンズオン発表資料

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

Page 79: 20130119 adkハンズオン発表資料

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

Page 80: 20130119 adkハンズオン発表資料

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

Page 81: 20130119 adkハンズオン発表資料

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

Page 82: 20130119 adkハンズオン発表資料

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

Page 83: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201183

Page 84: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201184

ADK開発の取り扱い

○ ハードウエアの設計・組み立て○ Arduino ←→ Android データ通信プロトコル設計○ Arduinoスケッチの実装○ Androidアプリの実装

Page 85: 20130119 adkハンズオン発表資料

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の話題は無し。

Page 86: 20130119 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のボリュームで、基礎から丁寧に解説。

Page 87: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201187

質疑応答

本資料の内容の一部は、Googleが作成、提供しているコンテンツを複製したもので、クリエイティブコモンズの表示 2.5 ライセンスに記載の条件に従って使用しています。

本資料は、有限会社シーリスの著作物であり、クリエイティブコモンズの表示-非営利-継承 3.0 Unported ライセンスの元で公開しています。

Page 88: 20130119 adkハンズオン発表資料

01.19, 2013 Copyright C-LIS CO., LTD. 201188

ご清聴ありがとうございました。

Arduinoスケッチ+Androidアプリのソースコードは、下記で配布しています

https://github.com/keiji/adk-handson