0

HTC J Butterfly買った

ケータイをsoftbankのiPhone3Gから、auのHTC J Butterflyに買い換えた。
iPhoneのSIMをSIMフリーAndroidに刺して使ってたんだけど、安かったから買った。
価格.com – HTC HTC J butterfly HTL21 au [ブラック] 価格比較

俺が買ったのは3週間ぐらい前で、3万円ぐらいだったんだけど今1.5万円ぐらいになってる。
LTEをテザリングもできるし、液晶が超きれいだしRAMが2GBも乗ってて爆速マシンだった。
LTEのテザリング、学校や家とpingで30msecとか出ててVNCしても快適だしすごい。


レクサスプランニングという店で通販した。
MNPの通販なので、ケータイ屋さんで書いてもらうカーボンで写しをとる申込書類を自分で書いたり、softbankに電話したりした。

手順

1. レクサスプランニングのwebサイトで申し込む
2. 入金する
3. auの申込書が届く
4. softbankに電話してMNP予約番号をもらう。なぜiPhoneをやめるかなど色々質問される。
5. auの申込書を書いてレクサスプランニングに返送する(MNP予約番号、身分証明書コピーなども)
6. 2日ぐらいするとsoftbankが止まる
7. 次の日に新しいケータイが届いた

というわけで丸1日、ケータイが使えない日があるのが注意。
全体で1週間弱かかる。


セットアップ

Android OSのアップデートをした。4.1.1が来た。
「モバイルネットワークの設定」からPRLバージョンを上げた。LTEのつながりが良くなった。
頭にauと付くアプリを片っ端から停止した。auマーケットとかlismoとかうたパスとか。アプリケーションの設定からアンインストールor無効にすれば起動しなくなる。
アドレス帳をgoogleにおいてあるのだが、googleアカウント認証後に同期する設定をしないと同期できなかった。また同期にはけっこう時間がかかる。


悲しい所

NFCの読み取りが弱い。タグによっては読めないが、グリグリ押し付けると読める。
USBホスト機能が入っていない気がする。Arduino認識しなかった。
テザリング中に電話がかかってくるとインターネットが切断される。電話しないからまあいいか



0

Androidのライブラリを作るときのメモ

次にまたAndroid用のライブラリを作るときのために、Android版Arduino Firmataを作った時に色々やった事をメモする。
最終的にCUIだけで全部ビルドしてリリースできるようになったし、rubygemなみにメンテしやすい構成ができたと思われ

ソースはここに公開してる https://github.com/shokai/ArduinoFirmata-Android


問題

EclipseでAndroidプロジェクトを作って、パッケージエクスプローラのフォルダを右クリックして「エクスポート」からjarファイルが作れる。プロジェクトの中で使っているファイルの一部分だけをライブラリとして切り出せる。


でも
  • jarに切り出すリリース作業をGUIでやるとミス起きそう
  • gitで管理しにくそう
  • jarにREADMEとかを含めるのが面倒
  • ライブラリの性質上実機で動作確認しなければならず、手元のMacで自動テストできない
  • 作ったjarを複数のサンプルアプリで動かすのが面倒
  • usb-serial-for-androidというgoogle製ライブラリを使うが、リポジトリに含めたくないのでgit submoduleで読み込みたい
などの問題があって、これは継続的にメンテするのが面倒くさそうだし、半年ぶりに更新する時に手順を全部忘れたりしそうだなあと思った。
rubygemみたいに久しぶりにメンテしても普通にリリースできる環境を作りたい。


Eclipseやめてターミナルでantとmakeとemacsで作ることにした。
Eclipseは適当に書いても足りないクラスをimportしてくれたり、アプリの画面をドラッグアンドドロップで作れるけど、ライブラリを作る時には意味ない。


開発環境

MacのターミナルとEmacsでAndroidアプリを作る環境を整える。
橋本商会 » Android開発環境をインストールしなおした
橋本商会 » emacsでAndroidのAPIも入力補完する


フォルダ構成


こんな感じ
├── History.txt
├── LICENSE.txt
├── Makefile (これ重要!)
├── README.md
├── arduino-firmata.jar (リリース版jarファイル)
├── samples (サンプルアプリを入れる場所)
│   └── FirmataSampleApp(サンプルアプリ)
│   ├── AndroidManifest.xml
│   ├── Makefile (これも重要!)
│   ├── libs
│   │   ├── arduino-firmata.jar (実は../../../arduino-firmata.jarへのシンボリックリンク)
│   │   └── usb-serial-for-android-v010.jar (これは実体)
│   └── (略)
├── src
│   ├── com
│   │   └── hoho(make initするとsubmoduleからコピーされてくるが、git ignoreされてる)
│   │   └── android
│   │   └── usbserial
│   └── org
│   └── shokai
│   └── firmata(ライブラリ本体)
│   ├── ArduinoFirmata.java
│   ├── ArduinoFirmataEventHandler.java
│   ├── ArduinoFirmataException.java
│   └── Error.class
└── usb-serial-for-android (git submodule。make initすると最新版をpullしてくる)


arduino-firmata.jarのビルド方法


Android SDKへのクラスパスを通して
% export CLASSPATH=$CLASSPATH:/usr/local/var/lib/android-sdk/platforms/android-13/android.jar
% export LC_ALL=en

ビルドする
% make init
% make

これを実現するMakefile
all: build

init:
cd usb-serial-for-android &&\
git pull origin master &&\
cd ../ &&\
cp -R usb-serial-for-android/UsbSerialLibrary/src/com src/

compile:
cd src &&\
javac org/shokai/firmata/ArduinoFirmataException.java &&\
javac org/shokai/firmata/ArduinoFirmataEventHandler.java &&\
javac org/shokai/firmata/ArduinoFirmata.java

build: compile
cd src &&\
jar cvf arduino-firmata.jar ./org &&\
jar uvf arduino-firmata.jar ../README.md &&\
jar uvf arduino-firmata.jar ../LICENSE.txt &&\
jar uvf arduino-firmata.jar ../History.txt &&\
mv arduino-firmata.jar ../

make initでsubmoduleのusb-serial-for-androidをgoogle codeのgitからpullしてきて、必要なソース(com.hoho.android.usbserial)だけsrcにコピーする。
コピーされたソースコードは.gitignoreに書いてあるのでコミットされない。

make buildでライブラリを全部コンパイルしてjarを作って、READMEやLICENSEを追加してルートディレクトリに置く。
これをgithubのmasterブランチにpushすると、github pagesで作ったArduino Firmata on Androidのページのチュートリアルのところに出るようになってる。


サンプルアプリのビルド方法

samples/FirmataSampleApp/ に移動して、
% make setup
で自分のAndroid開発環境の設定が読み込まれる


% make
% make install
これでサンプルアプリがインストールされる


Makefile
all: clean build
setup:
android update project --path `pwd` --name 'FirmataSample'
build:
ant debug
install:
adb install -r bin/FirmataSample-debug.apk
uninstall:
adb uninstall org.shokai.firmata.sample
logcat:
adb logcat | grep firmata
clean:
/bin/rm -r -f bin/classes

毎回.classファイルを削除してからビルドしている。
ant debugはソースのjavaファイルが更新された時のみ.classファイルに新しくコンパイルしなおすので、
毎回消してやらないとarduino-firmata.jarだけが更新された時に正しくビルドされない。

libsディレクトリにarduino-firmata.jarがあるが、これはルートディレクトリへのシンボリックリンク。
usb-serial-for-android.jarは http://code.google.com/p/usb-serial-for-android/からダウンロードしてきたもの。

antをmakeで使うのはなんかよくわからない気もするが、まあいいや。


更新作業

githubのissueを立てて、要求とおおまかな設計を書く。
ローカルでissue名のブランチを切って、commitメッセージの最後に#7とかissue番号を入れてcommitする。
githubにpushするとissueのページに書き込まれるので進捗が管理しやすい。
機能が完成したらmasterブランチにmergeする。



リリース作業は
History.txtにこれまでのcommitメッセージまとめを書いて、
ArduinoFirmata.javaの定数VERSIONを書き換えてからjarにビルドしなおして、
git tagをうってgithubにpushする。

だいたいこんな感じか。

1

Android版ArduinoFirmataを作った

AndroidのJavaの中で

int sensor = arduino.analogRead(1);
arduino.servoWrite(9, 155);
とか書けて便利です。

ここにチュートリアルとか、すぐ試せる無署名のapkとか置いといたのでどうぞ
ArduinoFirmata on Android

ArduinoFirmata on Android


先週ArduinoとAndroidを接続できたので、Firmataプロトコルの移植はRubyでもやった事だしさくっとAndroid版も作ってみた。



Android OS 3.2以上でUSBホスト機能がある端末とStandard FirmataをインストールしたArduinoを、USBホストケーブルで接続する。
Arduino IDE -> [File] -> [Examples] -> [Firmata] -> [StandardFirmata] でインストールできる。
(Firmataを入れたArduinoは、シリアル通信からの命令で動く操り人形モードになります)

Android用ライブラリはjarファイルにしてArduinoFirmata on Androidに置いてある。
Androidプロジェクトのlibsディレクトリに入れれば使える。


Arduino Duemillanove, UNO, Seeduino v2で動作確認した。
USBホストケーブルはこれこれが使えた。


ご意見ご感想はtwitterやgithubのissueやpull requestなどお待ちしております

11

AndroidのUSBホスト機能でArduinoとシリアル通信する

超便利なライブラリ作ったのでこっち使うといいです → 橋本商会 » Android版ArduinoFirmataを作った

——-以下本文

なんか意外と簡単にできたし、まったくやってる人の情報が無いので書いておく。


Nexus7+Arduino(Seeduino)+サーボモータ を動かした


AndroidにArduino等のシリアルデバイスを直つなぎできる。
ADKやUSBホストシールドやIOIOと違って、むずかしい回路やプログラムはいらないし、電源もAndroid側から供給もできる。
マイコン側は単純にシリアル通信するだけ。Android側もUSBシリアルポートを探して接続するだけ。


Nexus7にはUSBポートとは別に充電ポートがあるのでそっちで充電させつつ、デバイス制御もできそう

必要な物は3つ

1. USBホスト機能に対応したAndroid端末
2. USBホストケーブル
3. Arduino等のUSBシリアルデバイス


USBホスト機能に対応したAndroid端末

Android 3.1(タブレット用)や4以上の端末はUSBホスト機能がある。
2012年夏ごろからの端末が該当していて、USBホストシールドやADKが必要なくなった。

Galaxy NexusやGalaxy S3以降でAndroid4以上の端末はokのはず。
Googleが各ベンダになるべくUSBホスト機能を持たせるように働きかけているってsonyの人が言ってた。
最近Nexus SにもAndroid4が配信されたけど、チップセットにUSBホストの機能が無いので無理。


USBホストケーブル

ようするに「AndroidにUSBキーボードやマウスを接続できる」と書いてあるケーブルのこと。
これをUSBポートに接続すると、AndroidはUSBホストモードになる。

USBケーブルは普通4ピンだ。VCC、GND、D+、D-ピンの4つ。
USB mini/microから、5ピンになった。IDピンが増えた。
USBホストケーブルを作るには、IDピンとGNDピンをショートさせるだけでいい。


これを買った。ぴったりで良い。


なお自作も可能。S2 » USBホストケーブルとUSBケーブルの違い にくわしく書いてある。
市販のUSB-マイクロUSB変換コネクタを分解して、IDピンを短絡させてる。


昔のArduinoと今後のArduino

Arduino UNO以降は、AVRマイコン内蔵のUSBシリアル機能を使うようになっている。
Arduino Duemillanove以前は、FTDI社のFT232というUSBシリアル変換ドライバICを使っている。
それぞれ違うデバイスドライバが必要だけど、両方対応できるようにAndroidアプリを実装可能。

このGoogle製ライブラリを使えばいい。勝手にデバイス判別してくれる。
ボーレートの設定とかも扱いやすい関数が揃ってて便利。
usb-serial-for-android – Android USB serial and Arduino device host support library. – Google Project Hosting

これを使わなくてもandroid.hardware.usb.UsbDeviceクラスを使えば自分で実装できるが、ソース見てみればわかるけどげんなりする処理が多いのでusb-serial-for-android.jarを使うのが良いと思います。

AndroidでArduinoとシリアル通信する


usb-serial-for-androidのDownloadsメニューからusb-serial-for-android-v010.jarをダウンロードして、Androidアプリのlibsディレクトリに入れる


AndroidManifest.xml のinternt-filterの中に追加
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />


さらにintent-filterと同列にmeta-dataを作る
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />


device_filter.xml を取得する。FTDIチップやArduinoのUSBベンダIDが書いてある。
wget http://usb-serial-for-android.googlecode.com/git/UsbSerialExamples/res/xml/device_filter.xml
mkdir res/xml
mv device_filter.xml res/xml/


接続する。
アクティビティ内で
import java.io.*;
import android.hardware.usb.*;
import com.hoho.android.usbserial.driver.*;

public void onCreate(Bundle savedInstanceState) {
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbSerialDriver usb = UsbSerialProber.acquire(manager);
if (usb != null) {
try{
usb.open();
usb.setBaudRate(9600);
start_read_thread(); // シリアル通信を読むスレッドを起動
}
catch(IOException e){
e.printStackTrace();
}
}
}


Arduino → Android
シリアル通信で受信したデータを読む。ArduinoでSerial.println(“文字列”)したデータがAndroid側で読める。
public void start_read_thread(){
new Thread(new Runnable(){
public void run(){
try{
while(true){
byte buf[] = new byte[256];
int num = usb.read(buf, buf.length);
if(num > 0) Log.v("arduino", new String(buf, 0, num)); // Arduinoから受信した値をlogcat出力
Thread.sleep(10);
}
}
catch(IOException e){
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}


adb logcat | grep arduino
して見てみましょう。受信できているはず。


Android → Arduino
AndroidからArduinoに文字列「o」や「x」送信する。
while(true){
usb.write("o".getBytes("UTF-8"),1);
Thread.sleep(1000);
usb.write("x".getBytes("UTF-8"),1);
Thread.sleep(1000);
}


接続を閉じる。
try{
usb.close();
}
catch(IOException e){
e.printStackTrace();
}


Arduinoにはこんなのを書いておくと、シリアル通信でoとxが来たらLEDを点灯消灯させたりサーボモータを回したりできる。
char led_pin = 13;
char serial_recv;

void setup(){
pinMode(led_pin, OUTPUT);
Serial.begin(9600);
}

void loop(){
Serial.println(analogRead(0)); // アナログセンサの値をAndroidに送る
while(Serial.available() > 0){
serial_recv = Serial.read(); // シリアル通信を受信
switch(serial_recv){
case 'o':
digitalWrite(led_pin, true); // 基板上のLEDを点灯
analogWrite(11, 200); // サーボ回す
break;
case 'x':
digitalWrite(led_pin, false); // 消灯
analogWrite(11, 20); // サーボ回す
break;
}
Serial.println(serial_recv);
}
delay(10);
}


WiFiでAndroidアプリ開発

ArduinoをAndroidに接続しているとUSBケーブルがさせない。MacからWiFi経由でAndroidにプログラムを書くといい。
Nexus7が同じ無線LAN内の192.168.1.121にあるとする。
設定→タブレット情報→端末の状態 にIPアドレスが書いてある。
AndroidをMacにUSB接続してから
adb tcpip 5555
adb connect 192.168.1.121:5555
adb logcat
USBケーブルを抜く。

あとはもう、adb installもEclipseからのDebug Runも、logcatもWiFiでできるようになってる。


元に戻すには、USBケーブルを接続して
adb usb
これで戻る。


その他の作例

こういうのを作ってる人がいて、参考になった

Android USB Host + Arduino: How to communicate without rooting your Android Tablet or Phone | Using Android in Industrial Automation
android.hardware.usb.UsbDeviceを使ってArduino UNOとシリアル通信している

Android Host – Arduino間シリアル通信の実現 – アトリエのどか
FTDIドライバを使ってArduino Duemillanove以前とシリアル通信してる

0

NanoHTTPDでJavaアプリにwebサーバーを埋め込む

Javaで1ファイルで実装されたNanoHTTPDを触ってみた。
Apacheみたいなのが起動するんじゃなくて、自分のプロセスにwebサーバーの機能を埋め込むタイプ。

NanoHTTPD
https://github.com/elonen/nanohttpd


Androidで動かしている例も検索するとそれなりに出てくる。すんなり動くらしい。
Android上でWeb serverを動かしてみた – komamitsu.log
Androidアプリ開発に挑戦: Android で NanoHTTPD を使ってみる


とりあえずMacで試した。Androidではまだ試してない。
手元のファイルをHTTPで配信もできるし、リクエストのパスやメソッドやプロパティを読むことも出来る。
Androidのプログラムに埋め込めば、パソコンのwebブラウザからAndroidにアクセスして遠隔操作できて便利だと思う。


使い方

ドキュメントが無いけど実装がシンプルなのでgithubの本体のコードを見た。
new NanoHTTPD(8080, File(“.”));するだけで8080番で現在のディレクトリをdocument rootにしたhttpdが起動する。

カスタムするにはサンプルと同じくNanoHTTPDクラスを継承して、関数を自分で上書きしてしまえばいい。
主にserve(String uri, String method, Properties header, Properties parms, Properties files)を上書きする事になると思う。

本体のコードを見るとserveからserveFile関数を呼び出しているので、自分でserve関数を定義し直したらそこからfileServeも呼び出しなおしてあげないとファイル配信できなくなる。
(同梱されていたサンプルのHelloServer.javaではfileServeが動いていない)


webブラウザからMacを遠隔操作する例



サンプルのHelloServer.javaを改造してみた。特定のパス(/goと/stop)にリクエストが来たらMacのsayコマンドで「ゴー」「ストップ」と喋らせる。
それ以外のパスへのリクエストは、dataディレクトリ内のファイルを返すようにしてみた。
Androidのプログラムに埋め込む時は、SDカードやassetsのディレクトリでファイル配信すればいいと思う。
import java.io.*;
import java.util.*;

public class HelloServer extends NanoHTTPD
{
public HelloServer() throws IOException
{
super(8080, null);
}

public Response serve( String uri, String method, Properties header, Properties parms, Properties files )
{
System.out.println( method + " '" + uri + "' " );
if(uri.equals("/go")){
try{
Runtime.getRuntime().exec("/usr/bin/say go");
}catch(java.io.IOException e){
System.err.println(e);
}
System.out.println("go!!!!");
return new NanoHTTPD.Response( HTTP_OK, MIME_HTML, "go");
}
if(uri.equals("/stop")){
try{
Runtime.getRuntime().exec("/usr/bin/say stop");
}catch(java.io.IOException e){
System.err.println(e);
}
System.out.println("stop!!!!");
return new NanoHTTPD.Response( HTTP_OK, MIME_HTML, "stop");
}
return serveFile(uri, header, new File("./data"), true);
}


public static void main( String[] args )
{
try
{
new HelloServer();
}
catch( IOException ioe )
{
System.err.println( "Couldn't start server:" + ioe );
System.exit( -1 );
}
System.out.println( "Listening on port 8080. Hit Enter to stop." );
try { System.in.read(); } catch( Throwable t ) {};
}
}


dataというディレクトリを作ってその中にindex.htmlとして保存する。
ボタンが2つ並んでるだけだけど、押したらMacが「ゴー」「ストップ」とか喋る。
<html>
<head>
<script src='//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js' type='text/javascript'></script>
<script type="text/javascript">
$(function(){
console.log("start");

$("#go").click(function(){
console.log("go button");
$.get("/go");
});
$("#stop").click(function(){
console.log("stop button");
$.get("/stop");
});

});
</script>
</head>
<body>
<h1>remote controll</h1>
<div>
<input type="button" value="go" id="go"></input>
<input type="button" value="stop" id="stop"></input>
</div>
</body>
</html>