新規記事の投稿を行うことで、非表示にすることが可能です。
2016年12月24日
デバイス名をリンクさせた名前でjavaから接続できない!!??
前回USBポートを指定してデバイス名を固定できたけど、直接この名前でjavaのプログラムを組んでも
javaのほうでポートを開いてくれないのでjava側でもうひと工夫必要が必要だった
(java側はyytUSB0と1とかでしか認識してくれないんですよ)
コマンドプロンプトからls -laで情報を取ると
デバイス名を固定しているので
lrwxrwxrwx 1 root root 7 9月 18 20:47 /dev/ttyUSB_P2 -> ttyUSB1
のような情報が取得できる
これを利用して
private static String Conv_USB_COM(String SetDevPort){
Runtime runtime = Runtime.getRuntime();
Process p ;
String result;
try {
p = runtime.exec("ls -la /dev");
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while ((result = br.readLine()) != null) {
if( result.indexOf(SetDevPort)>0){
System.out.println(result);
String _right = result.substring(result.length() - 7, result.length()); //右側から7文字取得
System.out.println(_right);//これでここにttyUSB0〜3がでてくる!
}
}
} catch (IOException ex) {
}
}
みたいな関数を作ってUSBポートと実際のデバイス名を紐付けしてやればjavaで固定のCOMポートとして使うことができるようになる。
COMポート名はINIファイル(properties)で渡してやれば汎用的に使えます。
注意としては
コマンドプロンプトでは
ls -la /dev/ttyUSB*
ってやってあげればttyUSBだけ取得できたんだけど
javaから実行するとttyUSB*の部分が引っ掛かるらしくて
エラーになるのでフォルダの全部の情報から抜き出してやるしかないのです〜
javaのほうでポートを開いてくれないのでjava側でもうひと工夫必要が必要だった
(java側はyytUSB0と1とかでしか認識してくれないんですよ)
コマンドプロンプトからls -laで情報を取ると
デバイス名を固定しているので
lrwxrwxrwx 1 root root 7 9月 18 20:47 /dev/ttyUSB_P2 -> ttyUSB1
のような情報が取得できる
これを利用して
private static String Conv_USB_COM(String SetDevPort){
Runtime runtime = Runtime.getRuntime();
Process p ;
String result;
try {
p = runtime.exec("ls -la /dev");
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while ((result = br.readLine()) != null) {
if( result.indexOf(SetDevPort)>0){
System.out.println(result);
String _right = result.substring(result.length() - 7, result.length()); //右側から7文字取得
System.out.println(_right);//これでここにttyUSB0〜3がでてくる!
}
}
} catch (IOException ex) {
}
}
みたいな関数を作ってUSBポートと実際のデバイス名を紐付けしてやればjavaで固定のCOMポートとして使うことができるようになる。
COMポート名はINIファイル(properties)で渡してやれば汎用的に使えます。
注意としては
コマンドプロンプトでは
ls -la /dev/ttyUSB*
ってやってあげればttyUSBだけ取得できたんだけど
javaから実行するとttyUSB*の部分が引っ掛かるらしくて
エラーになるのでフォルダの全部の情報から抜き出してやるしかないのです〜
2016年12月14日
raspberryPiでUSBポートとデバイス名をリンクさせる
raspberryPiでシリアル制御をしようとした時にシリアルを何本も使うとデバイス名が
再起動するごとに変わってしまって、その都度繋ぎたいユニットにあわせて
順番に線を繋ぎなおす必要があった
でもコレって実際の運用の時に困るんじゃ・・・・
ということで、いろいろ調べてみたらUSBポート毎に個別のデバイス名を設定することが出来みたいなので
やってみた。
まずは自分が繋げているUSBシリアルのデバイス情報をゲットするために
USBに調べたいデバイスを繋げて
コマンドプロンプトで
sudo udevadm info -q all -n /dev/ttyUSB0
とやって
その中の
ID_BUS
ID_PATH_TAG
ID_SERIAL
の情報を控えておく
次に
etc/udev/rules.dフォルダの中で
99-usbcomsetname.rules
みたいなファイルを作成。
ファイル名は任意だけどアタマの99は2桁でできるだけ大きい数字がいい
(権限が高い?)らしいので99で設定してます。
これは管理者権限で扱ってくださいね〜
そんでもってファイルの中身は
SUBSYSTEM=="tty",
ENV{ID_BUS}=="usb",
ENV{ID_PATH_TAG}=="platform-3f980000_usb-usb-0_1_2_1_0",
ENV{ID_SERIAL}=="FTDI_FT232R_USB_UART_AH03IDU6",
SYMLINK+="ttyUSB_P2"
としてやると、たとえばここでUSBの2番目のポートに刺さったデバイスは
自動的にttyUSB_P2
という名前に設定されてくれるようになります。
上の記述では改行しているけど実際のファイルでは改行なしで1行で記述してください。
ここで
ID_PATH_TAG の 「usb-usb-0_1_2_1_0」」の2のところがUSBの2番目のポートということになります。
raspberryPiはUSBポート4個歩けど調べてみたら2〜5番で割り振られています。
実際にどのポートが何番かは1つづつポートにさしてデバイス情報ゲットしてみるとわかると思うよん。
ネットでは記述すれば再起動しなくてもUSBにデバイス挿しなおせば認識すると書いてあったけど
自分の環境では再起動しないと割り振ってくれなかったので一応再起動を推奨します。
これであれば全部同じUSB-シリアルの変換ケーブルを使ってもポートの番号で制御ができるようになるので
実用に近づいたかな〜とか思ってます。
コレをやると外付けのHDDとかのデバイスで同じ型名の物を繋げてもポートで管理できたりとかもするので
(HUBでつなげていても細かく制御可能)いろいろと使えるんじゃないかな
再起動するごとに変わってしまって、その都度繋ぎたいユニットにあわせて
順番に線を繋ぎなおす必要があった
でもコレって実際の運用の時に困るんじゃ・・・・
ということで、いろいろ調べてみたらUSBポート毎に個別のデバイス名を設定することが出来みたいなので
やってみた。
まずは自分が繋げているUSBシリアルのデバイス情報をゲットするために
USBに調べたいデバイスを繋げて
コマンドプロンプトで
sudo udevadm info -q all -n /dev/ttyUSB0
とやって
その中の
ID_BUS
ID_PATH_TAG
ID_SERIAL
の情報を控えておく
次に
etc/udev/rules.dフォルダの中で
99-usbcomsetname.rules
みたいなファイルを作成。
ファイル名は任意だけどアタマの99は2桁でできるだけ大きい数字がいい
(権限が高い?)らしいので99で設定してます。
これは管理者権限で扱ってくださいね〜
そんでもってファイルの中身は
SUBSYSTEM=="tty",
ENV{ID_BUS}=="usb",
ENV{ID_PATH_TAG}=="platform-3f980000_usb-usb-0_1_2_1_0",
ENV{ID_SERIAL}=="FTDI_FT232R_USB_UART_AH03IDU6",
SYMLINK+="ttyUSB_P2"
としてやると、たとえばここでUSBの2番目のポートに刺さったデバイスは
自動的にttyUSB_P2
という名前に設定されてくれるようになります。
上の記述では改行しているけど実際のファイルでは改行なしで1行で記述してください。
ここで
ID_PATH_TAG の 「usb-usb-0_1_2_1_0」」の2のところがUSBの2番目のポートということになります。
raspberryPiはUSBポート4個歩けど調べてみたら2〜5番で割り振られています。
実際にどのポートが何番かは1つづつポートにさしてデバイス情報ゲットしてみるとわかると思うよん。
ネットでは記述すれば再起動しなくてもUSBにデバイス挿しなおせば認識すると書いてあったけど
自分の環境では再起動しないと割り振ってくれなかったので一応再起動を推奨します。
これであれば全部同じUSB-シリアルの変換ケーブルを使ってもポートの番号で制御ができるようになるので
実用に近づいたかな〜とか思ってます。
コレをやると外付けのHDDとかのデバイスで同じ型名の物を繋げてもポートで管理できたりとかもするので
(HUBでつなげていても細かく制御可能)いろいろと使えるんじゃないかな
2016年12月13日
Piとwindowsとの挙動の違い?
Windowsでデバッグしている時とraspberrypiで実行させた時で挙動が違うことがあったので
対策などなど
jFrameでDialog設定したときに
setEnabledしているのに
下のウィンドウ(親ウィンドウ)が選択できてしまうことがあった。
完全なモーダルになっていないで、ボタンは押せないんだけど
親ウィンドウをクリックすると親のほうのウィンドウが前に出てきて子のダイアログのほうが隠れてしまう。
Winでは親ウィンドウは完全に触れない(クリックしても無反応になる)のになんで〜
ってことで対応したこと
setAlwaysOnTop(true); //常に前面にする
を付け加えることでWin側でもPi側でもモーダル処理ができるようになった。
あともう一点
ファイル選択ダイアログで
FileNameExtensionFilterで拡張子でフィルターをかけているが
Piでは「すべてのファイル」のほうがデフォルトのままになってしまっている
Winでは選択した拡張子(たとえばtxtとかcsvとか)だけの表示がデフォルトで選択できている
->これはjavaが1.6だと実行可能だった。
Win側もコンパイルを1.7にしたら「すべてのファイル」がデフォルトになってしまった
仕方がないので「すべてのファイル」のフィルタは使用しないことにして
特定拡張子だけの読込に変更する
//csvでフィルターをかける
FileFilter filter = new FileNameExtensionFilter("csvファイル(*.csv)", "CSV", "csv");
filechooser.setAcceptAllFileFilterUsed(false); //「すべてのファイル」は使用しない
filechooser.addChoosableFileFilter(filter);
これでPi側(javaバージョンが1.7)でcsvだけ読込できるようになった
早くクロスコンパイルの環境を作ってやってデバッグだと大丈夫なのに〜
ってことが無いようにしないとね
対策などなど
jFrameでDialog設定したときに
setEnabledしているのに
下のウィンドウ(親ウィンドウ)が選択できてしまうことがあった。
完全なモーダルになっていないで、ボタンは押せないんだけど
親ウィンドウをクリックすると親のほうのウィンドウが前に出てきて子のダイアログのほうが隠れてしまう。
Winでは親ウィンドウは完全に触れない(クリックしても無反応になる)のになんで〜
ってことで対応したこと
setAlwaysOnTop(true); //常に前面にする
を付け加えることでWin側でもPi側でもモーダル処理ができるようになった。
あともう一点
ファイル選択ダイアログで
FileNameExtensionFilterで拡張子でフィルターをかけているが
Piでは「すべてのファイル」のほうがデフォルトのままになってしまっている
Winでは選択した拡張子(たとえばtxtとかcsvとか)だけの表示がデフォルトで選択できている
->これはjavaが1.6だと実行可能だった。
Win側もコンパイルを1.7にしたら「すべてのファイル」がデフォルトになってしまった
仕方がないので「すべてのファイル」のフィルタは使用しないことにして
特定拡張子だけの読込に変更する
//csvでフィルターをかける
FileFilter filter = new FileNameExtensionFilter("csvファイル(*.csv)", "CSV", "csv");
filechooser.setAcceptAllFileFilterUsed(false); //「すべてのファイル」は使用しない
filechooser.addChoosableFileFilter(filter);
これでPi側(javaバージョンが1.7)でcsvだけ読込できるようになった
早くクロスコンパイルの環境を作ってやってデバッグだと大丈夫なのに〜
ってことが無いようにしないとね
2016年12月11日
Raspberry Pi(ラズベリー パイ)でアプリの自動起動
ふつうRaspberry PiでXWindowが立ち上がったときにアプリケーションを自動実行する場合は
シェルスクリプトで動くんだけど USBシリアルでCOM通信するようなアプリを作っていると
たまに自動で起動されなかったり、もっとひどいとログインできなくなって、自動実行したアプリだけが
延々起動し続けるという恐ろしい現象が!!!
(こうなったら他のOS(Linux系)でメモリ読み込んであげてシェルスクリプトを削除するしかなくなってしまう・・)
今回の最終目的としては
/home/pi/tmp/test.jar
のアプリを自動起動すること
となります。
かなり強引で回りくどい方法なんですが今作っているアプリ(USBシリアルを3本使うちょっと面倒なヤツ)
はこの方法で無いと自動起動しなかったのでメモです。
まず、コマンドプロンプトを実行するためのjavaのプログラムを用意
import java.io.IOException;
public class Main {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("sudo java -jar /home/pi/tmp/test.jar");
} catch (IOException e) {
e.printStackTrace();
}
}
}
これでjarファイルを作成(今回はautorun.jarとする。
autorun.shファイルを
/home/pi/tmpに作成
shファイルの内容は
#!/bin/bash
sleep 1s
sudo java -jar /home/pi/tmp/autorun.jar
exit
こんな感じで
LXTerminalで
chmod +x autorun.sh
して実行可能権限を与えます。
ファイルマネージャー上でダブルクリックして実行し
目的のjarのアプリが立ち上がるかどうかを確認して
OKであれば自動実行用の登録をおこないます。
(普通はシェルスクrプトに直接記述して登録すれば済むんですけどね)
/home/pi/.config/lxsession/LXDE-pi/autostart
の最後の行に
@/home/pi/tmp/autorun.sh
を記述してあげればPi起動後に目的のアプリが自動実行されるようになる
あぁ回りくどい!
シェルスクリプトで動くんだけど USBシリアルでCOM通信するようなアプリを作っていると
たまに自動で起動されなかったり、もっとひどいとログインできなくなって、自動実行したアプリだけが
延々起動し続けるという恐ろしい現象が!!!
(こうなったら他のOS(Linux系)でメモリ読み込んであげてシェルスクリプトを削除するしかなくなってしまう・・)
今回の最終目的としては
/home/pi/tmp/test.jar
のアプリを自動起動すること
となります。
かなり強引で回りくどい方法なんですが今作っているアプリ(USBシリアルを3本使うちょっと面倒なヤツ)
はこの方法で無いと自動起動しなかったのでメモです。
まず、コマンドプロンプトを実行するためのjavaのプログラムを用意
import java.io.IOException;
public class Main {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("sudo java -jar /home/pi/tmp/test.jar");
} catch (IOException e) {
e.printStackTrace();
}
}
}
これでjarファイルを作成(今回はautorun.jarとする。
autorun.shファイルを
/home/pi/tmpに作成
shファイルの内容は
#!/bin/bash
sleep 1s
sudo java -jar /home/pi/tmp/autorun.jar
exit
こんな感じで
LXTerminalで
chmod +x autorun.sh
して実行可能権限を与えます。
ファイルマネージャー上でダブルクリックして実行し
目的のjarのアプリが立ち上がるかどうかを確認して
OKであれば自動実行用の登録をおこないます。
(普通はシェルスクrプトに直接記述して登録すれば済むんですけどね)
/home/pi/.config/lxsession/LXDE-pi/autostart
の最後の行に
@/home/pi/tmp/autorun.sh
を記述してあげればPi起動後に目的のアプリが自動実行されるようになる
あぁ回りくどい!
2016年12月08日
javaでターミナルコマンドを・・・実行できたん
ラスパイで組み込みの装置を作っててIPをアプリから変更しないといけなくなった・・・
(タッチパネルで全画面のアプリだからOSにアクセスとかできないんだ)
RaspbianなんでLXTearmからコマンド打てばいいんだけどjavaのアプリからできるのか?
って調べてみたらできたのでメモメモ
IPをアプリから変更
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("ifconfig eth0 ○.○.○.○");
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
でOKだった。
(なんかTABがうまく表示されてくれないんで見にくいけど勘弁して〜〜)
でもこれだと再起動すると有線LANのアドレス消えてしまうので
アプリ立ち上げるたびに設定してやらないといけないみたい。
組み込みでアプリはコレしか立ち上げないからまぁいいか?
コマンドライン実行できるってことは・・この命令だけでGPIOとかもいじれるってこと?
今度実験してみよう〜♪
a8mat=2NZ8U0+5URGXE+3N2C+614CX" target="_blank">
アフィリエイトなら【A8.net】
(タッチパネルで全画面のアプリだからOSにアクセスとかできないんだ)
RaspbianなんでLXTearmからコマンド打てばいいんだけどjavaのアプリからできるのか?
って調べてみたらできたのでメモメモ
IPをアプリから変更
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("ifconfig eth0 ○.○.○.○");
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
でOKだった。
(なんかTABがうまく表示されてくれないんで見にくいけど勘弁して〜〜)
でもこれだと再起動すると有線LANのアドレス消えてしまうので
アプリ立ち上げるたびに設定してやらないといけないみたい。
組み込みでアプリはコレしか立ち上げないからまぁいいか?
コマンドライン実行できるってことは・・この命令だけでGPIOとかもいじれるってこと?
今度実験してみよう〜♪
a8mat=2NZ8U0+5URGXE+3N2C+614CX" target="_blank">
アフィリエイトなら【A8.net】
2016年12月07日
プログラミング教育!!
プログラミング教育は2020年度から小学校とかでも必修になるとか
これだけ電子ガジェットが氾濫している世の中だから、子供のうちからプログラムの基礎とかをなんとかくでも
学んでいけるといいのかなぁとか思ってみたり
そんなこんなで子供が遊びながらプログラムのお勉強ができるサービスが
MOONBolck
とか
scratch
とか
個人的にはゲーム要素の強いMOONBolckのほうが子供の食いつきがいいんだけど、これってネットにつながってないと
できないんだよね〜
scratchだったらスタンドアローンでうごくバージョンがあるから子供に好き勝手PCいじらせてやれるんだけどな・・・
a8mat=2NZ8U0+29KENM+37HI+626XT" target="_blank">
これだけ電子ガジェットが氾濫している世の中だから、子供のうちからプログラムの基礎とかをなんとかくでも
学んでいけるといいのかなぁとか思ってみたり
そんなこんなで子供が遊びながらプログラムのお勉強ができるサービスが
MOONBolck
とか
scratch
とか
個人的にはゲーム要素の強いMOONBolckのほうが子供の食いつきがいいんだけど、これってネットにつながってないと
できないんだよね〜
scratchだったらスタンドアローンでうごくバージョンがあるから子供に好き勝手PCいじらせてやれるんだけどな・・・
a8mat=2NZ8U0+29KENM+37HI+626XT" target="_blank">