PICマイコンと音声合成LSIのSPIによる通信について

デジタル屏風では音の周波数領域ごとの音量を調整できる音質調整スピーカーを開発しています。センサーと音声合成LSIを組み合わせた監視装置を検討中です。

◆音声合成LSI ATP3012

監視装置の検討に際しては「たのしい電子工作」(神田民太郎著)中の雨降り警報器の記述を参考にしました。本書ではAQUEST社のATP3012という音声合成LSIを使っています。この音声合成LSIはアルファベットで発音用文字列を送信するとその文字列の音を接続したスピーカーから出力するというLSIです。この他事前にメッセージを作成およびインストールし、利用することもできます。発音用文字列にはアクセントの付け方や音の伸ばし方など様々な指定ができる他、既定で組み込まれているチャイム音(2種類;カスタマイズ可能と記述されているがカスタマイズの内容はデータシートには見当たらなかった)を発することができる優れたLSIです。秋月電子通商で、女性の声用とロボットの声用が販売されていたので、両方を購入してみました。1個約900円です。

ATP3012の仕様については、秋月電子の販売サイトからデータシートをダウンロードすることができます。ATP3012はUART、I2C、SPIでマイコンと通信が可能です。3つの通信方法ではアーキテクチャや通信速度、使用する端子などが異なりますが、「たのしい電子工作」ではSPIを使って通信しています。

●SPI通信方式

SPI通信では、マスターとスレーブがあり、両方で協調して通信を行いますが、音声合成LSIを使う場合、PICマイコン側がマスター、ATP3012側がスレーブになります。ATP3012側のスレーブの処理はすでに実装されているので、PIC側のプログラミングのみで後は適切な端子を使って通信が可能になります。

ATP3012のデータシートの中で、データは8ビットでMSBファーストであること、SPIモードはMode0またはMode3を選択可能でありSMOD1、SMOD0端子で選択可能であることが記されています。Mode0が常時lowでhighになるタイミングを1/2クロック遅らせないモード、mode3が常時highでlowになるタイミングを1/2クロック遅らせるモードとし解釈しています。これは「C言語によるPICプログラミング大全」のSPIの通信モードに関する説明がデータシート中のSPIモードに相当するものと解釈したからです。

●セラミック発振子の利用

「たのしい電子工作」では、ATP3012シリーズでは外部クロック(セラミック発振子)を使ってよりクオリティの高い音声を出すことが可能です、と記述されています。ATP3012のデータシートを参照すると、発振子接続端子に16MHzまたは10MHz(CLK16端子の設定に依存)のクリスタルまたはセラミック発振子を接続する、とあります。クリスタルを接続する場合はコンデンサの接続が必要とあるので、セラミック発振子(セラロック)コンデンサー内蔵タイプ16MHz(1個35円)を使うことにしました。写真左がセラミック発振子(世良ロック)コンデンサー内蔵タイプ 16MHzです。1個35円。写真右側はチップセラロックという小型のもので、このままではブレッドボード上などでうまく使うことができません。セラミック発振子の極性は真ん中がGNDで、両側が発振端子。向きもあるようですが、村田製作所のFAQでは0.1%程度の違いであることが発信されていました。

 

●動作モード

PMOD1、PMOD0端子状態に応じて、コマンド入力モード、セーフモード、スタンドアロンモード、デモモードの4つのモードの選択が可能です。今回はコマンドで話ことばを出力するのが目的のため、コマンド入力モードを使用します。

●コマンド形式

ATP3012のデータシートには、ATP3012が受け付けるコマンドのフォーマットについても詳しく記述されています。一つのコマンドの終了はCR(0x0D)により識別され、ATP側が必要な処理を実行したあとにマスター側にレスポンスを返すことが説明されています。発声完了の通知はないので、Ready待ちはポーリングで行うこと(ダミーコマンドを送った応答が’*’なら発声中、’>’なら発声終了)、ポーリング間隔は10ms以上あけることが記述されています。

●音声出力方式

音声の出力方法についてはATP3012のデータシートに、AVアンプやアクティブスピーカーに接続する回路、簡易版D級アンプの回路および1.45W D級オーディオアンプ(TIのTPA2006D1を使ったもの)が示されています。スピーカーを直接接続する場合は簡易版D級アンプの回路を使うと解釈しています。この場合トランジスタ2SC1815とスピーカー(インピーダンス4Ω~16Ω)を組み合わせており、インピーダンスが大きいほど大きな音を出力することが記述されています。どのくらいの音量になるのか今後確認してみたいと思います。

◆「たのしい電子工作」での音声合成LSIの制御

「たのしい電子工作」では、PIC16F1823でこの音声合成LSIの制御をしています。SPI通信を行う上で必須となるPICマイコンのピン「SCK」「SDI」「SDO」が必要であり、これらのピンを持っているPICマイコンの一つがPIC16F1823です。

●サンプルプログラムについて

「たのしい電子工作」では、PICとの接続方法やCプログラムのサンプルも掲載されています。サンプルプログラムを見て気になったのは、PCからATPへの通信についてはプログラムで処理を追うことができましたが、ATPからPCに返ってくるレスポンスについては見当たりませんでした。コマンドを発行して一定時間待つことにより、発声中の場合の対応をしていると思われますが、レスポンスを考慮する状況もあるかと思います。

●PIC16F1823のピンの配置について

PIC16F1823のピンについて、まずはPICKIT4を使ってプログラムを書き込むので、書き込み用のPINを確保しなければなりません。PICKIT書き込み用アダプタの説明書にPINの配置について説明されているので、それに従って5つのピンを確保する必要があります。「たのしい電子工作」で記述されている内容と合致します。

RC0、RC1、RC2はそれぞれSPI通信のSCK、SDI、SDO用途として割り当てます。そのほか必要に応じてATP3012の/PLAY(発声ステータスを表すピン)、/SS(複数スレーブがある場合の対象となるスレーブの識別用のピン)との接続のPINを割り当てます。

あとはセンサからの認識結果の入力、電源ON時のLEDの点灯、電源スイッチが入っているかどうかの判定に使うピンです。

●ATP3012のピンの配置について

またATP3012の12番ピン(PMOD1)と14番ピン(PMOD0)が接続されていないことが気になりました。ATP3012のデータシートではPMOD0とPMOD0で動作モードを指定する必要があり、コマンド入力モードを指定する必要があるように考えます。あるいは接続されていないということは低電位で、いずれも0として扱うデモモードを意図しているのか?この設定で動作できるか実際に確認する予定です。

●サンプル回路図について

「たのしい電子工作」ではサンプル回路図が紹介されています。回路全体の電源について47uFのバイパスコンデンサが、ATP3012の4番ピンと5番ピンの間に0.1μFのバイパスコンデンサが使われています。PICプログラミングについて書かれている「電飾しましょ!2」(どろぼうひげ著)では、PICは高い周波数で動作するためノイズで誤動作する場合があり、電源からノイズを取り去り、電圧を安定させる目的のためバイパスコンデンサを使うことが記述されています。

●Cコンパイラの選定

「たのしい電子工作」ではSPI通信を使うためにCCS社のCCS-Cコンパイラを使うと記述されていますが、PICプログラミングで広く使われているXC8コンパイラ(withMCC;無償で利用可能なものもある)でもSPIを使うことができるので筆者はこちらを選択することにしました。サンプルプログラムを見ての判断ですが、CCS-Cではプログラム中でピンがPIN_A2のように識別されるのに対して、XC8ではRA2のように識別されるようです。またPINにhighを出力する場合はoutput_high(PIN_A2)、lowを出力する場合はoutput_low(PIN_A2)のように指定するようです。一方XC8では、それぞれをRA2=1およびRA2=0として記述します。

◆「C言語によるPICプログラミング大全」のSPI通信

XC8のSPI通信については、「C言語によるPICプログラミング大全」(後閑哲也著)を参考にしました。この書籍はPICのプログラミングに関して素晴らしいです。まずは初版が2018年と新しいのです。そのため統合開発環境MPLAB X IDE(無償)やプログラムコード自動生成ツールMCC(MPLAB Code Configurator;無償)といった新しい技術について詳しく説明されてます。PICに関する書籍は古いものが目につくのですが、この書籍はお勧めです。

●MCC(MPLAB Code Configurator)の設定について

MCCはMPLAB X IDEのプラグイン(無償)です。SPI通信に必要なシステムライブラリもMCCで提供されています。

MCCプラグインをインストールするには、MPLAB X IDEの「tools」→「Plugins」を選択します。

次にポップアップしたplugin画面でMCCをチェックします。installボタンをクリックします。

ライセンス画面が表示されるので、同意します。

インストール実行中画面が表示されます。

インストール終了後MPLAB X IDEの再起動が求められるので、再起動するとMCCのアイコンがメインメニューに追加されています。

次にMCCのアイコンをダブルクリックするとシステムライブラリがダウンロードされます。

MCCのコンフィグ指定画面になります。使用するPIC16F1823のピンの図が表示されます。RA3は入力専用ですが、既にそのように割り当てられているように見受けられます。Low Voltage Programming Enableは使用しないのでOFFに設定します。

MPLAB X IDEを起動する都度MCCのアイコンをダブルクリックし、MCCの設定を読み込む必要があります。

●MCCによるソースの生成について

MCCを使い各種構成を指定したあとソースの生成をすると、新たにmain()のエントリが書かれたソースコードが生成されます。左のResourceManagement[MCC]タブ中のgenerateを実行したときの話です。

このとき新たにmainプログラムが生成されるので、プロジェクトを新規に作成したあと、MCCの設定する前ににソースコードを生成してしまうとmain()が2つできてしまい、コンパイル時にエラーが出力されてしまいます。プロジェクト作成後MCCでソースを生成する前にソースを生成しないよう注意が必要です。

エラーの詳細情報を表示すると、下のように表示されます。

MCCを設定する前に生成したプログラムを削除することにより、コンパイルエラーがなくなりました。

MCCが生成したプログラムに処理を埋め込み、文字列の長さを取得するstrlen()を記述したところ、conflicting declarations for variables “_strlen” のエラーが出ました。

プログラム中に#include <string.h>を追加することで解決しました。strlenのような標準関数でも関数タイプを宣言するインクルードファイルを追加しないといけないということでしょうか。

●SPI通信について

「C言語によるPICプログラミング大全」では、SPIを含めたシリアル通信について1章を設けて詳しく説明しています。PICではシリアル通信を実行するモジュールとしてMSSP(Master Synchronous Serial Port)モジュールが用意されています。MSSPのSPIモードを使ってSPI通信環境を用意することができます。SPI通信に必要な設定とシステムライブラリはMCCのGUIでの指定を行って生成されます。利用者はこのライブラリを使ってCプログラミングをすればよいのです。以下の3つの関数が紹介されています。

①SPI1_Initialize

SPIモジュールの初期化関数。mainプログラムから自動で呼び出される。

②SPI1_exchange8bit

1バイトのデータを送信し、同時にスレーブから受信する

③SPI1_Exchange8bitBuffer

送信バッファから指定バイト数を送信し、同時にスレーブから同じバイト数を受信して受信バッファに格納する。

しかし、実際にMCCを使って生成されたプログラムを見てみると、このような関数は用意されていませんでした。どのような事情なのかは分かりませんが、同様な機能は提供されるので、こちらを使うことにしました。生成されたspi.hの関数の名前と型宣言は以下のようになっています。

spi.cに記述されているシステム関数の処理内容:

MCCを使った場合は、MCCの指定でピンの定義等を行うので、Cプログラム中ではピン名を指定しなくてもシリアル通信が可能です。またMCCで生成されたシステムのインクルードファイルの中身を見ることもできるので、私たちがAP開発等で行っているようなインクルードファイル内の記述内容を見ながらのプログラミングも可能です。

インクルードファイルの見方:filesペインから、mcc_generated_filesフォルダ下に格納されているファイルのspi.hを指定することでMCCにより生成されたインクルードファイルの内容をみることができます。

●マイコンへの書き込み

コンパイルエラーが無くなったプログラムをマイコンに書き込みました。MPLAB X IDEの画面で、マイコンへの書き込みボタンをクリックします。なお「電飾しましょ!2」に、書き込み中は、絶対PICKITに触れないでください、とあります。この点に十分留意します。

すると注意事項のウインドウがポップアップします。そのままOKをクリックします。

書き込みが始まると書き込み装置であるPICKIT4のLEDが青色から黄色に変わります。

約1分くらい経過したら、MPLAB X IDEの画面に書き込みが完了したことを示すメッセージが表示されました。

PICKIT4のLEDは黄色が点灯したままです。これでプログラムが正しく書き込まれているはずです。

●SPI通信のサンプルプログラムについて

「C言語によるPICプログラミング大全」のSPI通信についてのサンプルプログラムでは、加速度センサーとPICとの間のSPI通信が記述されています。このサンプルプログラム中ではスレーブからのレスポンスの処理が見当たりません。しかしスレーブからのレスポンスの処理が無くても、通信については問題なくできるという見解です。またサンプルプログラムにおいて「レジスタアドレス」という用語と値が使われており、その意味を当初理解することができませんでしたが、本書の補足PDFに加速度センサーの仕様説明の資料があり、これを参照することでこの用語が加速度センサーに関する用語であることを理解することができました。

また本著における自動生成されるSPI1用関数が書かれた表で、uint8_tというデータ型が使われていますが、これをそのまま書くとコンパイルエラーとなりました。意味としては符号なし8ビットの整数とのことで、unsigned charというデータ型にして対処しました。

◆「電飾しましょ!2」を参考にしたPICプログラム

「電飾しましょ!2(PIC編)」(どろぼうひげ著)は、初心者用 電飾模型プログラミングガイドと副題がついている通り、PICを使って模型を電飾するためのプログラミングガイドとなっています。数あるPICマイコンから、電飾模型用途にPIC16F1827とPIC12F1822に的を絞って、LEDを制御する方式をわかりやすく解説しています。本書では、MPLAB X IDEの使い方も詳しく説明されています。プロジェクトを新規に作成し、必要事項をGUIで入力したあとに、ソースプログラムを直接編集する部分について記述しています。

①#include <xc.h>の次の行に、#define _XTAL_FREQ 8000000 を入れる
②void main(void)の下に以下を入れる
 OSCCON = 0b01110010;
 ANSELA = 0b00000000;
 ANSELB = 0b00000000;
 TRISA = 0b00100000;
 TRISB = 0b00000000;
 PORTA = 0;
 PORTB = 0;

MCCを使う場合、これらはシステムにより自動生成されます。MCCを使わない場合に限りこの部分を使用するプロセサによって変更する必要があります。筆者はPIC16F1823を使用するため、どのように変更するのかを以下に示します。実機での動作確認はこれからです。

まず#define _XTAL_FREQ 8000000 は内部クロック数8MHzを指定するものです。PIC16F1823の内部クロック数は32MHz(「C言語によるPICプログラミング大全」のPIC16F1ファミリのスペック参照)ですが、内部発振器を使用するモード(INTOSC)では周波数の変更が可能という(「電子工作のためのPIC16F1ファミリ活用ガイドブック」(後閑哲也著)参照)ことと、今回も目的は監視渓谷システムの実現でそれほどCPUスピードは要求されないため、今回は8MHzのままとします。CPUクロック数の指定については、電源の電圧やシステムパラメータの変更が必要なこともあり注意が必要です。

OSCCON=0b01110010; は内部クロック数8MHzを指定するもののため、このままとします。

ANSELA = 0b00000000; の部分は、すべてのピンをアナログではなくデジタルに割り当てるのでこのまま。

ANSELB = 0b00000000; の部分は、PIC16F1823のピンの識別子(RBxではなくRCx)に合わせて、ANSELC = 0b00000000; とします。

TRISA = 0b00100000; の部分は、PIC16F1823では、RA3がINPUT ONLYのため、右端のRA0から数えて4番目の部分を1にし、TRISA = 0b00001000; と変更します。

TRISB = 0b00000000;  の部分は、PIC16F1823では、RBxがRCxとなり、すべてのPINが入出力用のため、TRISC = 0b00000000;  と変更します。

PORTA = 0; の初期化の部分はこのままとします。

PORTB = 0; の初期化部分はBをCに変えて、PORTC = 0; と変更します。

 

Follow me!