Upload
cat-sin
View
9.507
Download
11
Embed Size (px)
DESCRIPTION
Androidでロボットを動かそう・すまべん関西201003/catsin
Citation preview
2010-3-29
Androidでロボットを動かしてみよう
2010/03/27すまべん関西
catsin
2010-3-29
自己紹介
catsinです。
イロイロやってます。
小物機械好きの雑食系SE。
組込みものからシステムものまでなんでもやります。
WebPage
・Android関連
http://catsin-web.hp.infoseek.co.jp/Android/index.html
・その他
http://www.geocities.jp/c_a_t_s_i_n/
2010-3-29
お題目
Androidでロボットは動くのか?
Androidが話題になって以来たびたび話題が出るこのネタですが、
あまり見かけないのでやってみました。
と言ってもロボットOSとして搭載したわけではありません。
やってる人もいるようですが、リアルタイム系の制御に直接Androidを
使うメリットはあまりなくて、実際には制御系をリアルタイム系OS、
行動計画・アルゴリズム系とUI等アプリケーション系をAndroidで実装するのが
現実的な解かなぁと思います。
2010-3-29
とりあえずの目標
・市販品を無改造で使用することを目標にします。 (・・・・・改造するといろいろ面倒だから)
・カスタマイズが必要な箇所は自作ハードに絞り込みます。
ホントは他のネタにも簡単に使いまわせるように
手を入れる範囲を限定しておきました。
2010-3-29
材料
一覧
①Android端末
②Arduino+赤外線LED
③BTシリアルボード
④RoboQ
⑤Omnibot iSobot
2010-3-29
①Android端末
今回はhtc/docomo HT-03A(Android1.6)を前提とします。
(AndroidDevPhone1でも動作はします。)
今回唯一スマートフォンらしい箇所です。
2010-3-29
②Arduino
今回はArduino Duemilanove 328を使用します。
アマゾンで\3200くらいで売ってます。
http://www.amazon.co.jp
/Arduino-Duemilanove-328/dp/B001VG2RYO
/ref=sr_1_1
?ie=UTF8&s=electronics&qid=1266669553&sr=8-1
Arduinoに赤外線LEDを繋いで、Android-ロボット間の
インタフェース・ブリッジとして使用します。
・ATmega168を使用したマイコンボードです。
・デジタル/アナログI/Oが使用できます。
・PC上のIDE環境を使い、C言語で簡単にプログラムを作成し書き込み実行できます。
2010-3-29
③BTシリアルボード
bluetoothシリアルプロファイルとシリアルを繋ぎます。
以下のサイトで通販で購入できます。
合計\8000-程しましたが、技適認証済みです。
簡単!Bluetooth-シリアル(UART)モジュール [BT-MOD100R]」 ・BT-MOD100R http://park11.wakwak.com/~microtechnica/cgi-
bin/goodslist.cgi?mode=view_detail&this_num_genre=&this_num_goods=&genre_id=00000028&goods_id=00000001&sort=
・BT-MOD100R用 拡張アダプタ基板 http://park11.wakwak.com/~microtechnica/cgi-bin/goodslist.cgi?mode=view_detail&this_num_genre=2&this_num_goods=&genre_id=00000028&goods_id=00000002&sort=
2010-3-29
④RoboQ
今回動かすロボットその1、です。
・アマゾンだと\1300くらいで売ってます。
・超小型の二足歩行ロボットです。
・通常は赤外線を使ったコントローラで操作します。
http://www.amazon.co.jp/%E3%82%BF%E3%82%AB%E3%83%A9%E3%83%88%E3%83%9F%E3%83%BC-ROBO-Q-
RQ-04%E3%83%AC%E3%83%88%E3%83%AD%E3%82%B7%E3%83%AB%E3%83%90%E3%83%BC/dp/B001I903PO/ref=sr_1_1/378-1095935-5540239?ie=UTF8&s=toys&qid=1266668536&sr=8-1
2010-3-29
⑤Omnibot iSobot
今回動かすロボットその2、です。 ・アマゾンだと\22000くらいで売ってます。 ・サーボが17個載っていて二足歩行や両手足を使ったアクションが可能です。 ・通常は赤外線を使ったコントローラで操作します。
http://www.amazon.co.jp/%E3%82%BF%E3%82%AB%E3%83%A9%E3%83%88%E3%83%9F%E3%83%BC-Omnibot-17%E3%83%9F%E3%83%A5%E3%83%BC-i-SOBOT-BLACKversion/dp/B0012AVSBW/ref=sr_1_1?ie=UTF8&s=toys&qid=1266668682&sr=1-1
2010-3-29
やってみた
1.RoboQを動かそう
2.RoboQを無線で動かそう
3.iSobotを無線で動かそう
2010-3-29
1.RoboQを動かそう
構成図
Android端末
Arduino RoboQステレオオーディオ 赤外線
UI 赤外線コマンドへ変換・送信
無改造のHT-03Aから何で信号を取り出せるかな・・?ああ、音ならそのまま取れるか。ということで。
2010-3-29
1.RoboQを動かそう
・Android-Arduino側の実装の内容
Android側ではUIでの操作を監視してボタンの押下状態を検出、対応した音声を発声します。
Arduino側ではアナログ入力を一定期間監視して閾値を超えた入力があったか判定します。
動くけど、ステレオオーディオの音声の有無だけを使っていると、4状態しか表現できません。
ここでは前進/右旋回/左旋回/停止を割り当てておしまい。
(凝れば凝れるけど、メリット薄いよね)
Android端末 ArduinoAnalog2
Analog1
OFF ON
2010-3-29
1.RoboQを動かそう
・赤外線による制御の基本 方法はいろいろありますが、一般的な赤外線リモコン等では、赤外線を高速
に点滅させることで(だいたい)38KHzの信号を送信しています。
・Arduinoでの赤外線による制御の実装 ArduinoのDigital13ピン-GNDに接続した赤外線LEDを、タイマを使用して
38KHzの点滅をさせてシグナルの送信を行います。
Lo Hi
Arduino
GNDDigital 13
2010-3-29
1.RoboQを動かそう
・RoboQの制御の内容 RoboQでは赤外線を以下のように使用しています。 スタートビット:1000usのHigh ストップビット:500usのHigh+500usのLow ビットが1 :1000usのHigh+500usのLow ビットが0 :500usのHigh+500usのLow これを組み合わせて以下のビット列を定期的に出力します。 今回は150ms程度の間隔にしておきます。
コードは6ビットで定義され各ビットは以下のように使用しています。
スタートビット 1 0 ストップビット
コード=規定のビット数(RoboQでは6ビット)
0 1 2 3 4 5
歩行スピード11:高/10:中/01:低
動作前進:11
/左旋回:10/右旋回:01
バンドA:00/B:01/C:10/D:11
でもAndroid-Arduino間で2bitしか送れないのでスピードとバンドは固定です。
2010-3-29
2.RoboQを無線で動かそう
構成図
Android端末
Arduino RoboQbluetooth 赤外線
UI 赤外線コマンドへ変換・送信
なにかいい手はないかしら、とWebを廻っていると、Androdとbluetoothで何かやっている人たちが居るなぁ、と。
え?bluetoothのシリアルプロファイルってドライバ追加しなくても使えるの?じゃ使ってみようか。
BTシリアルボード
bluetoothでコマンド受信
・backport-android-bluetooth/emasuiさん
http://code.google.com/p/backport-android-bluetooth/
・Android + Arduino BT (なんとなく実験 with SIProp開発記) http://www.noritsuna.com/archives/2009/12/android_arduino.html
・side2 アンドロイドネタ(About Android)/カリーマンさん http://side2.256byte.com/2009/12/aba/
2010-3-29
2.RoboQを無線で動かそう
・ArduinoとBTシリアルボードの接続
配線
BTシリアルボード Arduino
VccGNDtxrx
VccGNDDigital 3Digital 4
2010-3-29
2.RoboQを無線で動かそう
・Android1.6でのbluetooth-SPPの実装
作成するAndroidのプロジェクトにbackport-android-bluetoothを導入 ・jarファイルの配置
・backport_android_bluetooth.propertiesの配置
・AndroidManifest.xmlの編集(パーミッションとインテントフィルタの追加)
BTデバイスの検索 ・ブロードキャストレシーバを用意してBTの状態のインテントを受信できるようにしておく。
・BluetoothAdapterにstartDiscoveryを発行する。
・検出したBluetoothDeviceをリストアップして、選択する。
接続 ・検出・選択したBluetoothDeviceからcreateRfcommSocketToServiceRecordを使用して
BluetoothSocketを取得、connectする。
送信 ・BluetoothSocketからgetOutputStreamを使用してOutputStreamを取得、writeします。
受信 ・BluetoothSocketからgetInputStreamを使用してInputStreamを取得、readします。
切断 ・BluetoothSocketをcloseします。
2010-3-29
2.RoboQを無線で動かそう
・操作
ペアリング
あらかじめAndroid側のBluetoothをONに設定し、目的のBTデバイスをペアリングしておきます。
起動・接続
アプリを起動し、BTデバイスを検索します。
検出したBTデバイスから目的のものを選択し接続します。
操作・通信
定期的にボタンの押下状態を検出して、対応したコードをbluetooth・シリアルに送信します。
やってることはオーディオでの接続時と変わりませんが、
送受信できるデータ量が増えたので、固定にしていた速度や
バンドをAndroid側で変更できるようにしました。
2010-3-29
3.iSobotを無線で動かそう
構成図
Android端末
Arduino iSobotbluetooth 赤外線
UI 赤外線コマンドへ変換・送信
BTシリアルボード
bluetoothでコマンド受信
そんなにデータ流せるんならもっと他のもの動かしちゃおうよ。
2010-3-29
3.iSobotを無線で動かそう
・iSobotの制御の内容
スタートビット:バンドA:2500usのHigh+500usのLow
バンドB:2500usのHigh+1000usのLow
ストップビット:500usのHigh+500usのLow
ビットが1 :500usのHigh+1000usのLow
ビットが0 :500usのHigh+2000usのLow
これを組み合わせて以下のビット列を定期的に出力します。
今回は150ms程度の間隔にしておきます。
スタートビットバンドAの場合3000us/バンドBの場合3500us
1 0 ストップビット
コード=規定のビット数(iSobotでは20または28ビット)
2010-3-29
3.iSobotを無線で動かそう
・コード内の各ビットは以下のように使用しています。
20~28ビットのコード内には多数のコマンドが定義されています。
・前進 6D B8 18
・左旋回 7D C8 18
・右旋回 45 D0 18
: i-SOBOTをPCからコントロール
http://akiba.geocities.jp/hyperstone_apple3/iSobot/iSobot.htm
バンドの切り替えはスタートビットのLoの長さと、先頭からの3ビット目を反転させることで切り替えられます。
・Android側の実装の内容
定期的にボタンの押下状態を検出して、対応したコードをbluetooth・シリアルに送信します。
コマンドが多すぎるので移動・キック・パンチをボタン、他をリストにしました。
2010-3-29
デモ
ここでは代表でiSobotの実動デモをします。
2010-3-29
応用
たとえば・・・
・Androidの音声認識を使ってロボット制御
・Androidのカメラ撮影でロボットの状態推定を行い、AR的にロボット制御
・Arduinoの赤外線制御をもっと汎用的にしておいて家電製品の制御
・BTシリアルを使ってのデバイス+Androidでのプロトタイプ機製作
などなど
2010-3-29
おしまい
以上ご清聴ありがとうございました。
catsin