Android x ArduinoでLチカ
〜USB Host API編〜
http://bit.ly/LCHICA
自己紹介
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冊
今日のゴール
自作のAndroidアプリとArduinoを連携させて
Lチカさせる
できたらどうする?
自作アプリを紹介しながら
Lチカを披露してください
目的は?
Androidでハードウェアを叩くやりかたを知る
みんなの自作アプリを知る
例えばどういうAndroidアプリにする?
ボタンをタップするとLチカする
ゲームをクリアするとLチカする
Lチカだけってしょぼいけど
こんなアプリを作れるようになる
第一歩
FTDriverを使った事例紹介�~ フルカラーLED制御~ @juju_suuさん
構成
フルカラー
LEDパネル
Androidタブレット
動画再生
FTDriverを使った事例紹介�~シリアルサーボ制御~ akagawaさん、catsinさん
FTDriverを使った事例紹介�~たーとるくん~ @titoi2, @yishii, @ksksue
一般人(非プログラマ)�プラネタリウムソフト制御+天体自動導入装置
とにもかくにも
まずはLチカからはじめよう
実物はこんな感じにつなげます
用意するもの
これ重要
千石電商で¥300
USB A type ⇔ micro B type
変換コネクタ
※USB Host APIを使用する場合に必要
ソフトはAndroidとArduinoの2種類作る
Android
使用言語: Java
使用ライブラリ: FTDriver
(USB Host API)
イベントに応じて "1", "0" をArduinoへ送る
Arduino
使用言語: C++(Arduino独自)
使用ライブラリ: Serial
Androidから
"0"を受けるとLED ON
"1"を受けるとLED OFF
Androidのはなし
Androidとハードウェア
AndroidとArduinoをUSBで繋げると言えばADK!
と、ちまたでは流行ってる。本たくさんでてる。
ちょっと書いた
もちょっと書いた
うん、でも今日はADKではなくて
USB Host APIの話なんだ
※ADK本でUSB Host APIのことしか書いてないです
ADKとUSB Host APIでは何がちがう?
ADKとUSB Host APIの違い
ハードウェア編
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ホスト
ADKとUSB Host API
給電方向が違う
ADK
USB Host API
A port
A port
B port
B port
ADK対応機器
USB対応機器
バッテリー
バッテリー
※USB規格でホスト側から電源供給と定められている
USBホスト
USBホスト
ADKとUSB Host APIの違い
ソフトウェア編
ADKとUSB Host API
ソフトウェア構成の違い
ADK
ユーザアプリ
USB Host API
ユーザアプリ
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
ADK
USB Host API
独自プロトコルでGoogleがサポート
プロトコルはユーザ側で実装
(汎用的なプロトコルを実装できる)
ADKとUSB Host API
開発効率の違い
ADK
ユーザアプリ
USB Host API
ユーザアプリ
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
開発者の負担でかいヨ
#デスマ
楽チン
ADK
USB Host API
ADK
要するにUSB Host APIめんどくさい
ADK
ユーザアプリ
USB Host API
ユーザアプリ
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
USB Host API
ここがめんどくさい
ADK
だからこうした
ADK
ユーザアプリ
USB Host API
ユーザアプリ
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
USB Host API
ここを
ADK
ADK
ユーザアプリ
USB Host API
FTDriver
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
USB Host API
こう!
ユーザアプリ
ADK
もういちど
ここを
ADK
ユーザアプリ
USB Host API
ユーザアプリ
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
USB Host API
ここを
ADK
こう!
ADK
ユーザアプリ
USB Host API
FTDriver
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
USB Host API
こう!
ユーザアプリ
ADK
ADK
ユーザアプリ
USB Host API
FTDriver
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
USB Host API
これ
オープンソース
ユーザアプリ
ADK
ADK
ユーザアプリ
USB Host API
FTDriver
USBドライバ
通信プロトコル
データバッファ
USBドライバ
通信プロトコル
データバッファ
ADK
USB Host API
\ FTDriver /
(ドヤァ
ユーザアプリ
ADK
FTDriver
・USBシリアル通信用Androidライブラリ
・コンセプト:Arduinoライクなシンプルなインタフェースでシリアル通信を
・シリアル通信:正確にはRS232C/UARTと呼ばれたりする。世の中にあるほとんどのマイコンと通信できる。
・対応プロトコル: FTDI, CDC-ACM
・Open source
https://github.com/ksksue/FTDriver
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の主なインタフェース比較
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() : 終了処理
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シリアルモジュール
Arduinoのはなし
Arduino
2500円
Arduino UNO R3
さまざまなセンサ/アクチュエータと
カンタンに組み合わせることができる
Arduino IDE
・Arduino開発環境� Win/Mac/Linux
・言語:C++
・かんたんにマイコン
プログラミングができる
・トラ技「ズルい」
Arduinoプログラミングの基本
・setup()関数内で初期化処理を書く
・loop()関数内で通常処理を書く
・電源を切るまで基本的には終了しない
(組込み機器全般に言えること)
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に直結されている
スケッチができたら
Arduinoへアップロード
PCとArduinoをUSBでつなげて
アップロードボタンをポチでおk
Android x Arduino
基本的な流れ
Begin
通信はじめ
Read
受信
Write
送信
End
通信おわり
Androidの処理
Begin
通信はじめ
Read
受信
Write
送信
End
通信おわり
Arduinoの処理
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の処理
Arduino側コード例
Begin
通信はじめ
Read
受信
Write
送信
End
通信おわり
Arduinoの処理
void setup()
{
Serial.begin(9600);
}
if(Serial.available() > 0){
rbuf = Serial.read();
}
if(/* なにかのトリガ */){
Serial.write("hogehoge");
}
まずつなげる
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
電源ON!
Arduinoのsetup()が走る
setup()内でSerial.begin(9600)
Android
まだアプリは起動していない
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
まずつなげる2
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
loop()内をまわりつづける
Android
まだアプリは起動していない
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
Androidアプリを起動
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
loop()内をまわりつづける
Android
アプリを起動
onCreate内でbegin()
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
イベントまち
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
イベントまち
loop()内をまわりつづける
Android
イベントまち
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
Androidからwriteしてみる
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
loop()内をまわりつづける
Android
write()イベント発生
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
例えばボタンタップしてみる
Androidからwriteしてみる2
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
read()
Android
write()イベント発生
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
データ転送
イベントまちにもどる
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
イベントまち
Android
イベントまち
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
Arduino側からwriteイベントを発生させる
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
write()
Android
イベントまち
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
Arduino側からwriteイベントを発生させる2
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
write()
Android
read()
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
データ転送
イベントまちにもどる
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
イベントまち
Android
イベントまち
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
アプリを終了させる
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
イベントまち
Android
end()
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
アプリ終了
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
イベントまち
Android
・・・
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
ArduinoのUSBを引っこ抜く
begin()
begin()
read()
write()
end()
Androidの処理
read()
write()
end()
Arduinoの処理
Arduino
終了
Android
・・・
setup()
loop()
loop()
onCreate()
イベント
イベント
onDestroy()
実装する
手を動かしてみる
各自もくもく
チューター数名まわってサポートします
FTDriver導入方法1/3
FTDriver導入方法 2/3
FTDriver導入方法 3/3
チュートリアルから触ってみることをオススメ
・FTDriverのzip内にチュートリアルプロジェクト作ってあります
・begin/read/write/endのイベントをボタンで操作
・コードサンプル、動きを見るのに使ってください
Arduino