音声合成LSIのPICマイコンによる制御
デジタル屏風では、音の周波数領域ごとに音量を調整できる音質調整スピーカーを開発しています。
センサーとアクチュエータをPICマイコンで制御する監視警報装置のプロトタイプを作成しており、その経験を以下に記述します。PICマイコンの利用は今回初めてであり、失敗した経験(SPI通信がうまく動作しなかった)についても参考のため記載します。
◆監視警報装置の機器構成
①音声合成LSI ATP3012
センサーが検知した結果に応じて、音や声を出す仕組みを実現するため、音声合成LSI ATP3012を使いました。このLSIはアルファベットで任意のしゃべりの発音を入力するとそれに応じた発音をスピーカーから出力したり、予め録音してあるチャイムの音を再生することができるものです。秋月電子で約900円で購入しました。声は女性の声とロボットの声が販売されており、両方を試してみました。
②PICマイコン PIC16F1823
「たのしい電子工作」(神田民太郎著)に、PICマイコンで音声合成LSIを制御する記事が掲載されており、それがPIC16F1823を使っているのでこれを試しました。秋月電子で約100円で購入しました。
③スピーカー
インピーダンス4Ωの小型スピーカーを使いました。秋月電子で1個約100円で購入。ATP3012のデータシートには、アナログ・オーディオ回路のサンプルが紹介されています。ATP3012の出力する音声データをトランジスタ2SC1815一つでスピーカーに出力する簡易型D級アンプのサンプルがあり、これに基づいたものです。
◆音声合成LSIとPICマイコンの通信
「たのしい電子工作」(神田民次郎著)では、音声合成LSIとPICマイコンの通信にSPIを使っています。しかしCコンパイラはCCS-Cを使っていました。私はのCコンパイラとしてMicrochip社のXC8(無償で利用できる)の存在を知っていて、MCCを使えばSPIを比較的簡単に使えるという情報をmicrochip社のWEBサイトで得ていたので、CCS-Cではなく、XC8を選びました。しかしSPI通信がうまくできず、UARTを使った通信で音声合成LSIを制御することができました。
①LEDを使ったプログラムロジック検証
PICマイコンのプログラムが動作しないときのデバッグは、PC上のプログラムより困難です。今回まずはプログラムを動作させたところだんまりの現象となりました。どこで止まっているのかがわからないのです。PC上のプログラムであればprintf文などで各変数の値は通過しているパスを簡単に検証できますが、PICでは用意ではありません。PICKITにはデバッグ機能がありますが、単体での動作確認に限定され、ATP3012のようなプロセサと連携する状況では困難があります。そこで私が選んだのは、PICマイコン上のプログラムにLEDを光らせるロジックを埋め込みどこを通って、どこを通っていないかを判断する仕組みです。あまり格好よくありませんがこの方法でどこで実行が止まっているのかを突き止めることができました。
②MCC(MPLAB Code Configurator)の利用
MCC(MCLAB Code Configurator)は、PICマイコンの開発環境MPLAB X IDEのプラグインであり、GUIを通してSPIなどシリアル通信などの各種設定を可能とするソフトウェアです。MCCの使い方については、「C言語によるPICプログラミング大全」(後閑哲也著)を参考にしました。英語ですが、Microchip社のWebサイトにビデオチュートリアルがあり、これも参考になりました。
MCCを使いこなすためには、PICコンピュータの用語とその用語が意味することを理解していないと大変だということです。クロック数、通信モード、割り込み制御など色々なことを理解していないと使いこなせないという印象です。またMCCが生成した制御プログラムの中身も理解することが求められる場面もあると思います。
③SPI通信がうかく動かない
私もドキュメントやビデオを数日間調査して理解を深めました。Microchip社のWebサイトのQ&Aも参照しました。ドキュメント通りやっているのにうまくいかないという問い合わせがいくつか見受けられました。結構ハードルが高いという印象です。Microchip社の問い合わせサイトを参照すると、問題解決のためデバッガを使ってその結果を求めたり、問い合わせること自体ハードルが高いのでは、と感じました。
私が躓いたのは、マスターからスレーブに1バイトのデータを送信するとき、送信完了を検知するはずのビットが立たないというものです。割り込みが効かないのか、データの転送ができていないのか、色々と仮説をたてて試しましたが、原因つかめず解決しませんでした。試行錯誤も限界と感じました。
なおPICコンピュータの代わりにArduinoを使ってSPI通信を行うサンプルがWebサイトにあったので参考にさせていただました。こちらは問題なく動いたので、私が作成したPICのプログラムがまずいということがわかり、問題点を絞り込むことができました。
④UART通信で動作確認
幸いATP3012には、SPI通信以外にUART、I2Cの2つのシリアル通信の選択肢があります。SPIでの失敗は勉強のためだったと考え、UART(Universal Asynchronous Receiver/Transmitter)で試すことにしました。PICマイコンにはEUSART(Enhanced Synchronous Asynchronous Receiver Transmitter)があり、これがUARTに相当します。UARTの使い方については、「C言語によるPICプログラミング大全」に書かれている通りで、SPIに比べてかなり単純という印象です。ボーレートは出荷時時の9600bpsのままです。1時間くらいで設定と動作が確認できました。一点間違えたのは、CLK16端子をhighにしていなかった点です。接続しているセラミック発振子として16MHzを使っているので、この設定が必要でした。
ATP3012のデータシートに記述されているトランジスタ一個で実装する簡易版D級アンプを使ってチャイムを鳴らすこともできました。チャイムの音は#Jと#Kの2種類があります。ギターの弦を鳴らしているような感じで、#Jが相対的に高い音、#Kが相対的に低い音になっています。音量は期待していたものより小さいです。警報システムとしてはアンプを使って音量を大きくする必要を感じました。