« 2013年12月1日 - 2013年12月7日 | トップページ | 2014年1月12日 - 2014年1月18日 »

2014年1月5日 - 2014年1月11日の1件の記事

2014年1月 6日 (月)

AquesTalkでマルチメーター読み上げ装置を作る

みなさま新年おめでとうございます。

  このブログも発足以来6年目となりました。昨年のアクセス件数はおかげさまで18万件と前年と同程度でしたが、記事の新規掲載数は下がる一方で、昨年はひところの半分以下の22本、特に先月の12月は遂に一本だけで、一ヶ月も間が空いてしまいました。

 当研究所のドジ話を楽しみにいらっしゃる方には申し訳ないことですが、なにしろ工作にかける時間が激減しましたので書くことがありません。前にも書きましたように電子工作への熱意がさめたわけではありません。むしろ何か創りたいという気持ちは前と変わりがないのですが、作る種(たね)がつきてきたというのが正直なところです。

  とはいえ、暮れには念願の実体顕微鏡を入手するなど意欲だけはまだ十分に旺(さかん)なので、細々でも電子工作は続けていくつもりです。これからも暖かく見守っていただけるようお願い申し上げます。以下は昨年からの工作記録です。

実用にこだわってマルチメーター数値読み上げシステムをつくることにする
 ご存知のように当研究所は「実用品」を作ることにこだわっている。工作への熱意が下がったというより、作れるものをあらかた作ってしまって作るものがなくなったというのが近いだろう。もう少し正確に言うと、「現在の自分の技術レベル」で作れるタネがつきたのだ。

 実用品を作ってきたので、身のまわりには自作品が溢れている。髭剃り用のLEDペンライトから、階段照明の人感センサー、プリンター電源の遠隔制御アダプター、PC用のデジタルアンプ、グラフィック気圧計などは常時電源が入っており、時計のぜんまい巻上げ機も毎日動いている。

 周りの棚やケースにはFPGAを使ったフォトフレーム、温度ロガー、ガイガーカウンター、Xbee電力ロガー、Xbeeラジコンカー、2台のリニアPCMプレーヤーなど自作品が満載である。

 FPGAの基板(DE0)や32ビットCPU(mbedなど)は数多い積み基板のひとつで、このあたりはフォトフレーム以降、タネが見つからない。タッチパネルで液晶を動かすAndroidなどのスマホ系は、既製品のレベルに到達するのはとてもじゃないが無理なのでそう簡単には手が出せない。Xbeeなどの無線系もこれといったアプリがない。

 オーディオ方面も、24bit 192kbpsのスーパーオーディオの世界には飛び込みにくい。これを導入するとなると、今常用している古いオーディオシステムの聡取替えにつながる。というより、今の音以上の忠実度を欲しいとは思わない(クラシックの場合、音の心地良さと忠実度は比例しない)。

51uzz1agal_sl500_aa300_ この間、書店でFPGAでギガビットイーサネットのインターフェースをつくるというFPGAマガジンを見つけ、勢い込んで買ってはみた。しかし、「で、何が出来るの?」と聞かれたとき胸を張って答えられるアプリケーションはこのなかから見つからなかった。

 RaspberryPiのライブカメラも猫への防御を考えている間に、すっかり熱がさめてしまった。やっぱり作ることが楽しいので、応用となると途端に意欲が薄れる。困ったものだ。

音声合成チップAquesTalkを試す(12/8/2013)
 そうこうするうち、ウェブを見るともなく見ていて音声合成チップ、AquesTalkを実験しているサイト(すみませんURLが行方不明になりました)を見つけた。ここの回路は、トランジスタひとつでスピーカーを鳴らしている(単にオープンコレクターの負荷にスピーカーを接続しただけ)。他にも色々な実験サイトがある(ここやここ)。

 これまでスピーカーを鳴らすのには別のアンプが要ると思っていたが、これなら小さなブレッドボードだけで実験できる。この音声合成チップ(AquesTalk pico ATP3011F4-PU) は1年以上前に面白がって買ってあったが、まだ動かしたことはない。

 どんな声かはウェブで聞いているが、実際に鳴らしたことはない。ちょっと聞いてみたくなった。合成音声は何かと応用範囲が広い。当研究所の「実用性」ということでは研究対象として申し分がない。

S_p1066341 マイコンも何も要らない、UART入出力をPCへつなぐだけである。簡単に結線が終了した。動かしてみる。しかし、最初は動かなかった。配線間違いなどしたくてもできない簡単な回路だ。定石どおり、各部の電圧をチェックしていく。所定どおり出ている。

 おやあ、電源を切ってもVccが2V以上を指しているではないか。USB-UARTアダプター(Aitendo製)を切ると、Vccは0Vに戻る。プルアップされたUARTピンから電流が流れチップのパワーオンリセットがうまく動いていない可能性が高い。

 UARTをCOM1で受ける別のRS232Cインターフェースに切り替える。0Vに戻った。PCコンソールから?を送ると、>が返ってきた。よしチップが正常に動いた。試しに>aioeoといれると、ちゃんと「あいうえお」と女性の声が出た。いやあ感激である。ウェブで音声を聞いていたけれど、実際に自分のブレッドボードのチップから声が出てくると、とても不思議な気分である。

 '(コーテーション)などで適当に音節を切ると、さらにもっともらしい音声になる。実用性は十分だ。このチップのすごいところは数字をそれらしく読み上げてくれるところで、しかも2種類(百千などの位取りをする読み方と、一桁づつ棒読みする方法)で発声する。どちらも試してみる。

  2つとも非常に明快に数値を読み上げた。見事なものである。これは完全な実用レベルだ。すぐにでも何かに応用したくなった。そこで思いついたのがマルチメーターの計測値を読み上げる装置である。

マルチメーターのデータ読み上げ装置を調べる(12/10/2013)
 マルチメーターの測定で、プローブを基板に当てたあと値を読み取るために視線を表示装置に移さなければならない。その隙にプローブが測定点をはずれてしまったり、下手をするとプローブが別のパッドに当たって機器を壊すような悲劇も起きる。

 このとき、音声で数値を読み上げてくれれば、視線を換えずに対象物に確実にプローブを当てていることが出来る。極めて実用的な応用だ。これは単にマルチメーターからの測定値をUARTなどで引き出し、それを音声合成装置に入れてやれば良いだけだ。

 こちらは以前、秋月で¥1000の激安マルチメーターP-10を改造し、USB-UARTでデータを引き出している。改めてUART付きのマルチメーターを用意する必要はない。しかし、簡単なしかけなので、もう色々な人が作っているだろう。今さら作って面白がられるのか。

 しかし、調べてみるとウェブには意外に応用例が少ない。みんなAquesTalkで声が出たことで満足し、実際のメーター値の読み上げまで作った人がいないのだ。音声テスターとして完成させているのは調べた限り、ここのサイトだけだ。

 ふーむ、Arduinoで作っているのか、いや、省電力のためにクロックを下げて、スクラッチからの開発だ(Arduinoは固定クロック)。ソースコードまで公開されている。なんだ、ここまで出来ているのなら、今さら、こちらで作っても2番煎じになるだけかなと、ちょっとやる気をそがれた。

 いやまて、このサイトのAquesTalkはI2Cだが、こちらの石はUARTだ。しかも対象のマルチメーターの機種が違う(MAS345とP-10)。ソースコードを公開する意味はありそうだ。はじめは思い付きレベルだったが、制作熱が次第に高まってきた。

 久しぶりのまともなソフトの開発に心がはやる。おおまかな仕様の検討を始めた。しかけは、マイコンでUARTを通してマルチメーターから送られてくる数値データを受け取り、それをAquesTalkの発声データに変換して、別のUARTを通してAquesTalkに送り込むだけである。

 ソフトとして難しいところは、2つのUARTをデータ落ちしないように(誤りは許されない)正しく動かすことだけで、制御上の問題はほとんどない。連続的に変換してやれば良い。マルチメーター(P-10)のUARTは2400bpsと遅く、AquesTalkのほうは38400bpsくらいまでサポートしているので、フロー制御も考えないでよいだろう。

 CPUはUARTが2つとれる石が良いが、先のブログと同じ、AVRのMega168で十分だろう、UARTはひとつしかないが2つめはソフトUARTで実現できる。Mega88でも全く問題なさそうだが、手持ちのMega328を選ぶ。

擬似コーディングの前に仕様を固める(12/12/2013)
 そろそろ忘年会のシーズンが始まって忙しくなった。先月長女が家を出て家族が減り、一人だけ工作室にこもるのが少し気が引けるようになった。家族となるべく一緒にいるようにしたら、結果として工作に専念できる時間が減った。こういうことも電子工作に時間をかけられなくなった理由かもしれない。

 それはともかく、読み上げシステムの仕様を詰めていく。こうした作業は居間のTVを見ながらでも出来る。読み上げは、数値だけでよいか。同一データの時の繰り返し発声はないほうが良いのか。オームやボルトなどの単位の読み上げは必須だが、AC、DCといった付属データの読み上げをどうするか。エラーのときはどうするかなど、開発の前に決めておくことは多い。メモ用紙に何枚も気のついたことを書き留める。

 対象のマルチメーターはとりあえずP-10で決まりだ。こいつは、USB-UARTでデータが出力できるように改装したが、出力データのデコードは既存のPCのフリーソフトDMMViewer(沢山のマルチメーターをサポート、P-10はWens20-Tと完全互換)に頼っているので、この部分は一から作り直す必要がある。

 P-10のデータフォーマットを本格的に調べ始める。スペックによると、データは定期的に固定長の14バイトのレコードをUARTに送り出す。この中にP-10のLCD表示面のデータがすべて入っているので、ここから必要なデータだけを選んでAquesTalkのフォーマットに変換する。

 例えば、読み上げる数値は、< NUMK VAL=NNN.NNN > という書式のASCIIデータを送れば、「N百N十NてんNNN」と発声してくれる。単位は、megu'o-muとかmiri'anpeaなどのローマ字表示だ。

 発声のトリガーは、音声データが送出されたあとAquesTalkから戻ってくるUARTのプロンプト'>'である。マルチメーター側のマイコンUARTは、同一バッファーに常に数値データを送り込み、一つのデータが完結するまでフラグを立て、途中のデータが持っていかれないようにする。

P-10からは別のUARTラインを取り出す(12/14/2013)
 手持ちのP-10のUART出力は、マルチメーターのケーブル収容スペースに設置したUART-USBアダプターを通してPCに行く(記事参照)。フォトカプラーで絶縁され、電源はUSBの5Vである。これまでに何度か使いロガーとして重宝している。

 最初は、このUART-USBアダプターを生かして、STM32とか、FM3などでUSBホストを実装してシリアルをつなぐ野望を抱いていた(単なるUART2つでは面白くない)。USBがつなげればソケットを通して読み上げシステムにつなぐことができる。とてもスマートだ。

 しかし、少し調べてみたが、マイコンでUSBホストを実装するのはとんでもなく難しいことがわかった。STM32も手持ちのF103ではだめで、F105以上が必要だ。F107基板は、グラフィック気圧計に使ってしまったのでmbedあたりの出馬が必要だが、ちょっと大げさすぎる。

 なひたふさんが、RX61でオープンソースの手作りUSBホストライブラリを提供しておられるのを見つけたが、こちらはRX61基板は持っているものの開発環境がない。簡単には手が出しにくい。それにこれができてもRX61をこれだけに使うのも勿体ない。

 あれこれ迷ったが、今回はUSBホストは諦め、通常のUART-TTL(元々はこれが出力)を途中から引き出すことにした。まあ、本筋でないところであまり力を懸けて何のプロジェクトかわからなくなることは避けよう。

 P-10のUSB-UARTアダプターとフォトカプラー基板の間のハンダ付け接続をとりはずし、ピンソケットを増設する。通常のmilピッチなので実体顕微鏡を持ち出すこともないが、嬉しくて顕微鏡を通して作業する。

 最初はハンダごてをレンズにあてないか冷や冷やするが、徐々に慣れてきた。ハンダ吸い取り線でハンダを除去する作業がとても楽である。吸い取り線を正確にとりたい部分にあてられるので、熱をかけすぎて部品を痛めることがない。P-10のハードの準備はあっというまに完了した。

擬似コーディングに入る。デコードが結構大変だ(12/18/2013)
  いよいよ実装に入る。今回のソフトの制御ループは単純だが、各段階のテストをどうするかが悩ましい。例の逐次開発法で行くには、少なくとも4段階のテストステップが必要で、最後は手探り(動きを確認する手段がない)になる。

 まず、AquesTalkのUART入力で音声がでることの確認(ステップ0でこれは済んでいる)、次は、P-10からのUART出力がマイコン側で受け取れているかの確認(Aques側のUARTをPCコンソールにつける。ステップ1)。

 次に、P-10のデータをデコードして、Aques側に渡せるだけのデータに揃え、これをPCコンソールに出力する(ステップ2)。さらに、Aques側のUARTを動かして、Aquesが音声を出せるかどうかの確認(今度は、P-10側をPCにつなぐ。ステップ3)を終えて、始めて、最終工程、P-10からの出力をAques側に送る(ステップ4)。

 最後のステップ4では、動いていることの確認は、Aquesの音声以外では出来ないのがちょっと不安だ。まあ、これは最後の方なので、とりあえずはP-10のデータのデコードロジックの開発に専念する。

 参考情報は、すんさんが紹介してくれたWens-20Tのサイトや、P10のコントローラーFS9721のデータシートである。データフォーマットは、上位4ビットがデータのシーケンス番号になって下位4ビットがデータという変則的な仕様である。

 これが結構手ごわい。数値の表現がややこしいのだ。1桁の数値が2バイトにわかれ、しかも出来上がったデータを別のテーブルで翻訳している。しかし良く調べてみると、これは7セグLEDの数字のエレメントを単にデータビットに出しているだけであることに気づいて理解は急速に進んだ。

 これに気づく前は、参考にしたサイトに、いくつか誤りがあったこともあって(マイナスや小数点表示のビット値"0"は誤りで"1"、4のときのAb、ghの値、2Eは誤りで27、表示のKとMがないなど)、頭をかかえていた。

忘年会ラッシュと年賀状印刷の合間を縫って作業する(12/26/2013)
 今年は忘年会は少なめだ。それでも人間ドックをはさんで3連荘で少々ばて気味である。このところ電子工作は掛け声だけで先に進まない。擬似コーディングは済んでいるのだが、実際のコーディングになかなか手がつかない。

S_p1066346 そのうち年賀状を作る時期になって工作には手が回らなくなる。こういうときに限ってレーザープリンターのトナー交換の時期が来る。購入後7年を経過し2回目の交換である。3色全部をとりかえねばならないので経費は3万円以上かかるし、時間もとられる。

 それでも年賀状作成の間を縫って作業を進めた。ブレッドボードにAquesTalkと、Mega328を並べる。Mega328のUARTをどう割り当てるかで迷う。P-10側のUARTはマイコン側から送信する必要がないので、バッファー出力のないソフトUARTを使い、Aques側には送信割り込みの入った本格的なハードUARTを使うことにする。

 XbeeのAPIモニターに使ったソースコードを丸々流用する。ここのソフトUARTはChaNさんのASMプログラムを使わず全部をCで書き直したやつだ。最初のステップ、P-10 のデータ受信で少しはまる。

 ボーレートの計算がおかしい。文字の字化けが直らない。クリスタルを4Mhzから8Mhzに上げたのでループカウントを倍にしたのだが、どうもこれが間違っているようだ。最初オッシロで立ち上がりの時間が所定の時間でないことを確認した。

Aquesuart そのあと、プローブステートメントをコードの中に入れてコンパイルし直し、今度はロジアナを入れて正確な時間を測り直す。4MHzのときは、受信割り込みのあと14μsで割り込みルーチンに来るのだが、8MHzでは、半分の7μsではなく、8.7μsになっていた。

 待ち時間を単純なCPUループで作っているが、どうもループカウントの換算数とクロックが比例していない。原因を究明するよりも対症療法で解決する(先を急ぐ)。ロジアナで出たパルスの時間を2400bpsの長さになるようループカウントを補正する。

 コンパイルし直して、様子を見る。よーし、完全にデータが出たようだ。14バイトのP-10の測定データの16進表示だ。上位4ビットば番号、下位4ビットが数値というデータ列がUART画面を埋めていく。これで一歩前進した。次はこのデータのデコードだ。

やっとUARTにP-10の測定数値が出た(1/4/2014)
 家族が増えて暮や正月は忙しかった。所長を除いてこれまでは女ばかり(猫一匹がオス)の家族だったが、婿殿が2人増えてようやく男女同数になった。

 正月は酒を飲む機会が多い。飲んでしまえば、まず電子工作のような細かい作業は全くやる気がなくなる。来客のある2日間は全く手がつかなかった。3日から再開する。

 16進表示のデータが出たのであとは力仕事である。UART上で完全なマルチメーターの数値データが表示されるようにする。ここまで来ればAquesTalkの発声データにするのはあと一息である。データシートの資料を元に単位(VやA)の表示のコードを加える。

 参考にさせてもらって文句を言うのも気が引けるが、Wens-20Tの資料は、どうもわかりにくい。難しく考えすぎだ。それに抜けがある。単に表示面のセグメントが各データのビットに対応しているのだから、そのまま書けば良いところを、組み合わせて表示しているので、かえってわかりにくくなっている。

Aquescosole 奮闘数時間で、UARTにP-10の表示のままの数値と単位が順調に表示されるようになった。やれやれ一段落だ。これでステップ2が終了した。数値と単位以外にも表示面には、色々な情報(DC、AC、HOLD、AUTOなど)が出ているが、これは音声で出す必要はないだろう。音声は短い方が良い。

 このあたりでブログに報告することにしよう。残っているステップは、AquesTalkの制御(初期化、プロンプト待ち)と、実際の音声出力の確認である。

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

« 2013年12月1日 - 2013年12月7日 | トップページ | 2014年1月12日 - 2014年1月18日 »