自作電子小物/電力インジケータ/テーブルタップ
自作電子小物/電力インジケータ/テーブルタップ
Wh meter V0.6 Feel Power strip
2010年3月28日日曜日
見た目には普通のテーブルタップですが、ランプの色で使用している電力を見る事ができる小物です。メモリカード(SDカード)に詳しい計測値を出力する機能も持っていますので、簡易的な記録型電圧計・電流計・電力計として使用する事もできます。製作費は約2500円位、電圧・電流センサに抵抗器を、制御部にサイプレスセミコンダクタ社のPSoCを使用し、ソフトウエアはC言語にてコーディングしています。
なお、本小物は実験目的であって、商用電源で使用する事を許可された物ではありません。
<機能/特徴>
■使い方簡単、直感的に使用量が判る
■許容量オーバ時は警告音が鳴る
■電圧・電流・電力値のデータロガーでもあり、負荷もしくは供給側の変動状況を確認出来る
■単純、安価、製作容易、補正作業不要
<仕様>
名称: 電力インジケータ付テーブルタップ
分類: 単相交流、多チャネル、電力表示ランプ、簡易電力量計、電力データロガー
タップ数:4(チャネル)個別スイッチ付
電源条件:単相交流125[V]以下 50または60[Hz]
許容量:合計1.5[kW]、15[A]いずれかの少ない方
測定方法:本テーブルタップを使って消費機器の電源接続を行う
表示機能:
スイッチ部分が光るインジケータ:瞬間電力値で色が変る
[W]
0
〜3W
〜10W
〜30W
〜100W
〜300W
〜1kW
以上
色
黒
水色
青緑
緑
ライム
黄色
オレンジ
赤
計測範囲:〜11.5[A]/チャネル
計測方法:サンプリング、約20[回]/1サイクル・1チャネル、間隔は1[秒]
数値精度:-10[%]〜+10[%] 2[A]未満は1[W]単位、2[A]以上は3[W]単位
警告機能:合計が1[kW](変更可能)を越えている間、オルゴール音(曲名:剣の舞)が鳴り続けます
データロギング機能:
出力先:メモリーカード
対応メディア:SDcard(変換アダプタでmini, microも可能)ライトプロテクトは認識しません
データフォーマット:
ファイルシステム:FAT16、フォーマット済である事(FAT12は可とFAT32は不可)
データ形式:CSV(カンマ区切りテキスト、行末コードはCR/LF、1行目項目名列)
ファイル名:固定”WHyyyymm.CSV”、yyyyは年、mmは月、既にファイルがある場合は追記されます
データ項目:
日時(yyyy-mm-dd hh:mi:ss)
瞬間電圧[V] チャネル1〜4
瞬間電流[A] チャネル1〜4(測定間隔内の平均ではなく、その日時のサンプル値、小数点以下切捨)
瞬間電力[W] チャネル1〜4(測定間隔内の平均ではなく、その日時のサンプル値、小数点以下切捨)
月間積算電力量[Wh] チャネル1〜4
電力値は「有効電力」です。
以下の項目は出力されませんが、計算で求められます。
皮相電力[VA]=電圧×電流
力率[%]=有効電力÷皮相電力×100
位相は進み遅れが判りませんので計算はできません。
出力間隔:60秒(変更可能)
最大蓄積量:使用するSDカードの容量による。200byte/サンプル
例えば1GBのSDカードで約9年分、1秒間隔に変更した場合1.8ヶ月分
出力データ例(Microsoft excelで取込んだもの)
設定機能:
SDカード上に設定ファイルを入れる事によりカスタマイズ可能。
設定項目:日時設定、ロギング間隔時間変更、警告音開始電力値変更
カードを挿入した時点で設定されます。
外形:幅215mm、奥行44mm、高さ33mm
電源:AC100[V] 1[W]未満
製作費:約2500円
設定ファイル仕様:
ファイル名:“WHM.TXT”
フォーマット:
yy=年(西暦年4桁)
mm=月
dd=日
hh=時
mi=分
ss=秒
iv=ロギング間隔秒数
bt=警告音開始ワット数
設定ファイル例:WHM.TXT
※各仕様値は正弦波の条件でのRMS値で表しています。
重要:基板は交流電源と絶縁されていません。SDカードの端子が、手に接触する構造になっているカードは感電する事があります。
<技術的なポイント>
■ハードウエア
・Cypress semiconductor社のCY8C29466マイクロコントローラ
・非絶縁回路
・電力の計測
分圧抵抗による交流電圧の計測
シャント抵抗(微小直列抵抗)による交流電流の計測
INSAMP(計装アンプ)を高ゲインで使用
・アノードコモンRGB-LEDの直接駆動+ダイナミック表示+中間色をPWMモジュールで制御
・圧電スピーカの単純直接駆動+PWMモジュール利用
・SDカードのSPI接続、活性挿抜
・32KHz時計用水晶
■ソフトウエア
・プログラミング言語はC、開発環境はPSoC Designer、コンパイラはICC(ImageCraft C compiler)
・DUALADCでの連続計測と、動的な増幅率変更
・有効電力計算、電圧・電流RMS計算、積算
・積算値の維持、E2PROMユーザモジュールの利用
・タイマ割込でのダイナミック表示、パレット式で中間色を出力
・オルゴールの実装
・タイマ割込でカレンダ時計の実装
・標準のSDカードサポートライブラリもしくは独自SDカードライブラリを利用しCSVデータ追加書込みと、パラメタファイル読込み
・LVD割込の実装
・SLEEP時の消費電流削減
・独自sprintfの利用
<構成・方式>
■電力計測方法
以前、別の「小物」で電力測定について考えていますが、ここで再度纏め直しました。
電力の計算自体は単純で、次の式で計算できます。
電力=電圧×電流
面倒なのは、交流の場合、時間軸で電圧・電流が常時変化しているので、
(1)常に計算し続ける仕組みを用意する
計算結果(電力)も非対称交流となります
測定区間の面積を電力量と見る
(2)スカラ計算する方法を考える
常に値が変化している交流を、単一値で表現する方法として、実効値(RMS)という物をがある
実効値を使えば次の計算1回で済みます
電力=実効電圧×実効電流×力率
実効値は正弦波であれば、ピーク値÷√2で単純計算出来ますが、非正弦波では変換処理は面倒です
力率は電圧と電流の位相差が判れば三角関数で計算出来ます
実効値変換をアナログ回路で実現できれば、すごく単純化出来ます
といった方法をとる必要があります。
(2)の方法での難題は位相差の検出です。正弦波前提にでもしないかぎり、この方法は適当ではないかと思います。やはり(1)の方法がより現実的です。ただ、交流→RMS変換はこのレベルのCPUでは荷が重い事があるので、平均等の近似値で行う等の工夫が必要になるかもしれません。
次に、センサデバイスの選択です。
・電圧
分圧抵抗:安価、絶縁するには高価になる。
変圧器:電源と共用できる、やや高価。
測定しない:固定値とする、力率も100%固定。割り切り。
・電流値
直列抵抗:抵抗器自体安くない、絶縁するには高価になる。
CT:絶縁素子、取付容易、とても高価(2k¥)。
ホール素子: 絶縁素子、小型、やや高価(0.5〜1k¥)。
・選択
安全な製作を進めたかったので、商用100V電源ラインとの絶縁にこだわって来ましたが、どうしても費用・仕様を我慢しなければならない面がありずっと悩んで来ました。技術の進歩は危険と隣り合わせの面がありますが、それを差し引いたとしても、その先に得られる物があるとすれば進むしかありません。
どんな機器でも、大なり小なり非絶縁部分はある訳で、その境界を何処に設定するか、設定しなければならないかを考える必要があります。この「小物」の要件では、一つの小さなプラスチックケース内で完結しますので、内部の回路の絶縁状態は関係ありません(ケースを開けられる構造でなければという条件ですが)。ただし、外部と電気的な接続が発生するのであれば、そこは絶縁しなければなりません。
そこで、次の様に考えました。
データ出力は、オンライン形態はあきらめ、メモリカード渡しのみとする。
電圧計測は、分圧抵抗式にする。思い切って絶縁なしの方向で考え、一番安い方法に。
電流計測は、直列抵抗式にする。10A程度の電流であれば、安い電流検出用チップ抵抗がある。(あった)
その結果、電圧・電流とも計測できるので、より正確な電力を計算できる(1)の方法を使えます。
以前製作したWHM0.4では、RMS変換を平均値で代用しました。これは、CPUパワーの制約によるものでしたので、今回はCPUの処理能力を上げ精度を改善したいと思います。RMSの計算は、サンプリング値を二乗し、積算してサンプリング回数で割った(平均)値の平方根を取るという処理です。サンプリング値を保存するのに十分なメモリ、もしくはサンプリングしながら計算できるCPUパワーが必要になります。
■絶縁対策
テーブルタップ内に全ての回路を仕込み、タップ全体を絶縁素材で囲めば、特に回路で絶縁を配慮する必要はなくなります。しかし、外部と電気的な接続がある場合、何処かに絶縁ポイントを作る必要があります。
絶縁するための手法としては、電磁結合(トランス、近接誘導コイル)、光結合(フォトカプラ、赤外線素子)、高周波結合(無線)等が考えられます。どれも、リニアな伝達は難しいので、変調/信号変換させるのが現実的なようです。具体的には、V-F変換やPWM変調すれば途中の素子の選択自由度は格段に高まります。
結構面倒になってきました。どうせ面倒になるのだったら、非絶縁エリアで、やれるだけやってしまい、数値データそのものを出力する部分で分離する方が単純化・有利になるのではないかと考えるのが自然です。逆に、センサ段階で絶縁されたものを使うのも、やはり有利だと言う事も言えると思います。
今回は、抵抗器をセンサとして使う事を検討していますので、後方でのデータ出力部分での適用を考えます。
電磁結合:小型トランスや開放型コイル、高価ですがCTでも良い訳です。駆動・復調回路もデジタルデータ(低速シリアル)を前提とすると、そんなに難しくないと思われます。
光結合:フォトカプラがダントツで設計し易く安いので、ベストチョイスではないでしょうか。物理的に離れる場合では赤外線LEDを使ってデータを飛ばすという手もあります。シリアルーUSB変換ICを利用すれば、新たに設計する事も無くPCへのインタフェースが簡単に完成します。
高周波結合:電波でデータを飛ばす方法で、離れた場所で受ける必要がある要件でも使えます。一番のネックは高価になるという事です。
それでは、この小物の構成はどうするかと言うと、積算・蓄積する機能さえあれば、リアルタイムで詳細データを見れなくとも我慢できると思いますので、外部出力はメモリカード出力だけにする事で解決する事にしました。
■電圧計測
・測定方法
抵抗で分圧する方式ですが、相手は交流なので負値の対応を考慮する必要があります。
通常A/Dコンバータ(ADC)の入力は負電圧はダメなので、正側にオフセットさせる方法を使います。
安定した電圧源を被測定側の基準点に接続する事でオフセットする方法(絶縁されている前提ですが)
オフセット量をADCの最大測定値の1/2にすると、レンジを一番広く取れる。
PSoCは基準に出来る電圧(AGND)を出力する機能があるので、簡単に実現出来る。
・分圧比
最大AC125Vの仕様の表現は一般的にRMS表記なので、実際の電圧範囲は正弦波の前提で ±125×√2 = 177V 〜 -177V となると思います。商用電源の電圧波形は、実際見てみると大きく崩れる事はないように見えますので、正弦波の前提で問題ないと考えました。
A/DコンバータのVrefを0〜3.3V電源系とした場合の減圧比は、(177 - -177)/3.3 = 108以上にすればOK。
・回路保護
商用電源は、非常に長い電線を通って来ますので落雷の影響があったり、大電力消費のオン・オフ時の過渡的な電圧変化により規定値を遥かに越える条件が発生する可能性があるようです。
バイパスコンデンサやラインフィルタを付けるのが常套手段のようですが、波形に影響するので今回は適切でないように思います。
マイコンの入力には大抵、Vdd/Vssへのクランプダイオードが入っていますが、これは電源ラインに逃がすだけなので、もっと広範囲な影響を及ぼす可能性も考えられます。
やはり、ツェナーダイオード(定電圧ダイオード可)で、設定以上の電圧が来たら消費させてしまうしかないのか。今回の場合、ACライン側で抑止する、サージ吸収素子(ZNRサージアブソーバ)が最適ではないかと思います。
■電流計測
・測定方法
被測定回路に直列抵抗(シャント抵抗と呼ばれる)を挿入し、その抵抗に発生する電圧降下を計測する事で電流値を求める方法。
抵抗で電力を消費してしまうため、出来るだけ値は小さくする必要がある。
ただし、あまり小さくすると電圧測定が難しくなるのでバランスが大事。
今回は、テーブルタップ内で発熱する事になるので、1W程度にしておかないと恐ろしい事に。
・抵抗値選定
15Aで1Wなので、P(電力)=V(電圧)×I(電流)の式に当てはめれば、
1=Vshunt(シャント抵抗に発生する電圧)×15
Vshunt=1W/15A=66.7mV
よって、抵抗値はR(抵抗)=V(電圧)/I(電流)の式に当てはめ
Rshunt=Vshunt/15A=66.7mV/15A=4.4mΩ(0.0044Ω)
切りが悪いので5mΩ・2W(余裕を持たせて)の抵抗器となります。
低抵抗は高価というイメージがあったのですが、チップ型で10mΩ/1Wの安い物がありました。
2個並列にすれば丁度良くなりましたので、この方法を決めました。
・アンプ倍率
ADCはVrefを3.3V解像度を1024(10bit)とした場合、最小単位1カウントで3.2mV。
最大電流時でも66.7mVしか出ませんので、そのままでは20カウント=720mA単位と非常に頼りない性能に。
必要となるアンプのゲイン(増幅率)は、Vref/測定幅=3.3V/(66.7mV*2*√2)=17.5倍
これだと、41mA単位になりますので約4Wの精度という事になり、ちょっと寂しい仕様になります。
0.1Wの精度を求めるのであれば、約700倍のアンプが必要。
1Wの精度を求めるのであれば、約70倍のアンプが必要。
・アンプ選定
電流検出抵抗は5mΩと、非常に小さい抵抗ですので、途中配線での抵抗も無視出来なくなって来ます。
GNDを共通にして、絶対電圧を測定する方法では、目的の部分の電流値にならなくなってしまいます。
正確な値を得るには、電流検出抵抗の両端の相対電圧を取るのがベスト。
計算で補正してしまうという手も考えられますが、非常に複雑な計算になります。
相対電圧を得るには、差動増幅器(計装アンプ、インスツルメンテーション・アンプ)という物がありますので、問題はありません。
今回は、テーブルタップと言う事で1つの機器を直接測る事になるので、小電力機器の為に出来るだけ小さい値も計れる様に、700倍のゲインを持たせたい所ですが、3桁ゲインはかなりハードルが高いと考えたため1Wの仕様とします。
■表示部
目立つ判りやすい表示にしたいので、次の表示方法について検討しました。
・グラフ表示
履歴まで表せる可能性があるので、試したい所ですが何分表示デバイスは高くつきます
・ゲージ表示
棒グラフの様なゲージ表示が判り易く、チャネル毎に表示器できれば、なお良いです。
ただ、物理的なスペースとコストが問題になります。100円/チャネル
8x8ドットLEDなら棒グラフ表示や、スクロールで数値も表示ができます。
・色表示
1チャネル1灯でも、使用量を色表現すれば遠目でも確認できる
緑:少ない ー> 黄:やや使っている ー> 赤:大量に使っている →青:異常に使っている
コスト的にも問題ない
前回、色表示の方式がまずまずの感触でしたので、今回もこの方法で問題ないと思います。特に、使う人が不特定多数を想定していますので、これが良いと考えます。
3原色×4灯ですので、そのままでは12ポート必要になってしまい、使用するマイコンの選定で苦労します。このような場合、ダイナミック表示するのが一般的です。横方向(灯)に2bit->4のデコーダを使った場合3+2=5ポート、直結の場合3+4=7ポートです。2ポート差でしかありませんので、直結方式にします。
さほど光量は必要ないので、LED1素子に10mA流すとした場合、10mA×3=30mA程度の電流ですので、大抵のマイコンの許容値はクリアでき、トランジスタ等を使用したバッファ回路は必要なく、直結で問題なさそうです。
ダイナミック表示制御は、上図の左側の様に桁のピンを順繰りオンにしていき、それに合わせて行(今回はRGBの各色、7セグメントLEDであればa〜gの各セグメント)をオンオフする事を、人間の目で追えない位速い速度で行うと、全桁同時に点灯しているように見せる方法です。RGB各色を単純にオンオフすると、組み合わせで7色しか表示
できませんが、今回中間色もあると表現できる電力レベルが増えるので、階調表示を出来る様にしました。
階調表示はRGBを単純なオン/オフではなく、それぞれをPWM駆動してデューティを動的に変化させる事で中間階調を表現出来る方法としましたので、微妙な階調も出す事が出来ます。マイコンにPWMモジュールが3個以上ある場合に適用できます。
■時計部
カレンダ・時計は意外とやっかいな所で、考えなければならない事は停電と時刻合わせです。
停電:つまり外部から電源供給が無い時のカウントアップをどうするのかですが、次の方法を考えてみました。
・バッテリ保持
電池もしくは大容量コンデンサを使って、カウントを継続できる最小の電源を用意。
カウントを専用のIC、RTC(リアルタイムクロック)を使えば、この問題は簡単に対処。
マイコン内で実現する場合、低電力状態でもカウントできる設計にする必要がある。
大体は、32KHz程度の比較的低速の発振子で低電力分周させ、1秒割込みを発生させる。
別途クリスタルが必要、電源周りも一工夫が必要。
・復帰時、外部から情報を得る
電波時計の技術を使って、標準電波を受信すれば常に正しい日時を得られる。
時刻合わせの問題もクリア。
時刻が合う迄に若干のタイムラグがある。
部品代が高く付いてしまう。
時刻合わせ:
・標準電波で自動同期
屋内使用(電波が弱る)、電子機器に近い場所で使用(ノイズが多い)を考えると難しい。
自分が発生するノイズを抑える必要がある→設計が難しい。
費用は+1600円程度 参考:「壁掛時計/暗所用環状ドット表示式」
バーアンテナが大きく、タップ本体に入らない。かなり困難な選択。
・手入力
人間から入力してもらうので、数字を表示出来る装置と入力ボタンが必要。
数字6桁程度、ボタンは2つあれば良い。
今回は、表示にランプが数個ある程度なので数字を表現するのは困難。(モールス信号なら...)
別途、キャラクタLCDや7SEG-LEDを付ける必要がある。
SDカード経由で日時を設定する方法。
予め、PCで日時を入れたファイルを用意しておき、その日時になったらカードを挿入。
かなり使いにくいと思うが、表示器もボタンも使わなくて済む。
家電用のリモコンで設定。
リモコンのキーパッドを押した情報を、赤外センサで受けてキーボード代わりに利用する。
複数の種類のリモコンの信号をサポートする必要がある。
選択:
今回の場合、電源を切られる可能性が高いので、停電対策がないとかなり使いにくいものになります。絶縁しない構成では外部から計時情報を得るのは難しいと考えるしかないので、バッテリ保持が現実的です。専用時計ICを使えば、簡単に解決できるでしょうが特殊な部品が必要になりますし、面白さもないのでマイコン内蔵の方向で検討してみました。
1秒単位に計時するだけなら、10μA級の電流があればいいので、電気二重層コンデンサでも数日は保持できるはずです。難しいのは、周辺で消費されてしまう電流の削減と、主電源断および復帰時の対応です。電流の削減は、電池駆動の小物で経験しましたので、だいたい対処できます。今回初となるのが主電源断・復帰時の対応で、電源断を速やかに検出し低電力モードへ移行出来るかがポイントだと思われます。意外と面倒なのが電源断の検出でした。最初はマイコンのLVD(低電圧検出)を利用すれば良いだろう程度に思っていましたが、検出した時には残っている電力はかなり減っていてしっくりきません。別のアイデアとしては、AC電源の電圧を見ていますのでこれを利用すれば、もっと早いタイミングで電源断を検出できるはずです。(電源部にはいくらかの電荷が残っていますので)タイムアウト以内に規定以上のパルスを検出できない場合、電源断と判断する方法です。ところが、実装してみると誤検知が多く、使い物になりませんでした。この件はまだペンディング状態です。
時計合わせの為に、表示装置やキースイッチを付けるのはバランスが悪いので、やはり前回と同じSDカードでの設定方法にしました。
■発音機能
定格以上の電力が使われた場合、火災事故に発展する可能性が非常に高くなります。容量を意識して使っている人ばかりではありませんし、予想外の使用量になっている事もあるでしょう。せっかく、電力値が判るので何らかのアクションをさせるべきだと考えました。
・ブレーカ機能:安心ですが、コストがかさむ、勝手に切ると逆に危険な場合もある
・ランプでアピール:全ランプ点滅等、ハードウエアの追加なしに対応可能、見える位置に居ないと気がつかない
・音でアピール:近くにいれば気がつく、+100円のコストが必要
今回は警告ブザーが適当ではないかと考えました。単純なビープ音が出れば良いので、安価で小型・駆動回路も単純な圧電ブザー(正確には圧電スピーカ、圧電サウンダ等と呼ばれる発音デバイス)を選択します。
実際使ってみると音が単調で何の音か判らなくなるので、オルゴール仕様に変更しました。音階はカウンタもしくはPWMモジュールを使って任意の周波数を発生させ、別のカウンタをメトロノームの様にテンポを刻み、メモリテーブル(楽譜)に従って出力周波数・切換タイミングをコントロールすればメロディーが奏でられるはずですので、そんなに難しくはないと考えました。
分周比は8ビットカウンタが使えると、節約出来るのですが小さすぎると出力される周波数誤差が大きくなってしまうので、少し考えなければなりません。圧電ブザーは1kHz位だと良く聞こえるので、第二か第三オクターブを使う事にした場合、クロックソース32kHzではかなり怪しくなります。16ビットカウンタとより高いクロックソースを使えば良いのですが、一応実際聞いて確認してみました。私の耳では「まあ大丈夫かな」と思えたので、8ビットカウンタ+32kHzにする事にしました。なぜ、32kHzに固執するのかと言えば、大抵のマイコンではSleep出来き節電できるからです。
一番時間がかかり困ったのが曲の選定で、著作権の切れていて、何かしなければならない気にさせる様な、という観点で探しました。結局「剣の舞」あたりが良いんじゃないかと思いこれにしましたが、こうゆう事はスッと決められる様な一般知識を持ちたいですね。すいません著作権切れていませんでした。別の物を準備中です。
■メモリカード部
入手性の良さからSDカードを選択します。
外形:抜き差しが多い事が想定されますので、標準サイズのSDカードが良いと思います。Microサイズを携帯電話で使っていて感じるのですが、小さすぎてそもそも抜き差しするようには出来ていないのではないでしょうか。また、標準サイズにしておけば、変換アダプタで全種類使えますし、小さくする理由は部品代だけです。あと、出来ればプッシュバックするタイプのコネクタが好みです。「カチッ」と明確に刺さった感触が大事だと思います。
電気的結合:マイコンの電源電圧をSDカードと同じ3.3Vに合わせる事で単純化できます。
ソフトウエアインタフェース:SDカードを使うのにネックとなるのは、FATファイルシステムを含んだサポートソフトウエアの存在です。
PSoC1の場合、IDE(統合開発環境ソフトウエアツール)のDesignerで直接サポートされていた時期がありましたが、今は新規開発はお勧めされていないようです。とは言え、これが一番楽な開発環境です。
PICの場合、Microchip社から提供されているライブラリ内の、”MDD File System”を利用すれば実現は可能ですし、個人的に開発したサブルーチンライブラリもあるので大丈夫です。
■制御部
複雑な制御を行いますのでマイクロコントローラが前提となります。
・A/D入力が5チャネル
・SPIポートが1
・入力ポートが1
・出力ポートが10(20mA級が7、その他が2)
・1Hzタイマ
・PWMが3
・プログラム・データメモリ量はSD関係が動くもの
・CPUクロック16MHz以上(PIC16アーキテクチャ基準)
SDカードを使うという条件では、
・PSoC1
・PIC18もしくはPIC24
・AVR
が私的な候補となります。
複数のADCを同時に動かせるので、電圧・電流を真に同時サンプリング出来る事と、電流検出用のアンプの事を考えればPSoC1が最良だと言わざるを得ません。そろそろAVRにチャレンジしたかったので、部品数が増えたり多少無理があってもいいかなとも思いましたが、製作のしやすさは大事ですので、今回は残念ですが見送りすべしと踏みとどまりました。本当は、途中まで設計を進めたのですがどうやっても安く済まず、行き詰まってしまっただけです。
PSoC1では計装アンプを内蔵出来ますし、SDカードの利用も楽々です。やはり、こういう緩い機器ではPSoCは設計が楽です。心配なのはA/DコンバータとCPUのスピードだけです。
■電源部
AC100VからDC3.3V150mAを作り出す必要があります。非絶縁でも良いので、色々な選択肢があると思います。
・定電圧ダイオードを利用したシリーズ型
・トランス
・AC-DCコンバータ
絶縁型
非絶縁型(トランスレス電源)
一番単純で安く済むのが定電圧ダイオードですが、降下させた電圧は熱に変換させてしまうため効率が良くなく、常時使う機器としては適切でない様に思います。トランスは物理的な大きさの点で不可。結果、AC-DCコンバータしかないのですが、小型化で非絶縁でも良ければ俗に言うトランスレス電源ICが適当ではないかと考えます。
今回は、第4の方法として、もう使わなくなった携帯電話用のAC電源アダプタを使う事にしました。大きさも電圧も容量もこの用途に最適でした。
ケースは接着タイプのようで、破壊して基板を取り出す必要がありました。
<回路図>
基本は方式設計通りです。
ハンダ付けがしやすい様に、SMD(表面実装部品)は使わず、全てリード型の部品を選定してあります。また、出来るだけ入手しやすいもので、種類も少なくしたつもりです。R1〜6,16〜17は、出来れば±1%位の精度のものにして下さい。
<部品表>
携帯電話用AC電源アダプタ、送料/交通費を除きます。
流用したテーブルタップが安かったので約2200円で済ました。
<ソフトウエア>
■開発に必要な物
Windows PC(パソコン)
Cypress Semiconductor PSoC Designer 5.0 (*1)
ImageCraft C compiler Release V7 (*1)
Cypress Semiconductor PSoC Programmer 3 (*1)
PSoC MiniProg 等のプログラム書込み器
*1: Cypress社のサイトからダウンロード可能
■コンフィギュレーション
グローバルリソースとユーザモジュールの配置・結線状態。細かいので一応雰囲気だけ。詳しくは、プロジェクトファイルをダウンロードして開いて下さい。
もう少し、拡張する余地は残っていますが、アナログ入出力ピンはほぼ塞がっています。
判りにくいでしょうから、ユーザモジュール間の関係を図にしてみました。
特に、変わった使い方などはしておらず、クロック以外の各モジュールの結びつけは、ほとんどCPUが介在します。複数RGB LEDの駆動は、7セグメントユーザモジュールと機能的には同じようなものなのですが、単純に流用するとピンが無駄になってしまうので今回は使えない手です。
■属性定義
INSAMPの出力はSWAPで受けなければならない事に注意です。
FirstBlock(64byte/block)〜Lengthの設定値と連動して、flashsecurity.txtファイルも修正する必要あります。
■全体処理フロー
メイン処理自体は非常に単純で、メインループ内で計測・計算・表示・出力を繰り返すだけです。時計の機能は、1秒間隔のハードウエアタイマ割込でカウントアップ処理を行っています。また、LEDは2ms前後でダイナミック表示(スキャン)する必要がありますので、これもタイマ割込みを使ってバックグラウンドで動作するようにさせています。
SDカード周りは、カードが挿入されている場合オープンして書込みし、挿入されていない場合でオープン済みの場合クローズを実行します。これだと、抜かれた時にまだ未書込みのデータが残っている可能性がありますが、別に何件かデータが取れなくても大きな問題ではないので、強制的なクローズ処理を行うだけにしています。
■ソースコード
バージョン0.6aまでは、サポートが終了したSDカードサポートユーザモジュールを使っていたり、新しくサポートされた stdio を使っていたり、出力ファイルで文字化けする事があったり、空きメモリ量が厳しかったり、改善しなければならない点は多々ありますが、PSoC Designerでの開発経験のある方なら、なじみ易いと思います。
バージョン0.6bでは、各問題点をクリアし、プログラムメモリも若干空きが出ましたので、機能追加も可能です。図はソースツリーになっています。SDカード周り(sd_*.*)とsprintfを独自ライブラリ(t_sprintf.*)に変更してあります。
説明した方が良い点は以下の通りです。
・printf()の仕様
ICC v7.02からやっとサポートされた stdio.h ですが、まだ限定的なもののようです。詳しくは ”Documentation/Revision Notes for ImageCraft ICCV7 for M8C 7.pdf”に書いてありますが、printfの書式指定の実装レベルがイマイチ、桁数指定さえも未対応なので、使う場面は限られます。今回は、自前の sprintf() を用意してしのぎました。
・プログラムメモリは32kB全部を利用出来ない
フリー版のコンパイラではサイズ制限が課せられていますが、これは最適化前のサイズでチェックされているようで、結果として空き容量があるのにビルドエラーになってしまいます。例えば、以下はバージョン0.6bでの実際のビルドメッセージですが、ROMは約25kBの実コードに対し、1行目のコード圧縮処理前のサイズが約28kBなので、3kB(9%)使えない事になります。
・スタックエリアの使用バランスを考える
PSoC1/ICCはスタックエリアが256byte固定で増量する事も出来きないので、オーバフローしない様に設計時に注意を払う必要があります。まず、スタックエリアがどのように使われるかについてですが、一般的には、(1)関数コール時のリタンアドレス (2)引数値 (3)関数内で使われるauto変数(デフォルトはauto属性となるのでstatic指定していない変数の全てが対象)です。(3)の使用量を減らすには「手っ取り早くstatic属性を付ければ良い」のですが、引き替えにプログラムコードサイズが増える事がほとんどです。試しに、半分位static化した時は、約5%使用率が増えました。これは多分ページ切換えのコードが多発するためと思われます。ROM容量に余裕がある場合にはこれでも良いでしょう。正確なスタックの使われ方についてはコンパイラのマニュアルをご確認して下さい。
もう一つは、「引数の数を減らしたり無くしたりする」事です。通常は、スタックだけでなくメモリ全体での削減と実効速度の向上に効果が出ると思われます。しかし、一般的にはプログラムの汎用化や判読性が悪くなり、品質低下(バグが入り込み易い)と言われています。ある意味、そのアプリケーションに最適化されるのかもしれませんが、アセンブラで開発をしているのと変わらないかもしれません。
どちらにしても、ハードウエアをかなり意識してコードを書く必要があり、ホスト系アプリケーションをやって来た人にとっては、気が滅入る事ばかりです。
・strncmp()はページ間の比較ができない?
strncmp(s1,s2, n)で、s1とs2のメモリ領域が別ページに割り当てられた場合、正しい結果が出ませんでした。そんなはずは無いと思い、色々試行錯誤する事になりましたが、どうしても原因究明できませんでした。逃げ手として、別にstrncmpを作りました。
<ダウンロード>
EAGLE5.6プロジェクトファイル:
PSoC Designerプロジェクトファイル :すいません、楽曲の著作権の関係でダウンロード止めています。
ライセンス: フリーソフトウエア(GPL v3)
作成者:富樫豊彦 tog001@nifty.com
開発環境:
Windows2000 SP6 / VMware Fusion 3.0.2 / Mac OS X 10.5
CadSoft Computer EAGLE 5.6 Light Edition for Mac
Cypress Semiconductor PSoC Designer 5.0 (SP6 Build1127)
ImageCraft C compiler Release V7.02
Cypress Semiconductor PSoC Programmer 3.06
<実装上の問題>
設計通りにならなかったり、設計不足の点が幾つかありましたので、説明させて頂きます。
■A/Dコンバータの処理速度について
DUALADCのデータシートで、変換性能は10ビット精度で最大約2000sps(毎秒サンプル数)と書かれていたので、50Hzの1サイクル分が40サンプリングなので何とかなるものと想定していました。しかし、実際動かしてみると、動作はするのですが値が少し低く出力されてしまう現象が出てしまいました。
問題箇所を特定するため、試行錯誤で色々条件を変えで確認した所、下記の設定が重要である事が判りました。
・Vrefのバイアスパワー Highの方が誤差が少なくなる
・オペアンプのバイアスパワー Highの方が誤差が少なくなる
・ユーザモジュールのパワーレベル Highの方が誤差が少なくなる
・ユーザモジュールのクロック 低い方が誤差が少なくなる
・電源電圧の影響については未確認
パワーレベルについては初めから全部highの設定にしていたので、クロックを下げるしかない現実となってしまいました。こちらも試行した結果、半分の4MHzまで落とせば計算通りの結果値が出力されるようになりました。これでは、1000spsの性能しか出ないので、何らかの対策を施さなければならなりません。
DUALADCは解像度を任意に設定する事が出来、解像度を落とせば性能を上げられますが、単純に精度低下させる事もできません。下の図は、実際にA/Dコンバータで取込んだ生データと計算した電圧/電流値を折線グラフにした物です。まずは、精度が問題になると思われる小さい値での条件で確認したかった為、負荷には小さい白熱電球(直径30mmの5W?品、DMM実測6W)を使用しました。白熱電球は力率がほぼ100%なので、このような確認を行う場合、重宝します。
左から10ビット、9ビット、8ビットでの結果です。1サイクル分の取込み数は、10ビットの場合20サンプリング、9ビットの場合39サンプリング、8ビットの場合73サンプリングとデータ数は増えますので、普通は有利に働くと思われますが、逆に1カウント当りのレベルが荒くなりますので、ジャギーのように階段が目立ってくるはずです。実際、波形はかなり崩れて行きましたが、それだけでは無いようで、バタツキが見られるような現象が見られました。しかしながら、今回は波形データを取得するのが目的ではなく、トータルでの計算結果が合えば良く、実際あまり差がありませんでした。結局、どれでも良いかもしれません。
次に、正弦波以外の波形の場合に追従できるかが気になります。想像としては、サンプリングが多い程正確な形を形を描けるはずです。電球型蛍光灯はかなり歪んだ形ですので、これで実測してみました。
確かに、8ビットの方がより正確に描けているように見えます。もっと複雑な波形でないと、大きな差は出ない様に思われます。
結局、何ビットで行くかの判断としては、
・8ビットでは5W以下の測定は難しそうに見える
・今回の小物では値の正確さよりは小さい値が取れる方が嬉しい
と言う事で、10ビットが良さそうと考えました。
また、Vref電圧をVdd(3.3V/2 ±1.75V)ではなくバンドギャップ値 (3.3V/2 ±1.3V) を使う様にしています。これは、電源変動の影響を減らすのと、低い電流時の測定精度を上げる目的で、測定出来る最小電流を1.27倍引き下げになるはずです。
■LEDダイナミック表示のアナログ入力信号への影響について
アナログ入力ピン数の制約から、電圧入力はPGA等のアンプ類を通さず、Port2にある直接入力用ポートを使いました。Port2は主にLEDの駆動に使っており、そのせいかダイナミック表示のカラム切換えのタイミングで、A/Dコンバータの出力にノイズが乗ります。PGA入力時には、こんな事はありませんでしたし、LEDを外しても再現するのでポートを共有した事によるものと考えられます。どちらにしても、ピン数が足りずポートを変える事は出来ないので、回避策が必要となりました。
A/Dコンバータで取込み中は、LEDの表示更新をしなければ良いので、割込禁止にする対応をとりました。これで、問題解決したのですが、今度はLED表示がぎこちなくなってしまいました。ノイズの影響は致命的ではありませんが、表示は大変気になります。と言う事で、とりあえずノイズは放置する事にしています。
■ECOが安定して発振しない
32KHzのクリスタルを使用したECO(外部水晶発振器)は、かなりデリケートなようです。ECOは以前から気軽に使っており、特に問題など無かったのですが、今回は何故か色々悩まされました。基本情報のアプリケーションノート「AN2027 Using the PSoC Microcontroller External Crystal Oscillator」等を参考に対策を行いました。
・周辺の配線をスッキリ
ブレッドボードで開発作業している時、配線経路を最小にしてやらないと発振しませんでした。完全に発振しないのではなく、1/3位の安定しない周波数が出力されます。動くのを確認する迄は、ISPコネクタも付けない方が良いと思います。
・ポート1を静かに
クリスタルを接続するピンはP1[0]とP1[1]ですが、同じポートP1[2]〜1[7]で激しい変化があると、発振が不安定になりました。今回は、ポート1をSDカードのI/Oに使っており、なぜかロギングしている間だけ時計の進みが極端に遅くなるという現象あり、これでやっと気がつきました。チップ内で影響されてしまうのかどうか判りませんですが、対策として動きのある出力ピンをP[0][1]から出来るだけ遠ざけるように配置変更する事で、かなり改善されました。
・XtalOut側のコンデンサ容量を増やす
ブレッドボード上では、上記の方法でも完全に解決出来た訳ではなく、すこしノイズが乗る事があります。コンデンサ値を増やせば、安定度は増すはずなのですが消費電流が増えるトレードオフがあります。もっとも、今回は停電対策を諦めましたので、増加させる対策にしました。出力側のコンデンサを取りあえず2倍にした所、安定して発振する様になりました。
・レジスタチューニング
ECO_TRレジスタでバイアス値等を調整する事が出来るのですが、変更は勧められていないとの事なので今回は手を付けませんでした。
<開発中の状況>
感電は怖いので、間違って100Vラインに触れてしまわない様に、きちんとテスト用の環境を作りました。
実験用のブレーカを用意し、検電ランプでNatural(接地)側を確認しておきます。N側は触っても大丈夫なはずですが、常に安全とは限りません。条件が悪ければ死に至ると教わりました。
100Vライン側の回路はすべて端子台に載せ、低圧部分のみ引き出します。露出した部分がないように全部絶縁します。右側写真の電流検出抵抗を乗せた小さな蛇の目基板は、この後熱収縮チューブを被せてあります。
引き出した信号線も、触ったり接続する前に検電ランプとDMMでの電位差の確認を行います。実際計ってみると、40Vもの電位差がありました。
電圧検出抵抗はこんな感じでにして熱収縮チューブで被せました。
回路の確認、ソフトウエアの開発はブレッドボード上で行いました。
左側、100Vラインの回路は、上のブレーカから入り、下に出て行きます。先にはタップがあり、色々な機器をつなげられるようにしています。感電の可能性を減らす様に、当初マイコン側の電源は乾電池から取っていました。実験用電源を使ったのは、問題無い事を確認してからです。また、測定時以外はブレーカを必ず切る様にしています。
32.768kHzクリスタルが発振しなく、原因が分からず困った事がありましたが、クリスタル周りの結線を最短にした事で発振するようになりました。初めは、PSoCの設定を疑いましたが実績のある設定ですし、部品も同じものを使っているのに、規定の約1/4の周波数しか出力されませんでした。配線はかなりデリケートなのかもしれません。
SDカードソケットは、ブレッドボード用にminiSDカードアダプタの端子に電線をハンダ付けしたものを用意しています。実験にはminiタイプのカードを使います。カードアダプタを使うのは勿体ないと感じるかもしれませんが、今はカード本体におまけでついてくる事が多いので、この方が安く済みます。1つ作っておくとSDカード関係の実験が楽です。
右側写真は、4チャネル分のLED点灯を確認した時のもので、空中に浮いた状態のLEDです。
<基板>
一品ものでしたので、蛇の目(ユニバーサル)基板で作りました。左側が上面、右が裏面です。
SDカードソケットがあるとかなりスペースを取られますが、全体の部品数が少ないので何とかなりました。このソケットは奥行き長の関係で、残念ながらプッシュバックしないタイプを使っています。
次の写真が基板単独で通電した時のものです。配線ミスは無かった様でした。
圧電スピーカの音がうまく共鳴しなかったので、最終的には平板形は止め、へび花火の様な円筒形にました。
<ケース>
テーブルタップ自体を自作すると、どうせ不細工になってしまうと思ったので、市販の物を改造する事にしました。何カ所か店を回り物色、内部にスペースの余裕があり基板を詰め込めそうなものを買って来てました。どのように、詰め込むかかなり悩み、開発で一番時間がかかった部分です。これが今回使ったタップです。
580円の格安品。一見、良品計画のように見えますが別の製品です。シンプルで好感の持てる形です。実は、この「小物」を作ろうと思ったのは、このテーブルタップを見つけてしまったのが全ての始まりです。結局、他には丁度良い物を見つけられませんでした。
改造前の状態。
1口毎に電源ランプが入ったスイッチが付いている4口のもので、コード側の内部にスペースがあるように見えましたので、これを選んで来ました。YAZAWAのH-442WHと言う物です。
開けてみると、非常に単純、分解しやすい構造で素材として申し分ないものでした。ただし、ネジは三角穴の特殊な物で通常のドライバでは合いません。分解されては困る物でしょうから仕方ありません。2.0mm星形を強引に差し込み舐めない様に慎重に回します。
改造途中 。
L側バーが上部で、N側バーが下部に通っており、これはそのまま使います。判りにくいのですが、中央バーはパイロットランプへの給電にしか使われていないようだったので、完全に取り払ってしまいました。ネオン管の為だけにこの太いバーを使う理由が判りません。
スイッチ内のネオン管を全部外し、代わりにLEDを装着しました。パイロットランプは通電状態を示すものなので、外す事はしたくなかったのですが、LEDの取付場所に困ってしまい、こうなってしまいました。メイン基板にLEDを付ければ配線が不要で楽なのですが、一カ所集中表示よりはそれぞれの口に近い位置で光った方が断然判りやすいので、ここは大事だと思いました。最初は、加工が面倒なのでスイッチ側面に穴をあけてそこから光が通って行く様にしようと考えていましたが、うまく光が出るか不安でした。ネオン管を外す時に、LEDをはめてみたら丁度入ってしまったので、これでやってみる事にしました。
電流検出抵抗は、バーとクリップ部分を金ノコで切り離し、チップ抵抗をハンダ付けしました。また、電圧測定用の分圧抵抗は上下のバーを繋ぐ黒いチューブの中に入っています。接触を防ぐ為に、熱収縮チューブを被せてあります。右は、配線を通した所です。
主基板は正面側に、電源基板は背面側に両面テープで固定です。SDカードの挿入口は、ドリル穴を何個も開けてニッパで穴をつなぎ、棒ヤスリで整形すれば奇麗に開けられます。
とりあえず仮組の状態で、ドキドキの初めての電源投入。
オーケイ、グッド!予想以上に奇麗です。白い素材のせいか発色がパステル調の色あいになります。これはこれでいい感じです。
あれ?何で使っていない所もランプが光っているんだろう?......
ここから設計の見直しが起こりました。当初は各シャント抵抗の片方が全部つながるので、この共通点をからの相対電圧を測る方法にしていましたが、シャント抵抗から共通点までの区間で、わずかですが電圧降下が発生しており、意外と抵抗がある事が判りました。確かにシャント抵抗は非常に小さい値ですので、配線経路上の抵抗も無視出来なくなって来るとは思いましたが、この短い区間で太いバスバーなので問題ないはずだと思い込んでました。微小抵抗を測れる測定器を持ち合わせていないので検証出来ません。事実、電圧降下は発生しているので、対策として共通点を持つのではなく各シャント抵抗個別に両端電圧を計測するようにしなければなりません。再設計という事になってしまい、普通なら基板作り直し、悪るければ失敗作となる所ですが、PSoCは融通が効くので助かります。アナログピンを使い切ってしまいましたが、若干の配線変更と、ユーザモジュールの構成変更で済んだので救われました。
最終的な、改造後の状態です。
見た目には、何も変わっていませんが、SDカードを入れる穴があいているのが外見上の違いです。
タップ自体のコンセントを差し込むとランプチェック代わりに全ランプを1秒程4色表示させてます。デバッグ用に付けた機能ですが、最初に見た人への「つかみ」になるようで、興味を持ってくれます。改造前は、ネオン管独特のオレンジ色でしたが、これは水色・緑色を基調にした色で光ります。
一番左側のバッテリ充電器では、電池を装着すると点いたり消えたりを繰り返し、断続して電気を使っている事が一目で判りました。2つ目は石油ファンヒータで、運転中は色がコロコロ変わるので使用している電力も変動している様です。実は前回の小物WHM0.5で、グラフ化した際に見つけていた特性ですが、まさに目で見て直ぐ判ります。WHM0.5では判らなかったのは、運転していない状態でも水色でしたので 1〜3W位という最近の器具の割には多い待機電力と判り、マメにスイッチを切る様になりました。3番目はノートPCのACアダプタです。PCのオン/オフと連動する様にランプが点灯・消灯し何か変な感じです。スリープしている時には完全に消えますので、このアダプタの待機電力は気にする程でもないようです。
<性能検証>
■電圧・電流値確認
基準に出来る様な測定器を持ち合わせていないので、電流波形がきれいな純抵抗系の負荷なら、クランプメータやDMMでも正確な数値が出ると思い、測定して比較してみました。
クランプメータ:sanwa DCL10 DMM:sanwa PC20
電圧値は、-2%と悪い様に見えますが、使用した抵抗器に±5%を使っていたので仕方ないといった所です。
電流値は、クランプメータとDMMでは値に差異がありすぎます。使用したクランプメータの仕様を確認すると最下位桁は誤差が大きく含んでいるようなので、そのせいかもしれません。DMMを基準とすれば、95%位の精度なので一応設定した仕様以内の結果となっています。使用した電流検出抵抗の精度が±1%品なので、もう少し良い結果を期待していたのでちょっと残念です。しかし、補正も見直しもしていない作りっぱなしの状態では、まずまずだと考えるべきかもしれません。
荒れた波形の条件でも確認したいのですが、正確なRMS値を得る計器を持ち合わせていないので、未確認状態です。
■電力値確認
測定器としては、電力会社の「電気メータ」しかありませんので、家全体を占有しての測定となり、なかなか実施タイミングがありません。取れたら報告したいと思います。
<関連>
「自作電子小物/簡易電力量計/7チャネル版」
「自作電子小物/電力インジケータ/分電盤用」 合わせて使うと便利
「自作電子小物/簡易電力量計/7チャネルGUI版」 合わせて使うと便利
「自作電子小物/電力インジケータ/テーブルタップ版0.6.5」 Bluetooth版
<製作背景>
「電力インジケータ/分電盤用」のペア品で、こちらは特定の機器の消費電力を長期的に見るための小物となっています。背景については前作をご参照下さい。
機器の消費電力を測る物として、エコワットやワットチェッカ等があり、これでも十分なのですが、本当に特定の機器に絞った場合には使えても、通常生活の中に浸透させるには多数用意しなければならず、アダプタ型の形状は使いやすく見えて、コンセント周りを占有してしまうので、取付にくい事もあります。また、意識して数値をチェックしなければならないので疲れます。
理想的には、全ての機器に消費電力を表示する機能、もしくはコンセント側に表示する機能があれば言う事はありません。もう少し、現実的な線で考え、壁コンセント自体に組込むとか、3極→2極変換アダプタのような小さな物が光るとか、テーブルタップが光るとか色々な形態を考えてみました。テーブルタップ型は既に市販品が出ています。「SANWA SUPPLY TAP-S6 省エネタップ」と「YAZAWA 電力計付省エネOAタップ SHK562WH」が2000〜3000円と手頃な値段です。どちらも判りやすいアナログメータで良いのですが、1つしか付いていないのでちょっと購入をためらってしまいました。自分で作った場合どの程度の費用で済むのか、この形態での検討を進めて行く事にしました。また、これまでの「小物」で出来なかった電圧測定を行う事により、より正確な電力値を得ると言う技術的な興味もありました。結果的には試作でも部品代2500円で、それもロギング機能付きですので、普通のテーブルタップの置き換えが出来る位安い値段に出来るかもしれません。今は、実際の生活の中で使ってみて本当に有用かどうか評価している所です。
富樫 豊彦 tog001@nifty.com
The "Feel Power Strip" is the watt indicator with a SD card.