2012年10月30日火曜日

[Java][AVR]MacのJavaでAVRとシリアル通信したい

AVRで作ってるI/Oボードで取得したセンサーのデータを扱うのは、現状JavaでやりたいのでMac上のJavaでシリアル通信出来るようにする。

Javaでシリアル通信を行うライブラリにRxTxという物があるのでこれを使います。GNUライセンスです。

まず、古い方の公式サイトからrxtx-2.1-7-bins-r2.zip (Final)をダウンロードしてきます。
さらっと少し上にダウンロードサイトが移動した旨が書いてありましたが気づきませんでした。
新しい方のサイトも見てみましたが、書いている時点で安定版のバージョンは同じ様です。

ダウンロードしたzipファイルを解凍して出来たディレクトリの中のINSTALLの内容の

Mac OS X (x86 and ppc) (there is an Installer with the source)
RXTXcomm.jar goes in /Library/Java/Extensions
librxtxSerial.jnilib goes in /Library/Java/Extensions
Run fixperm.sh thats in the directory. Fix perms is in the Mac_OS_X
subdirectory.

に従って、
解凍したディレクトリの中にあるRXTXcomm.jarと、Mac_OS_Xディレクトリの中にあるlibrxtxSerial.jnilibを、
/Library/Java/Extensionsにコピーします。
最後のfixperm.shを実行するよう言ってますが、無いので飛ばします。

とりあえず前準備は終わったので、Eclipseでサンプルプロジェクトを作ってみます。
適当なプロジェクトを作成し、プロジェクトのプロパティの Javaのビルドパス-ライブラリー外部Jarの追加で先程コピーしたRXTXcomm.jarを指定してあげます。

ポートを開き、受信した文字を出力するだけのプログラムを書いてみます。
AVRのプログラムは、ただHello World!!を出力し続けるだけです。
import java.io.IOException;
import java.io.InputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;


public class Sample {
 
 public static final void main(String[] args){
  try{
   
   CommPortIdentifier portID = CommPortIdentifier.getPortIdentifier("/dev/tty.usbserial-A400FMPJ");
   SerialPort port = (SerialPort)portID.open("Sample", 5000); //waiting5000ms
      
   port.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
   port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
   
   InputStream is = port.getInputStream();
   
   int c;
   while((c = is.read()) != -1){
      Calendar cal = Calendar.getInstance();
      System.out.print(cal.get(Calendar.SECOND) + "." + cal.get(Calendar.MILLISECOND));
      System.out.println("->" + (char)c);
   }
   is.close();
   port.close();
  }catch(NoSuchPortException e){
   System.err.println("Can Not Find Device");
   e.printStackTrace();
  }catch(PortInUseException e){
   System.err.println("Can Not Open Device");
   e.printStackTrace();
  }catch(UnsupportedCommOperationException e){
   System.err.println("Invalid Parameter");
   e.printStackTrace();
  }catch(IOException e){
   e.printStackTrace();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}


簡単に説明を行うと
15行目
CommPortIdentifier portID = CommPortIdentifier.getPortIdentifier("/dev/tty.usbserial-A400FMPJ");
getPortIdentifierの引数には下の画像にあるように、開きたいデバイスのパスを与えます。



16行目
SerialPort port = (SerialPort)portID.open("Sample", 5000);
第一引数にはポートを開くアプリケーション名, 第二引数にはポートが他のアプリケーションに使用されていた場合にポートが解放されるのを待つ待ち時間(ms)です。

18行目
port.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
第一引数から、ボーレート, データビット数, ストップビット数, パリティの種類です。

19行目
port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
フロー制御の設定を行います。

あとは、通常のJavaの通常の入出力プログラムです。 それぞれの例外は、エラーメッセージの通りだと思います。

実行してみると、
java.lang.UnsatisfiedLinkError: /Library/Java/Extensions/librxtxSerial.jnilib:  no suitable image found.  Did find:  /Library/Java/Extensions/librxtxSerial.jnilib: no matching architecture in universal wrapper thrown while loading gnu.io.RXTXCommDriver
Exception in thread "main" java.lang.UnsatisfiedLinkError: /Library/Java/Extensions/librxtxSerial.jnilib:  no suitable image found.  Did find:  /Library/Java/Extensions/librxtxSerial.jnilib: no matching architecture in universal wrapper
ってエラーを吐きました。
調べてみると、先程ダウンロードしたlibrxtxSerial.jnilibは32bit用でJavaは64bitで実行される事によるエラーのようです。
なので、実行の構成からVM引数-d32を与えて32bitで実行してあげると解決します。
また、根本的な解決として64bit対応のライブラリに置き換える方法もあります。
arduinoのgoogle codeに、64bit用のライブラリがありましたのでダウンロードし置き換えてあげて下さい。

先程のエラーは解決できましたが、
gnu.io.PortInUseException: Unknown Application
 というエラーが出ました。
調べるとRxTxの排他制御の為のディレクトリが必要という情報がありましたので、ターミナルで
sudo mkdir /var/lock
sudo chmod 777 /var/lock
でディレクトリを作成してあげて、再度実行すると


無事、データの受信を確認しました。


Java Communications APIの使い方

2012年10月26日金曜日

[Android]Xperia SXに変えました

Galaxy SIIが出た頃に型落ちしてたGalaxy Sに変えてからの、二台目Android
Symbianを使ってた頃には考えもしなかった世界になってますね!

iPhone 3GS以来のiPhone5か, WM6.1以来のWindows Phoneか, Galaxy SIII miniか?とか迷いながらサイズだけ見てXperia SXをチョイス。
12年夏モデルで生産も多くないみたいで、中々在庫も無くロードバイクでお散歩ついでに近隣の市のshopを見て回って買ってきました。
冬にはXperia AXも出ますが、スペックはほぼ変わらず画面サイズは大きくなってるので...


以下メモ
ホームアプリ
 └Docomo palette ui, Xperiaホーム は痒い所に手が届かなかったので、4.0以降で使えるApex, Nova, Atom Launcherを入れてみたけど、どれも微妙
 └結局、Galaxyの時と同じでGo Launcherを。Xperiaホームのページ数を減らせればそれで良かったのに...

ブラウザとメッセンジャー系
 └Chrome
 └Kakao talk
 └Viper
 └Lineはバッテリーを良く食べるみたいなのでちょっと様子を見てから..
 └Skypeもまた今度

ツールとか
 └GTasks(ToDoと簡易メモ)
 └Solid Explorer(ファイラ)
 └AirDroid(wifiを使ってPCとファイルのやりとり)
 └3G Watchdog(通信料監視, 今回は要らない気もする)
 └Google Play music(google play music クライアント)

とりあえず、必要最低限だけ
あとは、プリインストールのアプリをいくつかアンインストール, 無効化

2012年10月18日木曜日

[AVR]AVRを始める(3)-USBで通信

赤外線カメラが早速ほこりを被りました

そして、盗まれた一代目ロードのTrek君に変わって二代目Corratecのバイクを買いました(*´ω`*)
Trekのより鍵のグレードは上げないといけないですが、鍵なんて所詮無力です...置いておくのが悪いんです...


また間が空いて、今回はUSBを使って通信をします。
USB変換モジュールは、秋月のFT232RLを使います。
COMポートもUSBも同じシリアルなのに、どのあたりが変換なのかよく分かりません。

前回までで、SP3232ECPを用いたシリアル通信はできたので、それをFT232RLに変えるだけです。
回路図は以下の通りです。


FT232RLとAVRの接続はデータの送受信に用いるTXDとRXDの二本だけです。
また、FT232RLはUSBから5V(または、3.3V)電源を出力する事ができますので、AVRへの電源供給に用います。簡単便利!


シリアル通信のソフトによってシリアルポートが開けなかった為、sanahi氏のAcknowrichでキャプチャしてテストを行いました。良さ気ですかね。

とりあえず、ここまででCOMポートの無いmacbook proに戻れそう。

次はJavaでシリアル通信をしたいと思います。

2012年10月4日木曜日

赤外線カメラの作り方

赤外線カメラを作りました。赤外線照射器と一緒に
SEALsの本 を読んでナイトビジョンに憧れて...本は凄く面白かったです

新しいデジカメをそろそろ買いたかったので、4年くらい前に購入したカメラを利用する事にします。

用意するもの
    1. デジカメ

      今回は、大分古くなったNikon COOLPIX P60を利用します。
      分解・改造するので、亡くなっても構わない物を用意しましょう。

    2. 光吸収・赤外透過フィルタ (IRフィルタ)

      IRフィルタは可視光領域をカットするフィルタです。暗闇で照射器と組み合わせて使うなら必要ないと思いますが、お昼に赤外線写真を撮影したい人は必要です。
      今回は富士フィルムのIRフィルタを使用しました。IR-xxと号数が振ってあり、号数の10倍の波長をカットします。JIS曰く、可視光の波長の上界は760-830nmらしいです。
      先人の方達は76号を使っている場合が多いように感じますが、近くのお店の在庫と相談して 80号 を使用しました。昨日の時点で近くのビックカメラには80号82号の2枚だけ在庫がありました。お店によって無いことも多そうです。
デジカメの改造
    1. カメラを分解します
      写真はP60のものですが、工程は似たようなものでしょう。
      フラッシュ用の大容量のキャパシタが内蔵されています。感電したら痛いです。気をつけましょう。
      筺体の底部, 側部のネジを外しカバーを開きます。
      液晶やアルミのシールド(? 放熱板?)を取り除き、イメージセンサにアクセスできる所まで分解します。
      二枚目の画像でAと書かれた、フレキシケーブルの接続されたシルバーのボードを開けるとCCD素子があります。

    2. フィルタの交換
      画像は撮り忘れましたが、CCD素子の前に光の当たる角度でピンク色に見えるガラス板があり、これがローパスフィルタです。このフィルタが赤外線領域をカットしています。
      ローパスフィルタを取り除き、そのフィルタと同サイズにIRフィルタをカットしローパスフィルタのあった場所に収めます。

    3. 元に戻す
      液晶等を基盤に接続し仮組みを行い、電源が入ること, (場所によるかもしれませんが)紫色の画像が液晶に表示される事を確認しデジカメを元に戻します。
      又開ける事もあると思いますので、ネジが2, 3本余っても気にしないでいきます。

      ローパスフィルタとIRフィルタは厚さが異なるため、取り替えるとピントが合わなくなると思います。同じ厚さになる様にガラス(アクリル)板を加える方も居るようです。
これで、赤外線カメラのできあがりです。
試しに手作りの赤外線照射器を使って真っ暗な部屋を撮影してみます。

肉眼では真っ暗ですが、撮影は出来てますね。残念なのは思ったより照射器の光量が小さい事ですね...
また、IRフィルタを少しカットし、デジカメのフラッシュをフィルタでカバーすると赤外線フラッシュになります。夜間の写真撮影ならばこれで十分です。照射器は必要ありません。

せっかくの赤外線カメラなのでスノー効果(?)など赤外線独特な写真も...?
画像の加工の仕方が分からないので、macのプレビューで適当に...これも練習ですね。

赤外線カメラは出来ましたが、ナイトビジョンはまだ達成できていないので赤外線照射器と一緒にまた後で...

*最後に、カメラの改造は自己責任です。どんな不具合が起きても対応する事はできません。撮影についても同様です。
ちなみに、透けたりムフフな事にはなりませんので、あしからず