1 of 70

Android x ArduinoでLチカ

〜USB Host API編〜

2 of 70

http://bit.ly/LCHICA

3 of 70

自己紹介

twitter @ksksue

web page : Geekleboard http://ksksue.com/wiki/

Androidアプリ

USB Serial Monitor Lite

シリアルモニタ

AnArduino Writer

Arduinoライタ

いずれもUSB Host APIを使用

オープンソース(github)

○ FTDriver(FTDI, CDC-ACM対応シリアルドライバ)

Android書籍執筆 2012年 共著3冊

4 of 70

今日のゴール

自作のAndroidアプリとArduinoを連携させて

Lチカさせる

5 of 70

できたらどうする?

自作アプリを紹介しながら

Lチカを披露してください

6 of 70

目的は?

Androidでハードウェアを叩くやりかたを知る

みんなの自作アプリを知る

7 of 70

例えばどういうAndroidアプリにする?

ボタンをタップするとLチカする

ゲームをクリアするとLチカする

8 of 70

Lチカだけってしょぼいけど

こんなアプリを作れるようになる

第一歩

9 of 70

FTDriverを使った事例紹介�~ フルカラーLED制御~ @juju_suuさん

構成

フルカラー

LEDパネル

Androidタブレット

動画再生

10 of 70

FTDriverを使った事例紹介�~シリアルサーボ制御~ akagawaさん、catsinさん

11 of 70

FTDriverを使った事例紹介�~たーとるくん~ @titoi2, @yishii, @ksksue

12 of 70

一般人(非プログラマ)�プラネタリウムソフト制御+天体自動導入装置

13 of 70

とにもかくにも

まずはLチカからはじめよう

14 of 70

実物はこんな感じにつなげます

15 of 70

用意するもの

  • Android本体
  • Arduino本体
  • USBケーブル
  • USB A type ⇔ micro B type�変換コネクタ

16 of 70

これ重要

  • Android本体
  • Arduino本体
  • USBケーブル
  • USB A type ⇔ micro B type�変換コネクタ

千石電商で¥300

USB A type ⇔ micro B type

変換コネクタ

※USB Host APIを使用する場合に必要

17 of 70

ソフトはAndroidとArduinoの2種類作る

Android

使用言語: Java

使用ライブラリ: FTDriver

(USB Host API)

イベントに応じて "1", "0" をArduinoへ送る

Arduino

使用言語: C++(Arduino独自)

使用ライブラリ: Serial

Androidから

"0"を受けるとLED ON

"1"を受けるとLED OFF

18 of 70

Androidのはなし

19 of 70

Androidとハードウェア

AndroidとArduinoをUSBで繋げると言えばADK!

と、ちまたでは流行ってる。本たくさんでてる。

ちょっと書いた

もちょっと書いた

20 of 70

うん、でも今日はADKではなくて

USB Host APIの話なんだ

※ADK本でUSB Host APIのことしか書いてないです

21 of 70

ADKとUSB Host APIでは何がちがう?

22 of 70

ADKとUSB Host APIの違い

ハードウェア編

23 of 70

ADKとUSB Host API

USB接続方向が違う

ADK

USB Host API

A port

A port

B port

B port

A port

B port

ADK対応機器

USB対応機器

USBホスト

USBホスト

24 of 70

ADKとUSB Host API

給電方向が違う

ADK

USB Host API

A port

A port

B port

B port

ADK対応機器

USB対応機器

バッテリー

バッテリー

※USB規格でホスト側から電源供給と定められている

USBホスト

USBホスト

25 of 70

ADKとUSB Host APIの違い

ソフトウェア編

26 of 70

ADKとUSB Host API

ソフトウェア構成の違い

ADK

ユーザアプリ

USB Host API

ユーザアプリ

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

ADK

USB Host API

独自プロトコルでGoogleがサポート

プロトコルはユーザ側で実装

(汎用的なプロトコルを実装できる)

27 of 70

ADKとUSB Host API

開発効率の違い

ADK

ユーザアプリ

USB Host API

ユーザアプリ

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

開発者の負担でかいヨ

#デスマ

楽チン

ADK

USB Host API

ADK

28 of 70

要するにUSB Host APIめんどくさい

ADK

ユーザアプリ

USB Host API

ユーザアプリ

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

USB Host API

ここがめんどくさい

ADK

29 of 70

だからこうした

ADK

ユーザアプリ

USB Host API

ユーザアプリ

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

USB Host API

ここを

ADK

30 of 70

ADK

ユーザアプリ

USB Host API

FTDriver

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

USB Host API

こう!

ユーザアプリ

ADK

31 of 70

もういちど

32 of 70

ここを

ADK

ユーザアプリ

USB Host API

ユーザアプリ

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

USB Host API

ここを

ADK

33 of 70

こう!

ADK

ユーザアプリ

USB Host API

FTDriver

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

USB Host API

こう!

ユーザアプリ

ADK

34 of 70

ADK

ユーザアプリ

USB Host API

FTDriver

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

USB Host API

これ

オープンソース

ユーザアプリ

ADK

35 of 70

ADK

ユーザアプリ

USB Host API

FTDriver

USBドライバ

通信プロトコル

データバッファ

USBドライバ

通信プロトコル

データバッファ

ADK

USB Host API

\ FTDriver /

(ドヤァ

ユーザアプリ

ADK

36 of 70

FTDriver

・USBシリアル通信用Androidライブラリ

・コンセプト:Arduinoライクなシンプルなインタフェースでシリアル通信を

・シリアル通信:正確にはRS232C/UARTと呼ばれたりする。世の中にあるほとんどのマイコンと通信できる。

・対応プロトコル: FTDI, CDC-ACM

・Open source

https://github.com/ksksue/FTDriver

37 of 70

Arduinoライクなシンプルなインタフェース

Arduino

FTDriver(Android)

Serial.begin(9600);

Serial.begin(9600);

Serial.end();

Serial.end();

readByte = Serial.read();

Serial.read(readBuf);

Serial.write(writeBuf);

Serial.write(writeBuf, length);

ArduinoとFTDriverの主なインタフェース比較

38 of 70

FTDriverの主なメソッド

boolean begin(int baudrate) : 開始処理

baudrate : 通信レート

戻り値 : true:コネクション成功, false : 失敗

int read(byte[] buf) : 受信処理

buf : 受信したbyte配列

戻り値 : 受信したbyte数

int write(byte[] buf, int length) : 送信処理

buf : 送信するbyte配列

length : 送信byte数

戻り値 : 送信に成功したbyte数

void end() : 終了処理

39 of 70

FTDriver 対応状況(2013/2/9現在)

機種

OK/NG/?

Arduino Due

OK

Arduino UNO

OK

Arduino MEGA

OK

Arduino ADK

OK

Arduino Leonard

NG

mbed NXP LPC11U24

?

mbed NXP LPC1768

OK

NXP LPC1769

OK

GR-SAKURA

OK

PSoC

?

Arduino Duemilanove

OK

Harpy nano

OK

FTDI

・FT232RL

・FT232H

・FT2232C/D/HL

・FT4232HL

・FT230X

ラトックシステム

・REX-USB60F/MI

秋月FT232RL

USBシリアルモジュール

40 of 70

Arduinoのはなし

41 of 70

Arduino

  • 安価なマイコン搭載ボード

2500円

Arduino UNO R3

42 of 70

さまざまなセンサ/アクチュエータと

カンタンに組み合わせることができる

43 of 70

Arduino IDE

・Arduino開発環境� Win/Mac/Linux

・言語:C++

・かんたんにマイコン

プログラミングができる

・トラ技「ズルい」

44 of 70

Arduinoプログラミングの基本

・setup()関数内で初期化処理を書く

・loop()関数内で通常処理を書く

・電源を切るまで基本的には終了しない

(組込み機器全般に言えること)

45 of 70

ArduinoだけでLチカさせるスケッチ

void setup() {

pinMode(13, OUTPUT);

}

void loop() {

digitalWrite(13, HIGH); // set the LED on

delay(100); // wait for a second

digitalWrite(13, LOW); // set the LED off

delay(100); // wait for a second

}

これだけ

※13ピンはArduino付属のLEDに直結されている

46 of 70

スケッチができたら

Arduinoへアップロード

PCとArduinoをUSBでつなげて

アップロードボタンをポチでおk

47 of 70

Android x Arduino

48 of 70

基本的な流れ

Begin

通信はじめ

Read

受信

Write

送信

End

通信おわり

Androidの処理

Begin

通信はじめ

Read

受信

Write

送信

End

通信おわり

Arduinoの処理

49 of 70

Android側コード例

if(mSerial.begin(FTDriver.BAUD9600)) {

/* オープンが成功したときの処理 */

} else {

/* オープンが失敗したときの処理 */

}

/* 一度に最大4096byte受信可能 */

byte[] rbuf = new byte[4096];

/* 受信したバイト数が戻り値 */

len = mSerial.read(rbuf);

String wbuf = "FTDriver Test.";

/* Stringをbyte配列に変換して渡す */

mSerial.write(wbuf.getBytes(), wbuf.length);

mSerial.end();

Begin

通信はじめ

Read

受信

Write

送信

End

通信おわり

onCreate()

イベント

イベント

onDestroy()

Androidの処理

50 of 70

Arduino側コード例

Begin

通信はじめ

Read

受信

Write

送信

End

通信おわり

Arduinoの処理

void setup()

{

Serial.begin(9600);

}

if(Serial.available() > 0){

rbuf = Serial.read();

}

if(/* なにかのトリガ */){

Serial.write("hogehoge");

}

51 of 70

まずつなげる

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

電源ON!

Arduinoのsetup()が走る

setup()内でSerial.begin(9600)

Android

まだアプリは起動していない

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

52 of 70

まずつなげる2

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

loop()内をまわりつづける

Android

まだアプリは起動していない

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

53 of 70

Androidアプリを起動

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

loop()内をまわりつづける

Android

アプリを起動

onCreate内でbegin()

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

54 of 70

イベントまち

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

イベントまち

loop()内をまわりつづける

Android

イベントまち

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

55 of 70

Androidからwriteしてみる

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

loop()内をまわりつづける

Android

write()イベント発生

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

例えばボタンタップしてみる

56 of 70

Androidからwriteしてみる2

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

read()

Android

write()イベント発生

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

データ転送

57 of 70

イベントまちにもどる

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

イベントまち

Android

イベントまち

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

58 of 70

Arduino側からwriteイベントを発生させる

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

write()

Android

イベントまち

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

59 of 70

Arduino側からwriteイベントを発生させる2

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

write()

Android

read()

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

データ転送

60 of 70

イベントまちにもどる

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

イベントまち

Android

イベントまち

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

61 of 70

アプリを終了させる

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

イベントまち

Android

end()

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

62 of 70

アプリ終了

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

イベントまち

Android

・・・

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

63 of 70

ArduinoのUSBを引っこ抜く

begin()

begin()

read()

write()

end()

Androidの処理

read()

write()

end()

Arduinoの処理

Arduino

終了

Android

・・・

setup()

loop()

loop()

onCreate()

イベント

イベント

onDestroy()

64 of 70

実装する

65 of 70

手を動かしてみる

各自もくもく

チューター数名まわってサポートします

66 of 70

FTDriver導入方法1/3

  • Githubでソースコードダウンロード

https://github.com/ksksue/FTDriver

67 of 70

FTDriver導入方法 2/3

  • FTDriverディレクトリをEclipseインポート
  • FTDriverプロジェクトのプロパティで「 is Library」にチェックされているか確認

68 of 70

FTDriver導入方法 3/3

  • 自分のプロジェクトのプロパティでFTDriverAddボタンで登録。

69 of 70

チュートリアルから触ってみることをオススメ

・FTDriverのzip内にチュートリアルプロジェクト作ってあります

・begin/read/write/endのイベントをボタンで操作

・コードサンプル、動きを見るのに使ってください

70 of 70

Arduino

Arduino公式からIDEをダウンロードできます

http://www.arduino.cc/

Arduino持っていない人は貸し出します