« 2014年1月26日 - 2014年2月1日 | トップページ | 2014年3月2日 - 2014年3月8日 »

2014年2月9日 - 2014年2月15日の1件の記事

2014年2月11日 (火)

AquesTalkのマルチメーター(P-10)読み上げ機完成

 音声合成チップAquesTalkを使ったマルチメーター(P-10)の測定値読み上げ装置がやっと完成した。使ってみるとこれがなかなか便利である。秋月電子では、この激安(¥1000)のマルチメーターP-10の販売は停止してしまったようで、読者の方が買ってすぐ試してみるというわけにいかなくなったのは残念だが、いずれは他のマルチメーターでも動くような改善を考えたい(なお、秋月のWENS-20TはRS232Cの出力をTTLにするだけで動く)。

S_p2116401スピーカーの固定で道草を食って実装進まず(1/30/2014)
 読み上げ機はブレッドボードでは動いていたが、ケースへの実装はまだである。ケースは定番の秋月の117[P-00358]を予定している。このケースにスピーカーをつけるのにネジなどを使わないスマートな方法を考えて、この前までいろいろ苦労していた。

 最初の方法は、固定辺をケースに2つ取り付け、ケースの剛性を利用してスピーカーをその隙間にはめ込む方法である。しかし、実験してみると、ケースの剛性が思いのほか強くて、スピーカーが入らない。無理に入れようとしたら固定辺をつけた接着剤がはがれてしまった。これでは駄目だ。ケースは単なる板ではないので、そう簡単にはたわまないことを学習する。

Photo で、次に思いついたのが、固定する側の板の剛性を利用してスピーカーをはめ込むやりかたである。固定辺をこれまでの厚さ2ミリのアクリルではなく、CDケースのような薄いプラスティック板(1.2ミリ)にする。

 これだけ薄いとかなり曲がるので、この板を適当に切って、その真ん中を円形にくりぬき、前のように面にテーパーをつけてスピーカーを止める。この板をケースに作った隙間にはめ込めばスピーカーが固定できる理屈である。

 はめ込みが2重になるが、プラスティックを円形にくり抜くのは、コッピングソーがある今、たやすい作業である。固定辺2つが並ぶ止め方より、一枚板で止まっている方が見栄えも良い。新しい糸鋸刃も揃えてある。早速、作業にかかろうとケースを見ているうち、また気が変わった。

 一枚板でつける方法も結局はケースにこの板を止める固定辺を2箇所張り付けなければならない。接着剤による固定は、接着面が汚くなるのでなるべく少なくしたいが、これでは前と同じである。それより今ある一方のスピーカー固定辺をバネか何かで動くようにすれば、これまでの部品が無駄にならないで済む。

 ちょっと泥臭くなったが、片側の可動固定辺のバネに幅広の輪ゴムを切りだし、少し動くようにした。これで何とか固定される。強い力で叩くとスピーカーは落ちるし、見栄えも今ひとつだが実用的に問題ない。次の工程に移ろう。

S_p2116386 音を抜くための穴あけに入る。この前のデジタルアンプの通気孔では、気安く開けて失敗した。今度は慎重に、養生テープの上にマークをつけ、ドリル刃が泳がないように、錐で正確なガイド穴を開ける。しかし、ドリルスタンドで慎重に位置決めして開けたつもりだが、開けたあと調べると、やっぱり不ぞろいになっている。がっかりである。

 ガイド穴を開けたといっても、単なるドリルスタンドである。回転によってドリルそのものが動くし、ビットの僅かなぶれで対象物が意図せず動き、それがずれる原因になっている。やっぱり対象物やドリルの固定がもっと厳密に出来るボール盤レベルでないと、正確な穴あけは無理なようだ。

 まあ、それでもケースを割る事故もなく所定の穴は開いた。音を出してみる。びびりもせずちゃんと音がでた。養生テープがはってあるので見栄えがどの程度かまだ判らないが、とりあえずは次に進む。

基板のレイアウトと、スペーサー作りは順調だった(2/1/2014)
 ケースの中の詳細なレイアウトの検討に入る。ケースの一部に前の工作のときにあけた小穴が見つかった。これによって基板のレイアウトは制約を受ける。しかし実はこういう制約がある方が、設計は楽である。自由がありすぎるとかえって決まらないものだ。

 スピーカーを上面につけることになったため、ケースの高さが思ったより低い(うちのり23ミリ)のが心配である。部品の高さと位置を考慮しないといけない。特にMPUのソケットはつけておきたいので(今までに交換したことは殆どないが)、その高さを含めると、そのままではスピーカーと干渉する。

 スペーサーも常用の5ミリジュラ樹脂のものでは高すぎてまずい。ChaNさんおすすめのナットをハンダ付けする方法は、ケースに正確な穴をあけるのに結構神経を遣う。というので、このところRaspiの電源制御基板に使って具合の良かった5ミリABSパイプの中をタッピングした高さ4ミリのスペーサーを作る。

 何度目かの作業なのでこれは進捗が早い。スペーサーが完成し基板を仮組み立てして様子を見る。スイッチの形状と位置が問題だ。ソフトパワースイッチにしようかとも思ったが、AquesTalkの電源事情が良くわからず(/sleepピンを落としても電流が0にならない)、音声増幅のトランジスターへの電源も切らないと駄目なので、結局諦めてレガシーなスライドスイッチにする。

 基板のケースへの固定は最終組み立てまで保留して、基板の細かいアートワークにとりかかる。なんとかかんとか言いながら、少しづつものができていく。この過程はいつも心踊る楽しい時間だ。

アートワークをスキャナーで反転しハンダ面図まで準備して実装完成(2/5/2014)
 たいした配線量ではないのだが、久しぶりのアートワークに手間取った。当研究所の実装はUEW線で、「交差をさせないこと」を基本ルールにしているが、AVRのMegaシリーズは、VccとGNDがピン列の中央で交差しているので、それを避けようとすると、このあたりがやけにせせこましくなる。

 たてこんでいる基板なら、そう気にならないが、今度の基板は、真ん中にスピーカーが来るので疎密が激しくて、せせこましさが目立ってしまう。結局、この部分は、部品面に線を迂回して交差をさけ(一種のピア)、アートワークはとりあえず終了した。

S_p2116389  しかし次の日、昨夜一晩かかったアートワークが気に入らないので、もういちど見直す。これも気になりだすときりがないので適当に切り上げ、用心のため、スキャナーで反転画像をとってハンダ面の図も用意した。ちょっとした手間だが、ハンダ面があるのとないのとではこれからの作業の効率は段違いだ。

 ハンダ付け作業に入る。実体顕微鏡を活用する。いやいや道具にはお金をかけるものである。ハンダ付けの作業が楽しい。メガネをはずさないと顕微鏡が見えず、難儀していたのだが、アイピースをはずすとメガネをつけていても良く見えるようになったので作業効率は格段に向上した(今度はメガネの方のレンズ損傷が心配だが)。

 延べ半日の作業でハンダ付けは終了した。いや楽しかった。いよいよ通電である。ケースにはまだいれず裸の状態でテストに入る。ISP部の配線はかなり前に完成させ、正常に動くことを確認している。プログラムのロードも順調に済んだ。ISPをはずして意を決して再通電。動かない。はいはい、この程度では驚きません。

 気を取り直して、配線をチェックする。ISPまでは動いているのだから犯人はAquesTalk側の配線である。ただし電源周りは隣のMegaチップと同じなので間違いようがない。ひとつづつピンアサインを確かめる。おう、見つけたぞ。データ送受信のUARTピンがひとつづつずれている。隣のISPピンをピン最上部と勘違いしていた。

 ここを修正して、めでたく実装基板でAquesTalkが喋った。ここまで来ればあと一息である。電池フォルダーの固定や、スイッチ周りの配線が残るだけだ。

電池ホルダーの接触不良に悩まされる(2/6/2014)

 電池ホルダーの固定が意外に手間取った。ケースと電池フォルダーの隙間が少なくハンダ付けに工夫がいる。一旦、ホルダーを接着剤でつけてしまうと、あとから修正が効かない。ハンダ付けの後、何度も確かめてから接着剤で固めたのだが、心配したとおり、ケースの上蓋がハンダ付け部と干渉してうまくはまらない。

 万事休すというやつである。接着剤をはがさないとハンダ付け点に届かない。下手にやるとケースを溶かしてしまう。自分用だから、こだわることはないのだが変なところに美学がある。泣く泣く一つのホルダーを外して修正する(というよりいじっているうち勝手にはがれてきた)。

 ところが、この電池ホルダーがおかしいのである。どこかで接触不良を起こしている。どうもこのホルダーの樹脂が極端に熱に弱く、端子のハンダ付けのときにハトメの接触部分に樹脂が流れ込んで接触不良を起こしているようだ。

S_p2116382  初めての経験である。信じられない話だが、現実にテスターで測ると、電池の負極をあてるバネと端子が導通していない。ケーブルをハンダ付けする端子部分は熱でかなりの部分がホルダーの本体の樹脂に陥没してしまっている。

 このときとばかり実体顕微鏡を持ち出して、ハトメの部分と端子部をナイフで掘り出し、地を出して導通試験をする。間違いない。ハトメと端子の間には導通がない。それどころかハトメと負極のバネになる部分とも導通がないのである。樹脂がこの隙間に流れ込んだのだろうか。

S_p2116383  で、解決策は、錫メッキ線でバネと端子をハンダ付けすることだった。この作業はとても簡単だった。あっさり電池ホルダーの接触不良は解消した。ホルダー自身が、電池がはまらなくなったり端子がはずれたりして使えない状態ではないので、このまま使うことにするが、今度はもう少し熱に強いホルダーを探すことにしよう。

LEDをつけることにした(2/7/2014)
 実装版が動いた。動かしてみて、やっぱりLEDなどのパイロットランプがないのは不便であることがわかった。出だしは音声が出るから良いが、途中は全くわからない。テスターのレンジによっては、数値が出る間隔が遅い(周波数など)のもある。いちいち電源を入り切りして確かめるのも面倒である。

 さあ、どこに何をつけるかである。透明ケースなので基板に直接つけても良いが、いつもの3ミリ砲弾型では芸がない。ちょっと趣向をこらしてSMDのLEDをつけることにした。両面基板ではないので、ハンダ面からリード線を出し、そこへハンダ付けする。上手く行った。強度的にも問題ない。

S_p2116390  前の記事からLEDの仕様はだいぶ変えた。省力化をしているのにLEDを点けっぱなしにするのは矛盾する。待機中はゆっくり点滅し、動作中は激しく点滅して注意をうながすことにする。エラーについては、余り意味がないうえに、エラー期間は一瞬で終わる。表示時間を入れるロジックが必要なほどのことでもないので、やらないことにした。

 このLED点滅は、マルチメーターやAquesTalkとの送受信中でも動くように、つまりマルチタスク的に動く必要がある。そうなるとロジックは必然的にタイマー割り込みルーチンの中に組み込むことになる。こういうロジックは、擬似コーディングの恰好の題材でもある。

LEDの点滅ロジックの擬似コーディング(2/8/2014)
 ちょうど良い機会なので、擬似コーディングによる作成過程を少し詳しくご紹介しておくことにする。まず、仕様は次の通りである。

・1秒をサイクルに0.1秒だけLEDをつける(これで電流消費量は1/10になる)

・動作状況を示すグローバル変数を定義し、
  0....通電(0.1秒のブリンク)
  1....発声中は0.05秒間隔の激しい点滅

・割り込みは従来のタイマーの1msオーバーフロー割り込みを使う。
プログラムは、初期化以外は常に、1msごとに、制御がこのルーチンに飛び込んでくるので、他の仕事と一緒にここで同時(みかけの)処理ができる。

以上の要件をもとに、第一段の擬似コーディング(C言語風)は以下のようなことになる。

タイマー1msオーバーフローの割り込み関数() {
  カウンターを1つあげる
 もし、カウンターが900を越えたら、LEDを点ける。 //duty比10%のとき
 1000を越えていたら、カウンターを0にもどし、LEDを消す。
}

これで、LEDは0.1秒づつ点滅を繰り返す。これに動作状況によって変える処理を加える。グローバル変数をRTNとすると、擬似コーディングは、こうなる。

タイマー1msオーバーフローの割り込み関数() {
 カウンターを1つあげる。
 もし、RTNが0なら、カウンターを50で割り、余りが0ならLEDを
  exclusive or (0なら1、1なら0)して returnする //0.05秒ごとに反転
 そうでなければ
  もし、カウンターが900を越えたら、LEDを点ける。//duty比10%のとき
  1000を越えていたら、カウンターを0にもどし、LEDを消す。
}

 RTNが0のときにカウンターをリセットするべきか、ここで検討する。タイマーの割り込みと、AquesTalkの発声は非同期なので、リセットしておかないと、発声が終わったときのカウンターの値は不定で、正確な0.9秒待ち、0.1秒点灯は保証されない。規則正しい点滅にしたければ、RTNが0でLEDをスイッチする度にカウンターを0にしておいた方が良い。

 擬似コーディングの強みは、こういう検討が日本語の中で出来ることである。こうした検討のあと、もう少しソースコードに近い擬似コーディングを書く。

ISR(タイマー1msオーバフロー割り込み) {
  static uint16_t cnt;     //関数を抜けても変数がクリアされない
  if(rtn == 0) {             //ただし、機種やコンパイラー依存なので注意
    if( !(cnt++ % 50) ){
   LEDのポートをスイッチする。    //  A = A ^ 1;
   cnt = 0;           // 0と50の間を往復
    }
 }
  else {    //2つしか選択肢がないときはあらためて聞く必要はない
    if( ++cnt > 900 ) LEDのポートをONする。
  if( cnt > 1000 ) {
     LEDのポートをOFFにし、
   cnt = 0;        // カウンターを0に戻す
  }
}

 ここまで来れば、もうソースコードに近い。あとは、LEDのON/OFFのソースコードを用意し必要なグローバル変数を定義すれば完成である(お断りしておくが、ソースコードというものは文章と同じで、それぞれ個性があり絶対的な解答というものはない。そのつもりで参考にして欲しい)。

重複データは発声しない、小数点以下の0サプレスなどの機能追加(2/10/2014)
 テストを続けているうち、気にいらないことが出てきた。AquesTalkの数値読み上げルーチンはすぐれもので、整数部分の読み上げは、0が並んでいても、ちゃんと「ゼロ」としか読まないが、小数点以下は、.000でもゼロを律義に全部読み上げる。こいつは何とかしたい。

 それに前回と同じ値でもそれを繰り返すのは、やっぱり煩わしい。特に抵抗値の無限大時に「オーバーレベルです」を繰り返されると耳障りで、「うるさい!」と言いたくなる。これを回避するには、前回の測定データをまるまる残しておく必要があり、データ構造の大きな変更になるのでためらっていたが、せっかくだから直してしまうことにした。

 まず、小数点以下の0サプレスである。このロジックも文字列ハンドリングの擬似コーディングの恰好の題材なのだが、重複するので割愛する(ソースコードのコメント参照)。こういうときは、文字列の最後から調べていくというのがキモである。

S_p2116399  重複データの発声抑制は、思ったより簡単だった。memcmpと、memcpyというCの標準関数を使えば、3ステートメントで実現した。案ずるより生むがやすしというところである。

 ケースに入れた実装品が動き出した。スイッチを入れると、チャイムのあと「準備ができましぃた」と少し間の抜けた開始メッセージのあと、次々にデータを読み上げる。読み上げている時は50ミリ秒間隔のせわしない点滅、終わると、1秒間隔で0.1秒の点灯という待機状態を示す状態になる。

Aquestalk_readerv4  ソースコードと回路図を公開することにする。これでマルチメーター読み上げ機のプロジェクトはひとまず一段落である。

 新しいバージョンのソフトウエア一式をいつものAVRStudioのフォルダーの形で下に置きます。回路図ファイルもフォルダーの中に入っています。zipファイル名は違いますが、中のフォルダー、ファイルは前と同じなので注意してください。

「aques168V4.zip」をダウンロード

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

« 2014年1月26日 - 2014年2月1日 | トップページ | 2014年3月2日 - 2014年3月8日 »