自作電子小物/電力インジケータ/分電盤用
自作電子小物/電力インジケータ/分電盤用
Wh meter V0.5 Feel AC power
2010年2月28日日曜日
住宅用の分電盤等に取付け、使用している電力を系統毎にランプ色で確認する物です。詳しい数値データを出力する事も出来ます。電流センサに小型のクランプ式のCT(変流器、カレントトランス)を使っているので取付は簡単、6チャネル(系統)までの対応です。データ出力は、リアルタイムではUSB経由でPCに表示、そしてメモリカード(SDカード)に連続記録する機能も持っております。製作費は約3500円〜12,000円、制御部にマイクロチップテクノロジ社のマイコン PIC18F2550 を使用し、ソフトウエアは C言語 にてコーディングしています。
<機能/特徴>
■使い方簡単、直感的に使用量が判る
■配線を変更せずに取付け出来る
■最大6カ所を見る事が出来る
■通常の100Vだけでなく、単相200Vにも対応
■電流・電力値のデータロガーでもあり、簡易電力量計としても利用可能
■単純、製作容易、補正作業不要
<仕様>
名称:分電盤用電力インジケータ・データロガー
分類: 単相交流、多チャネル、電力表示ランプ、 簡易電力量計、電力データロガー
測定方法:被回路の片線にクランプ式電流センサを装着
測定数:最大6カ所
表示機能:
インジケータ:瞬間電力値で色が変わる
[W]
0
〜3W
〜10W
〜30W
〜100W
〜300W
〜1kW
〜3kW
〜10kW
以上
色
黒
水色
青緑
緑
ライム
黄色
オレンジ
赤
紫
青
計測範囲:単相交流 50/60[Hz] 〜32[A](正弦波,RMS) 電圧100V(チャネル単位に変更可能)
計測方法:半波のみサンプリング、約3200回/100[ms]/チャネル、間隔は1秒
数値精度:-10%〜+60%
電圧、力率=100%固定で計算しておりますので、正確には「有効電力」ではなく「皮相電力」値です。
オンラインデータ出力機能:
出力方法:USB仮想シリアルポート接続
PC側に特別なソフトは不要、OS付属ソフトを利用
Windowsはハイパーターミナル
USBドライバはMicrochip社提供のCDC用の.INIファイルを使って下さい
格納場所:c:\Microchip Solutions\USB Device CDC Basic demo\inf\mchpcdc.inf
COMポート番号はドライバのプロパティで確認して下さい
Mac OS Xはユーティリティのターミナル
データ保存は各ソフトのキャプチャ機能を使用
データ項目:
日時(yyyy-mm-dd hh:mi:ss)
瞬間電力[W] チャネル0〜5
月間積算電力量[Wh] チャネル0〜5
データロギング機能:
出力先:メモリーカード
対応メディア:SDcard(変換アダプタでmini, microも可能)ライトプロテクトは認識しません
データフォーマット:
ファイルシステム:FAT16、フォーマット済である事(FAT12可、FAT32不可)
データ形式:CSV(カンマ区切りテキスト、行末コードはCR/LF、1行目項目名列)
ファイル名:固定”WHyyyymm.CSV”、yyyyは年、mmは月、既にファイルがある場合は追記されます
データ項目:
日時(yyyy-mm-dd hh:mi:ss)
設定電圧[W] チャネル0〜5
瞬間電流[W] チャネル0〜5(測定間隔内の平均ではなく、その日時のサンプル値、小数点以下切捨)
瞬間電力[W] チャネル0〜5(測定間隔内の平均ではなく、その日時のサンプル値、小数点以下切捨)
月間積算電力量[Wh] チャネル0〜5
出力間隔:60秒(変更可能)
最大蓄積量:使用するSDカードの容量による。200byte/サンプル
例えば1GBのSDカードで約9年分、1秒間隔に変更した場合1.8ヶ月分
出力データ例(Microsoft excelで取込み、1行目にコメントを追加したもの)
設定機能:
SDカード上に設定ファイルを入れる事によりカスタマイズ可能。
設定項目:日時設定、電圧変更、ロギング間隔時間変更
カードを挿入した時点で設定されます。
外形:幅111mm、奥行86mm、高さ30mm
電源:USBポートまたは、USB電源アダプタ 1[W]未満
電気代、年間約200円(@22円/kWh)
設定ファイル仕様:
ファイル名:“WHM.TXT”
フォーマット:
yy=年(西暦年4桁)
mm=月
dd=日
hh=時
mi=分
ss=秒
v0=チャネル0の電圧値〔V〕
v1=チャネル1の電圧値〔V〕
:
iv=ロギング間隔秒数
初期値:(V0.5b=電源が切れても保持されます、V0.5=初期値に戻ります)
電圧値=100
ロギング間隔秒数=60
年月日時=前回電源が切れた年月日と時
分秒=0
設定ファイル例:WHM.TXT
重要:
分電盤内をに関わる作業は、それなりの知識が無いと生命に関わる事故や火災になる可能性があります。
電気工事士の資格者が行うようにして下さい。電気屋さんに頼んだとしても、認定のない機器を取付ける事は、まずなさらないと思いますので、基本的には資格を持った方が自己責任で行う電子工作だと理解して下さい。
電圧を計測して、真の電力値を得る様に機能追加なさる場合、電源ラインとの絶縁について注意深く設計しないと、感電したりUSB接続先の機器が壊れます。
<技術的なポイント>
■ハードウエア
・Microchip Technology社のPIC18F2550マイクロコントローラ
・回路の絶縁
・CTによる交流電流の計測
・アノードコモンRGB高輝度LEDのトランジスタ駆動+ダイナミック表示
・SDカードのSPI接続、活性挿抜
・USBデバイス
■ソフトウエア
・プログラミング言語はC、開発環境はMPLAB、C18のペリフェラルライブラリを使用
・ADCでの連続計測
・皮相電力計算、電流RMS計算、積算
・積算値の維持、EEPROMの利用
・タイマ割込でのダイナミック表示、ソフトウエアで中間色を出力
・タイマ割込でカレンダ時計の実装
・独自SDカードライブラリを利用しCSVデータ追加書込みと、パラメタファイル読込み
・USBデバイスCDC(通信デバイスクラス→仮想シリアルポート接続)
<構成・方式>
■電力計測部
以前、別の「小物」で電力測定について考えましたので、ここでは要点のみ説明させて頂きます。
電力の計算自体は単純で、次の式で計算できます。
電力=電圧×電流
面倒なのは、交流の場合、時間軸で電圧・電流が常時変化しているので、
(1)常に計算し続ける仕組みを用意する
計算結果(電力)も非対称交流となります
測定区間の面積を電力量と見る
(2)スカラ計算する方法を考える
交流を単一値で表現する方法として、この世界では実効値(RMS)という物を使っています
実効値を使えば次の計算1回で済みます
電力=実効電圧×実効電流×力率
実効値は正弦波であれば、ピーク値÷√2で単純計算出来ますが、非正弦波では変換処理は面倒です
力率は電圧と電流の位相差が判れば三角関数で計算出来ます
実効値変換をアナログ回路で実現できれば、すごく単純化出来ます
といった方法をとる必要があります。
(2)の方法での難題は位相差の検出です。正弦波前提にでもしないかぎり、この方法は適当ではないかと思います。やはり(1)の方法がより現実的です。ただ、交流→RMS変換を、処理が単純になる平均等の近似値で行う等の工夫は必要になります。
次に、センサデバイスの選択です。
・電圧
分圧抵抗:安価、絶縁するには高価になる。
変圧器:電源と共用できる、やや高価。
測定しない:固定値とする、力率も100%固定。割り切り。
・電流値
直列抵抗:抵抗器自体安くない、絶縁するには高価になる。
CT:絶縁素子、取付容易、とても高価(2k¥)。
ホール素子: 絶縁素子、小型、やや高価(0.5〜1k¥)。
・選択
電圧センサは使用しない → 感電事故が一番怖いのと、前回の実績で電圧固定、力率固定でも十分な数値が出たのでこの選択とします。(直列抵抗を使ったパターンは、テーブルタップ版で実装)
電流センサはCTを選択 → 高価なのが大変痛いが、分電盤へ後付けという条件ではこれ以外考えられません。構造が単純なので、自分で作って安く上げる手があると思いますが、特性のバラツキが出ない様に一つ一つ測定する必要があり、測定環境を整えたり正確な計測器を要したり、逆に高く付く可能性もあります。興味的にはチャレンジして見たいですが、今回は前回の余り部品があるのでパスします。
電圧を固定にした場合の電力値の計算方法は(1)を使う場合、仮想の電圧波形を使って計算するやり方が考えられます。力率も固定となりますので(2)のやり方でも良く、電流のみRMS変換を行います。今回は、簡単な後者の計算方法にしたいと思います。
以前製作したWHM0.4では、RMS変換を平均値で代用しました。これは、CPUパワー/プログラムメモリ容量の制約によるものでした。RMSの計算は、サンプリング値を二乗し、積算してサンプリング回数で割った(平均)値の平方根を取るという処理です。サンプリング値を保存するのに十分なメモリ、もしくはサンプリングしながら計算できるCPUパワーが必要になります。今回は若干でも精度を改善したいので、きちんとRMS変換処理を行う為にCPUの処理能力を上げたいと思います。
CTを使用する事に決めましたので、具体的な実装方法を考えます。CTは負荷抵抗RL間に発生する電圧を読み取る事により、電流値が判る電流センサの一つです(分流器とも呼ばれ名前が示す様に、一次側の電流に比例した電流が二次側に現れる複合コイル)。実際はCTの製造メーカがデータシートで明示していますので、これを元にアナログ回路を設計するか、数式にしてマイコンで処理させれば良いと考えました。今回、データ出力機能も必要なのでマイコンを使用する事が決定事項ですから、アナログ回路は最小限にしたいと思いました。
CTの出力は交流なので、マイコンに入力するには、マイナス値を正側にオフセットさせるか、半波のみを測定対象にするかしなければなりません。今回は半波のみ計測する方法で、マイナス側はカット/無視します。非対称の波形もあり得ると思いますが、今回は精度より単純化を選びます。
ダイオード等で半波整流したり、コンデンサを使ったりすると、波形が変わってしまうと思ったので、何も加工せずにピンへ入れる方法を考えてみました。負電圧は、マイコン内の保護ダイオードでカットされる事を期待していますが、この内蔵ダイオードの仕様がはっきりしないうえ、マイコンの絶対定格-0.3Vを軽く下回る(電流値が大きくならないので多分大丈夫だが)ので、いけない使い方です。本来なら外付けのダイオードを付けるべきですね。このダイオードは、Vf値が0.3V以下のSBD(ショットキバリアダイオード)が必要ですが、実際の部品にはこの仕様は厳しいのでちょっと面倒です。さらに商用電源では、雷等で発生する定格を遥かに越える入力があった場合の保護機能も必要でしょう。嬉しい事に、CTの中にリミッタ:クランプ素子付が入ったものがありますので、これを使えば保護の仕組みは付け加える必要がなくなります。抵抗Rlimについては、負側をカットするとCT-RL電流ループに影響させてしまうので、分離(影響を少なく)する目的で付加しました。
以上、使う部品がかなり少なくなったというか、こんな物で本当に大丈夫かという程です。心配なので、回路シミュレータLTspiceを使って確認してみました。
3チャネル分を定義し、CTの出力を見立てた交流電源3つから、正弦波±1V、±5V、±7Vを発生させ、マイコンのピンに入る波形を表示させてみました。(位相も少しずつ変えています)ほぼ、想像通りの波形で、負側は-0.6V(Vf分)で制限され、正側はVdd(5V)+0.6Vで制限され、変な所はなさそうです。
CT品種:U_RD社のCTL-10-CLS
使用するCTは、取付が容易なクランプ式で、マイコンで直接入力出来るような1V程度の出力があり、電圧リミッタを内蔵しているものを探しました。U_RD社のCTL-10-CLSが最適だと思われます。これより小型のCTL-6シリーズもありますが、こちらは出力電圧が小さいのでアンプが必要になってきますので、選択しませんでした。直販してくれますので入手も容易です。部品屋さんより安いのですが、支払い方法が銀行振込しかないので、少数の購入は割高になります。
RL値:330Ω
RLには25A位迄計れるようにしたかったため330Ωにしました。計算は次の通り。
Eo(負荷抵抗間電圧) = K(定数) × Io(貫通電流) × RL(負荷抵抗値) ÷ N(巻き線数)
これが、データシートで示されている式です。
これを抵抗値を求める式に書き換えて計算すると
RL(負荷抵抗値) =( N(巻き線数) × Eo(負荷抵抗間電圧 )÷( K(定数) × Io(貫通電流) )
=(3000×5.0V)÷(1.0×(25A×√2))
= 424Ω
入手し易い抵抗器という事でE12系列に当てはめると、390か330が適当です。
同様に、電流値の算出は以下の式になります。
Io(貫通電流) =( N(巻き線数) × Eo(負荷抵抗間電圧) )÷( K(定数) × RL(負荷抵抗値) )
これが、実際に回路を組みオーブントースター(1kW)を使った時のCTの出力をPIC18F2550のA/Dコンバータで取り込んだ数字をグラフにしたものです。シミュレーション通りのきれいな波形をキャプチャ出来ていました。特に問題無しです。
■表示部
目立つ判りやすい表示にしたいので、次の表示方法について検討しました。
・グラフ表示
履歴まで表せる可能性があるので、試したい所ですが何分表示デバイスは高くつきます
・ゲージ表示
LEDでドット表示が安く済みそう。
6チャネルのデータでは、8×8ドットマトリックスの表示器が利用可能。
30mm角の大きさの物で安い物があるが、遠目でみるにはちょっと小さい。
単品を並べて実現すると高くつく。カラー化しやすいのはいい。
思い切って8×8カラードットマトリックス表示してしまうか。+3000円
・色表示
1チャネル1灯でも、使用量を色表現すれば遠目でも確認できる
緑:少ない ー> 黄:やや使っている ー> 赤:大量に使っている →青:異常に使っている
コスト的にも問題ない
技術的な興味でカラードットマトリックスにしたいとも思いましたが、部品を揃えられないので「色表示」の方法で行く事にしました。発光素子はRGB-LEDで、1灯の出力を高めにして目立つようにします。
3原色×6灯ですので、そのままでは18ポート必要になってしまい、使用するマイコンの選定で苦労します。このような場合、ダイナミック表示するのが一般的ですが、実際の回路を考えると意外と面倒なものでした。具体的には、横方向(灯)に3bit->8のデコーダか、シフトレジスタといった汎用ロジックICを使えば、簡単にピン数を減らせLED程度だったら直接駆動でき一石二鳥になると考えていましたが、都合の良いロジックICは値段が半端でなく高いものでした。安いマイコンでロジックICの代わりにするという手もありますが、それだったらピン数の多いマイコンに選定を変えた方が安い。そんな事をつらつら考えていると、またどんどん複雑な回路になってしまっている事に気づきます。ではどうするのか。当初8チャネルで設計していたので、外部に部品を使わないとしたら多ピンのマイコンを使うしかないと考え始めていました。が、出来ればSMD品を使わないようにしたかったので、長い時間悩んでしまいました。結局、6チャネルに減らせばDIP品でも行けますので、ここは仕様を縮小するのが妥協点ではないかと考えました。RGB3ポート×桁数分(6灯6ポート)のマトリックスで合計9ポートをLEDの為に使うやり方です。
ちょっと失敗したのは、接続の仕方です。
LEDに20mA流すとした場合、3×6構成ではマイコンとトランジスタに20mA×3=60mAが流れますので許容値は余裕でクリアします。懸念は、ダイナミック表示で1/6ディユーティは輝度低下が気になる所です。
対して、6×3構成では20mA×6=120mAが流れ、このマイコンは絶対定格200mAなので多分大丈夫だと思いますが、トランジスタは汎用品だと150mAなのでもう少し余裕が欲しい所。使用する数は半分で済むのですが、もっと流せるトランジスタに変更が必要です。
今回は汎用品が格安なので3×6構成を選択しましす。あとで判ってしまった事ですが、安くても電流を流せる品目
(2SA950が安く入手出来る)もありますので6×3構成がお勧めです。
今回、RGB-LEDのダイナミック表示方法に一工夫してみました。
ダイナミック表示制御は、上図の左側の様に桁のピンを順繰りオンにしていき、それに合わせて行(今回はRGBの各色、7セグメントLEDであればa〜gの各セグメント)をオンオフする事を、人間の目で追えない位速い速度で行うと、全桁同時に点灯しているように見せる方法です。RGB各色を単純にオンオフすると、組み合わせで7色しか表示
できませんが、今回中間色もあると表現できる電力レベルが増えるので、簡単な階調表示を出来る様にしました。仕組みは単純、右側の図の様に桁を2倍にし、時間差で色の組み合わせを増やすものです。人間の目では、色も小さな時間差を認識する事が出来ず、混じった色に見えます。これで、組み合わせ的には26色になりますが、実用的なのは10色程度です。
これは左の点灯状態の時、カメラを横に振りながらシャッタを切って撮影したものです。点々で写るのは、点滅を繰り返しているため、つまりダイナミック表示しているというのが判ります(人間の頭を振っても見えました)。撮影が難しいので、色の混じり具合まで確認出来る写真までは撮れませんでした。
このやり方は、以前製作した「太陽電池式誘導灯」で使ったものを簡略化したものです。
■時計部
カレンダ・時計は意外とやっかいな所で、考えなければならない事は停電と時刻合わせですね。
停電:つまり外部から電源供給が無い時のカウントアップをどうするのかですが、次の方法を考えてみました。
・バッテリ保持
一般的な方法ですが、電池もしくは大容量コンデンサを使って、カウントを継続できる最小の電源を用意。
カウントを専用のIC、RTC(リアルタイムクロック)を使えば、この問題は簡単に対処。
マイコン内で実現する場合、低電力状態でもカウントできる設計にする必要がある。
大体は、32KHz程度の比較的低速の発振子で低電力分周させ、1秒割込みを発生させる。
別途クリスタルが必要、電源周りも一工夫が必要。
・復帰時、外部から情報を得る
電波時計の技術を使って、標準電波を受信すれば常に正しい日時を得られる。
時刻合わせの問題もクリア。
時刻が合う迄に若干のタイムラグがある。
部品代が高く付いてしまう。
時刻合わせ:
・標準電波で自動同期
取付場所によっては受信困難な場合がある
自分が発生するノイズを抑える必要がある→設計が難しい
費用は+1600円程度 参考:「壁掛時計/暗所用環状ドット表示式」
・USBから取得
接続した時、自動的にPCの日時情報を取り込めないか?
USB-IF(仕様)上は、日時情報をやりとりする事はないようで、PC側のプログラム開発が必要。
PC側に関わると、使う側にインストール等面倒な事が発生するので、出来れば避けたい。
MSC(マスストレージクラス、MSD)を使って、ファイルシステム上のタイムスタンプを得る手はどうか?
ちょっと行き詰まり、今後の対応。
・手入力
人間から入力してもらうので、数字を表示出来る装置と入力ボタンが必要。
数字6桁程度、ボタンは2つあれば良い。
今回は、表示にランプが数個ある程度なので数字を表現するのは困難。(モールス信号なら...)
別途、キャラクタLCDや7SEG-LEDを付ける必要がある。
USB接続したPCから手入力してもらう。
さほど難しくはなく、表示器もボタンも使わなくて済む。
今回では一番現実的な方法。
電源供給用とPC用の2つのUSBコネクタが必要になる。
SDカード経由で日時を設定する方法。
予め、PCで日時を入れたファイルを用意しておき、その日時になったらカードを挿入。
かなり使いにくいと思うが、表示器もボタンも使わなくて済む。
選択:
普通の機器で考えれば、RTC+USB手入力の構成で設計するのが良いと思います。
今回の場合、常時オンなので停電対策に対する重みは少ないと考えます。復帰時に手で時刻合わせすれば良いと思いました。時刻合わせについては、USB手入力にしたかったのですが、USB電源アダプタでの使用を考えるとうまくありません。USBコネクタを2個付ける手もありますが、かなりケチってSDカードでの設定方法を試してみる事にしました。
使ってみた感想としては、重たいPCを用意するよりは、SDカードだけ持って行けば時刻を合わせてそのままログも取り始めるので、最初に想像していた程面倒とは感じませんでした。
■オンラインデータ出力部
次のデバイスを検討してみました。
・シリアル(RS-232C)
接続部品は意外と高い。 +250円
シリアルポートの付いたPCが必要。ノート型では現在は皆無。
PC側のソフトウエアの開発を省略可。(OS付属ユーティリティを活用)
・USB
シリアルーUSB変換チップ(モジュール)が楽 +300〜1000円
マイコン内蔵USB機能を利用する場合、プログラムメモリを多く必要。+8KB +200円
PCが必要。CDCという簡単な通信方法を使えば、PC側のソフトウエアの開発を省略可。
・赤外線 +100~500円
垂流し式とIR-DA等の双方向式がある。
PCの場合、赤外線ポート付PCまたはUSB-IRドングル等と対応ソフトウエア開発が必要。
PDAの場合、対応ソフトウエア開発が必要。
携帯電話の場合、 対応ソフトウエア開発が必要→面白そう、追加調査。
・無線系
自力開発は難しい(認可等の面で)のでモジュール使用
この形態が一番使いやすいので何とかしたいが... 費用の面でどうにもならない
選択 → 現実的にはUSB
■メモリカード部
入手性の良さからSDカードを選択します。
外形:抜き差しが多い事が想定されますので、標準サイズのSDカードが良いと思います。Microサイズを携帯電話で使っていて感じるのですが、小さすぎてそもそも抜き差しするようには出来ていないのではないでしょうか。また、標準サイズにしておけば、変換アダプタで全種類使えますし、小さくする理由は部品代だけです。あと、出来ればプッシュバックするタイプのコネクタが好みです。「カチッ」と明確に刺さった感触が大事だと思います。
電気的結合:マイコンの電源電圧を3.3Vに出来ない場合は、レベルシフトする必要があります。汎用ロジックICを使えば安心ですが、次のような回路でも問題ないのではと考えました。
マイコン(5V)→SDカード(3.3V) 分圧抵抗により電圧を下げればSDカードに合わせられる
マイコン(5V)←SDカード(3.3V) 例えばPIC18F2550の仕様では最低でも2VあればHとなるので問題無し
この方法は、SDカードの吸い込み電流が十分少ない・高速動作させないという前提ですので、動かない場合もあり得ますが、抵抗6本のみで済むというのが魅力です。
ソフトウエアインタフェース:SDカードを使うのにネックとなるのは、FATファイルシステムを含んだサポートソフトウエアの存在です。
PSoC1の場合、IDE(統合開発環境ソフトウエアツール)のDesignerで直接サポートされていた時期がありましたが、今は無くなってしまいました。しかし、これまでの「小物」を製作する過程で設計したSDカードサポートライブラリがあり、今回のケースでの適用が可能です。
PICの場合、Microchip社から提供されているライブラリ内の、”MDD File System”を利用すれば実現は可能です。今回初めて使ってみましたが、PSoC Designerの様に全く苦労無く使えるライブラリ(ユーザモジュールと呼ばれる)と違い、個別にインストール、ドキュメントが散在、かなり取っ付きにくいと感じました。しかしながら、format機能も持っている等サポートしている機能範囲が広く、ほとんどのアプリケーションでは困る事がないと思われます。また、ライブラリ内の構造として実デバイスにアクセスする部分(ブロックアクセス)は静的に切り替えが可能で、SDカードだけでなく他のデバイスやユーザ定義のデバイスも可能です。 注意すべき点は前提ハードウエアで、PIC18以上でプログラムメモリは70kB以上なので、デバイスはかなり限られたものになります(アプリケーションノートAN1045参照)。使用するMDDの機能を絞ればスリムになりますが、単純なファイルへのレコード書込みでも32kB前後を要しました。(コンパイラが「最適化なし」の条件です)
USB連携について:SD+USBという構成なので、SDの中身を直接PCでアクセスする手段が考えられます。要はPCからSDカードリーダ/ライタのように外部ディスクの様に見させて、ログデータを引き出せるようにする方法です。リアルタイムでデータを得たい場合は、PC側にファイル末を常時のぞける特別なソフトウエアが必要となります。WindowsではWebサーバのログビューア等がフリーソフトウエアで見つけられそうですし、Macはログビューア(コンソール)が標準で付いていますので、問題はなさそうです。とは言え、多少面倒になるので、仮想シリアルポートを使ったリアルタイムデータ転送機能と両立させた方が良いと思われます。
実装としては、USBのMSD(外部ディスク)機能とSDカードを連携させ、並行して仮想シリアルのCDC機能を使用すると言うコンポジットデバイスとなります。動作可能なPCの条件が、WindowsXP以上でMacは完全に不可という足かせがついてしまい、現在のPC事情を考えると適用不可と判断しました。
そうするとMSD一本での対応でいきたい所でしたが、最終的にはメモリが足りなくなったのと、USBコネクタ2個の問題もあり、今回はCDCのみの実装としました。
参考情報:
・MDD File Systemで面白いのはプログラムメモリの一部をストレージデバイスに見立てる仮想デバイスもあり、ファイルシステムとして読み書き!が出来ます。これ自体は、実際に役に立つ場面は無いと思いますが。
・USBデバイス[MSD]はチップ単体でも簡単に動かしてみる事が出来ます。外部ストレージが無くとも、プログラムメモリの一部分をストレージにして、微小容量(10kB級)のながらUSBメモリが実現出来てしまいます。Microchip社が提供しているサンプルがそのような構成になっています。
・CDCを含んだUSBコンポジットデバイスがPC側で完全に対応されていないのは、CDCがUSBが出来た後に追加された規格なので、PC側の対応がまちまちなためだと思われます。単独での使用は出来てもCDC+MSDのコンポジットデバイスでの実装が現在進行中といった感じなのかもしれません。私的にはMacが使えないのでは意味が薄いので、しばらくCDC+xxxという組み合わせは検討外です。
■制御部
複雑な制御を行いますのでマイクロコントローラが前提となります。
・A/D入力が6チャネル
・SPIポートが1
・入力ポートが1
・出力ポートが10(20mA級が3、Trベース駆動用に6、その他が1)
・1Hzタイマ
・USB機能(Lows peedでも可)
・プログラム・データメモリ量はSD、USB関係が同時に動くもの
・CPUクロック16MHz以上(PIC16アーキテクチャ基準)
MSP430は、低電力アプリケーションではない事と価格の点から対象外。
PSoC1は、USB機能を持つデバイスは高くなってしまうので選定の優先度は低い。
AVRは、メモリが64KBになると価格が跳ね上がってしまうので適当なデバイスが見つからない。コード効率が良いとは言っても、32KBで済むものか使った事がないので何とも言えない状況です。
PICは、PIC18F26J50が適当だと思うのですが、入手性の面で優先度が落ちます(Digi-Keyは送料が高いので買いにくい→ 2012年1月〜秋月電子で扱い出したので状況は変わりました)。ちょっと古いアーキテクチャになりますがPIC18F2550が現状での選択肢の様に思います。ただ、メモリが32KBなのでSDカードをファイルシステムアクセスする事はできません。そこで、苦肉の策としてPSoC1用のSDカードサポートライブラリを移植すれば何とかなるのではと考え、今回こちらを使ってみる事にしました。(移植済ライブラリは 簡易SDカードサポートライブラリPIC18版 を参照)
■電源部
分電盤周りは、壁コンセントなどあまりないと思いますので、分電盤から直接取り出したくなります。しかし、絶縁に関してこだわっていますので、やはり別電源を用意するしかありません。
(LED20mA×3+α)×5Vで0.5W級の電源となると、バッテリでは難しいし、ACアダプタが適当でしょう。USB出力のACアダプタに注目していましたが、やっと手頃になってきたので今回使ってみようと思います。これは、汎用のACアダプタとして色々な機器に使えますので、投資効果は良いはずです。
USBが5Vなので、SDカードに供給する3.3V用にボルテージレギュレータが必要になります。100mA級で1.7V電圧差でも動くもの、LDO(低損失、低ドロップタイプ)と言われるものなら何でも良いでしょう。
<回路図>
基本は方式設計通りです。
ハンダ付けがしやすい様に、SMD(表面実装)部品は使わず、全てリード型の部品を選定してあります。また、出来るだけ入手しやすいもので、種類も少なくしたつもりです。値が重要な部品はR11〜16、R41〜43で、その他のものは若干違っても問題ないでしょう。ただし、SDカードの所のR5〜10は比率を1:2にする必要があります。例えば10k:20k、5k:10k、3.3k:6.2k、1.6k:3.3kといった感じです。極端に小さくすると電流が流れ過ぎマイコンが壊れますので注意を。
全体として、かなり省部品になったと思います。心残りは、3.3V電源に統一すれば抵抗を6本削減出来たのですが、PIC18F2550は3.3V動作が保証されていないので諦めた事です。長時間安定した動作が求められますので、仕様外で使う事は避けた方が良いと考えました。
<部品表>
基板、配線材料、USB電源アダプタ、ケース関係、送料/交通費を除きます。
本体は約1700円ですが、CTが高価(U_RD直販サンプル価格でも1575円)なので6チャネル分用意すると約12,000円にもなってしまいます。
<ソフトウエア>
■開発に必要な物
Windows PC(パソコン)
Microchip MPLAB IDE 8 (*1)
Microchip C Compiler for PIC18 MCUs v3 (*1)
Microchip Application Libraries (*1)
PICkit等のプログラム書込み器
*1: Microchip社のサイトからダウンロード可能
■全体処理フロー
メイン処理自体は非常に単純で、1秒毎に回るループ内で計測・計算・表示・出力を繰り返すだけです。1秒間隔の作り方としては、ハードウエアタイマを使い割込を発生させる方法にしています。また、LEDは約1ms間隔でダイナミック表示(スキャン)する必要がありますが、メインの処理を単純化させる為に、これもタイマ割込みを使ってバックグラウンドで動作するようにさせています。
USB周りは、ライブラリが良く出来ているので、フロー制御なしのRS-232C通信のように簡単に使う事が出来ます。このアプリケーションでは、PCと接続されていればデータを転送し、接続されていなければデータを捨てるという処理を加えているだけです。
SDカード周りは、カードが挿入されている場合オープンして書込みし、挿入されていない場合でオープン済みの場合クローズを実行します。これだと、抜かれた時にまだ未書込みのデータが残っている可能性がありますが、別に何件かデータが取れなくても大きな問題ではないので、強制的なクローズ処理を行うだけにしています。
■ソースコード
C言語(C18)にてコード化しております。ソースファイルは以下の構成です。
●メイン
・main.c : アプリケーションプログラム本体。ローカルなサブルーチンや割込ルーチン等、全てのアプリケーションコードが記述されています。
●USB関連
・usb_config.h : USB動作定義。デモプログラム(\Microchip Solutions\USB Device - CDC - Basic Demo\usb_config.h)をベースに、割込を有効になるように修正。
・usb_descriptors.c : USBデバイス定義。デモプログラム(\Microchip Solutions\USB Device - CDC - Basic Demo\CDC - Basic Demo - Firmware\usb_descriptors.c)をベースに、デバイス名、製造元名を修正したのみ。
・HardwareProfile.h : USBライブラリ及びアプリケーションで参照される、入出力ポート等のハードウエア関係定数を定義。
●SDカード関連
・sd_config.h : SDカードライブラリのオプション定義。
・SDcm/sd_*.c : SDカードライブラリ本体。
・SDcm/sd_*.h : SDカードライブラリのヘッダ定義。
・delay.c : 時間待ちサブルーチン。SDカードライブラリからコールされます。
・delay.h : 時間待ちサブルーチンのヘッダ定義。CPUのクロック数が定義しているので、変更した場合このファイルも修正する必要があります。
●その他
・18f2550_g.lkr : リンクパラメタ。基本的にはSDカードライブラリに付いてくるファイルをベースに、メモリを最大限利用できるように若干修正しています。
特に説明したい点は次の通りです。
プログラムメモリ領域がすぐパンクするので、かなり苦労しました。ここでは、対策として以下の方法を取りました。
・printf等のstdioを使わない(効果大:KB単位で減る)
printf()が楽ですし、判りやすいので使いたい所ですが、この規模のマイコンではメモリイータの一つです。
数値文字変換をitoa()系に変える等の対応をします。
・floatを使わない(効果大:2〜3KB減る)
一カ所でもfloat計算をしていると、浮動小数点ライブラリを取り込んでしまい激増します。
さらに、使用した科学技術関数のサイズが乗ってきます。
使うのであれば全面的に使い、使わないで済むのであれば完全に排除するようにします。
int, longの整数型でも、10/100/1000倍すれば小数点以下の数字を表現出来ます。(固定小数点)
注意点は、割算・掛算が混じった式で計算順をよく考えないと、桁落ちして精度が落ちます。
乗算を先にして(オーバフローに注意)から、最後に除算すればだいたい回避可能。
今回はソースコードの読みやすさを優先し、floatを使用、あえて対策は行っていません。
・サブルーチンコールする場所を減らす(効果中:20~100byte/箇所、減る)
メモリ系の操作では、memcpy()等を書き並べてしまいがちですので、意外とメモリを消費しています。
コールする回数を減らすのではなく、コールする場所を減らすようにします。
例えば、else if を繰り返す書き方より、テーブルとループを使うと全体での使用量が減る事が多い。
・無くてもいい初期値設定はカットする(効果小)
フローをよく考えれば、処理内での値設定だけで済む場合が多いものです。
バグ予防の意味で考えれば、あまりお勧めはできませんが、ロジックを完全に掌握するには逆に良いかも。
なお、どこがどの程度使っているか確認するのは、オブジェクト単位では、リンクマップファイル(*.map)を見れば何となく判ります。ステップ単位は逆アセンブルリスト表示で何とか判るでしょう。
やはり、もっと大きいメモリ量のデバイスにするのが本来の対策だと感じます。
<ダウンロード>
バージョン0.5b リリース日:2012.5.23(USBブートローダ対応、バグ対策、機能改善等)
次のツールを追加インストールする必要があります
Cコンパイラ:Microchip C Compiler for PIC18 MCUs v3.33以上
ライブラリ:Microchip Application Libraries v2010-10-19以上
バージョン0.5 リリース日:2010.2.27(初版、ブートローダ非対応)
次のツールを追加インストールする必要があります
Cコンパイラ:Microchip C Compiler for PIC18 MCUs v3.33以上
ライブラリ:Microchip Application Libraries v2009-11-18以上
ライセンス: フリーソフトウエア(GPL v2)
作成者:富樫豊彦 tog001@nifty.com
開発環境:
WindowsXP HomeEdition SP3 / VMware Fusion 3.0.1 / Mac OS X 10.5
CadSoft Computer EAGLE 5.6 Light Edition for Mac
Microchip MPLAB IDE 8.36
Microchip C Compiler for PIC18 MCUs v3.33
Microchip Application Libraries v2009-11-18、v2010-10-19
PICkit 2 v2.60
<基板>
一品ものなので、蛇の目(ユニバーサル)基板でも良かったのですが、最近配線が面倒になったので、EAGLEで基板設計しました。EAGLEはドイツのCadsoft社のソフトウエア製品で、機能限定ながら無料でPCB設計ができます。
フィルムに印刷してそのまま感光基板に使える様に、反転させたデータになっています。
パターンは片面のみです。自分にしては大きめの基板(100×75mm)なので、配線の引き回しは簡単だろうと鷹をくくっていたのですが、ジャンパ線が2カ所必要になってしまいました。
基板下部のCT用ターミナルの所で太めにしているのは、ターミナルのネジ止めの応力でパターンが切れてしまう事があるので、このようにしてみました。前回WHM0.4のトラブルの反映です。
ベタの部分は、単にエッチングで溶け出す銅の量を減らす為で、電気的な理由ではありません。GNDに落とした方が良いのかもしれません。
左はパターンとピンのピッチを確認した所で、何の苦労も無くばっちり合いました。使ったインクジェットプリンタの尺度の正確さに感謝です。
右はSDカードコネクタの乗り具合を確認した所。初めて使う物なので、データシートを見ながら形状寸法を自分でライブラリ登録したので心配でした。こちらもばっちり合っています。ただし、カードコネクタの位置決めピン用の穴は、今回は穴開けしません。と言うのも、穴開け位置にパターンを通さないと、片面基板では難しかったからです。位置決めピンはニッパでカットし、基板との接触部分がツライチになるようにしておきます。
角がたつ部分は、パターン切れになりやすいので、丸めるようにしています。見た目には問題無いように見えて、実は崖っぷちを歩いているようなケースがあります。以下の写真は、この基板を拡大鏡にカメラを付けて撮影した物です。
一番楽しいハンダ付けが終わった所で、あっという間でした。USBコネクタの上のボルテージレギュレータの取付が不細工ですが、作る段になって丁度良い物を持っていない事に気付き、手持ちの物を何とか繋いだ為です。実は、この基板は一世代前のもので、2カ所程不具合があります。またISPコネクタの位置が悪く、プログラム書込み器のPICkit2がそのままでは刺さりませんでした。ダウンロードできるものは改善しています。
LEDは左下からチャネル0、1、2、左上から3、4、5です。
<ケース>
ケースはいつものように有り合わせのアクリル板を使って、簡単なのを作りました。
ケース完成直後。材料が有り合わせ再利用品なので、キズだらけです。アクリル用研磨剤で磨くとキズが隠れ、かなり見栄えが良くなります。
基板を取付けた状態。判りにくいのですが、SDカードが引っ込みすぎて、右側面とツライチになってしまい、挿入取り出しが困難な状態です。飛び出し長を良く考えていなかったのです。もう少し、基板を右寄りに取付けるべきですが今回は、挿入口をおちょぼ口のように加工して何とかしのぎました。(下記寸法図の赤ペンの部分)
寸法図面です。背面にはマグネットシートを両面テープで貼付けて、金属面に張り付く様にしました。
CTL-10-CLSをブレーカに取付けた様子と、使用した携帯電話充電用のUSB電源アダプタ。
動いている様子。カメラでうまくとれません。人間の目にはもっときれいに見えます。
<性能検証>
■実運用確認
今回は検証と言う程の事はせず、いきなり電気メータ(料金メータ)との比較のみ実施しました。なぜなら、基本的な方式は前回の「小物」WHM0.4から変わっていないため、同じような結果になると思ったためです。
力率固定で計算しているので、最悪150%の誤差が出る可能性がありますが、大きな電力を使う機器は力率が低下しないような対策(進相コンデンサ、PFC機能等)が入っている事が多いし、系統内で相殺される事もありますので、120%ぐらいの精度じゃないかと予想していました。家は、消費する電力のうち約3〜5割を電気温水器(ヒートポンプ式ではなくヒータ式なのでほぼ力率は100%)が占めていますので、もっと精度は上がるはずです。
結果は、 積算誤差が3週間で102%と言うのは予想以上に良い結果です。未調整の作りっぱなしの状態で、かつRLは誤差5%の通常品を使った条件では奇跡的と言っていいかもしれません。
出力されたCSVファイルは次のような感じです。Excelで取込み1行目は手で日本語コメントを打ち込んであります。
元ファイル WH201003.xls (約6MB)
各値については、信頼出来る基準器を持っていないので、良いか悪いか判りません。
IHコンロ(電磁調理器) 東芝BHP-M46T の待機電力は、26Wを表示しました。あまりにも多すぎるので、東芝の公式情報を確認すると、スペックは0.2Wのはずです。その後の調査で、やはり超低力率が原因で実電力は小さいのでした。電圧センサを加え、正確な電力値を計算すれば良いのですが、前述の絶縁問題の件で諦めていた部分です。このような低力率の器具がたくさんあると、誤差が増える要因になります。26Wの場合、月間18.7kWh多く表示されてしまいますので、ちょっと問題です。
エアコンの電流が2〜3mAなので0.3W位の電力を使っていると言う事なんですが、そんな精度はないはずなので嘘っぽいです。5サイクル分オーバサンプリングしているとは言え、こんなに奇麗に出てくるとも思えません。(温水器も同様)
グラフにすると、こんな感じです。
CH0:壁コンセント CH1:エアコン CH2:IHコンロ CH3:台所 CH4:温水器
上が十日間分で、下がある日の0:00〜23:59だけを抜いたものです。
温水器が飛び抜けて大きいのは仕方のない所で、電気単価の安い夜間時間帯(電力会社とそう言う契約をしています)に一気にお湯を作っています。これで、給湯には多くのコストがかかっているのが判ると思います。直接関係ないのですが、ガスの場合はもっと給湯での使用割合が高い(ガスコンロでの使用量はわずかなものです)ので、給湯量を減らした時の効果は大きいと言えます。また、最近のガス給湯器も高効率になっていますので、壊れた場合、修理ではなく買い替えを考えた方が良いと思います。
台所で定期的に使われているのは冷蔵庫です。いつも、ウンウンうなっている様に思っていましたが、そうでも無い様です。このグラフでは判りませんが、1秒単位にロギングすると、起動電流が結構大きいのも判りました。
山形は寒いので、暖房はエアコンを使わず石油ファンヒータです。青のハリネズミの様になっているのがこれで、石油エネルギーを使っているくせに、電気エネルギーも結構使っています。(少なく抑えている製品もありますので、見比べると面白い)今シーズンは暖冬だったのでエアコンの方が良かったかもしれません。 14:00〜18:00はこたつの時間で、ヒーターオン時は500Wを越えますが、平均するとまずまず。
問題だったのは、チャネル間で何らかの影響がある事実です。
温水器が動いている間、他の測定値が6割ぐらい落ちているのです。グラフ紫が温水器で、青が壁コンセントですが、コンセントの使用量が減っている様子が判ると思います。連動して使用量が変わる訳はありませんので、明らかにおかしい測定結果と思われます。調査した所、マイコンの入力ピンでは問題ない事迄は切り分けましたが、まだ原因はわかっていません。とりあえず、電気メータとの比較でも実証出来ていますので、このまま使っています。
その後、温水器系統(200V)のCTの取付線をもう片方に変えた所、影響が無くなっている事に気が付きました。残念ながら理由も、原因特定にも至っていません。
電気温水器は極端に使用量が大きいので影響がある事に気づきましたが、他のチャネル間でも少しは影響があると考えざるを得ません。ただ、他のチャネル間ではグラフに現れる程ではないのです。回路シミュレータLTspiceで再確認してみましたが、ここでも影響は出ないのです。電源への流入や、ノイズの影響など色々考えてみましたが、お手上げ状態です。
<関連>
「自作電子小物/電力インジケータ/テーブルタップ版0.6.5」
<製作背景>
この先、電気代は徐々に値上がりしていくと思ます。灯油やガソリンは以前より高くなっているのは事実だし、発電の半分以上は石油や天然ガス等を大量に使っていますので、技術革新でもなければ安くなるとは思えません。また、近い話では、家庭用太陽光発電の全量買取制度で、その負担が間接的に電気料金に入ってくるでしょう。そもそも、今の電気料金は十分安く、値上がりは本来あるべき価格に近づいているだけかもしれません。こんな事を考える理由は、太陽電池の小物を作って感じたのですが、mW単位の電力を安い部品で済む設計に苦労していると、商用電源のW当り約0.02円はもの凄く安いです。と言う事で、普通の家で何が出来るかを考えれば、「節電」しかありません。まずは、現状の消費の分析が必要になります。これは1回だけの作業で、すぐ節電の効果を実感できると思います。それ以上を考えると、常に節電を心がける為の何かきっかけ的な物(啓蒙)があれば有効ではないでしょうか。
消費状況の分析については、消費量の多い機器・不要な機器を探す為の情報として、電力計と電力量計が有効だと思います。家全体の電力量については、月々の電力会社からの請求書で判りますが、これだけでは何をしたら良いか判らないです。そこで、もう少し詳しいデータが欲しくなりますが、次の方法を使えば測定器等用意しなくともお金もかからずに知る事が出来ます。普通の家には、外に気メータ(料金メータ)、中には分電盤(ブレーカ)が必ずありますのでこれを利用します。分電盤は家の中で使う機器、コンセントをグループ分けしそれぞれにブレーカを割り当てています。大抵はブレーカのラベルに台所、居間、1F電灯等と書かれていると思います。このブレーカを手で切ってみて、電気メータの数値を前後で記録すれば使用量を調べる事が出来ます。切る前の1時間の電力量の差と、切っている間1時間の電力量の差から、そのブレーカ配下で使っていた電力が判るという方法です。アナログ式の電気メータの場合、小さな目盛まで読めば0.01kWh(10Wh)まで判別できますので、1時間位でも大丈夫だと思います。量が小さい場合は測定時間を長く取れば良いでしょう。ブレーカを切ってしまうと大変な事になる(冷蔵庫は水浸しに)場合はこの手は使えませんので要注意です。これで、大体の切り分けが出来るとおもいます。もっと細かく調べる場合でも、この電気メータを使う方法は有効ですが、使用量が小さい機器では変動に埋もれてしまうので、不可能ではないにしても、かなりの困難が想像されます。もっと楽に調べるには、やはりクランプメータ等のテスタ類を用意する必要があります。個別の使用量についてはエコワットやワットチェッカ等の簡易電力量計が最適です。ただ、クランプメータでは瞬間電力は判っても、積算値(電力量)が直接出る訳ではないので、これだけでは苦しいです。また、安価なエコワットでは瞬間電力が出てこないのが、ちょっと残念です。ワットチェッカは機能が充実していますが、高めの価格です。これらの、方法・器具を使って使用量の多い機器や消しても問題ない機器を探し、何らかの方策(マメに消す、使うのを止める、高効率の機器に買い替える等)を考えます。
つぎに、きっかけ的な「何か」ついてですが、この事に気づいたのは、以前「簡易電力量計」を製作した時です。テストのため家の分電盤に取付けた時に、初めは節電の効果が見えたので面白くいつも気にしていたのですが、進展が無くなると数字を見るのが面倒になりそれ以上の展開にはなりません。やっぱり、簡単に派手派手に、一目で電気の使用量を見れるようにしないといけないと考えました。そう言えば電気は目では見えません。ガソリンや灯油は液体だし、ガスも燃やすと見えます。電気も、見えたり・感じられる事が出来れば、節約の気持ちも持ちやすくなるはずだと考えました。
まずは、家全体の切り分けするための小物です。また、機器側のための小物も考えて行きたいと思います。
富樫 豊彦 tog001@nifty.com
Watt indicator for wall outlet distribution board.