« 2008年9月21日 - 2008年9月27日 | トップページ | 2008年10月5日 - 2008年10月11日 »

2008年9月28日 - 2008年10月4日の1件の記事

2008年10月 1日 (水)

メトロノームの間隔測定に成功

ADコンバーターは気難しい(9/26/08)
 ブレッドボードの別の場所に組んであったリズムメーターのTiny861のデジタル部をアナログ部の隣に移し、いよいよ音響パルスでリズムを刻むマイコンシステムのテストに入る。ソフトは、この前スイッチでリズムを作り、LEDにその誤差を表示するソフトが出来ているので、これを殆どそのまま流用する。

 ADコンバーター(以下ADC)で一定間隔(1ms)毎に値を収集し、何回か(当初10回その後3~5回)合計した後、その値が閾値を越えたときスイッチがONされたとみなし、スイッチが押されたときと同じフラグを立てる。これで今までの構造を全く変えずに時間間隔がとれるはずである747

 はやる心を抑えて電源を入れる。音源は、この前の掛け声で家族を驚かせた経験を踏まえ、マイクの横にメトロノームを置く。ADCの閾値は、とりあえず基準電圧(1.1V)の半分程度とする。しかし、全く反応がない。スイッチの割り込みは生きているのでCPUが動いていることは確認できている。

 おかしいな。メトロノームの音のパルス出力はオシロで確認できている。P-Pで4V近くある。ローパスフィルター(以下LPF)が入ってTiny861のADC入力ピンで2V以下に下がっているが、ちゃんと音声パルスはでている。

 ところが、Tiny861が動き始めた途端、この出力が0になってしまっていることを発見する。これはどうしたことだ。データシートによれば、ADCへのアナログ入力は出力インピーダンスが10KΩ以下であることというのが条件で、オペアンプの出力インピーダンスはこれよりはるかに低いはずで問題ないはずだ。

 ただ今度は、オペアンプとの間にLPFが入っている。こいつが悪さをしているのかと直結してみた。ところが反対に、オペアンプそのものの出力までが1/10以下に下がってしまう。もちろんADCピンにも出てこない。これはまずい。ADCは随分前に温度センサーで使ったことがあるが、このころはWebの情報どおりにやっただけで基本的なところは全くわかっていない。

 データシートを読み直すが、先の条件以上のことは書いていない。基本がわかっていないので手の出しようがない。素人判断では、ADCの入力インピーダンスが相当低く、オペアンプの出力にまで影響を及ぼしていることを示している。

 それでは、オペアンプが悪いのか。このあいだ買った「定本 トランジスタ回路....」の出力インピーダンスを測定する方法で、オペアンプ単独の出力インピーダンスを測ってみた。無負荷で出力が4Vなので2Vになる負荷抵抗をつないだとき、この抵抗値が出力インピーダンスになる理屈である。10Kからはじめて、4.7K、1Kと負荷抵抗を下げていく。全く変わらない。100Ωでも変化なし。つまり100Ω以下であることは間違いない。

 オペアンプが動いているほうがまだましなので、LPFを入れた状態で色々調べる。オシロの測定電圧の感度を上げると、ADCピンにノイズに紛れてはいるが、わずかながら、音響パルスが出ていることがわかった。LPFの1KΩを何の根拠もなく100Ωにしてみた。これが何とADCピンに音響パルスが出始めたのである。50Ωにするともっと大きくなる。748

やれやれ0オームでは全く出なくて、50Ωを入れると動くなんて、理屈に合わない。しかし現実には1V近く出ているのでノイズはやや多いものの、もうデジタル計測が可能な状況になった。理屈はあとで考えることにして、このままでプログラムを動かしてみる。出た。メトロノームの音で時間が区切られUARTのコンソールにはインタバル時間が表示され、LEDがつき始めた。

やったやった。遂にリズムメーターの機能が動き始めた。暫く動かしてみる。しかし、パルスのとりかたがまずいのか安定しない。時々とりこぼしたり、メトロノームの中間で早く時間を切ってしまっている。オシロで見ている限りはきれいなパルス状の波形が出て、人間の見る限り、間違えようがないのだが、ソフトがうまく動いていない。
7463
ソフトロジックも結構難しい(9/29/08)
 ADコンバーターがとりあえず音を拾うようになったので、本格的なソフトの改修を始めた。まず、家中のメトロノームを動員する。常用している定番の大きなメトロノームに加え、携帯用の小さな機械式メトロノーム、それに次女が持っている電子式の小さなメトロノームの3つを揃える。とりあえずは電子式のものがやはり一番取りこぼしが少ない。それはそうだ。オシロでみてもきれいな方形波になっていて、これはそばで音を立てない限り正確にタイミングを記録する。
Photo
 小さな機械式のメトロノームが意外に成績が良い。音は小さいがパルスが揃っている。こいつは古くなって、往復の時間が狂ってきたのでもう使っていないのだが、正確にその違いがこのリズムメーターでわかる。率にして実に10%近い差があることが測れた。これは便利だ。早速役に立った。

 しかし、大きなメトロノームの方は問題が多い。筐体が大きいのでその反響音があるのだろう。オシロで見ると小さいメトロノームのパルスに比べて、パルスが不ぞろいで、ピークが2つ山になることがある。判定ロジックが練れていないので、この谷を次のタイミングと間違えるのと、時々音が急に小さくなる拍があり、ここで取りこぼしている。

 やれやれ問題は山積である。しかし、オシロは大活躍だ。スイープを長くしていくと短いパルスがメトロノームの音と音の間に発生しているのが発見できた。調べているうち、出てくるときが限られているのがわかった。どうもLEDが点滅しているときのノイズのようだ。LEDをドライブするピンはどういうわけか、アナログ入力の隣のピンになっていてジャンパーコードが近い。LEDはしょっちゅう点滅するのでなく、緑、橙、赤の3つのLEDを間隔の移動平均との差で点滅させたり、常時点けたりしている。

 ブレッドボードなのでこの辺の対策は無いに等しい。あわててLEDの配線をオペアンプから離し、ジャンパーコードが近づかないようにする。この対策で少しミスが少なくなった。実装のときはアナログピンを離して設定することにしよう。いや素晴らしい。オシロのおかげでこんなことがすぐわかる。まあ、アナログ入力のすぐ隣に10mA近く流れるピンを設定すること自体が非常識なのだけど。

 それはともかく、懸案はロジックである。閾値を変えてみたり、平均回数を増減したりするが、あちら立てればこちらが立たず。パラメーターの違いで大きいメトロノームが良くなったと思うと、電子式がとりこぼしを始めたりしてうまく収束しない。

 もうすこし賢い方法がありそうである。閾値を固定するのは本当は良くない。それと1ms単位にデータをサンプリングして10回の平均をとるのは、メトロノームの音響パルスが機械式では高いところは10~20ms程度しかなく、電子式でも30ms程度なので、タイミングがずれると正しい値を示さないことになる。いわゆる量子化ノイズである。

 それはわかっているのだが、連続的にADCを動かすのは今のロジックを大幅に変更する必要がある。何とか今のやりかたで出来ないか、可能な限りのパラメータ変更や、ローパスフィルターの調整をしたりするが、なかなか百発百中というわけにはいかない。いやいやソフトも難しいものだ。

 それと今のプログラムにはもうひとつ大きな問題がある。 LEDの点滅の仕様である。LEDで間隔時間の移動平均と直近の観測値との誤差を表示するようにしている。5%以内なら緑が点灯(good)、それより離れると15%(fair good)まで点滅し、それを越えると今度は橙色(caution)のLEDが点くというような仕様である。現在は移動平均の間隔時間を1とし、これより長くなっても短くなっても、その算術差で判断している。時間が長くなるときは移動平均との差でよいのだが、短くなったときの差はそのままではおかしくなる。

 1割増しと1割引きとの差は同じと考えられるが、3割あたりからおかしくなり、5割増しと5 割引では明らかに後者の差は前者より大きい。前者は1.5倍だが、後者は半分になっている。8割増までくると違いははっきりする。8割り増しは1.8だが、8割引というのは残りは2割(0.2)で、元とは5倍の差がある。

 どうすれば感覚的に同じになるか。2割遅くなったと感じたときは元の長さの1.2で良いが、逆に2割早くなったと感じる速さは、1.2で割ってやれば良い。つまり元の長さの1/1.2で0.83の長さが2割早くなったと感じるところということになる。要するに対数目盛りだ。

 この改修も含めてロジックを修正し、メトロノーム3台を実験台に今日一日試行錯誤した。しかし状況は好転しない。やはり飛び飛びのサンプリングで、しかも何回かの平均値を単に前後比較するだけで、音響パルスを正しく把握することは難しい。サンプル点をもっと増やすか、比較する範囲を広げた知的なロジックが必要だ。今日の実験はひとまずやめて、ソフトを基本的に考え直すことにしよう。

 と、ここまで書いて、後片付けし始めたとき、新しいロジックのアイデアが閃いた。よしこれを最後にやめようとソフトを少しいじり、動かしてみた。何と何と、これが大当たりだった。換えたところは一箇所だけ。今まで絶対値で大きな値になったとき、前の値が一定限度以下のときスイッチが入ったと判断していたのだが、絶対値をやめて、両方の値の差が一定の大きさを超えた時にスイッチが入るようにしただけである。

 Tiny861は、メトロノームが出す音響パルスを正確に把握して、PCコンソールに次々にタイミングを記録していく。どのメトロノームでもミスがない。これまでの状況がうそのように見事だ。いやあ、参った、参った。ソフト一つでこんなに状況が変わるとは。これだから電子工作はやめられない。

 一時は実装をあきらめようかと思うほどエラーだらけだったが、これで胸を張って次に進めそうだ。冷静になって考えれば、なぜこれを今までやらなかったのかというほど簡単な手法である。激しくパルスが立ち上がっているのだから、この前後の関係にもっと注目すべきだったのだ。これでもう少しサンプリング間隔を縮めればもっと確実になるはずだ。

ADコンバーターの入力インピーダンス(9/30/08)
 昨夜遅くの成功に気を良くして、今日も仕事から帰った後、工作室にこもって実験の再開である。サンプリング間隔をもっと小さくするとか、単純な平均でなく移動平均をとっていくとか、ソフトロジックにはまだまだ工夫の余地があるのだが、当面は昨夜のロジックをもとに最適な閾値を追い込む。不思議なことに、この方法は機械式の2つのメトロノームのほうが成績が良く、パルスの正確な電子式がむしろたまに間違える。
745
 これは電子式が音量の一定な音を30msだけ出しているのに対し、機械式は打撃音でパルスが鋭いため音量差が大きくなるためと見られる。平均をとる回数を3回(3ms)から5回(5ms)に増やしたり、閾値の値を減らすと電子式のメトロノームも正確になった(最上段 電子式 中段 機械式(大) 下段 機械式(小)ただし電子式はタイムスケールを2.5倍にしている)。

 それより前から気になっているのが、ADコンバータへの入力743電圧の低さである。どうも入力インピーダンスが予想よりはるか に低そうなのである。そうでなければ、ADコンバーターが動いただけで、あんなに一気に電圧が下がるわけがない。オシロで測ってみても、高々100Ω程度のローパスフィルターの抵抗の前後で大きな電圧降下がある。電流が流れている証拠だ。

シグナルジェネレーターから1Khzの入力をマイク入力に入れて整流回路のオペアンプで得られる出力は、脈流なので実効値(RMS)で見て0.8Vあるが、ADCが動き始めるとローパスフィル744タの100Ωの抵抗を介してピンの電圧は0.3Vまで下がる(コンデンサーははずしてある)。単純に考えると5mAも流れていることになる。

となると、ADCの入力インピーダンスは何と60Ωしかないことになる。本当にこれだけ電流が流れているのか、少し乱暴だけれど、テスターで電流を測ってみることにした。テスターの表示した値は6.05mA。やっぱり間違いない。こんなに低いとはどこにも書いていない。これは大変だ。下手にフィルターをはさむわけにはいかない。最初LPF(ローパスフィルター)に1KΩの抵抗をつけたらピクリとも動かなかったわけである。

それでは、このあいだ動かなかったオペアンプ直結にしてみてはどうだろう。やってみた。表示が5mAから10mAと見る見る増えていく、15 mAを超えたところで怖くなって電源を慌てて切る。CPUチップのピンに流せる最大電流は20mA程度だ。これではCPUが壊れてしまう。60Ωだとすると1Vに対して17mA流れるはずなのでこの測定値は間違いではない。直結したときオペアンプの方が動かなかったのは、このあたりと関係があるのかもしれない。

 困ったときのWeb頼みで調べたが、特にこういう話は出ていない。他社のADCの入力インピーダンスは数KΩが多いようだ。ご本尊のTiny861のデータシートをもういちど調べる。最後にADCの電気特性が出ているのを見つけた。入力インピーダンスは100MΩとある。そんな馬鹿な。Mega単位とはとても考えられない。チップが壊れているのだろうか。いやAD変換は全く問題なくやっている。どこかに大きな勘違いがあるのかもしれないが、今のところ動いているので余り深追いはしないことににしよう。

 ただ、何故これにこだわるかと言えば、アナログ入力をもっと増やしたいからである。LEDのスイッチング電流が場所を離しても結構アナログ入力に載って来て、前後の入力差にロジックを換えたせいもあって、頻繁にエラーを起こす。それで今はLEDの点滅をやめている。しかし、実装のときは是非欲しい機能なので、パルスを無視できるほどの、アナログ入力レベルにしたいのだ。こうした周辺ノイズを減らす対策が非常に面倒なことは経験上知っている。余りやりたくない。LPFはオペアンプを使ったアクティブフィルターにでもすればもう少しゲインが稼げるかもしれない。

| | コメント (2) | トラックバック (0)

« 2008年9月21日 - 2008年9月27日 | トップページ | 2008年10月5日 - 2008年10月11日 »