技術メモ: 鼻ホタルの計算書【回路設計を覗き見よう】

技術メモ: 鼻ホタルの計算書【回路設計を覗き見よう】

akira_you
akira_you (ID197) 公認maker 2014/09/06
0

概要:
鼻ホタルのセンサー部分の設計時に考えている事(計算書)を思い出して書き起こしてみました。Arduinoを使うけど、回路設計をした事ない人って意外と多いですよね。そこから自分でシールドを作るといった回路設計へのステップアップの第一段が計算書です。少しだけ回路設計の雰囲気を味わってみませんか?

その前に・・・鼻ホタルについて

鼻ホタルは鼻息をLEDで演習する、近未来的デザインのアホデバイスです。作者は私なのですが、ネタを考えたのは妻です。当時小さい電池(SR416)を見つけた私が妻に「これで体の色んな所光らせたら面白く無い?」と言って帰ってきた答えが「ん~、鼻息で鼻の穴が光ったらいいんじゃない?」です。

https://www.youtube.com/watch?v=CQJDa41mKwA

素人目には簡単そうに見えて鼻息センシングからしてハードル高かったです。紆余曲折いろんなタイプのを作ったのですが、今回は最新版のデジタル鼻ホタルをどうやって設計したのか、その計算書を温度センサー部分を中心に公開したいと思います。

オープンソースハードといっても回路図しか公開してない事が殆どですが、実際の設計者は動作検証が終わるまでは計算メモを残しているものです。計算書を作る事は電子工作キットやArduinoシールドを単に使うという立場から、中身を理解してHackするという立場になる為の第一歩です。計算書という名前は恐ろしげですが、電子回路というパズルを解くためのメモ書きなんで気楽にいきましょう。

動作原理

鼻ホタルは鼻息を吐くときと吸うときの温度差を検出して動作します。
温度が一定以上上昇した時にLEDを光らせる事によって呼吸を提示します。

設計要件

・温度感度は0.03℃が確実に取れる事を目標に(安全をみて0.01℃)
 健康な状態でも鼻は片方だけ詰まることが多いですが、詰まった方の鼻でも
僅かに鼻息は出ています。これを検知するには0.03度ぐらいを検知できれば
行けそうなことが過去の経験から分かっています。
 (初めての設計の時は試行錯誤する事になります)

・電池はML621(凄い小さい充電池)を利用
 過去の経験から非常に小さい電池(SR4169)の入れ替えは非常に大変なので。
 充電式にしてコネクタを抜き差しにするようにします。

センサー基本設計

基本的な回路図は以下の通りです。
センサー部分はR1(サーミスタと呼ばれる温度で抵抗値が変わる素子)とC1(コンデンサ)とマイコン(ATTiny10)のみです。R2とD1はLEDを光らせるためだけの部品で、R3はマイコンをスリープモード(事実上の電源OFF)に入れるためのスイッチ用です(今回の記事では無視)。

「▽」マークはGND(電池のマイナス)を示しVCCが電池のプラスを示しています。

サーミスタR1を通して流れる電流というのは、例えるならば温度計で制御された水道の蛇口のようなものです。温度に応じて水の流れる勢いが変わります。勢いを直接図るのではなく、電気をためるコンデンサに充電される時間を計ります。 水道で例えるならば水の勢いを直接図るのではなく、バスタブに水が貯まる時間を計測します。

風呂の水が溜まるまでの時間をはかっては、風呂の栓をぬいて空っぽにして。またゼロから水のたまる時間を計る。そんな回路をコンデンサと温度で抵抗値のかわる抵抗とマイコンで行います。

水位が規定量になったかを計るのは単純にデジタルIOのHI/LOW判断でできます。(マイコンの種類によっては中途半端な電圧を加えるのを禁止しているので、データシートをご確認ください。)
栓を抜くのは、デジタルIOを出力にして、0Vにする事で行います。

マイコンのADCを使わない理由:
初代は温度センサにS-8120C(http://akizukidenshi.com/catalog/g/gI-04574/ )を
使っていましたが、0.01度では0.12mVしか電圧が変化しないので、今回使うマイコン
(ATTiny10)のADコンバータ(分解能256段階)では150倍ほど測定精度が足りません。
(参照:http://www.avr.jp/user/DS/PDF/tiny10.pdf )
そこで今回はサーミスタとコンデンサでの積分回路を使う事にしました。

センサーの計算書

ここからが今回の本題です。
今回は温度センサーにはとりあえず簡単に手に入るサーミスタを使う事を仮定します。充電池の容量が小さいので、省電力のため高い抵抗値をと言う事で100kΩ(http://akizukidenshi.com/catalog/g/gP-05268/ )のサーミスタを前提にします。ADコンバータの分解能は低いので使う事が出来ません。そこで上に述べたサーミスタ(抵抗)を経由してコンデンサに充電される時間を利用して高分解能で温度を測定する事を検討します。

時間の計測にはマイコンのタイマーを使いますが、省電力のため250kHzでカウンタを動かす事を考えます。
此方のサイト(http://sim.okawa-denshi.jp/THtool.php )でサーミスタの抵抗値を計算すると32度の時に72109Ω、32.01度の時72076Ωです。72kΩで33Ωの差です、充電時間を計る方式なので抵抗値0の時に0秒から始まって、体温程度の72kΩまで33Ωステップで計ると考えて、およそ2200段階です。250kHzでカウントアップするので、2200段階を実現するにはコンデンサ充電にかける時間は約1/100秒です。ATTiny10は電源電圧の0.5倍の所にHI/LOWのスレッショルドがあるので充電時間t,コンデンサ容量Cと抵抗Rの関係式はt=0.693*CRとなります。

(ATTinyのIOのHI/LOWの閾値は電源電圧の半分なのでv=0.5の時間を算出しています)

これを解いて、コンデンサの容量は0.14μFと求まります。値が中途半端なので0.47uFに丸めます。上の方程式に再び代入するとt=32ms。約30Hzで計測できる事になるので、鼻息を取るには十分な計測速度です。これによって、100kΩのサーミスタを使う場合は0.47uFのコンデンサを使えば良い事が分かりました。


こういう計算がArduinoシールドのユーザから、ちゃんと考えてを設計・改造する回路Hackerへのステップアップの第一段です。

おまけ:電池の持ち時間の概算

ML621充電池は5mAhしか容量が有りません。5mAを1時間長し続けると電池が干上がってしまいます。

センサーは100kΩのCR回路なのでexp(-t)をt=0からexp(-t)が0.5になるまでの平均高さを次の式をwxフリーの数式計算ソフトMaximaで計算して、「integrate(exp(-t),t,0,log(2))/log(2)≒0.72」。
つまり平均で抵抗を繋いだだけの0.72倍の電流が流れます。なので、消費電流は7.2uAです。今回はずっと計測するのではなくて30ms計って10ms休憩するようにしてみました。40msに一回測れれば鼻息の測定には十分な速度です。ということで消費電力を30/40して0.54uAです。
マイコンは殆どの時間はタイマカウント待ちのアイドル時間なので2.7V,256kHz駆動のアイドル電流をデータシートから読み取って、10uAです。それに加え1/40ぐらいの時間はマイコンがアクティブに動いて居るので2,7V 250kHzのアクティブ電流をデータシートから読み取って0.5mA*1/40=平均12uAです。

以上マイコンとセンサーで22.6uAです。
実はML621という電池10uA以上を流しつづけると、電池の実質の容量が半分以下になるという制限があります。(大電流流し続けると電池の回復ができない)

LEDの電流は2mA程度を見込むと、1時間程度がまともに動く時間だと推察されます。実際には息を吸うときはLEDを消灯しているので倍持ちます。
したがって、2時間程度がこのマイコンバージョン鼻ホタルの電池持ち時間です。

このように、電池の持ち時間の見積は非常に考えるべき場所が多くて大変です。小さい電子工作作品を作る時に必ず現れる壁が電源どうする?です。みなさん良いアイディア思いついたら積極的に発表しましょう。ヒーローになれますよ。

おまけのおまけ:更なる改良設計と、課題

さて、折角ならもう少し電池を持つようにしたいです。特に10uA制限に引っかかっているのは勿体ないです。
センサーだけで7.4uA食っているのがきついので、サーミスタを470kΩにしてみましょう。100kΩより入手性は劣りますが、手に入らない訳ではありません。これでセンサー消費電流1.6uAまで減らせます。さらにマイコンの動作周波数を125kHzまで落とすことも可能でしょう。そうすれば合計7uA程度の消費電力にできそうです。
ただ、電流は減らせばいいと言うモノではありません。マイコン(ATTiny10)はIOポートから1uA程度の電流が漏れ出てきます。この漏れ電流がセンサーにとってはノイズになります。この影響はデータシートだけでは予想が難しいので、実験が必要になってきます。

さて、ここからもう一勝負です。そのうち改良版出ますよ。


回路図と、プログラムソースコードは以下でダウンロード出来ます。
https://drive.google.com/file/d/0B2MvWvAFndBdUXg5YTBtaEs2VXM/edit?usp=sharing
回路図にはフリーウェアのKiCadを用いています。
プログラミングにはAtmel社が無料配布しているatmel studioを利用しています。

追記 470kΩ化しました

470kΩ化した図面とソースコードを以下におきました。コンデンサの容量は0.068uFにしました。
https://drive.google.com/file/d/0B2MvWvAFndBdSzVkWnNyTzlHVm8/edit?usp=sharing

実測でLED抜きで平均20uA程度、非計測期間は6uA程度です。
元々の設計に比べれば、だいぶ電池の分極を防げるはずです。(10uA制限まではクリアできませんでしたが)

鼻づまりでもきちんと反応するように0.01度の温度変化を取れる事を目安に設計していますが、電池の分極を防ぐのを重視するのならば0.022uF程度にコンデンサに変更してもよいかもしれません。

参考にしてくれた記事

記事が登録されていません。
この記事を参考にして、新しく記事を投稿しよう!

違反について