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



0

PhoneGap NFC Plugin作った

PhoneGapでAndroidのNFCを使えるpluginを作った。



JavaScriptから簡単にNFCタグのIDが読める。
<script src='./phonegap.nfc.js' type='text/javascript' />
document.addEventListener('deviceready', function(){
window.plugins.nfc.id(
function(tag){
var id = tag.id; // get Tag ID;
},
function(e){
log(e);
});
}, true);


インストール方法はgithubに書いた。サンプルプロジェクトもある。
普通のPhoneGap pluginと同じく、phonegap.nfc.jsとNfcPlugin.javaを所定の場所に置くのだけど、NFCを使うためにguava librariesとAndroidManifest.xmlの修正も必要。

とりあえず、NFCでタグのIDを読むだけしか機能は無い。もちろん他にも色々データは取れるんだけど、どこまでwrapしたらいいのかよくわからないのと俺がIDしか使う予定が無いので、とりあえずIDだけにしておいた。(要望あれば追加する)




PhoneGap pluginの作り方は、phonegap / PhoneGap Pluginsが参考になった。JavaScriptからJavaのコードを呼びだす方法が書かれている。


既に公開されているプラグインがいくつかあって、それも参考になった。


0

Eclipseで作ったAndroidプロジェクトをantでbuildする

ふつうに最初からEclipseで開発したプロジェクトのディレクトリ内で、

android update project --path `pwd`

してから

ant debug
adb install -r bin/YourApp.apk
でインストールできる。


android updateでantビルドに必要なbuild.xmlとlocal.propertiesが生成される。
local.propertiesにはandroid sdkの絶対pathが含まれているので、この2つはgitにcommitしない方が良いみたいだ

0

AndroidでHTTP POST

targetはAndroid2.3.4、API 10向けにビルドして試した。

参考:


<uses-permission android:name="android.permission.INTERNET" />

import java.io.*;
import java.util.*;
import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

HttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://localhost:8080");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("message", "ほむ"));
try{
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse res = client.execute(httppost);
ByteArrayOutputStream os = new ByteArrayOutputStream();
res.getEntity().writeTo(os);
Log.v("result", os.toString());
Log.v("status", res.getStatusLine().getStatusCode());
}
catch(Exception e){
e.printStackTrace();
}


リクエストができているかの確認は、EM::HttpServerで見た
gem install eventmachine_httpserver
#!/usr/bin/env ruby
require 'rubygems'
require 'eventmachine'
require 'evma_httpserver'

class Handler < EM::Connection
include EM::HttpServer

def process_http_request
res = EM::DelegatedHttpResponse.new(self)
puts "request_method : #{@http_request_method}"
puts "path_info : #{@http_path_info}"
puts "query_str : #{@http_query_string}"
puts "post_content : #{@http_post_content}"
res.status = 200
res.content = "こんにちは"
res.send_response
end
end

EM::run do
EM::start_server("0.0.0.0", 8080, Handler)
puts "http server start, prot 8080"
end