|
■Linux(CentOS)でUSBウェザー・ボードを使って遊ぶ
USBウェザーボード(USB Weather Board)という商品があります。
小さな基板上に気圧、温度、湿度、照度のセンサーが実装されておりUSB接続したパソコンでその値を読み取ります。

●搭載センサ
・SHT−15温度・湿度センサ
・SCP1000気圧センサ
・明るさセンサ
●インターフェース
・USB(バスパワー)
・9600bps8N1 ASCIIフォーマット
・毎秒1回計測
まあこんな感じ。
でこれをパソコンとUSBケーブルを使って接続してシリアル通信ソフトで読み取ります。
販売会社のページやメーカーのページを見るとWindows用のドライバしか提供されておらず、Windowsでしか使えなそうでしたが、マイコンボードで通信して遊んだことのあるわたくしは、Linux(CentOS)でもドライバさえ何とかなればあとはシリアル通信は可能だと考えていたのでまあだめならWindowsで使えばいいし、ととりあえず注文しました。
商品が手元に届いてまずはWindowsで動作確認をしてみます。
‥‥うム、確認した。
では次にLinux機につないでみます。
‥‥うム、やはりただでは使えないようだ。
やっぱりドライバがいるのか。
というわけでドライバの組み込みです。
まずはLinux機でこのUSBウェザーボードがどうやって認識されているのか調べてみます。
GNOMEを起動し、システム→管理→ハードウェアでデバイスマネージャを起動します。

「FT232 USB-Serial(UART)IC」というのが接続したUSBウェザーボードです。
んじゃあこれのドライバ入れれば良いわけだ。
最初は「FT232 Linux
ドライバ」とかでぐぐってみたりしてちょっと難易度の高い方向に行きかけましたが、ひょんなことから「ftdi_sio.ko」というドライバを組み込めばおっけーということがわかったので組み込むことにしました。
なんてことはありません。CentOS5.4ではすでにドライバが用意されてます。
|
# /lib/modules/2.6.18-164.9.1.el5/kernel/drivers/usb/serial |
で表示してみると
ftdi_sio.koがあります。たんに組み込まれてないだけです。
さっそく組み込んでみます。
組み込みにはベンダーIDとプロダクトIDというのが必要になるみたいです。
どうやって調べるかというと
# cd /proc/bus/usb
# cat devices |
でUSBデバイスを表示します。
するとこんな結果が表示されました。
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 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= 6.00
S: Manufacturer=FTDI
S: Product=FT232R USB UART
S: SerialNumber=A9007Swp
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
E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms |
ここでVendorとProdIDに注目。
Vendorが0403、ProdIDが6001になってます。
これを16進として指定してあげます。
具体的にはこんな感じ。
|
# modprobe ftdi_sio vendor=0x403 product=0x6001 |
これでドライバの組み込みが完了しました。
ただ、これは再起動するとドライバの組み込みが解除されてしまうので再起動のときにドライバを読み込むようにスクリプトを書きます。
ファイルは/etc/rc.d/rc.sysinitです。
CUI野郎の方々はviなどのエディタで書くところでしょうが、わたくしはGUI野郎なのでGNOMEテキストエディタで開いて編集しました。
modprobe ftdi_sio vendor=0x403 product=0x6001
保存して終了、と。
これでドライバの組み込みは完了です。
あとはシリアル通信ソフトで読めばいいのですが最終目標がcactiでグラフ表示なのでperlで読み込ませることにしました。
まずはテストのスクリプトを組んでみます。
#!/usr/bin/perl
use strict;
open(PORT "/dev/ttyUSB0") || die
"NG!";
my $serial = <PORT>;
print $serial;
|
こんだけ。
これでてきとーなファイル名(ここではweather.pl)をつけて実行してみます。
と。
キタ━━━━━(゚∀゚)━━━━━ !!
ばっちり表示されました。
あとはこれをcactiで読み込めるように修正します。最終的にはこんな感じになりました。
■weather.pl
#!/usr/bin/perl
use strict;
open(PORT,"/dev/ttyUSB0") || die "NG!";
my $serial = <PORT>;
chomp $serial;
my @a1 = split /\#/,$serial;
#print $a1[1];
my @val = split /,/,$a1[1];
if($val[0]<1){
sleep(5);
my $serial = <PORT>;
chomp $serial;
my @ai = split /\#/,$serial;
my @val = split /,/,$a1[1];
}
my $humidity = $val[0];
my $temp = 5/9*($val[1]-32);
my $press = $val[4]/100;
my $fukai = (0.81*$temp)+(0.01*$humidity)*((0.99*$temp)-14.3)+46.3;
chomp $humidity;
chomp $temp;
chomp $press;
chomp $fukai;
#printf("%2.2f\n",$humidity);
#printf("%2.2f\n",$temp);
#printf("%4.2f\n",$val[4]/100);
#printf("%2.2f\n",(0.81*$temp)+(0.01*$humidity)*((0.99*$temp)-14.3)+46.3);
printf("uwbpres:%0.2f uwbhmi:%2.2f uwbtemp:%2.2f
uwbfuk:%2.2f",$press,$humidity,$temp,$fukai);
close(PORT);
|
ちょっと解説すると、USBウェザーボードは華氏で温度をとってくるので
my $temp = 5/9*($val[1]-32);
として摂氏に直しています。
あとは
my $fukai = (0.81*$temp)+(0.01*$humidity)*((0.99*$temp)-14.3)+46.3;
は不快指数を計算しています。
あ、あとなんか知らないですがたまーにセンサーの値を取りこぼすことがあるんですよね。
そうするとグラフがいったん0を描いちゃって具合が悪いので値を取りこぼしたときは5秒後にもう一回センサーの値を読み込んでます。ほんとはセンサーの値がとれるまでループした方が良いんでしょうけど、まあいまのところ1週間稼働させてますが問題なさげなのでこれでよしとします。
これを実行するとこんな感じ。

まだデバッグ中のスクリプトの実行結果なので最終的なスクリプトの実行結果とは違うけどまあイメージで。
よっしゃあ!あとはcactiに読み込ませます。
Data Input Methodsの設定はこんな感じ。

Data Templatesの設定はこんな感じ。

Device→Addで新しいホストにUSB Weather Boardを追加します。
あとはGraph Templatesにお好みのグラフを追加してData
Sourcesとかちょっと設定してちょちょっとすれば

こんな感じでグラフが描画されます。
すごくね?すごくね?
でもすごいだけですな。
これが正確かというとまぁビミョーなところもありますし温度や気圧の変化を見て楽しむくらいのお遊びとして使う分にはおもしろいボードだと思います。

cactiはMRTGと違って3つ以上のグラフを描画することができます。
USBウェザーボードで計測した気温をシステムの温度と重ねてみました。
ハードディスクの温度と気温がだいたい同じような感じで変化しているのがわかっておもしろいです。
なお、1回目にcactiにスクリプトを読み込ませたときは気圧のグラフを描いてくれず、さんざんハマった結果スクリプトを書き直して再度設定し直すことで解決しました。
スクリプトが正しく動作しても必ずしも動作するとは限らないのでもしなにかのグラフが描画されないときは再読み込みしてみるといいかもしれません。
■商品情報
■参考ページ
最終更新:2010年1月11日
|