2014年3月7日金曜日

PIC18F14K50で簡易4chアナログロガーを作ってみた

USB内蔵マイコンを使って何か実用的なものを作ろうと思い、簡単に出来て役に立ちそうなアナログロガーを作りました。

アナログロガーがあれば二次電池の充放電特性を見たり、太陽光発電で使われている蓄電池の電圧推移を記録できるので何かと便利ですよね?

使用したマイコンは、秋月電子で販売されている「PICマイコンPIC18F14K50T-I/SS(USB内蔵)」ってやつです。 USB内臓で150円って安い! 
過去にAVRでロガーを作ったことがありますが、そいつはATmega88のUSART出力をFT232系のシリアル変換ICで受けてPCに送信していました。今回のはPIC内部にUSBインタフェースが内蔵されており、(バッファ用のオペアンプ等を除くと)1チップで完結するのでとても楽です。

といっても、PICでUSBを使うとなると、どうやって開発していけば良いのかよく分からんわけで。。。
イロイロ調べてみると、「microchip社のWEBサイトにUSB機能を使ったデモプログラムがある」とのことなので早速DLしてきました。中にはAudioデバイスのデモだったりCDC,HIDなどたくさん入ってました。
デモプログラムをコンパイルする際、ヘッダファイルのパスを通すのに結構苦労しましたがww

デモプログラムの「Device - CDC - Serial Emulator」ってのを雛形にして改造していきます。
これをコンパイルしてPICに書き込んでUSBに接続すると、PC側からは仮想シリアルポート(COMポート)として認識されます。


PICで行う処理はとても単純です。
1、シリアルデータが送られてくるまでポーリングしながら待ちます。
1、データが送られてきたら、受け取った文字を確認し、"I"であればAN5,6,7,8をAD変換してPCに送信します。
以上です。

AD変換を1回行うだけでは偶然混入したノイズの影響を受けそうなのと、分解能が1024(10bit)になってしまうので、64回変換を行ってその合計をPCに送信しています。
理論上は、入力電圧が固定でADリファレンスも固定なら何回AD変換をしても分解能は1024のままです。
しかし、現実では周辺ノイズやリファレンス電圧の微小なふらつきが有り、閾値付近の電圧を変換する際は、変換値がパタパタ行ったり来たりします。
64回変換を行っている間に閾値のどちらに多く傾くかで結果が変わってくるわけです。
これで見た目の分解能を上げることが出来ます。(多分....)

次にPC側です。こちらも単純です。
1、AD変換値を得たいときにCOMポートへ"I"を送信する。
2、受信データをCHごとに分離して表示する(電圧への換算を行う)。
3、ログの記録やグラフを表示する。
以上です。

汎用のシリアルターミナルからCOMポートを直接叩いても構いません。
ただ、送られてくるデータがそのままだと見づらいのと、受信した日時が記録できないので専用のソフトを作りました。
C#で開発したので、簡易グラフやテキストログの記憶&吐き出し機能も割と簡単に実装できました。

動作中の画面



~ 以下写真など ~

ロガー本体。
フリスクのケースに入れてます。

ANポートに配線前。

プローブ差込口。

分圧基板はクッキングシートで転写する方法でやってみました。

生基板に転写後。

エッチング後。
一回だけだけの転写だとトナーが薄すぎるのか、ピンホールが出来てしまいました。残念。
なんとか使えそう。

部品実装後の分圧基板。
ダイオードは過電圧保護用。
(漏れ電流で逆に悪さをしている感w)

TL431の基準電圧源。

リチウムイオン電池の充電電圧のログを取ってる様子。

 12V12Ahのシールド鉛蓄電池を定電流放電した時の電圧変化をログ取ってる様子。

リチウムイオン電池の充電電圧ログ例

シールド型鉛蓄電池の放電電圧ログ例


周波数カウンタ機能を追加するともっと便利だったかな?
例えば、ハイサイドで電流検出した値を周波数に変換して、フォトカプラで受けるなど。

入力インピーダンスを高く保ちつつ、精度を上げるには入力のバッファアンプも必要ですね!

~ おわり ~




2014年2月15日土曜日

電源装置のプチ改良

先日ヤフオクで落としたKENWOODのCVCC電源(PR30-6P)に、CV/CC状態表示LEDが付いてなかったので追加した。



↑こいつ


電子負荷で動作確認。


とりあえず分解時の写真をいくつか。



半固定抵抗の実装方法が面白い。





電圧、電流を制御しているオペアンプの出力を観測してみる。


CV動作しているときは、黄色い波形が赤い波形より上に来てる。


オペアンプ周辺の回路を少しだけ書き出してみると、よく見かけるダイオードORを使った制御方法だった。
2つのオペアンプで電圧と電流を監視し、いずれかでも設定値を超えると電流を吸い込む方式。
ちなみに自作のCVCC電源でもこの方式を使っている。

この方法では片方のオペアンプが制御状態に入ると、もう片方のオペアンプの出力が飽和状態になるので2つのオペアンプの出力電圧を比較すればCV/CCのどちらのモードで動いているかが分かる。

今回はLM358をこの電圧の比較器として使った。
追加回路はとてもシンプル。


前面パネルのアルミ板に直径5mmの穴を開けてLEDを差し込む。

追加回路はパネルメータの取り付けネジに共締め。

完成!
これで使い勝手が少し良くなったかと思う。
全面のプッシュスイッチは電圧のプリセット用。
スイッチの下に穴が見えるが、そこにドライバーを突っ込んで半固定抵抗を回すと、電圧を設定することが出来る。

~  おわり ~












2014年1月23日木曜日

接地抵抗の測定実験

今回は接地抵抗の測定ネタです。

~ 経緯 ~
自室のデスクトップパソコンとオーディオコンポをUSBケーブルで接続して使用しているのですが、数日前に掃除をしていた時、一旦外していたUSBケーブルをコンポ側のコネクタに挿すときに小さな火花が散っているのを発見しました。
気のせいかな?と思ってUSBコネクタのシールド部分とコンポの差込口金属部を両手で触れてみると、少しビリビリ来たのでテスターで電圧を測定してみるとAC70V程度ありました。おそらくPC側のノイズフィルタから来ているものだと思います。
この状況はあまりよろしくないので「接地をしよう!」と思ったわけです。
といっても、部屋のコンセントはエアコンのコンセントを含めて接地端子は付いていません。
来ているのはDRSSTCのテストに使っていたアース線くらいです。ここに接続するのも気持ち悪いので新たにアース棒を埋めることにしました。
~ 経緯終わり ~

ホームセンターで購入してきたアース棒は、断面がS字になっている物で長さは60cmです。
これを部屋からすぐ近くの庭に埋めました。
地表から約30cm掘り下げたところに打ち込んでいます。




頭が隠れるまで打ち込んだあと、じょうろで水を掛けてから土を戻しました。
念のため地表10cmのところに「アース棒が埋まっていますよ~」って分かるようにラベルを入れておきましたw。

ちなみにアース棒に付いている銅線と黒色の線は、はんだ付けした後にビニルテープで保護してあります。本当は緑色の線を使いたかったのですがこの電線がたくさんあったので、、、
1.25sq HKIV耐熱電線です。

とりあえず埋め終わったのですが、接地抵抗がどの程度なのか知りたくなりますよね?

D種接地は漏電遮断機が付いている場合は500Ω以下と決められていますが、そのくらいはあるだろうなー と予想していました。
(今回はD種接地の規定に沿っているわけではないが。)

で、接地抵抗の測定方法をいろいろ調べていますと、主となる接地棒の他に測定用の補助接地棒を2本打ち込んで測定する「電圧降下法」ってのがよく使われていることがわかりました。
詳しく知りたい方は、「接地抵抗測定方法」とかで検索するといくらでも分かりやすい説明が出てきますが、ここでも簡単に説明してみます。

まずはこの図を見て下さい。

図中でEと書かれているものが主となる接地棒です。P、Cは測定時に必要となる補助接地棒です。
各接地棒の間隔を大きく取るのは、接地棒付近では導体と土との間で接触抵抗が大きく、それにともなって電圧勾配も大きいためです。
この電圧勾配がほぼ水平になったところに補助接地棒Pを打ち込まないと正確に測定できません。
電圧降下法ではE-C間に一定の交流電流を流して、その時にE-P間に生じる電圧を測定することで接地抵抗を求めます。

理解しやすいように各接地棒に生じる接地抵抗をRe, Rp, Rcで表記したのが以下の図です。

まず、接地棒E-C間に3mA程度の交流定電流を流します。
この時、ReとRcによって電圧降下が発生しますが、定電流源を接続しているので各抵抗に流れる電流は変わりません。

次に交流定電流を流したまま接地棒E-P間の電圧を測定します。
ここで用いる電圧計の内部抵抗はRpに比べて無視できるほど十分大きいものでなければいけません。
内部抵抗が十分に大きければRpにはほとんど電流が流れず、Rpの電圧降下を無視することができます。つまり、Rpを短絡したと考えてOKです。
そうすると電圧計はRe両端の電圧を測定していることになります。

よってオームの法則よりRe = V / I と求めることができました。

これが電圧降下法の測定原理です。


市販の測定器には交流定電流源と電圧計が内蔵されていますが、交流定電流を作るのが面倒なのでオシロスコープで電流値と電圧値を測定してそこから接地抵抗を求めることにします。
各機器の接続を以下に示します。

↓実験の様子


まず、PC上でWaveGaneというソフトウェアを使って820Hzの正弦波を出力させます。
820Hzという周波数は市販されている接地抵抗計で使われていたのでそれを真似ています。

この信号をオーディオアンプで増幅し、さらに1次と2次を逆接続した電源トランスで昇圧して絶縁された高電圧の正弦波交流を得ます。

この電圧をE-C間に印加しますが、Eに近い側に10Ωの抵抗を入れて、ch1のプローブに入力し電圧降下より電流を計算します。

補助接地棒Pはch2に入力します。

観測された波形を次に示します。

割ときれいな正弦波が出ています。
ch1の電圧が39.15mVrmsなので流れている電流は3.915mAとなります。
ch2の電圧は2.407Vrmsなので、接地棒Eの接地抵抗Reは2.407 / (3.915*10^-3)より614.8Ωと求まりました。

予想していたよりも大きな値でちょっと残念。
100Ω以下にするには結構大変なことが分かります。

電圧降下法による測定は以上です。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

次にLCR METER DE-5000を使って同じく接地抵抗を測定してみます。
こちらも測定対象に交流電圧を印加して抵抗値を求めます。測定周波数は1kHzとしました。

方法は単純で、接地棒E-P、P-C、C-E間の抵抗を測定し、連立方程式を解いて各抵抗値を求めます。

各接地棒は電圧降下法で実験した時と同じ位置に打ち込んであります。
精度よく測定するには、各接地棒を正三角形の頂点に位置するように打ち込み、間を10m程度ずつ離すのが理想です。
今回は簡易的な測定のため、直線上に打ち込んでいます。

↓測定の様子

結果は、
E-P間 1.434kΩ
P-C間 2.023kΩ
C-E間 1.855kΩ
となりました。

これより、接地棒Eの接地抵抗Reは (1.434+1.855-2.023)/2 = 0.633 → 633Ωと求まりました。
同じように計算してRp = 801Ω、Rc = 1222Ωとなります。

上で行った電圧降下法の結果とだいたい一致しています。

いちいちオシロスコープを持ち出すのは億劫なのでこの方法で十分でしょう。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

こうして庭に埋めた接地棒から線を部屋まで引き込み、端子台に接続しました。

PC本体とモニタ、コンポのアース線をここに接続しています。

後日、アース棒をもう一本打ち込んで接地抵抗を330Ωまで下げました。

接地後は異常電圧はなくなりました。 
あと、コンポでFMを聞いている時のノイズが小さくなったような気がします・・・。

アースは大切ですね!??

~ おわり ~

2014年1月4日土曜日

Tiny10を使ったサーボテスタ

明けましておめでとうございます(・ω<)

最近ブラシレス関連に興味がありまして、、
海外の安いESCを買ってみて分解して回路構成なんかを勉強していました。
というか、海外のESCが安すぎて自作する意味があまり無いようなwww

そのESCを動かすにはサーボ信号などと呼ばれるパルス信号が必要です。
パルス信号は周期約20ms、パルス幅1~2msとなっています。
重要なのはパルス幅で、周期はアバウトでも大丈夫みたいです。

このパルスはタイマIC555などを用いて簡単に発生させることが出来ますが、今回は米粒AVRであるTiny10を使ってみました。

Tiny10は、小さい割にA/D、16bitタイマ、アナログコンパレータ、内蔵クロックなどが搭載されていて素晴らしですが、EEPROMが非搭載なのが残念ですね。。

製作したサーボテスタは恒例のフリスクケースに収めてみました。

可変抵抗の厚みで蓋が若干浮くのでネジで固定しています。

内部は結構スカスカです。
ピンヘッダや基板は瞬間接着剤で固定しています。

Tiny10周辺の拡大

小さすぎて扱いにくいので変換基板に実装

マイコンを用いたので周辺回路はとてもコンパクトになりました。
手描きでナンですが、回路図です。

2014/03/07追記 保護用のポリスイッチなど抜けてたところを書き足しました。

※可変抵抗からの信号を入力するポートには、周辺ノイズの影響を抑えるために0.1uF程度のコンデンサをGNDとの間に挿入したほうが良いです。 
今回はプログラム書き換えの都合上省いていますが、特に問題になっていません(゜ε゜)

プログラムの開発環境はAVR Studio5を使用しました。

~動作の説明~
動作モードは5つあり、以下のようになっています。
1 ・・・ マニュアル(可変抵抗の角度に応じて出力パルス幅が決まる。スイッチを押すとパルス幅が1500usになる。)
2 ・・・ オート、三角波状にパルス幅変化
3 ・・・ オート、ノコギリ波状にパルス幅変化
4 ・・・ オート、逆ノコギリ波状にパルス幅変化
5 ・・・ 停止(パルス幅は直前のままで固定)

オートモード(モード2,3,4)では可変抵抗を回すとパルス幅の変化のスピードが変わります。

スイッチを押さずに電源に接続すると、モード1で起動してモードは固定です。
スイッチを押しながら電源に接続すると、モード2で起動します。再度スイッチを押すごとに、モード3→4→5→2→3... と切り替わります。

パルス幅は内蔵クロックの精度に依存し、周辺温度で結構変化するみたいです。
可変抵抗の角度読み取りの分解能は、内蔵A/Dの都合上8bitになっています。
2014/01/04時点の最新のファームウェアはコレです↓
https://www.dropbox.com/s/l4nyqr6aumg3p2f/tiny10%20analog%20to%20servo.hex?dl=0
MD5: 523CD4EC39FE797A6192AA287000510A

動作の様子です。(文字が見えにくいような..



2013年10月23日水曜日

パルス幅制限回路

インタラプタが暴走しても大切なテスラコイルを壊さないために、パルス幅制限回路があると便利。
そこで、74HC14と抵抗、コンデンサ、ダイオードで簡単な回路を組んでみた。
上手く動いているようなのでメモっておく。


↑ 実験した回路


インバータとRC直列回路を組み合わせたシンプルな回路。


パルスが入力されていないときはCtは充電されており、反転された電位が右側のダイオードにかかるが、逆方向なので電流は流れない。

正のパルスが入力されるとインバータで負のパルスに変えられ、コンデンサCtの電圧がRtCtの時定数で下がっていく。
電圧が更に下がってシュミットトリガのしきい値電圧に達すると、右側のダイオードが導通し出力がLになる。
パルスの立下りでは左側のダイオードでRtが短絡されるので、Ctはすぐに充電されて次のパルスに備えることが出来る。

Ctに使うコンデンサは小さい容量のものを使わないと74HC14の負担が増えるので注意。

この回路で制限されるパルス幅はおおよそ RtCt[s] になる。

いくつかの組み合わせで測定してみると、おおよそ理論値になっていた。
ダイオードの電圧降下やシュミットトリガのしきい値電圧のバラつきでずれているのだと思う。

測定結果↓

現在製作途中のMIDIインタラプタは、前回のように555によるパルス幅調整回路が無いので、マイコンが暴走した時のためにこの制限回路を付加しようと思う。

動作の様子↓



以上。

2013年9月8日日曜日

MIDIインタラプタ v2.1まとめ

なんか中途半端なとこから書いてますが。

◆出来ること
・MIDI信号を受信して、6和音までの固定パルス幅の信号を出力。
・ノート番号(音の高さ)によって出力ポートを振り分けられる。
・MIDIチャンネルによって       "

◆出来ないこと
・ベロシティに対応してパルス幅を可変させる。
・ピッチベンドでうにょ~~~んする。


DRSSTCの制御用として開発しましたが、パルス幅は外部のタイマICで固定されるのであまりよろしくないです。マイコンからは約9.6usのワンショット用信号を出しているだけです。
図1. よく分かる図

つまり、周波数が高くなったり和音数が増えると、デューティが大きくなりすぎて音が汚くなったり渦電流でヒューズが飛んだりするということです。

hex、説明書、回路図は下記URLからどうぞ
クロックは20MHz、8分周無しです。

バグなどあればコメントに書いていただけば修正するかもです。

【2018/03/16 追記】
パルス信号は、LMC555などのトリガとして使用しやすいようにHigh/Lowが反転した状態で出力されます。
つまり、図1に記載の”マイコンから出力される波形”は誤りです。脳内でHigh/Lowを入れ替えて下さい。近いうちに修正版をリリース予定です。

2013年8月12日月曜日

WINSTAR WEH001602ALPP5N00001 初期化メモ

シリコンハウスで購入したOLED(有機EL)キャラクタディスプレイ、WEH001602ALPP5N00001を動かしてみたので初期化方法を忘れないようにまとめておく。

普段、マイコンとキャラクタディスプレイを接続するときには、配線数の少ない4-bit modeを採用しているので、4-bit modeでの初期化方法を書く。 8-bit modeでも2回に分けているのを1回で送信するだけでほとんど同じだが。。。

まず、このOLEDディスプレイを使うにあたって、一般のバックライト付きキャラクタディスプレイよりも電源ラインのノイズが多いことに注意しないといけない。ディスプレイの裏面を見ると昇圧用のDC-DCっぽいものが見える。ここでDC12V程度を発生させている。

電源ラインにはこのDC-DCからのノイズが混入してくるので、ディスプレイ基板のVss-Vdd間に追加で10uFのコンデンサを入れておいた。
Eピンはプルダウンしておいたほうがよいかも(内部でプルダウンされている?)

マイコンにはATtiny2313を使用し、ディスプレイの端子割り当ては以下のようになってる。
<LCD: AVR>
Vss: GND
Vdd: +5V
RS: PB5
R/W: GND
E: PB4
DB0-DB3: NC
DB4: PB0
DB5: PB1
DB6: PB2
DB7: PB3

ディスプレイにデータ、コマンドを送信するときは、DB4-DB7にデータをセットしてからEを立ちあげ250ns以上待ってからEを下げる。下げた後も250ns以上待つ。
データシートのRead/Write Characteristicsを見ると、Eの立下りエッジでDB0-DB7が読み込まれるようだ。
RSピンは文字データを送受信するときは1、コマンドを送信するときは0にする。
コマンドによっては実行するのに10ms近く掛かるものもあるので、ビジーフラグを使わない場合は注意する必要がある。

4-bit mode初期化手順は以下のとおり。
この中で幾つか記号が出てくるが、意味は次のようになっている。
N: 表示行数の設定。 0を設定すると1行、1を設定すると2行になる。今回は2行なので1。
F: 文字フォント設定。 通常は0にしておくらしい。。
FT1, FT0: フォントテーブルを選択する。 今回は00にした。
D: ディスプレイ表示のON/OFF設定。 1で表示ON、0で表示OFF。 1を設定。
C: カーソル設定。 1でカーソル表示あり、0でカーソル表示なし。 0を設定。
B: ブリンク設定。 1でカーソル点滅あり、0でカーソル点滅なし。 0を設定。
I/D: 文字の表示方向を設定。 1で左から右、0で右から左。 1を設定。
S/H: 文字書き込み時のシフト設定。 1でシフトあり、0でシフトなし。 0を設定。


マイコンの代わりにスイッチで初期化してみる動画を撮った。
バスの状態が目に見えるので分かりやすいかな?




以上。