2016年03月
2016年03月31日
Raspberry Piで電流計・電力計を作る
2週間ほど前に思いついたRaspberry Piで自宅の電力計を作ろう作戦、海外出張から帰ると注文してた部材が届いていたので早速組み立て開始。すると意外とあっさり成功しました。あっけなさすぎてやりがいが今ひとつです。まずは物理的なところですが、分電盤の単相三線ブレーカにクランプセンサーを取り付けます。今回はお手軽にCTT-10-CLS-CV50を使いました。1個3000円で2個6000円です。このセンサーは変換器内蔵なのでCV50だと電流50Aの時に5Vを出力します。15Aだと1.5Vというわけ。単純なクランプセンサーのみだと交流の場合積算して力率考えて・・・とややこしいですし、自分で電流変換器作るのもパーツがたくさん必要になっちゃうのでこの変換器内蔵センサーはとっても便利です。そしてこの出力をA/Dコンバータに入力してあげます。実際には3線式なので2個のセンサーの合算値が実際の電流値、消費電力量になります。
そして2個のセンサーの出力をA/Dコンバータに入れるわけですが、たまたま手元にあったICはMCP3008です。これは8ch入力ですが今回センサーは2個なのでMCP3002とかでもOK。1個200円くらいです。そしてこのA/Dコンバータに電源を供給しますが、供給電圧がデジタル変換の基準になります。夫婦2人のうちはブレーカーが30A契約なのでセンサーに30A流れると3V出力になり、基本的にはそれ以上の電圧にはならないはず。というわけでこのICにはRaspberry Piの3.3V出力を供給しました。3.3V給電の場合、3.3V入力の時のA/Dコンバータ出力値は10ビットのMAX値=1024となります。もし30A流れているとセンサー電圧は3Vとなり、A/Dコンバータの出力は1024/3.3*3=930となります。実際にはRaspberry Piの3.3Vに誤差があると結果もずれますのでそこは後で校正することにして、とりあえずはA/Dコンバータの出力を保管するようにします。ネットワーク屋大得意のRRDを使います。データは5秒毎に取ることにして一応10年分のデータが保管できるようにします。そこで書いたPythonコードがこれです。タブは消えてるので補完して読んで下さい。
#!/usr/bin/env python
import spidev
import time
import subprocess
if __name__ ==("__main__"):
adc=spidev.SpiDev()
adc.open(0,0)
for i in range(11):
buf = adc.xfer2([1,((8)<<4),0])
a1 = ((buf[1]&3)<<8)+buf[2]
buf = adc.xfer2([1,((9)<<4),0])
a2 = ((buf[1]&3)<<8)+buf[2]
cmd = "/usr/bin/rrdtool update /home/meter/amp.rrd N:"+str(a1)+":"+str(a2)
subprocess.call( cmd, shell=True )
time.sleep(5)
adc.close()
このコードを毎分cronで実行し、5秒ごとに2つのセンサからのデータを取得してRRDに格納します。そして取得したデータをPNG出力します。グラフ作成は慣れているPerlで書きました。横軸のスケールを変えつつ複数グラフを出力するコードになっています。電源2系統の電流値を積み上げグラフにし、見た目にもちょっと気を使って線と塗りつぶしを両方使っています。
#!/usr/bin/perl
$rrdtool = "/usr/bin/rrdtool";
$rrdfile = "/home/meter/amp.rrd";
$pngfile = "/var/www/png/";
$graphoption = "--font \"DEFAULT:7:/home/meter/MEIRYO.TTC\" -E";
$graphoption = "$graphoption --lower-limit 0 -T 1 -g --units-exponent 0";
$height = 150;
@width = ( 800, 800, 800, 800, 800 );
@timescale = ( 5, 60, 600, 3600, 86400 );
@xgrid = ( "--x-grid MINUTE:2:MINUTE:10:MINUTE:10:0:%R",
"--x-grid MINUTE:15:HOUR:1:HOUR:1:0:%H時",
"--x-grid HOUR:2:HOUR:12:HOUR:12:0:%a%H時",
"--x-grid HOUR:12:DAY:1:DAY:1:86400:%e%a" );
($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);
$tmax = 1;
if ( ( $min % 10 ) == 0 ) {
$tmax ++;
if ( $min == 0 ) {
$tmax ++;
if ( $hour == 0 ) {
$tmax ++;
if ( $mday == 1 ) {
$tmax ++;
}
}
}
}
for ( $t = 0 ; $t < $tmax ; $t ++ ) {
$pngfilename = "$pngfile$timescale[$t].png";
$timewidth = $width[$t] * $timescale[$t];
$rrdcmd = "$rrdtool graph $pngfilename $graphoption";
$rrdcmd = "$rrdcmd $xgrid[$t] --rigid";
$rrdcmd = "$rrdcmd -h $height -w $width[$t] --end now --start end-$timewidth\s";
$rrdcmd = "$rrdcmd DEF:LL1=$rrdfile:L1:LAST CDEF:LA1=LL1,3.223,*";
$rrdcmd = "$rrdcmd DEF:LL2=$rrdfile:L2:LAST CDEF:LA2=LL2,3.223,*";
$rrdcmd = "$rrdcmd AREA:LA1#A0FFA0 STACK:LA2#A0A0FF";
$rrdcmd = "$rrdcmd LINE1:LA1#00AF00 STACK:LA2#0000FF";
`$rrdcmd`;
}
タイムスケールの違うグラフを5個描くスクリプトです。ちなみにグラフの単位はわかりやすいW(ワット)にしました。あとはHTMLファイルを作ってグラフを表示し、自動更新もかけるようHTMLヘッダに記述します。結局必要なモジュールはrrdtoolとapache2くらいでしょうか。そうそう、crontabで自動実行の設定もします。毎分実行です。
* * * * * /usr/bin/sudo /usr/bin/python /home/meter/amp.py
* * * * * /home/meter/amp.pl
あとはRaspberry Piを分電盤の中に放り込みます。小さいので壁の穴と分電盤の周囲の隙間に収まってしまいます。電源は空きブレーカからとりました。ここは電気工事士の資格が必要かもしれません(当然私は持っていますが)。分電盤のカバーを外して空きブレーカからVVFケーブル出してコンセントプラグをつけて、USBアダプタつないでRaspberry Piに給電します。Raspberry PiにはUSB WiFiをつなげておけば、あとは半永久的に動いてくれます。つないだブレーカーがRaspberry Piの電源スイッチになりますので万一ハングアップしても再起動がとても簡単。ブレーカーを落としてまた上げればOK。良いシステムですね。分電盤のカバーを閉めると、外からは全く見えずいい感じです!ちなみにカバーを閉める際に漏電遮断器のスイッチに触ってしまい、間違えて家全体が停電しました。嫁が「食洗機が止まった〜!どこまで進んでたかわかんない〜!」と騒いでましたが、まぁ大きな問題ではありません。うちはガス暖房ということもありそんなに冬は消費電力大きくないのですが、夏とかにどうなるか楽しみですね。約1時間ほどでできた工作(材料費は2万以下)ですが、なかなか良いRaspberry Piの使い方ではないかと思います。
そして2個のセンサーの出力をA/Dコンバータに入れるわけですが、たまたま手元にあったICはMCP3008です。これは8ch入力ですが今回センサーは2個なのでMCP3002とかでもOK。1個200円くらいです。そしてこのA/Dコンバータに電源を供給しますが、供給電圧がデジタル変換の基準になります。夫婦2人のうちはブレーカーが30A契約なのでセンサーに30A流れると3V出力になり、基本的にはそれ以上の電圧にはならないはず。というわけでこのICにはRaspberry Piの3.3V出力を供給しました。3.3V給電の場合、3.3V入力の時のA/Dコンバータ出力値は10ビットのMAX値=1024となります。もし30A流れているとセンサー電圧は3Vとなり、A/Dコンバータの出力は1024/3.3*3=930となります。実際にはRaspberry Piの3.3Vに誤差があると結果もずれますのでそこは後で校正することにして、とりあえずはA/Dコンバータの出力を保管するようにします。ネットワーク屋大得意のRRDを使います。データは5秒毎に取ることにして一応10年分のデータが保管できるようにします。そこで書いたPythonコードがこれです。タブは消えてるので補完して読んで下さい。
#!/usr/bin/env python
import spidev
import time
import subprocess
if __name__ ==("__main__"):
adc=spidev.SpiDev()
adc.open(0,0)
for i in range(11):
buf = adc.xfer2([1,((8)<<4),0])
a1 = ((buf[1]&3)<<8)+buf[2]
buf = adc.xfer2([1,((9)<<4),0])
a2 = ((buf[1]&3)<<8)+buf[2]
cmd = "/usr/bin/rrdtool update /home/meter/amp.rrd N:"+str(a1)+":"+str(a2)
subprocess.call( cmd, shell=True )
time.sleep(5)
adc.close()
このコードを毎分cronで実行し、5秒ごとに2つのセンサからのデータを取得してRRDに格納します。そして取得したデータをPNG出力します。グラフ作成は慣れているPerlで書きました。横軸のスケールを変えつつ複数グラフを出力するコードになっています。電源2系統の電流値を積み上げグラフにし、見た目にもちょっと気を使って線と塗りつぶしを両方使っています。
#!/usr/bin/perl
$rrdtool = "/usr/bin/rrdtool";
$rrdfile = "/home/meter/amp.rrd";
$pngfile = "/var/www/png/";
$graphoption = "--font \"DEFAULT:7:/home/meter/MEIRYO.TTC\" -E";
$graphoption = "$graphoption --lower-limit 0 -T 1 -g --units-exponent 0";
$height = 150;
@width = ( 800, 800, 800, 800, 800 );
@timescale = ( 5, 60, 600, 3600, 86400 );
@xgrid = ( "--x-grid MINUTE:2:MINUTE:10:MINUTE:10:0:%R",
"--x-grid MINUTE:15:HOUR:1:HOUR:1:0:%H時",
"--x-grid HOUR:2:HOUR:12:HOUR:12:0:%a%H時",
"--x-grid HOUR:12:DAY:1:DAY:1:86400:%e%a" );
($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);
$tmax = 1;
if ( ( $min % 10 ) == 0 ) {
$tmax ++;
if ( $min == 0 ) {
$tmax ++;
if ( $hour == 0 ) {
$tmax ++;
if ( $mday == 1 ) {
$tmax ++;
}
}
}
}
for ( $t = 0 ; $t < $tmax ; $t ++ ) {
$pngfilename = "$pngfile$timescale[$t].png";
$timewidth = $width[$t] * $timescale[$t];
$rrdcmd = "$rrdtool graph $pngfilename $graphoption";
$rrdcmd = "$rrdcmd $xgrid[$t] --rigid";
$rrdcmd = "$rrdcmd -h $height -w $width[$t] --end now --start end-$timewidth\s";
$rrdcmd = "$rrdcmd DEF:LL1=$rrdfile:L1:LAST CDEF:LA1=LL1,3.223,*";
$rrdcmd = "$rrdcmd DEF:LL2=$rrdfile:L2:LAST CDEF:LA2=LL2,3.223,*";
$rrdcmd = "$rrdcmd AREA:LA1#A0FFA0 STACK:LA2#A0A0FF";
$rrdcmd = "$rrdcmd LINE1:LA1#00AF00 STACK:LA2#0000FF";
`$rrdcmd`;
}
タイムスケールの違うグラフを5個描くスクリプトです。ちなみにグラフの単位はわかりやすいW(ワット)にしました。あとはHTMLファイルを作ってグラフを表示し、自動更新もかけるようHTMLヘッダに記述します。結局必要なモジュールはrrdtoolとapache2くらいでしょうか。そうそう、crontabで自動実行の設定もします。毎分実行です。
* * * * * /usr/bin/sudo /usr/bin/python /home/meter/amp.py
* * * * * /home/meter/amp.pl
あとはRaspberry Piを分電盤の中に放り込みます。小さいので壁の穴と分電盤の周囲の隙間に収まってしまいます。電源は空きブレーカからとりました。ここは電気工事士の資格が必要かもしれません(当然私は持っていますが)。分電盤のカバーを外して空きブレーカからVVFケーブル出してコンセントプラグをつけて、USBアダプタつないでRaspberry Piに給電します。Raspberry PiにはUSB WiFiをつなげておけば、あとは半永久的に動いてくれます。つないだブレーカーがRaspberry Piの電源スイッチになりますので万一ハングアップしても再起動がとても簡単。ブレーカーを落としてまた上げればOK。良いシステムですね。分電盤のカバーを閉めると、外からは全く見えずいい感じです!ちなみにカバーを閉める際に漏電遮断器のスイッチに触ってしまい、間違えて家全体が停電しました。嫁が「食洗機が止まった〜!どこまで進んでたかわかんない〜!」と騒いでましたが、まぁ大きな問題ではありません。うちはガス暖房ということもありそんなに冬は消費電力大きくないのですが、夏とかにどうなるか楽しみですね。約1時間ほどでできた工作(材料費は2万以下)ですが、なかなか良いRaspberry Piの使い方ではないかと思います。
2016年03月26日
北京出張
一昨日から2泊で北京出張に行ってきました。初日の朝のJAL便で北京入りしたわけですが、朝目が覚めてメールを見たら機材変更で2時間遅延の連絡・・・二度寝しました。で、家を出て羽田から北京まで4時間のフライト。入国も税関も問題なく、送迎に来てくれた事務所の女の子と合流して迎えの車に乗って北京市内へ。予想通りの大渋滞で建国門まで1時間以上かかりました。で、ひとまずオフィスに顔を出して日本から来た出張者と上海から来た出張者と合流。ネットワーク作業はちゃちゃっと済ませ、私の仕事は現地入り後3時間ほどですべて完了です。全く楽勝ですね。
で、夜は北京の所長がアレンジした北京ダックの店へ行きました。なかなか豪勢でオープンキッチンになっている作りのレストランで、大勢が待っていましたが予約していたのですんなりテーブルへ。まぁ・・・やはり私は中国料理はダメな感じですが食べれそうなものだけちょいちょいつまみました。なんだかんだ言って食べ過ぎたのかもしれませんが、ちょっとお腹が微妙な感じです。2日目はホテルで仕事しつつお昼頃オフィスへ。この日は出張者たちはみんな外出だったので残った事務所の子たちが四川料理の店に連れて行ってくれて、麻婆豆腐や青椒肉絲やら、私の食べやすいものいろいろとオーダーしました。そして夕方ホテルに戻って・・・気づいたら爆睡。目が覚めたらすでに深夜で、見事に夕食食べ損ねました。
そして今朝、8時発の帰国便なので5時頃起きてシャワーして6時にチェックアウトしタクシーで空港へ。行きとは違って週末の朝は道路がガラガラ。25分ほどで空港到着。チェックインしたらインボラアップグレードで1列目!ただ残念ながら北京発の食事はマズくあまり食べられずに羽田に帰国。夕方約束があったので速攻で家に帰ってまたお出かけです。あっという間の北京出張でした。今回、PM2.5にビビっていたのですが全人代のためになんと青空。中国は環境すら意のままにコントロールしようとするんですね。やはり現地に行かないと分からないこともいろいろとあります。
で、夜は北京の所長がアレンジした北京ダックの店へ行きました。なかなか豪勢でオープンキッチンになっている作りのレストランで、大勢が待っていましたが予約していたのですんなりテーブルへ。まぁ・・・やはり私は中国料理はダメな感じですが食べれそうなものだけちょいちょいつまみました。なんだかんだ言って食べ過ぎたのかもしれませんが、ちょっとお腹が微妙な感じです。2日目はホテルで仕事しつつお昼頃オフィスへ。この日は出張者たちはみんな外出だったので残った事務所の子たちが四川料理の店に連れて行ってくれて、麻婆豆腐や青椒肉絲やら、私の食べやすいものいろいろとオーダーしました。そして夕方ホテルに戻って・・・気づいたら爆睡。目が覚めたらすでに深夜で、見事に夕食食べ損ねました。
そして今朝、8時発の帰国便なので5時頃起きてシャワーして6時にチェックアウトしタクシーで空港へ。行きとは違って週末の朝は道路がガラガラ。25分ほどで空港到着。チェックインしたらインボラアップグレードで1列目!ただ残念ながら北京発の食事はマズくあまり食べられずに羽田に帰国。夕方約束があったので速攻で家に帰ってまたお出かけです。あっという間の北京出張でした。今回、PM2.5にビビっていたのですが全人代のためになんと青空。中国は環境すら意のままにコントロールしようとするんですね。やはり現地に行かないと分からないこともいろいろとあります。
2016年03月18日
Raspberry Piで積算電力計を作る
NHKで整理整頓コメディー「わたしのウチには、なんにもない。」をやっていますけど、あそこまで極端でなくても部屋がきれいというのは良いものです。で、オフィスもものを減らそう運動を勝手にはじめて、とりあえずPCを1台処分しました。サイネージ用にPCを1台置いていたのですが、よく考えたらRaspberry Piが1台あれば十分じゃないかということで、置き換えたわけです。見事にちゃんと動いてくれていて何の問題もありません。ただ、Raspberry Piを単なるPC代わりに使うのもなんか味気ないですよね。やっぱりGPIO使わないと。ということで個人用にもう1台購入して、自宅でいじくりまわし始めたわけです。
LEDや抵抗なんか買ってみて、あと今はブレッドボードというのがあって半田付けなんかしなくても簡単に回路を組めるんですよね。で、Webサイトを参考にしつつPythonで簡単にプログラム組んでみると、あっさり動作。へー、これは面白いですね。CDS光センサを使って明るさが変わるとブザーが鳴る、とかいうのを作ると、手をかざすだけで音が出たりします。で、これで調子に乗ったわたくしは、自宅の積算電力計をRaspberry Piで作ることにいたしました。RRDtoolでグラフ書いたり、自動更新のWebサイトにリアルタイムの消費電力を表示させるのが第1ステップです。まずはセンサに何を使おうかネットで検索してみますが、意外にも情報少なく、みなさん単純なCTL-10-CLSとかでやってるんですよね。交流は電流が行ったり来たりするので、瞬間の電流値を見ただけでは電力量はわかりません。あるサイトではC言語使って毎秒数百回のサンプリングをしていました。でもこれだとデータ量膨大だし、SDカード酷使したらすぐ使えなくなりそうですよね。あとは、平均値整流型電流変換回路を自分で組んじゃってる人もいました。ダイオードだ抵抗だコンデンサだとそろえるの面倒・・・ということでわたくしの選択は、クランプセンサと電流変換器が一体になったCTT-10-CLS-CV50を使うことにしました。ちょっと値は張りますが手間を考えたら格安です。あとはA/DコンバータをやらせるICを調達。全部で1万円は超えますが2万円はかかりません。これで電力量記録してWeb経由で公開できるわけですからタダみたいなものです。既製品買ったら数十万は行きますからね。全部部品届いたら早速組み立てたいと思います。
2016年03月13日
G-BOOKマップオンデマンド
最近都内でいろんな道路が開通しています。自分がよく通るところでいうと、羽田空港に行く際の中央環状線とか。前回の車検の時にナビの自動アップデート期限が来てしまい、わたくしの車は古い地図のままになっているわけですが、道路がないところ走っているとリルートしまくりでナビが喋ってばかりでうるさいですし自車位置も正確に表示されません。で、ちょうどこの前車の点検でディーラーに行った際に地図更新の費用と、マップオンデマンド期間を聞いてみました。最初のメカニックは、1回はディーラーで更新できるけどマップオンデマンドは使えなくなるとの答え。そうかなぁと思って待ち時間にトヨタのWebサイトを見てみると「4年目以降またはサービス利用期限内に販売店にて全更新(最新版地図ソフトを購入)を実施いただくと、購入日より2年間ご利用いただけます。」って書いてあるのを確認。次に別のメカニックが点検の詳細な説明をしに来たのでこのWebサイトを見せると、再度確認するとのこと。結局Webサイトの記述が正しく、今回バージョンアップすると2年間は自動更新が使えるとのことです。しかも値段は1万ちょっと。その場でバージョンアップを依頼しました。ディーラーからの帰りに早速地図を見てみたのですが、あれ?変わってない・・・と思ったら、しばらくしてから更新作業が始まりました。これであと2年は最新の地図が使えます。ていうかもっと早く案内してくれたらとっくにやってたのにねえ。
2016年03月07日
スティックPC
一度は試してみるべきと思っていたスティックPCを買ってみました。予想通りの小ささで、本体にはHDMI端子、USB端子3つ(1つは充電用)、SDカードスロット、そして電源ボタンしかありません。早速すべてつないで電源を入れてみると、あら完全に普通のPCと同じです。OSはHome Editionなので業務利用は難しいですが、家庭用には十分ですね。Wi-FiもBluetoothも内蔵していて、しかも価格は1万円以下。なんということでしょう。ネットを見たりするには十分です。USBハードディスクつなげれば、家の中でストレージとしても使えますし、電源入れっぱなしでも音もせず消費電力もたかが知れていますから、使い道次第では結構便利そうです。とりあえず1つ持っておけば何かに役立つかもしれません。
2016年03月01日
SIMフリースマホ
最近、MVNOとかSIMフリースマホとか流行ってるわけですが、昨年から発売された大手キャリア端末はSIMフリー化が可能なため今後さらに増えていくものと思います。維持費用も格段に下がるため、わたくしもひとつ検証してみることにしました。検証用なので安いもの・・・ということで選んだのは、FREETELのPriori3S LTEというモデル。2万以下で買えちゃってデュアルSIM対応。まずはドコモのWiFiルータのMicroSIMをさしてみてAPNを設定すると、問題なく通信可能。ただしなぜかLTEではなくて3Gでの接続になってしまいます。そしてもう一つはMVNOのOCNモバイルONEのNanoSIM。こちらもAPNの設定で無事につながり、画面にはdocomoの文字も表示されます。
大手キャリアのスマホ料金は月額7000円オーバーが相場ですが、MVNOなら利用量にもよりますが月額2000円以下ですみます。SIMフリー端末を2万円で調達しても、数か月で元が取れる計算。それこそ家族が多かったりすると家族で毎月数万円も違いが出てきますよね。会社だと法人で相対契約とかしているでしょうから、たとえばうちの会社はiPhone6Sは無償提供+通話料+パケット料+各種オプション代込みで月額4000円台なわけですが、内線通話機能が不要であればMVNOで全然良い感じです。固定電話代はもう下げられるところまで下がっていますが、モバイルはまだまだ削れそうですね。社用携帯を今後どうしていくか検討したいと思います。
大手キャリアのスマホ料金は月額7000円オーバーが相場ですが、MVNOなら利用量にもよりますが月額2000円以下ですみます。SIMフリー端末を2万円で調達しても、数か月で元が取れる計算。それこそ家族が多かったりすると家族で毎月数万円も違いが出てきますよね。会社だと法人で相対契約とかしているでしょうから、たとえばうちの会社はiPhone6Sは無償提供+通話料+パケット料+各種オプション代込みで月額4000円台なわけですが、内線通話機能が不要であればMVNOで全然良い感じです。固定電話代はもう下げられるところまで下がっていますが、モバイルはまだまだ削れそうですね。社用携帯を今後どうしていくか検討したいと思います。