0

IOIO for AndroidでLEDピコピコ光らせる

IOIOのデジタル出力を使った。
作ったものはテストなのでどうでもいいとして、IOIOLibをimportして自分で1からAndroidアプリプロジェクトにするところと、Eclipseの設定でハマった事について書いておく。


■できたもの
コード https://github.com/shokai/android-ioio-study/tree/master/LED_Blink


Androidの画面上のボタンが3つあって、IOIOのLED3つと対応している。
1つ前の記事で作ったUSB給電ケーブルとeneloopで外でも動かせる。下の4つ目のボタンは気にするな。
R0016179

動画



■EclipseのCompiler Compliance Level
Eclipse->環境設定->Java->CompilerにあるCompiler Compliance Levelを1.6にする。
これをしないと後述のioio.lib.impl.*impl.java等で90個ぐらいのエラーが発生してビルド出来ない。

でもCompiler Compliance Levelを変更すると、Level 1.5等で作ったAndroidプロジェクトが今度はエラー表示を大量にだしてしまう。なのでIOIO用に新しいworkspaceを作ったほうが良いでしょう。


■最新のIOIOLibを使わない
IOIO for Android Beginners Guide – SparkFun ElectronicsにあるIOIOLib.zipを解凍して、Eclipseでworkspaceにimportする。

こうなればよし。

http://codaset.com/ytai/ioioに最新版のgitリポジトリがあって、毎日すごい勢いで実装されている。
だが、最新のIOIOLibでビルドして動かしてみるとLogcat上でもAndroidとIOIOが接続できているっぽい様子が見えるが、デジタル出力ができなかった。firmwareも修正しているのでプロトコルがupdateされているのかもしれない。とりあえずBeginners GuideのIOIOLibを使いましょう



■新規プロジェクト作成
まっさらからAndroidプロジェクトを作り、IOIOLibを使う方法。

まず普通にAndroidプロジェクトを作る。どうも2.3.x以降じゃなくても動くらしい。http://codaset.com/ytai/ioioのサンプルもAndroid1.6用とかで作ってた。


プロジェクトを右クリックしてプロパティで、Android->Libraryに ../IOIOLib を追加する。workspaceのIOIOLibが読み込まれる。

Eclipse使ってない人は default.properties

android.library.reference.1=../IOIOLib
を追加する。


AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
を追加する。(どうもADKじゃなくて、debug bridgeを使って通信している様だ)

あとはAndroidアプリとしてごプログラムを書く


■IOIOのプログラムを書く
今回作ったMainActivity.java

まずioio.lib以下で必要な物をimportする。
MainActivityはandroid.app.Activityではなく、ioio.lib.util.AbstractIOIOActivityを継承する。
サンプルのHelloIOIOと同様に、クラス内クラスでAbstractIOIOActivity.IOIOThreadを作ってその中に関数setup()とloop()を作った。

そしてMainActivityからIOIOThreadを呼び出す。
@Override
protected AbstractIOIOActivity.IOIOThread createIOIOThread() {
return new IOIOThread();
}

あとはArduinoっぽく書ける

どうもActivityがアクティブの時しかIOIOは動かないらしい。Intentで画面遷移させるアプリから使う時どうなるか気になる。



■IOIOはADKじゃないっぽい
IOIOはADKで通信してるんだと思ってたら、debug bridgeを使って通信してるっぽい。http://codaset.com/ytai/ioio/wiki/IOIO-Over-OpenAccessory-BetaにADKとして動作させる方法が書いてある。



■logcatを見る
IOIOとAndroidを接続するのにUSBポートが塞がれるので、logcatができない。またNexusSはrootを取らないとWiFi経由でのadb logcatができないので、ブラウザからlogcatを見る – 明日の鍵にあるツールを使う。
wget http://tomorrowkey.googlecode.com/svn/trunk/LogcatOnBrowser/LogcatSocketServer/bin/LogcatSocketServer.apk
adb install -r LogcatSocketServer.apk
wget http://tomorrowkey.googlecode.com/svn/trunk/LogcatOnBrowser/Client/logcat.html
open logcat.html

grepしたいので、後でlogcat.htmlを改造しようと思う

Androidへのapkのインストールはhttpからできるので、https://gist.github.com/1090762でhttpdを動かしてUSBケーブルを抜き差ししなくてもapkをインストールしてlogcatを見る事はできる。多少面倒くさいのでこの辺どうにかしたい。

0

IOIO for Androidを動かした

sparkfunによるADK上に作られたphidgets的な環境であるIOIO for Androidのサンプルプログラムを動かした。
R0016173
ADKはAndroidとデバイスとの接続の仕様なのだが、Androidとマイコン両方のプログラムを書かなければならないので面倒くさい。
IOIOはADKのプロトコルの上で、Androidから出された命令に従ってIOを操作するマイコンボード。Javaのライブラリが提供されているので、Javaを書くだけでAndroidでハードウェアが制御できる。
IOIOのボード上にI2Cのポートがあるので、IOIOにさらに他のマイコンを接続する事もできる。


■買う
スイッチサイエンスで買った
スイッチサイエンス/商品詳細 IOIO for Android


■5V電源を作る
Read This Before Connectingを見ると、

・USBコネクタそばのVINに5〜15V入れるか、5Vピンに5Vちょうどを入れるかして電源を与える
・Androidから給電はできない(ADKの仕様)
・裏の黒丸がついてるピンだけ、5Vを入力できる。他のピンは3.3Vまで。それ以上やると死ぬ
と書いてある。


外に持って行ける電源が欲しかったので、USBケーブルを剥いて赤(VCC)と黒(GND)の線にピンヘッダを付けて5V電源を作った。
パソコンかエネループに接続すれば5VがIOIOに供給できる。
5V USB



■サンプルプログラムをAndroidにインストール
IOIO for Android Beginners Guide – SparkFun Electronicsにサンプルがある。
0番ピンに接続されている基板上のLEDを光らせるプログラム。


ビルドされたapkが入っているのでインストールする

wget https://www.sparkfun.com/tutorial/ioio/HelloIOIO.zip
unzip HelloIOIO.zip
cd HelloIOIO
adb install -r bin/HelloIOIO.apk



■Androidと接続する
USBケーブルでAndroidとIOIOを接続する。
IOIOのUSBコネクタ近くの可変抵抗をドライバーか何かで回して、Androidの画面の上のバーに「USBデバッグが接続されました」と表示されるように調節する。


■サンプルを動かす
Hello IOIOを起動して、ボタンを押すとLEDが光る。もう一度押すと消える。
R0016172



5

Sinatra+Haml+jQuery入門

研究室の後輩にSinatraとhamlとjQueryを教えるために作ったテンプレートについて、ここにも書いておく

ソースコード https://github.com/shokai/sinatra-template
実際動いているもの http://masui.sfc.keio.ac.jp/sinatra-template/


git clone git://github.com/shokai/sinatra-template.git


■Sinatraを何に使うか
Sinatra+haml+jQueryが便利。
Railsと似てるけど、ちょっと違う。

個人的には
Rails → HTMLのページをいっぱい作るのに便利
Sinatra → 画面遷移あまりしなくて、同じURLのままjsonのAPIをjQueryのajaxで取得して動的に表示を変えるwebページを作るのには便利

に感じる。
でもSinatra自由すぎるので、ある程度実装パターンを知らないとメチャクチャになるのでこのテンプレートを参考にすると良いよ

個人的にはserial-http-gatewayと一緒に使ってデバイスと連動したwebページを作る、とかが手軽にできてよく使う。



■動かし方
gemでsinatra入れて、ruby development.ru
詳しくはREADME嫁


■テンプレートの解説
最低限の動作するおみくじアプリです
おみくじ結果をJSONで返すAPIがある
jQueryでajaxでJSON読んで表示する
hamlでhtmlを作る
開発用とデプロイ用の2種類のRackUp(*.ru)ファイル付き


■ファイルの説明
・README.md
 まず読め
・development.ru
 開発サーバーを起動し、main.rbとhelper.rbを読み込んでSinatraアプリを実行するスクリプト
・config.ru
 本番サーバーのapacheやnginxでsinatraアプリを実行するためのPassenger用スクリプト
・config.yaml
 ”やむる”形式の設定ファイルです。アプリのタイトルしか書いてない。
 ここに設定値を書くようにするとアプリを配布するのに便利
 (必要になったら)DBの接続設定などを書くと良い。
・Gemfile
 アプリで使うgemを書いておく
 bundlerでgemを管理する時に使う
・helper.rb
 起動時に一回だけ読み込まれる
 必要なライブラリをロードするコードはここに書く
 (必要になったら)データベースへの接続などをここで行うと良い。
 app_rootという関数が定義されている(重要)
 これにより、開発サーバー・サブドメインでの運用・サブディレクトリでの運用でも内部のURLがズレない
 jsからサーバーのAPIにアクセスする時、hamlでcssを読み込む時などに便利
・main.rb
 Sinatraアプリ本体
 HTTPでアクセスしてきた時のresponseを書く
 app_root/omikuji.json でアクセスしてきた時に、ランダムなおみくじを返す
・views/
 hamlを置くディレクトリ
・views/index.haml
 http://(app_root)/ にアクセスした時に表示されるhamlファイル
 index.hamlをどのURLの時に表示するかは、main.rbで指定している
 main.js, main.cssを読み込んでいる
 rubyの変数のapp_rootをjsの変数app_rootに渡している(重要)
・public/
 画像やjavascriptなどの静的ファイルを置くディレクトリ
・public/js/jquery.js
 最新版のjquery
・public/js/main.js
 index.hamlから読み込まれるJavaScript
・public/css/main.css
 index.hamlから読み込まれるcss

SinatraやjQueryの基本的な使い方についてはググる。ライブラリの入門サイトとかを頭から読むよりも既に動いているアプリのソースを読んでわからない所を調べるのが一番速い。


■工夫しているところ
そんなに多いわけでもないけど、
・config.ruとdevelopment.ruを分ける。developmentから起動した時だけsinatra/reloaderを使ってアプリを毎回リロードさせている
・helper.rbの中身は1プロセス毎に1回しか呼ばれないので、DBとの接続や設定ファイルの読み込みはmain.rbと分けてここに書いておくといい
・app_rootという関数を定義してあって、開発環境や本番環境でAPIのURLがずれないようにしている
haml内に書かれたRubyコードの動作についてはここにまとめた


■アプリの動作
ruby development.ruする→helper.rb読む→helperがyamlの設定ファイルを読む、app_rootという関数を作る→port8080でサーバーがthinに設定される→Sinatraアプリ(main.rb)を起動→main.rbは”/”へのアクセスにindex.hamlを返す、”/omikuji.json”にはランダムなおみくじと時刻を返す

ブラウザで”/”にアクセスする→cssとjsを読む、ajaxでおみくじを取得する関数がボタンに関連付けられる→ボタン押す毎におみくじ表示される



こんな感じで、ajaxでデータ取ってきてhtmlを書き換えるアプリの最低限のテンプレートを用意しました。
意外とDB無くてもglitchtweetTweetButton増井研オーディオAPIのようなものは作れるので、まずはDBなしでSinatra+Haml+jQueryで何か作ってみるのが良い。


DB使うときは、SQL系ならActiveRecordsかSequelかDataMapperあたりがメジャーなのかな?多分。そのへんをまず単体で使ってみて、適当にtwitterのクローラーとか作ってみると良い。
それからSinatraの中に混ぜて使ってみる。いきなりjsで画面が書き換えて、Sinatraもいじって、DBも使うとかやると確実に破滅するので一つずつやるのオススメします

0

Google Latitudeから自分の位置情報を取得する

以前自分でAndroid用のGPSロガーアプリを作っていたんだけど、収集した位置情報をAndroid内に持っていても特に面白いことが出来なくて悩んでた。
Android版のgoogle latitudeはもちろんサーバーに位置情報が溜まっているので、これを別の自分のサーバーから取得したほうが使い勝手がよい。


作ったもの https://github.com/shokai/google-latitude-logger


■google latitudeから位置情報を取る方法
GData APIからGoogle Latitude APIが使えるが、なんかわけがわからなかったのでgoogle latitude badgeからデータを取ることにした。


Google Latitude公開ロケーションバッジのページにgoogleアカウントにログインした状態で行き、「有効にして最新の現在地情報を表示する」にチェックを入れる。
webサイト用のembedコードから api?user=1234567890 の部分をメモする。


で、 http://www.google.com/latitude/apps/badge/api?user=1234567890&type=json を見ると自分の位置情報が書かれている。

位置情報を取得してMongoDBに保存するコードをlatitude-logger.rbに置いておいた。さくらVPSのサーバーで数分おきに動かして位置情報を保存している。



■保存した位置情報を使う

移動の方角と速度を計算してtwitterに投げるようにしてみた。
移動方向
俺が元気に活動している様子がわかる。例えば、時速200km以上で西に移動するのが連続していたら新幹線に乗ってるのかなとか、そういう想像ができる。
位置情報をそのまま公開するのは気持ち悪いし危険だし誰も得しないので、何か加工して表示する必要があるのでちょっと抽象的な表現にしてみた。

地理的な知識があれば速度と方角だけでも結構何をしているかわかる。時速20〜40kmで東西に移動しているなら神奈川中央交通のバスに乗っているし、時速80kmぐらいだったら電車で東京に向かっている事が多い。けっこうわかる。



KMLで出力してGoogle Earthに表示してみた。これは先週木曜に学校に行こうとしてバスを乗り過ごして迷子になった時の移動のログ。
迷子になった
KMLファイルはAndroidで開いてもMapに描画されるので、サーバーで定期的に生成されてるようにしてあるからほぼ以前作ったAndroid用GPSロガーと同じ事ができている。


今後は俺が近くに来たら通知するアプリを作って配布しようかと思ったけどあまりうれしくないのでやめた。

0

Dropboxチャットクライアント「drochan」

Dropboxにチャット機能を付けるとても便利なクライアント「drochan」を開発しました。
共有フォルダに参加している他のメンバーと会話する事ができます。



発言するとこのように通知がでます。
use Dropbox as a Chat


drochanの利点は

  • Dropbox以外のツールが必要ない
  • drochanを使っていないユーザも、Dropbox標準のgrowl通知でチャットを読む事ができる
  • 相手がオフラインでも、メッセージを送ることができる
  • メンバー管理が楽。Dropboxの共有に招待したけどチャットに招待しわすれた、なんて事が無くなる


■使い方
drochanをダウンロードしてpathの通っている場所に置く。

7行目あたりの
DIR = "#{ENV['HOME']}/Dropbox/drochan"
を自分のDropboxの共有フォルダ名に変更する。(この場合はdrochanというフォルダを共有している)


Dropboxでメンバーを共有フォルダに招待してから、
発言する
drochan こんにちは


タイムラインを見る
drochan


このようなタイムラインが表示されます
drochan timeline