2011年12月6日火曜日

【追記あり】DotsduinoをAndroidから操作してみた



Make: Tokyo Meeting 07に3日行ってきました。
そこで、以前からお世話になってるブログ(なんでも作っちゃう、かも。)の方が出展しており、 DotsduinotというArduino互換のオリジナル製品を売っていたので買っちゃいました。
それで、折角なのでAndroidからDotsduinoを制御できるようにしてみました。
正確に言うと、シリアル通信で、命令をDotsduinoが受け取り表示するといった流れなので、 そのままPCからも制御できちゃいます。

【追記】
動画をアップロードしました


  • Dotsduino側のソース

#include 

Dots myDots = Dots();

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  myDots.begin();
}


void loop()
{ 
  int msg[4] = {0};
  int i    = 0;
  int flag = 0;
  
  // 3バイトを超えてバッファされないと処理しないようにする
  if (Serial.available() > 3) {
    i = 0;
    
    while(i < 4) {
      msg[i] = Serial.read();
      if (msg[i] < 0) {
        break;
      }
      i++;
    }

    // 念のためのデータチェック用
    if (msg[0] == '@') {
      myDots.write(msg[1], msg[2], msg[3]);
    }
  }
}

とりあえずこれだけで、PCからでも"@111"や"@250"といった形のデータを送れば付けたり消したり出来ます。
ただ、msg[1]〜msg[3]は数値である必要があるのでASCIIコードで送ると、49とか50といったデータが送られてくるので、次のように変更するといいかもしれません。
      myDots.write(msg[1] - '0', msg[2] - '0', msg[3] - '0');
ただ、これはPCからASCIIコードで送る場合の処置です
数値として送る場合には不要です。

Android側のソースは後日綺麗にしたらGithub上に上げておきます。
https://github.com/iwata-n



#以下アフィリエイト用の広告です

2011年11月27日日曜日

さくっとfoursquareとGoogleカレンダーを同期する方法

TwitterでfoursquareとGoogleカレンダーを同期すると引きこもってた日がいっぱつでわかるとツイートしたらやたらRTされたんでやり方をメモ


  1. おもむろにfoursquareにログインします
  2. https://ja.foursquare.com/feeds/にアクセスします
  3. https://feeds.foursquare.com/history/○○.icsをコピー
  4. Googleカレンダーを開きます
  5. 左のメニューから「他のカレンダー」で小さい三角を押します
  6. 「URLで追加」にさっきコピーしたicsのURLを貼り付け
  7. (゚д゚)ウマー

これで自分の履歴がさくっと確認できます。
kmlをコピってGoogleマップでインポートすれば地図上で確認できるようになります


#以下アフィリエイト用の広告です

2011年11月6日日曜日

AndroidのUSB Host APIを使ってチョロQを動かす




前回前々回に紹介したAndroidのUSBホストAPI。
これを使っていつものごとく日本が世界の誇るタカラトミー社製のチョロQ ハイブリッド を遠隔操作しました。
今回はそれのまとめ記事です。
ソースはGithub上でライブラリ化したものとサンプルソースで公開してます。

使用方法は、これまでに紹介したとおりAndroid 3.1以上が必要です。
自分はOptimus Padでのみテストしてますが、おそらく他のタブレットでもいけると信じてます。

ライブラリの方はまだ詰めが甘いのでUSBのパーミッション取得用のBroadcastReceiverを正しく開放できていない状態です。
また、シリアル通信のボーレートの計算方法がいまいちわかっていないので今の所9600で固定値になっています。
APIにはsetBaudrate()は実装しているのですが、中身は見てもらってもわかるとおり空っぽです。

ライブラリの使い方はgithub上のUSB_Lib_sampleがわかりやすいかと思ってます。
UsbSerialManagerを使ってUSBシリアル通信ができるデバイスの一覧をgetList()を使って取得します。
取得してデバイスの一番最初のデバイスの使用許可を要求します。
要求すると、要求ダイアログがでます。



    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
        manager = new UsbSerialManager(this);
        if (serial == null) {
            List list = manager.getList();
            if (list.size() > 0) {
                Log.d(TAG, "Device count=" + String.valueOf(list.size()));
                UsbDevice dev = list.get(0);
                manager.requestPermission(dev, listener);
            } else {
                Log.e(TAG, "USB Serial Device not found");
            }
        } else {
            Log.e(TAG, "USB Serial Device has already got instance.");
        }
    }

要求が承認されるとコールバックが呼ばれるので、あとは、UsbDeviceからUsbSerialを生成して、オープンしてあげます。
この辺はちょっと苦肉の策を使っています。
    /** USBシリアル通信デバイスを使用するパーミッションを取得した際のコールバックリスナー */
    UsbSerialManager.OnGetPermissionListener listener = new UsbSerialManager.OnGetPermissionListener() {
        @Override
        public void onGetPermission(UsbSerial device) {
            Log.d(TAG, "onGetPermission");
            UsbDevice dev = device.getDevice();
            Log.d(TAG, "DeviceName=" + dev.getDeviceName());
            Log.d(TAG, "id=" + String.valueOf(dev.getDeviceId()));
            serial = device;

            try {
                serial.open();
            } catch (IOException e) {
                e.printStackTrace();
            }
            threadStart();
        }
    };

オープンすれば、あとはread()、write()で読み書きができます。
本当はストリームで実装しようと思ったのですが、ちょっとオーバーヘッドが大きかったので、手抜きしました。

今後はボーレートの計算とか調べようかと思います。

#以下アフィリエイト用の広告です

2011年11月5日土曜日

Arduino IDEのフォントを変える


ちょっとArduinoの開発環境のフォントがアンチエイリアスなしでギザギザして見難かったし、Ubuntuだと豆腐現象(日本語が文字化けして□に見える)に悩まされていたのでフォントを変えました。

その際の手順をまとめておきます。

Arduinoを立ち上げてFile > Preferenceを選ぶ


そうするとここでフォントサイズは変更できます。でもフォントを変えることができないので、画面内の「/home/<ユーザー名>/.arduino/preference.txt」をクリックする。
そうすると詳細設定を行えるテキストファイルの場所が開きます。

そうしたら、preference.txtはArduino IDEが起動していると編集しても、終了時に上書きされてしまうので、Arduino IDEを終了しておく。

Arduino IDEを終了したら、preference.txtを開きます。
開いたら、editor.fontとeditor.antialiasを以下のように編集します。
<フォント名>は使用したいフォント名を選びます。


editor.font=<フォント名>,plain,16
editor.antialias=true



編集したら保存してArduino IEDを再度立ち上げればOK

記事の先頭にある画像のように日本語も大丈夫です。


#以下アフィリエイト用の広告です

2011年11月2日水曜日

【使い方編】AndroidのUSBホストを使ってArduinoとシリアル通信 その2

前回ここで紹介されているAndroidとArduinoをUSB Host APIを使ってシリアル通信させるソースの動作テストをしました。

今回はメーリングリストでリクエストがあったので、それの使い方編をやろうかと思います。

紹介しているサイトを拙い英語力で読んでいると
http://www.intra2net.com/en/developer/libftdi/
ここで、libftdiのソースやバイナリがあり、
FTDIのドライバの動作について詳しくしりたいならソース読めって感じだった。

あと、rootedな端末であれば
http://android.serverbox.ch/?p=285
ここにドライバをカーネルに入れる方法が書かれてた。


それでは本題。

必要なもの
・Android 3.1以上のタブレット(自分はOptimus Padを使った)
・マイクロUSBからホストAへ変換するコネクタ
自分はOptimusPadに付いてきたものを使用
また、動作確認はしてないですが、Amazonでも売ってる様子
ELECOM Micro-USB(Aメス-MicroA)アダプタ 延長 0.15m ブラック MPA-EMA015BK
USB2.0ホストケーブル Micro-USB(Aメス-MicroB)アダプタ
・FTDI製のUSBシリアル変換チップを使った製品
動作確認したもの
・Arduino Duemilanove
Arduino pro mini 3.3VFT232RL搭載小型USB-シリアルアダプタ
動かないもの
・Arduino Uno
※Arduino UnoはUSBシリアル変換のチップがFTDIのものから変更されているのでそのままでは動きません

ソースのダウンロード
USBシリアル通信の方法はまず紹介しているサイト
Download the Android source
からソースをダウンロードしてきます。

適当に解凍して、Eclipseにプロジェクトをインポート。

FTDI_USBActivity.javaがソースで、こいつがほぼすべて。
private static final String VID_PIDを必要があれば書き換える。
でもおそらくFTDI製のチップであればそのままでも動くはず。

デバイスのVID、PIDの確認
念の為にPCにデバイスを接続して確認してみる。

自分のUbuntu 11.10ではコマンドで、
$ usb-devices
と打てば接続されているUSBデバイスの詳細情報一覧が取得できたので、

## デバイスを接続していない状態
$ usb-devices > usb_none.txt
## デバイスを接続した状態
$ usb-devices > usb_connect.txt
$ diff usb_none.txt usb_connect.txt

を行って差分を見て新しく接続されたデバイスを見つけて
Driver=ftdi_sio
になっているものを探した。

そうすると

< T:  Bus=02 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 12 Spd=12  MxCh= 0
< D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
< P:  Vendor=0403 ProdID=6001 Rev=06.00
< S:  Manufacturer=FTDI
< S:  Product=FT232R USB UART
< S:  SerialNumber=A700eYen
< C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=90mA
< I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
こんなのが見つかったので、VIDはVendor、PIDはProdIDが一致してたので問題ない。

もし、これでDriverはftdi_sioなんだけどVendorとProdIDが違う製品であれば
FTDI_USBActivity.javaのVID_PIDを変更する必要があります。

アプリの実行
インポートしたプロジェクトを実行

[2011-10-31 23:53:26 - FTDI_USB] ------------------------------
[2011-10-31 23:53:26 - FTDI_USB] Android Launch!
[2011-10-31 23:53:26 - FTDI_USB] adb is running normally.
[2011-10-31 23:53:26 - FTDI_USB] No Launcher activity found!
[2011-10-31 23:53:26 - FTDI_USB] The launch will only sync the application package on the device!
[2011-10-31 23:53:26 - FTDI_USB] Performing sync
[2011-10-31 23:53:26 - FTDI_USB] Automatic Target Mode: using device '192.168.11.3:8000'
[2011-10-31 23:53:26 - FTDI_USB] Uploading FTDI_USB.apk onto device '192.168.11.3:8000'
[2011-10-31 23:53:27 - FTDI_USB] Installing FTDI_USB.apk...
[2011-10-31 23:53:31 - FTDI_USB] Success!
[2011-10-31 23:53:31 - FTDI_USB] /FTDI_USB/bin/FTDI_USB.apk installed on device
[2011-10-31 23:53:31 - FTDI_USB] Done!

実行すると普通のアプリと違いDone!となりそのまま起動しません。
なのでアプリ一覧から起動します。
ちなみにUSBポートはシリアル通信用のデバイスとつないでしまってDDMSからログが見れなくなるので、無線LAN経由でADBが使用できるようにしておくとデバッグが便利です。
やり方としてはPCとAndroidをつないだ状態で
adb tcpip <ポート番号>
と実行し、PCからAndroidを接続を切った状態で(繋がってても問題は無い)
adb connect :<ポート番号>
と実行すればつながるはず。2.X系だとrootedじゃないとダメかも。

なにもAndroidタブレットにつないでいない状態だとlogcatに

11-02 21:34:49.952: D/FTDI_USB(11875): >==< no more devices found >==<

と出力される。
ただ、自分の環境だと変換ケーブルが悪いのかよく認識しなかった。
抜き差ししたりするとたまに治る。

うまいこと認識すると次の画面が出るのでOKを押す


ここで注意!
OpenAccessoryでは接続した瞬間にブロードキャストのIntentが飛んでブロードキャストレシーバーがそれを捕まえることでアプリが自動で立ち上がる仕組みができてましたが、なぜかこのアプリはそれが動きません。Optimus Padが悪いのかサンプルが悪いのかまだ詳しく追っていないのでよくわかりません。
なので、接続する際は次の手順がうまく行きます
USBデバイスを接続 → アプリ起動
この順番を守らないと上記の画面が出てきてくれません。


アプリは1秒間隔で0〜15までを順にカウントアップしています。
なので、今回はテスト用にArduinoに次のようなスケッチを書き込みました。

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

void loop() {
  int buf;
  
  if (Serial.available()) {
    buf = Serial.read();
    if (buf % 2 == 1) {
      digitalWrite(13, HIGH);
    } else {
      digitalWrite(13, LOW);
    }
  }
 
}

単純に受信したデータを2で割り、あまりが1だったら基盤に実装されているLEDをつけるだけです。
なので、1秒間隔でオンオフを繰り返すようになっています。



こんな感じで比較的簡単に準備は出来ました。
今後はこのサンプルソースを改良してライブラリをちゃちゃっと作っちゃおうかと思います。


#以下アフィリエイト用の広告です

2011年11月1日火曜日

ブログタイトルを変えてみた

前々からブログタイトルを変えたかったので、
ちょっと思い切って変えてみました。

「傘に骨はあるけど、お肉はどこにあるの?」
これが、自分が親に子供の頃に聞いた質問だそうです。
全く覚えてないですがこういう発想を自分は出来るんだってのを
忘れないためにもブログのタイトルにしてみました。

#以下アフィリエイト用の広告です

2011年10月31日月曜日

AndroidのUSBホストを使ってArduinoとシリアル通信

Androidの会のメーリングリストを見ていると気になる投稿があったので、早速試してみた。



Android USBを用いてシリアル通信を行う方法

https://groups.google.com/forum/?hl=ja#!topic/android-group-japan/eox6wGtMOSY

投稿の中で紹介されていたサイト
http://android.serverbox.ch/?p=370

上記のサイトを読む感じだとハニコムのUSB Host APIを使ってFTDIのチップと通信してるみたい。
とりあえずデスマが近いのでさくっとした動作確認だけしました。

追記
アプリ側は紹介されているサイトのままなので、シリアルからカウントアップした値を常に出し続ける。Arduino側は受信したデータを2で割ってあまりが1ならLEDをオンにするスケッチを書き込んだ。



Android
Optimus Pad(L-06C) 3.1

Arduino
・Arduino Duemilanove
・Arduino Pro Mini 328 3.3V 8MHz + FT232RL搭載小型USB-シリアルアダプタ 3.3V

Arduino UNOはUSB-シリアル変換のチップがFTDI製のものからATmega8U2
に変わっているのでそのままでは認識しない様子。
この辺ももしかしたらどこかに仕様が落ちてるかも。


#以下アフィリエイト用の広告です


2011年10月8日土曜日

Thunderbirdの送信メールの自動改行を無くす方法

自分の備忘録


メニューから
「ツール」→「オプション」



「詳細」で、「一般」のタブを選ぶ。

「高度な設定」の「設定エディタ」を選ぶ。



「about:config」は内部の定数などを編集するので間違えると深刻な問題を引き起こすので、
最新の注意を払って変更する。


「フィルタ」に「mailnews.wraplength」を入力し検索する。

出てきた設定名「mailnews.wraplength」を右クリックし、「値を変更」を選ぶ



入力ボックスを「0」としてOKを押す。

「about:config」を閉じて、「オプション」でOKを押すと設定が反映される。



#以下アフィリエイト用の広告です

2011年10月2日日曜日

Channel APIを使ってブラウザ経由でlogcatを見る


TLやらデ部やらで@tomorrowkeyさんがWebSocket使ってブラウザでLogcat見れるようなのを、
作ったってのを見て二番煎じしてみました。


サイト
https://iwata-n.appspot.com/logcat
上のURLをお好きなブラウザから見ればOK。
ただし、Androidで使っているアカウントと同じGoogleアカウントでログインしている必要があります。

ubuntu11.04 + chrome
mac 10.6 + chrome
Android 3.1 + ブラウザ
で動作確認しました。


アプリ
RemoteLogcat(マーケットへのリンク)
残念ながらGoogleアカウントを使っているのでIS01は動作対象外にしてしまいました。
誰か1.6で端末に設定されているGoogleアカウントのとり方教えてください。


使い方
使い方は簡単で、

  1. PC等でサイトにアクセスして、Androidと同じGoogleアカウントでログイン
  2. Androidでアプリを起動
  3. アプリにサイトでログインしたGoogleアカウントを設定する
  4. サービスのチェックを入れてサービスを起動する
  5. サイトが(゚д゚)ウマー

取りあえずで公開してみました。
反応を見てつくり込むか決めようかと思います。



参考
 Android1.6でも動く「オレオレC2DM」の実装
明日の鍵


#以下アフィリエイト用の広告です

2011年9月6日火曜日

Ubuntu11.04にArduinoの開発環境を作る

ちょっとデスクトップの環境をWin7からUbuntuに変更したのでその際のメモがわり。

Winやmacと同じようにArduinoを公式から環境を落としてきたらコンパイルができなかった。
おそらくコンパイラの設定を特にしていない状態だからまずいようだ。
なので、
 sudo apt-get install arduino
 sudo apt-get install arduino-core
と実行したが、これだとランチャーにショートカットをおいても起動できなかった。
なので、Ubuntuソフトウェアセンターからダウンロードしてくると、
コンパイルもできるし、ランチャーにショートカットをおいても起動できた。
ただ、微妙にアイコンが標準と違う気がするけど、気にしない。


追記
ライブラリとかを置くフォルダは
/usr/share/arduino
の下にある。

さらに追記
なぜか標準のリポジトリからダウンロードできるIDE(22)でUnoが使えない。
しかたがないので、ダウンロードして解凍したのを使う

#以下アフィリエイト用の広告です

2011年8月30日火曜日

横浜Androidプラットフォーム部第12回勉強会 メモ


@checkela
ゲーム屋的パフォーマンスチューニング(仮) & NDK本サイン会
@tetsu_koba
Google TV add-onのemulatorをいじってみた
@androidsola
OrigenBoardPandaBoardの比較(仮)
@roishi2j2
Android開発者のためのSoC入門(のようなもの)
@hermit4
init以前 – フラッシュメモリとfastbootをさわりだけ」 



ゲーム屋的パフォーマンスチューニング
@chechela
出村

フリーランス
東北
黄色いト○ピーみたいなアイコンの人
黄色いとげとげ→黄色いチューリップ

NDK本の執筆者

普通の奴らの下を行け

1clockの削減に命を削る世界は存在する

1GHz -> 0が9個

その1つがゲーム開発

なぜ1clockにこだわるのか?

1clock削るとゲームの操作性とかに影響
 UI操作が気持ちいい!
 
1万回通るなら1万クロック削減できる
 ある部分の1クロックを削る

3Dグラフィックスが特にそう
 PS3など
  1回の描画で1万頂点演算する
   1頂点の処理時間を短くすれば全体の処理が早くなる

場所を見極めてチューニングする

全体で1番時間がかかるのは描画処理

3Dはそんなに処理は無いからチューニングしやすい、結果が見やすい


どんなパフォーマンスチューニングをする?
 10年くらい前の知識かも

ゲームプログラマを10年ほど
SFC末期〜PS2初期頃まで

ゲーム機の歴史


SFC時代
 H/Wの上でアプリが動いていた
 H/Wがマイナーアップデート入ると後期のソフトほど互換テストするのが大変だった

 ハード特性を極限まで利用する手法
 処理速度はアルゴリズム、DSP(ファミコンソフト側)でカバー
  CPUクロックは早くない
  変態コードは存在する

 H/W特性を利用した例
  ラスタースクロール(DQのワープで波打つエフェクトの事)
   テレビの走査線(H-SYNC 水平同期)の割り込みを利用
  1/60秒で処理する
   すべての画面を書き換える時間(NTSC規格)
   海外のテレビだと仕様が違うから作り直したりする 

PS時代
 H/W上でOSが動いてライブラリがあってアプリが動く
 OS、ライブラリのレイヤーは薄っぺらい
 開発ハードルが下がった

 家庭用ゲーム機に3Dの波が
 RISC CPU(32bit)を搭載
 3D演算に特化したプロセッサを搭載
  DC、PS2、PS3も

 開発スタイルが変化
  CPU、メモリが劇的に変化
  8割〜9割はC言語でつくっていた。一部asm
  昔はROM、RAMを意識してプログラムしていた


 ハードウェアの変化
  CPU性能
   キャッシュ
   パイプライン
  デバイス間のBUS幅
  コンパイラ性能
  3D描画性能
  メモリ管理
  CD-ROMアクセス
   ノウハウが溜まってBGロードができるようになった
   SFCではなかった要素

 組み込み開発で役立つ
  CPU、コンパイラの話

 CPU性能
  ・キャッシュ
  ・パイプライン
  実行効率を決める要素
  
 キャッシュ
  メインメモリから直接データ取得
   メモリから取得している間にidleする
    メモリのアクセス速度はCPUの数十倍遅いから
    CPUの速度向上にくらべメモリの速度向上していない
    刺す枚数を増やしてごまかす
   L1キャッシュからデータ取得
    CPUとL1きゃっすは同クロックで動作するからCPUのidle時間が発生しない
    L1キャッシュは容量が小さい(32K)
    コードをキャッシュに載せられるか、ヒットさせられるかは腕次第
     1ループを小さくして参照するデータ量を減らす
      似たメモリアドレスにあるデータを処理する
    L1キャッシュを意識したプログラムを書く

 パイプライン
  1命令を13のプロセスに分割して処理
  →命令の実行効率を上げる
   ちょっとずつ並行して処理する
  F:フェッチ
  D:デコード    解析
  E:エグゼキュート 実行

 パイプラインの効率化
  パイプラインストール
   パイプライン処理の間延びの事(少し止まる)
    結果の依存性がある箇所で発生
     c=a+b
     e=c+d
    コンパイラ利用すると発生しない
     asmで書くとうっかりやっちまう
     Cで書くとコンパイラがそのへん理解して自動でやってくれる
    CPUの特性把握は必須
    プロファイラを利用するのも手

 動的分岐予想
  true/falseの分岐を予測して先回りしてパイプラインでデコード処理
  ヒット率向上がカギ
  予想を外すと影響がでかい
   13clockのペナルティ
  なるべく外さないコードを書く

 コンパイラ性能
  なぜ重要視するのか?
   そもそものRISCの概念
    1命令を単純化 → 実行を高速化
    コンパイラが頑張って命令配置
     CPU特性を活かすため
    ハード・ソフトからアプローチ
   コンパイラがへぼいとCPUを生かしきれない
   GCCを利用する
    クロスコンパイラ=GCC
   -O3をしても昔は最適化が甘かった
   すべてasmで書くのか?
    →現実的な量では無い
  いかに実行効率がよいコードをはかせるのか?
   人間が頑張るしかない

まとめ
  機械は人間の思いを理解してくれない
  人間が機械の思いを理解するしか無い
  チューニングは細かい作業の積み重ね

おまけ(学習手法)
  97年 → 書籍がほぼすべての情報源
       ハイパフォーマンスコンピューティング(RISC特有のチューニング手法を解説 絶版)
       MMXテクノロジオフィシャルガイド(SIMDを学ぶ)

  今はこの手の情報が減ったからNDK本買ってね。

FAQ
どうやったらコンパイラの気持ちがわかるの?
 コンパイラがだしたコードを読んでみると特徴が分かってくる
  どこで無駄が出てるとか。
 コンパイラに色々な情報を追加して人間の思いをつたえる
 相手をよく知ること!

SIMDの考え方はNEONとかでも変わらない?
 実装されている命令は変わらない
 特徴的なのは、命令に合わせたアルゴリズムを考えないといけない。そうしないとNEONの特徴を生かしきれない。




Tweaking Google TV emulator
@tetsu_koba

Google TVのアドオン
KVMの説明
やってみたこと
 NDKが動かなっかったのはなぜか?

Google TVアドオン
 code.google.com/tv/android/docs/gtv_addon.html
 Android SDK上で動く
 Javaのアプリが動くけどUIを変えてねって趣旨のページ
 
 FAQページ
  Android 3.1
  NDK動かない
  chrome 11(Linux用)
  Flash 10.1
  Native Clientはあとで実装する
  HTML5のVideoタグのH.264サポートを続ける
  
 ターゲットCPU x86 atom
 KVMが必要
  リナックスの技術
  Windowとmacは今はサポートしない
   そんな簡単に移植できないだろ
 Open GLつかって描画
  GPUで動いていない
  画面サイズでかい、3Dガリガリ使うから遅い
   HOST側のGPUにエミュレータの情報を食わせるエミュレータを作ってる

 Kernel Based Viertual Machine
  VMとかViertual Boxみたいなもの
 Intel VTとかADM_V
 ゲストCPUとホストCPUが一緒である必要がある
 KVMはQEMUと一緒に使う
  www.linux-kvm.org/page/Main_Page

 KVMがどんなふうに動くか
  QEMU
   すべての命令をエミュレート
   MMU(仮想メモリのハードウェア支援)もソフトウェアでエミュレートしてるから遅い
  QEMU + KVM
   普通の命令はCPUでそのまま実行
   IO命令、状態を変えるような命令を何らかの仕組みでフックして特別な割り込みをしてKVMの本体が差し替えて動作さるようなイメージ
   95%くらいは普通のCPUで動いている
    だから速度向上が見込める
 
 KVMのセットアップ方法(Ubuntu)
  sudo apt-get install kvm

  Ubuntu 10.04
   sudo chmod a+rw /dev/kvm
  Ubuntu 11.04では必要ない
  gtv_emu**.html

 速度比較
  Ubuntu 10.04 KVM無効 52秒
         KVM有効 32
  Wubi  11.04 KVM無効 52
      11.04 KVM有効 17

  新しいカーネルを使ったほうが速度が上がるのかもしれない


NDK
 NDKr6からはx86をサポートしている
  armとx86を同時につくるとおかしくなる
 AOSPのマスターのソースからx86のエミュレータがビルドできる
 NDK for x86はちゃんと動いている

 Google TVのランタイムはandroidとだいぶ違っている
  Vynamic linkerとかlibcがbionicじゃない
  ソースを見た感じglibcじゃないかな?
  NDKr6はbionic向けだからglibcじゃ動かない

Google TV emulatorをWin7上で動かす
 KVM無効でも動くからwin7でも動くんじゃないか?
 
 eulator executable (QEMU + KVM)
 Linuxカーネル
 target file system
 Skin image files
 AVD file configure
 onley (1) depends on host OS

 起動方法
  Android SDK for windowsにはemulator-86.exeがある
  Linuxで作ったエミュレータをコピーする
  iniファイルにパスが入ってるからwin用にパスを変更する
  eclipseからは起動出来ないから、コマンドラインから起動する
   emulator -avd
  起動するけどむちゃくちゃ遅い

参考資料
 KernelVM探検隊
 てつこばさんのサイト

デモンストレーション
 仮想マシン上ではKVMが動かない
 画面構成はDirectFDからSurfeceフリンガーに変わった

FAQ
 QEMUのイメージをVM用のイメージに変えればいけるんじゃない?
  ぜひやってみてください


OrigenBoardとPandaBoardの比較(仮)
@androidsola

OrigenBoardとPandaBoard
似たようなスペックと価格だったから比較してみた

PandaBoard
 CPU:OMAP4430 Dual Core 1GHz
 メモリ:DDR2 1GB
 GPU:PowerVR SGX540
 無線・BTが付いている

OrigenBoard
 CPU:Exynos4210
 メモリ:DDR3 1GB
 GPU:Mali-400
 CPU基板が取り外しができる
 無線・BTが付いている
 
ベンチマークソフト
 Quadrant Standard
  CPU、メモリ、I/O、2Dグラフィック、3Dグラフィックの総合結果
 0xBenchmark
  村長がよく使ってる
 AnTuTu Benchmark
  Pandaで落ちたから不採用
 Neocore

結果
 PandaはNSに劣る
  解像度のせいかも・・・
 解像度を変えても遅い
  解像度が何故か1680×1080でだしてた・・・
 解像度を1024*600にしてもOrigineBoardの方がいい




Android開発者向けSoC入門(のようなもの)

目標
Xoomはギャラタブ10.1でNEON命令が使えなくなった事情を理解する

NEONとは
 ARMのSIMD拡張命令の1つ
 マルチメディア向けの命令

SoCとは?
 System on Chipの略
  昔はボード上に実装していた回路を1chip化したもの

Tegra2の構成
 CPU
 キャッシュ
 GPU
 バス AMBA
 などなど・・・

Tegra2のコピーを作ってみよう

そもそもどうやってSoCをつくるのか?
大規模ソフトを開発する場合は?
 まったくの新規開発でなければパッケージやライブラリを買ってきて手を加える
 新規開発でもOSを1からつくることはめったにないでしょ?

H/Wも一緒
 CPUはNVIDEAから買う
 DDR2 I/Fはxxx社から買う
 USB I/Fはyyy社から買う
  ・・・

なぜTegra2にNEONを入れなかったのか?
 NEON命令を処理する回路をレイアウト出来なかった。
  その分だけチップサイズをでかくしてもいいけどうまく収まるとは限らない
  矩形のフロアプラン問題はNP困難

SoCの製造って?
 シリコンウェーハから切り出す

課題
 チップをでかくするとどうなるのか?
 有効面積問題
  丸から四角を切り出すから使える面積な問題がある
   4.9mmから5.2mmに変更するとどうなるのか?
 歩留まり問題
  300mmウェハ1枚あたりに数十個の微細なゴミが落ちているとする。
  ゴミを含むチップは不良品
  4.9mmから5.2mmに変更するとどの程度影響するか?

ARMから買ってきたCPU
 TSMC 40Gハードマクロ実装で2GHzの標準動作を実現する卓越したパフォーマンス
 TSMCは世界的に有名な半導体製造メーカー
 40G : 40nmプロセスのハイパフォーマンス版

しかしTegra2はTSMC 40LPで生産
 40LP : 低電圧版

IP(Intellecual Property)
 知的財産権
 日経新聞では「設計済み回路ブロック」
 半導体業界では通信プロトコルは「TCP/IP」と読んで使い分ける
 ハードマクロ
  配置・配線が完了しているモジュール
  物理的な制約(デザインルール)が満たされている
   ゲートの大きさ、素子間の距離、配線間隔
   デザインルールを満たすラインでしか製造出来ない
   Tegra2の場合:TSMC 40LPのハードマクロが必要
 ソフトマクロ
  配置・配線を行う前のモジュール
  素子の間の接続情報だけが記述されている
   ネットリストと言うこともある
   手間暇かければ解析できるかもしれない

ソフトマクロとハードマクロ
 ソフトマクロ(Verilog等)
 ハードマクロ(GDS2等)

買ってきたIPを修正
 ソフトの場合、ソースコードを書き換えることで修正
 ハードマクロの場合は形状固定でブラックボックス
 ソフトマクロは自由にレイアウト、頑張れば解析可能
 IPベンダーはソフトマクロは売りたがらない

IPを組み合わせるには
 全体の仕様を決める
 接続部分のRTLを書く Register Transfer Level
 論理合成する 合成した出力はソフトマクロと等価
 配置配線する
 レイアウト後に検証

ハードの検証
 シミュレーション
  PC上でクロックを与えて回路を実際に動かす
   最新のハイスペックPCでもせいぜい100Hz
   遅いので回路全体を動かすのはまれ
   デバッグ用のコードを任意の場所に挿入できる
    買ってきたIPではできない
    IPにも普通にバグがあるのでIPベンダはソースに検証用のコードを入れておくのが一般的
 エミュレーション
  エミュレータという専用装置を使う
  数十KHzでる
  内部状態の参照に制限がある
 実機

Tegra2にNEONがない理由は?
 *根拠はない
 
 レイアウト上の制約
  そんなにNEONの実装面積でかいのか?
 ARMが「NEON入りのA9ハードマクロ」を高く売っている
  NEON無しIPって価値があるのか?
 実はNEONが載っているけど、マスクされているとか?
  ありそうな話:NEON命令を実行したらバグがでた
  


 
 

2011年8月10日水曜日

2011年8月4日木曜日

第11回レスキューロボットコンテストの中の人やってきます

8月6日〜7日に神戸サンボーホールで開催される第11回レスキューロボットコンテストで
中の人をやってきます。

Rescue Robot Contest(公式ホームページ)

当日1階の展示ブースでABCなどで展示したAndroidから操縦できるカメラ付きラジコンを
Windowsから操縦できる走行体験コーナーもやってます。
そこら辺をうろうろしている私に声をかけてもらえればWindowじゃなくて、
Androidから操縦できるようにしますよー。

ぜひいらしてください。

#以下アフィリエイト用の広告です

2011年7月18日月曜日

横浜PF部 第11回メモ


@sekitoba
はじめよう!プラットフォーム Kernel2.6のマルチプロセッサー対応その3(仮)
@akryokoyoko
その後の現状での活動報告(USBの表面的なこと)
@magoroku15
Androidの入力システム(仮)
@l_b__
OpenBinder Android IPCの2回目 

メモ内容はつづきへ


2011年7月16日土曜日

Android Bazaar and Conference 2011 Summerで講演/出展します



半年に一回のペースでやっているABC
今回はついに講演者側に回ることになりました。

Robotトラックの15:00〜のロボットサミットで登壇します。
16:00ごろからの予定です。
その後にパネルディスカッションの予定です。
興味のあるかたはぜひいらしてください。
http://www.android-group.jp/abc2011s/conference.html#robot

また、当日はバザールで、横浜ロボ部としてブースをだしています。
こちらは、8号館の3Fコミュニティーブース3でだしています。
今まで作ったロボとかチョロQとか持っていく予定です。
http://www.android-group.jp/abc2011s/bazaar.html


Android Bazaar and Conference 2011 Summer
http://www.android-group.jp/abc2011s/


#以下アフィリエイト用の広告です

2011年7月15日金曜日

MicroBridgeでADKのアプリインストール動作を真似る

ADKでは対応するアプリがインストールされていなかったら
自動でマーケットへ飛ばしてくれるらしいです。
ADKを使える端末を持っていないのであくまでらしいです。

神戸支部のMLで日曜エレクトロニクス(日エレ)の管理人の石井さんの投稿を見て
そんな機能をMicroBridgeでも作れないかとインスパイアさせて頂きました。

やり方は至って簡単で、adb shellのamコマンドを使って起動したいアプリをintentを使って
起動しようとします。
もし、アプリが起動したらバンザイ。それでおしまい。そのままお好きに通信開始。
アプリが起動出来ないと、amコマンドが色々とエラーを吐いてきてくれます。
エラーが出てたら、そのままamコマンドでマーケットへ飛ばしてあげるだけです。
小さいapkファイルだったらそのまま書き込みをしてみてもいいかもしれないです。

これで、ABCや、マイスマではチョロQ展示用の端末を自前で用意しなくても
来場者の端末を使って操縦できそうです。

最後に動作している動画です。


#以下アフィリエイト用の広告です

2011年7月10日日曜日

MicroBridgeを使ったスケッチのテンプレート

MicroBridgeを使ったスケッチのテンプレート。


#include <spi.h>
#include <adb.h>

// ADB接続
Connection *connection;

// ADB接続のイベントハンドラ
void adbEventHandler(Connection *connection, adb_eventType event, uint16_t length, uint8_t *data) {

  if (event == ADB_CONNECTION_RECEIVE) {

  }
}


void setup(){

  // ADBの初期化 
  ADB::init();

  // ADB接続の開始
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler);  

}

void loop() {
  // ADB接続のポーリング
  ADB::poll();
}



Arduino pro miniでADK互換ボードを構成する

どうもArduino UNOだと大きいのでArduino pro miniを使って小さく構成してみました。

といっても市販品?で構成できるので簡単でした。

構成部品

  1. Arduino pro mini
  2. FT232RL搭載小型USB-シリアルアダプタ 3.3V
  3. USB Host Shield for Arduino Pro Mini


Arduino pro miniはスイッチサイエンスで購入。
注意点として3.3V版を購入すること。

FT232RL搭載小型USB-シリアルアダプタ 3.3Vはスケッチの書き込みで使います。
間違って5V版を買わないこと!

USB Host Shield for Arduino Pro MiniはCircuits@Homeで購入。
何故か国内で取り扱っている店が無いので、海外から購入。
海外からの発送なので1週間ほど時間がかかります。
ちなみに自分はFlat Rateで発送してもらいました。
Paypalで購入したら荷物番号みたいなのを送ってきてくれたのですが
USPSで追跡はできなかったです。
Expressだともっと早いし追跡できるのかな?

上から

横から

組み合わせてみるとこんなくらいのサイズ。
ジャンパが基板表面上にあるみたいで、どう影響するかいまいちわからなかったので
コネクタを使ってArduinoとシールドを外せれるようにしておいた。
でもそのまま使えたので、2セット目はそのまま直結してもよさそう。

これでテストでLogcatのサンプルを書きこんでみたら
そのまま動いた。

とっても簡単でした。

2011年7月2日土曜日

ADKリファレンスボードでMicroBridgeを使う

神戸支部の吉田さんからGalileo 7 ADK Main BoardでMicroBridgeが使えないか?と頼まれたので
いろいろと調べてみました。

Galileo 7 ADK Main BoardはADK互換ボードでサイズはUNOを少し大きくした感じです。
詳しくはこちら

肝心のMicroBridgeを使う方法ですが、拍子抜けするくらい簡単でした。

まずArduinoのライブラリフォルダにMicroBridgeのライブラリを追加します。
追加方法は過去記事を参考にしてください。

過去記事の「Arduinoのライブラリをインストール」が終わったら、
ARDUINO/librarys/Adk/max3421e.h
を編集します。

max3421e.hをひらいて、


#include "max3421e_constants.h"
#include "pins_arduino.h"





#include "max3421e_constants.h"
#include "pins_arduino.h"
#define ADK_REF_BOARD

としてください。
あとは、過去記事と同じようにlogcatのデモを実行すればAndroidのログが見れます。



おそらく

PIN_MAX_SS、PIN_MAX_INT、PIN_MAX_GPX、PIN_MAX_RESET
でピン配置を決定しているのだとわかるのですが、SPIの端子はどこで設定しているのか
よくわかりませんでした。そのあたりがわかればもう少し自由が効くようになりそうなのですが・・・



2011年6月27日月曜日

AndroidのMonkeyRunnerを使うためのメモ

自分用のメモ

MonkeyRunnerは自動テストツールらしいよ。

使うためには/tools/monkeyrunnerにJythonでかいたソースを投げればいい。
Activityの起動はintentで直書きするのと似た書き方

2011年6月20日月曜日

AndroidからAndroidの乗ったロボを操縦する


ABC2011sへ持ってく予定の新作です。
端末がいっぱいあったので、タブレットからAndroid携帯とBluetoothで通信して、
Android携帯からはMicroBridgeを使ってArduinoと通信するといった構成で
遠隔操縦ロボつくりました。

詳細は続きから

2011年6月10日金曜日

Amazonで買えるArduino関連商品

Amazonで買えるArduino関連商品をまとめた

・本体
Arduino Uno
¥2,995
言わずもがな、一番大切な本体。一番最初に買うなら一番オススメ。Unoからドライバを入れないとWinで認識してくれない。Macは何故かモデムとして認識する。

Arduino Fio
¥2,495
Zigbeeとかバッテリーが必要だとかで追加で買う物があったはず。

Netduino
¥3,495
.Net環境で開発ができる変わり種。一番最初に買うのはあまりオススメしないかな。
でもVC#で開発ができて、ステップ実行とかできるのでデバッグがすごく遣り易いらしい。

Seeeduino328

¥3,200
Arduino 互換らしいけど詳しくはしらないな。

Arduinoをはじめようキット
本当はこのキットがオススメなのだが、最近ずっと売り切れになってる。
ブレッドボードやLED等があってすぐに遊べるキットになってる。


・シールド
LCDシールドキット
¥1,980
ちょっと興味があるかな。まんまLCDを表示するためのシールド。

Arduino用ユニバーサル基板 UB-ARD01
¥704
自分で作った回路を載せるための基板

Arduinoイーサネットシールド(microSDスロット付)
在庫切れ
便利。Arduino に有線LANをつなぐ事ができる。ただノイズに弱いのか電源が貧弱なのかモータードライバと一緒にして動かすとリセットがかかってしまい使えない。
サーボ、LEDなら大丈夫だった。
PLANEX 手のひらサイズ 300Mbps ハイパワー無線LANルータ/アクセスポイント/コンバータ FFP-PKR01と組み合わせれば、無線LAN化してArduino とAndroidを繋げられる。

・その他
RBT-001 Bluetooth evaluation kit
Bluetoothをシリアル通信化してくれるキット。技適もとってるから安心。

Prototyping Lab Kit Vol.1
Prototyping Lab Kit Vol.2
正直バラで買ったほうがオススメ。






2011年5月27日金曜日

AndroidとArduinoを使ってチョロQを操縦する ソース公開編



AndroidとArduinoをUSBホストシールドを使って通信するMicroBridgeを利用して
チョロQを操縦するアプリのソースを公開しました。
先人の知恵をお借りすることで簡単に操縦が出来ました。

http://code.google.com/p/iwatan-lab/downloads/list

ArduinoにMicroBridgeのライブラリを追加する方法は
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
を参照してください。


Google Codeで公開しているのはAndroid側のアプリのソースです。
Arduino側のソースはここを参考にさせて頂いているので改変部分のみ公開します。

以下のソースに参考元からコピペで追加してください。

  • void setch(byte bb)
  • void setbit(byte bb)
  • void execpwm()
  • void setpwm(int pwm)
  • void runpwm()
  • void sendpwm()

#include <spi.h>
#include <adb.h>

#define LED 2


// Adb connection.
Connection * connection;

int data[15];
int g = 0;
byte b = B001111;

// Event handler for the shell connection. 
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data) {
  
  // Data packets contain two bytes, one for each servo, in the range of [0..180]
  if (event == ADB_CONNECTION_RECEIVE) {
    char ch = data[0];
    Serial.println(ch, DEC);
    if (ch < 0x20) {
        setbit(ch);
    } else {
        setch(ch - 0x20);
    }
  }
}


void setup(){
  Serial.begin(57600);
  Serial.println("Ready"); 
  pinMode(LED , OUTPUT);
 
  // Initialise the ADB subsystem.  
  ADB::init();

  // Open an ADB stream to the phone's shell. Auto-reconnect
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler);  
 
}

void loop(){
  
  // Poll the ADB subsystem.
  ADB::poll();
}

ここまでやっておいてなんですが、やはり標準のコントローラーの方が操縦しやすいです。

2011年5月26日木曜日

AndroidとArduinoを使ってチョロQを操縦する その2

AndroidとArduinoを使ってチョロQを操縦する
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)

上の続きです。

!追記
この記事のソース公開編

TVの音入っちゃってるけど気にしない。




配線を少し綺麗にしました(前のでは切れちゃったから)
アプリ側では複数チャンネルに対応して、チャンネルを切り替えることで
複数台のQステアを操縦することができるようにしました。
また、トグルボタンでターボのオン/オフも切り替えができるようにしました。
これで、Qステアへの充電以外の機能はすべて実装しました。

Qステアも少しドレスアップしちゃいました。


ボディを開けて、LEDを仕込みました。




2011年5月23日月曜日

AndroidとArduinoを使ってチョロQを操縦する

AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす

土日試した上の記事をもとにAndroid(IS01)を使ってQSteerを動かしてみました。
IS01には赤外線通信機能がついてはいますが、独自の信号を出すことが出来ないので諦めていましたが、ここに来て思いが再燃してきました。
わざわざIS01を使ったのは1.6でも動くことの確認とIS01だって未来へ行くことができることの証明です!



用意するもの
・日本が世界に誇るHENTAI端末 IS01
Arduino
・Arduino USBホストシールド
Qステア

Arduinoが約3000円、ホストシールドが約2500円、Qステアが約1500円なので、合計7000円ほどです。あと動画だとモバブー使ってますが、普通にPCのUSB電源からでも動きます。
ただ、このUSBホストシールドはここを参考にして電源周りをすこし修正しています。
半田をすこし触ったことがある方ならそんなに難しくはないと思います。
自信がない方はArduino用に外部電源を用意する必要があります。

Qステアとは赤外線で操縦するチョロQの事です。通信規格もいろいろな方が解析しているようで、公開されています。
参考にしたのはここです。
あと、Arduinoのスケッチの実装はここを参考にさせて頂きました。

コードはまだ完成していないので今回は載せませんが、比較的簡単に実装できてます。
先人の方々の知恵があるおかげで簡単にQステアが動かせました。
動作のイメージとしては

  1. AndroidのonKeyDownメソッドで上下左右のキー入力を受け付ける
  2. MicroBridgeを使用してArduinoへ押されたキーの情報を送信
  3. Arduinoが受信したキー情報に対応する情報を赤外線で送信
  4. Qステアが勝手に動く

といった流れです。
ただ、onKeyDownメソッドを使用しているので、長押しを検出するまで時間がかかり、
少し動いたと思ったら止まってしまい、しばらくしたら動き続けるといった少し怪しい動きになってしまっています。

2011年5月22日日曜日

AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす

Arduino側は File -> Example -> Adb -> Demoのスケッチをそのまま使用します。

Android側のアプリには少し手を加えました。
フォーマッタもmicrobridgeのArduinoに近いフォーマットからAndroidのフォーマットへ変更

MicroBridge.java
初期化方法の変更
元のソースだとコンストラクタを使ってArduinoとの通信を行うServerを初期化してたのですが、
それをonCreate()へ移動した。理由はなんとなく。

シークバー周りでの変更
シークバーの最大値を制限するあたりがスマートじゃなかったので、
SeekBar#setMax()で最大値をきって、Arduinoへの信号の送信もString#format()から変更
(String#format()は処理が遅いから)

seekBar.setMax(180);

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
    publicvoid onStopTrackingTouch(SeekBar arg0) {
    }

    publicvoid onStartTrackingTouch(SeekBar arg0) {
    }

    publicvoid onProgressChanged(SeekBar v, int progress, boolean flag) {
        try {
            byte[] data = {
                (byte) progress, (byte) progress
            };
            server.send(new String(data));

        } catch (IOException e) {<
             Log.e("SEEK", e.toString());
        }
    }
});

Server.java ・Server#addListener()でのエラーに対処 理由は良く解らんが、なぜかMicroBridge.javaで、Server#addListener()を呼ぶと ClassCastExceptionがでたので、とりあえずの対処。 元ソースだとTreeSetを使ってリスナーの管理をしているのだが、 多分Listでも動くだろうと思って変更。 TreeSetを使ったことがないのでなんでClassCastExceptionがでたのか理解は出来なかったけど、 Listにしても問題なかったのでいいのかな?
// private TreeSet<serverlistener> listeners = new TreeSet<serverlistener>();
private List<serverlistener> listeners = new ArrayList<serverlistener>();
とりあえずこれだけAndroid側のアプリには変更を加えて実行。



動作確認した動画


2011年5月21日土曜日

AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)

巷はにわかにADK(Android Open Accessory Development Kit)で盛り上がっている中、
自分はN1やNSを持っていない為このBIG WAVEに乗りきれていません。
悔しいのでADKを使わなくてもAndroidとArduinoをつないでBIG WAVEにあやかろうと思います。


準備するもの(ハードウェア編)
  1. Android(できればDesire HD
  2. Arduino UnoかDeicimila。Megaとかでも動くみたい
  3. USBホストシールド(スイッチサイエンス千石電商
  4. USBホストシールドをArduino本体とつなぐ連結用のピン
これだけです。USBホストシールドは千石電商の店頭で購入しましたが、
連結用のピンが実装されていなかったので、これは個人でやらないといけなさそうです。



準備するもの(ソフトウェア編)
  1. Arduinoの開発環境
  2. MicroBridgeのライブラリ
今回はArduinoでAndroidのlogcatを表示しようと思うので、特にAndroid側のソフトはつくりません。


Arduinoのライブラリをインストール
MicroBridgeのダウンロードのページ(http://code.google.com/p/microbridge/downloads/list)からMicroBridge-Arduino.zipをダウンロードしてきます。
解凍したらARDUINO/librariesの下にAdbというフォルダ名でソースを配置します。


logcatサンプルの実行
Arduino IDEを起動して File -> Example -> AdbからLogcatを選択して、サンプルを開きます。
開けたらコンパイルして、Arduinoへ書きこむ。


logcatを見る
ターミナルやシリアルモニターを起動して、通信レートを57600に設定する。
そしたら、AndroidとUSBホストシールドとをつなぐとLogCatが出力されてくる。



動作確認した端末の結果
Desire HD 正常に動作した
Optimus Pad デバッグ接続まで行ったが、logcatのメッセージが出力されなかった
Xperia mini pro うんともすんとも言わない



まとめ
非常に簡単にArduinoとAndroidがつながりました。
USBホストシールドはADKでも使うので、もしDesire HDに2.3.4が降ってくるなんて
奇跡が起きたとしても今後使えるので購入しても良いかと思っていた程度でしたが、
意外とこのままでも使い物になるんじゃないかと期待ができそうです。


2011年5月17日火曜日

Optimus Padのケース

Optimus Padのケースを2つほど試してみました。
レザータイプとラバーコーティングタイプの2つです。
シリコンタイプはしばらく使うとべろべろになっちゃうので論外です。キリッ!

ラバーコーティングタイプ



本体を買うのと同時に買ったやつです。
プラスチック製で意外としっかりとハマる感じです。
手に持った感じサラサラでいい感じです。

・Good
ラバーコーティングタイプのいいところはやはりしっかりした作りです。
あと、重さもそれほど増えず、サイズもほぼ変わらないのがよいです。

・Bad
単体で立てることができないので、何かにもたれるようにしないといけないです。


レザータイプ



革製(人工かな?)でちょっと高級感ある感じ。
入れると本みたいな雰囲気になります。

・Good
高級感ある。単体で画面の保護もするので、かばんに無造作に入れることができる。
単体で立てることができるので動画見る際には便利。

・Bad
でかい。分厚い。重い。ちょっといただけない3拍子です。
あと、致命的なのが、立てるとUSB端子がそのまま刺さらないこと。
開発をやる際にはいただけないです。


あまり種類がないOptimus Padのケースですが、2つほど試してみてやはり、ラバーコーティングタイプがいい気がします。ただ、単体で立てれないので、何かしらグッズが必要そうです。

2011年5月2日月曜日

macでjavaのsplitを使うときの注意

macでjavaのsplitを使う際にハマりました。
splitに限らず正規表現での問題なんですが、エスケープ文字が「¥」だと思っていたら、
「\(バックスラッシュ)」じゃないと認識してくれないようで、ハマりました。
多分winの人から見るとわからない問題かもしれないです。

これだと動く
String url = "www.blogger.com";
String[] s = url.split("\\.", 0);


これだとダメ
String url = "www.blogger.com";
String[] s = url.split("¥¥.", 0);

2011年4月29日金曜日

javadocのdocletをEclipceで作る

自分用のメモだけど、javadocのdocletをちょっと作る機会があったのでメモ。


ここを参考にした
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javadoc/doclet/overview.html


Eclipseだと文字エンコードで怒られなくなる。なんでだろ?


・ListClass.java
ソースに含まれるクラスを標準出力へ吐き出してくれる。
パッケージをデフォルト・パッケージにすると実行時に楽みたい

import com.sun.javadoc.*;

public class ListClass {
    public static boolean start(RootDoc root) {
        ClassDoc[] classes = root.classes();
        for (int i = 0; i < classes.length; ++i) {
            System.out.println(classes[i]);
        }
        return true;
    }
}
・プロジェクトの実行の構成を変える メイン・クラス com.sun.tools.javadoc.Main 引数 -docletpath ${workspace_loc:doclet/bin} -doclet MyDoclet -sourcepath ${workspace_loc:対象になるソース} -subpackages パッケージ名 -private 


2011年4月26日火曜日

ByteBufferの速度

ByteBufferはプリミティブな型の数値からbyte配列を簡単につくってくれる。
だけど、ByteBuffer.classの中身を見るとabstractとか使ってたりインスタンス生成したりするので意外とコストがかかる。
なので、自前でビットシフトを使って作ったメソッドを作ってみた。ByteBuffer.classの中身を追った感じは同じ用な考え方で実装してた。
速度を測ってみたら自前でつくったメソッドの方が早く動作した。

・Main.java
ByteBufferと自前でビットシフトをするメソッドで1000000回変換した場合の時間を測定

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {

        final int LOOP = 1000000;
        final int value = 0x12345678;

        ByteBuffer buf = ByteBuffer.allocate(16);
        buf.order(ByteOrder.LITTLE_ENDIAN);
        byte[] dat = new byte[16];

        long s_time = System.nanoTime();

        for (int i = 0; i < LOOP; i++) {
            DataConverter.setValue(dat, 0, value);
            DataConverter.setValue(dat, 3, value);
            DataConverter.setValue(dat, 7, value);
            DataConverter.setValue(dat, 11, value);
        }

        System.out.println("Convertor:" + (System.nanoTime() - s_time) / LOOP);

        for (int i = 0; i < dat.length; i++) {
            System.out.format("%02X ", dat[i]);
        }
        System.out.println();
        System.out.println();

        s_time = System.nanoTime();

        for (int i = 0; i < LOOP; i++) {
            buf.putInt(0, value);
            buf.putInt(3, value);
            buf.putInt(7, value);
            buf.putInt(11, value);
            // byte[] d = buf.array();
        }
        System.out.println("ByteBuffer:" + (System.nanoTime() - s_time) / LOOP);

        byte[] d = buf.array();
        for (int i = 0; i < d.length; i++) {
            System.out.format("%02X ", d[i]);
        }

    }
}
・DataConvertor.java
public final class DataConverter {

    /** int型のバイトサイズ */
    private static final int SIZE_INTEGER = Integer.SIZE / Byte.SIZE;

    /** マスク */
    private static final int MASK = 0xFF;

    public static void setValue(final byte[] dest, final int offset, final int src) {
        for (int i = 0; i < SIZE_INTEGER; i++) {
            dest[offset + i] = (byte)(src >> Byte.SIZE * i & MASK);
        }
    }
}
●結果
Convertor:56
78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00

ByteBuffer:130
78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00
どちらも出力の形は一緒になったけど、時間に差が出た。 10回やってみた結果。
cnt = 1
Convertor :  54ns
ByteBuffer: 139ns
cnt = 2
Convertor :  53ns
ByteBuffer: 130ns
cnt = 3
Convertor :  49ns
ByteBuffer: 131ns
cnt = 4
Convertor :  50ns
ByteBuffer: 134ns
cnt = 5
Convertor :  50ns
ByteBuffer: 129ns
cnt = 6
Convertor :  50ns
ByteBuffer: 130ns
cnt = 7
Convertor :  52ns
ByteBuffer: 131ns
cnt = 8
Convertor :  50ns
ByteBuffer: 127ns
cnt = 9
Convertor :  50ns
ByteBuffer: 131ns
cnt = 10
Convertor :  50ns
ByteBuffer: 131ns

2011年4月24日日曜日

JavaのMapの動作

ちょっとJavaでMapの動作について気になったからテストしてみた。
気になったことはMapに同じキーでputしてからgetするとデータはどうなっちゃうのかなって。
結果としては、Mapはあとから同じキーでputされると以前設定されていた内容に上書きしてくれる。
Javadocにもそう書いてあった。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Map.html#put(K, V)

Map map = new HashMap();

map.put(1, "1st");
map.put(2, "2nd");
map.put(3, "3rd");
map.put(4, "4th");
map.put(5, "5th");
map.put(6, "6th");
map.put(1, "いち");


for (int i = 1; i <= 6; i++) 
{
      System.out.println(map.get(i)); 
}  

2011年4月23日土曜日

Javaのコールバック

abstractでextendsしたクラスへのコールバック?と、interfaceを使ったコールバックだとabstractの方が早い。
Core-i5で5倍ほど差が出た。
多分Android上だともっと差がでるんだろうかな。




・AbstractThread.java
public abstract class AbstractThread extends Thread implements Runnable {

    abstract public void run();

}

・CallbackThread.java
public class CallbackThread extends Thread implements Runnable {

    public interface CallBack {
        void onCallback(int value);
    }

    private CallBack lis;

    void setCallBack(CallBack listener) {
        this.lis = listener;
    }

    @Override
    public void run() {

        long startTime = System.nanoTime();
        for (int i = 0; i < Main.LOOP; i++) {
            if (lis != null) {
                lis.onCallback(i);
            }
        }

        long procTime = System.nanoTime() - startTime;
        System.out.println("Callback:" + procTime / Main.LOOP + "[ns]");

    }

}
・Main.java
public class Main {

    public static void main(String[] args) {

        CallbackThread thread = new CallbackThread();

        CallbackThread.CallBack call = new CallBack() {

            @Override
            public void onCallback(int value) {
                // System.out.println(value);
            }
        };

        thread.setCallBack(call);
        thread.start();

        AbstractThread athread = new AbstractThread() {

            @Override
            public void run() {
                long startTime = System.nanoTime();
                for (int i = 0; i < LOOP; i++) {
                    // System.out.println(i);
                }

                long procTime = System.nanoTime() - startTime;
                System.out.println("Abstract:" + procTime / LOOP + "[ns]");
            }
        };
        athread.start();
    }
}

2011年4月12日火曜日

XOOMとOptimus Padを触ってみた

Optimus Padを買いました。
そしたら後輩がXOOMを買いました。

なので、ちょっと触って比べてみた。

・大きさ
XOOMは画面が10.1インチでOptimus Padは8.9インチ。
ただし、寸法的にはXOOMが幅で1センチほど大きいだけ。
大きさとしてはほぼ同じくらいに感じました。
それでも、XOOMはOptimusよりもでかい画面なので、画面周りの枠が細かったです。

・画面
そのサイズの違う画面。
輝度としてはXOOMの方が少し暗い感じ。画面サイズが大きい分でしょうか?
発色としては好みが分かれそうな感じ。
XOOMは少し淡い感じで、Optimusは色がきつい感じな印象でした。

・キーボード
XOOMとOptimus Padでなぜかキーボードの挙動が違いました。
XOOMは入力切り替えに表示される文字が英字キーボード表示時と、数字キーボード表示時は同じだったのですが、
Optimus Padは数字キーボード表示時に半角/全角で選べるようになりました。
見た目は同じなのですが、中身がちょっと違って意外です。どっちが新しいんだ?

・雑感
お昼休みとラーメン屋でちょっと比べただけなのであまり詳しくは観ていないのですが、
ほぼ同じといった印象。
重さで選ぶなら、Optimus。画面の大きさで選ぶならXOOM。
初期出資が少ないのを選ぶならOptimus。維持費で選ぶならXOOM。
といった感じでしょうか。
今度もうちょっと詳しく比べてみようかと思います。

2011年4月8日金曜日

通知バーを消したり出したりする

通知バーを出したり消したりする方法
忘れないようにメモ

//消す場合
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

//出す場合
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

2011年3月27日日曜日

Androidでアプリのサイズを取得する方法

Androidのアプリのサイズを取得する方法をメモ。
IPackageStatsObserverで取得が可能なようです。
ただ残念ながら非公開APIらしく、標準では取得が出来ないようなのでちょっと工夫が必要。

IPackageStatsObserverを使用する方法。
参考サイト リンク1リンク2

IPackageStatsObserverを使えるようにする方法

  1. プロジェクトのsrcにandroid.content.pmのパッケージを作成する
  2. IPackageStatsObserver.aidlPackageStats.aidlの2つのAIDLファイルをコピーして先のパッケージへ追加する

アプリのサイズを取得する方法
  1. AndroidManifest.xmlへ<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>を追加する
  2. 以下のコードで取得が可能

Method getPackageSizeInfo = 
    packageManager.getClass().getMethod("getPackageSizeInfo", 
                                        String.class,
     IPackageStatsObserver.class);

getPackageSizeInfo.invoke(packageManager, info.packageName, new IPackageStatsObserver.Stub() {
    @Override
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) 
    throws RemoteException {
    
        Log.i("AppSize", "codeSize: " + pStats.codeSize);
    }
});


2011年2月27日日曜日

Conversion to Dalvik format failed with error 1

Androidでプロジェクトのフォルダ構成を変更していたら


Conversion to Dalvik format failed with error 1
と表示され、コンパイルが通らなくなった。


ネットを調べるとプロジェクトをクリーンするだとか、Javaのコンパイラーのバージョンを変えるといいとかとあったけど、自分の場合はJava Build PathでAndroidのライブラリにチェックが入っていないのが問題だったようだ。

なぜ、チェックが外れたのかは謎。フォルダ構成をいじったのがまずかったのか?

2011年2月22日火曜日

MeeGoを試してみて

とりあえず1〜2時間ほどMeeGoをNetbookに入れて遊んでみたので、
その時の個人の主観としての感想をまとめてみる。


MeeGo v1.1 for Netbooksを試してみた

昨日Qtの勉強会へ行って来た際に色々話題にあがっていたMeeGoを家で寝かしてあったNetbookで試してみました

詳細は続きから


2011年2月21日月曜日

第1回関東Qt勉強会へ行って来た


第1回関東Qt勉強会が2/21に大井町であったので行って来た
そのときのメモを公開

詳細はつづきから

2011年2月16日水曜日

ドロイドくんフィギュアでUSBメモリを作った


前回作成したUSB変換機。これの頭部を利用してUSBメモリを作ってみました
なんとアクセスランプとして目が光ります!

詳細は以下から


2011年2月14日月曜日

ドロイドくんUSB変換機をつくってみた



われらがAndroiderのアイドルの緑の彼
名前は無いそうですが、勝手にドロイドくんと呼んでます。
かれのフィギュアを何個か買ったので1台生け贄に捧げてUSB変換機を召還してみました

詳しくはつづきから


2011年2月11日金曜日

横浜Androidプラットフォーム部第6回勉強会のメモ


横浜Androidプラットフォーム部第6回勉強会が2/11に石川町でありました。
その際の自分用のメモを公開します。ごにょごにょと書いてあるところはメモが追いつかなかった箇所。後日資料が出て来てから考えよう。

長いので詳細はつづきから。


2011年2月10日木曜日

ラジコン操縦アプリ

本当にしょうもない事なのですが、以前ラジコン操縦アプリをAndroid Marketに公開しました。
もちろん、ボードがのったラジコンが必須となるのですが、なぜかアクティブインストールが
11件(執筆時点)もあります。パーセンテージとしては23%です。
いったい誰がダウンロードしているのか検討も付きません。
4〜5件は自分で把握しているのですが・・・
意外と物好きな方も居るという事が分かった次第です。

2011年2月2日水曜日

Android -> 無線LAN -> Arduino

今日もロボ部な活動

最近やってるのは個人でも手が出せそうな値段で作れるロボット。
ただ、ロボ部のメンバーがもっと安く作れそうな構成を出しちゃってるから、
単に世の中によく出て来てるArduinoを使ってるだけって状態です。

構成としては、市販のUSB給電で動くアクセスポイントを使って、
イーサネットシールド経由でArduinoの無線コンバーター化する。
そんで、そのアクセスポイントにAndroidがつながってArduinoを操作するといった感じです。

現状



購入品はつづきから

2011年1月31日月曜日

Arduinoのイーサネットシールドがおかしい

今日は少しAndroidの会横浜支部 ロボ部らしい活動をします。
今がんばって個人レベルで買えるロボを作ろうとがんばっています。
予算としては1万円くらいで一通りそろえられるもので、考えてます。
それで今日はモーターを回すための作業をしていたのですが、
どうもイーサネットシールドが怪しい動きをしたのでまとめ。

詳しくは続きから

2011年1月27日木曜日

AndroidのUDPソケットのソースを読んでみた


ラジコンのカメラ映像を受信する箇所がなぜか1.6までの端末だとうまく動かない問題がありました。
ちょっと実装に問題が見当たらなかったので、Androidのソースを読んでみました。

詳しくはつづきから

2011年1月23日日曜日

Androidマーケットで検索させる方法

Intentを投げてマーケットで検索をする方法

/**
 * マーケットでアプリを検索
 * @param packageName パッケージ名
 */
private void viewMarket(String packageName) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:" + packageName));
    startActivity(intent);
}