macOS SierraのEclipseでArduinoとシリアル通信しようとしたらハマったお話.
実行環境
- OS : macOS Sierra
- java : java1.7
- Eclipse : Eclipse Java EE IDE for Web Developers.(version: neon)
RXTX
概要
Arduinoなどのマイコンとシリアル通信を行うためのライブラリ.
Windows, Mac, Linuxがサポートされている.
以下のページを参考に進めていきました.
http://cho-kotan.blogspot.jp/2012/10/javaavrmacjavaavr.html
ダウンロード
以下のページのrxtx-2.1-7-bins-r2.zip
をダウンロード
http://rxtx.qbang.org/wiki/index.php/Download
ファイルの移動
ダウンロードしたファイルを展開し,下記コマンドによって外部ライブラリ用のフォルダにダウンロードしたファイルを移動します.
$ cd <download_folder>/rxtx-2.1-7-bins-r2
$ sudo cp RXTXcomm.jar /Library/Java/Extensions/
$ sudo cp Mac_OS_X/librxtxSerial.jnilib /Library/Java/Extensions/
また,RXTXの排他制御のためのディレクトリが必要であるため,下記コマンドを実行
$ sudo mkdir /var/lock
$ sudo chmod 777 /var/lock
eclipseでパスを通す
- eclipseにて,現在のプロジェクトフォルダを右クリック -> [プロパティ]
- [Javaのビルド・パス] -> [ライブラリ]
- [外部JARの追加] -> 先ほどのExtensionsディレクトリの
RXTXcomm.jar
を選択 - [ビルドパス上のJAR及びクラス・フォルダ]に出現したRXTXcomm.jarの中の[ネイティブライブラリー・ロケーション]に先ほどのExtensionsディレクトリを選択
- OK
実行
参考にした下記URLのソースコードをコピペしそのまま実行.
http://cho-kotan.blogspot.jp/2012/10/javaavrmacjavaavr.html
すると,以下のようなエラー
java.lang.UnsatisfiedLinkError: /Library/Java/Extensions/librxtxSerial.jnilib: dlopen(/Library/Java/Extensions/librxtxSerial.jnilib, 1): no suitable image found. Did find:
/Library/Java/Extensions/librxtxSerial.jnilib: no matching architecture in universal wrapper thrown while loading gnu.io.RXTXCommDriver
リンクに関するエラーが出ているが,gnu.io.RXTXcommDriver
を読んでいる最中にエラーが出たと怒られているのでパスはきちんと通っているらしい.
何度やっても動かなかったので調査.
バージョンの問題だった
Sierraだから対応できていないのか,javaが対応できていないのかわからず,とりあえず色々調べて見たら下記のページを見つけました.
http://blog.brianhemeryck.me/installing-rxtx-on-mac-os-mountain-lion/
記事によると,どうやら公式のページからダウンロードしたファイルのlibrxtxSerial.jnilib
はJava5にしか対応しておらず,Mountain LionからのJava 6以降では同じようなエラーが起こることがあるみたいです(Eclipseの環境によるかもしれませんが...).
そのため,先ほどのExtensionsファイルのlibrxtxSerial.jnilib
を削除し,下記ページでJava 6対応のものが配布されているのでダウンロード.
http://blog.iharder.net/2009/08/18/rxtx-java-6-and-librxtxserial-jnilib-on-intel-mac-os-x/#comment-163295
$ rm /Library/Java/Extensions/librxtxSerial.jnilib
$ cp <download_folder>/librxtxSerial.jnilib /Library/Java/Extensions/
再度実行
先ほどの設定でEclipseにて外部JARファイルのパスの設定はしてあるので,上記のコマンドが終わった時点でそのままEclipseで実行.
無事コンソールにてArduinoから読み取った値が表示されました.
結論
公式ページからダウンロードしたライブラリファイルは新しいJavaのバージョンをサポートしていなかった.