ボード構成
今回の実験は、TZ2100音声HMIボードに搭載されているArduino互換ピンを使用して、Seeed社のGrove Kitに含まれているLEDをつけたり、アナログ入力ピンに温度センサーをつないでみました。
TZ2100音声HMIボードのピン配列
Seeed社のGrove Kit V3
Arduinoシールドは、Seeed社のGrove Kit V3を使用しています。このキットに含まれているLEDと温度センサーを音声で制御します。
今回使用した音声コマンド
今回使用した音声コマンドは、以下の3つ。
- 「でんきつけて」
- 「らいとをけして」
- 「いまのおんどは」
「らいとをけして」は「でんきけして」にした方がよかったのですが、4番目と5番目の文字しか違いがないので、誤認識する可能性が高いと考えて、「らいとをけして」にしました。この辺りは、辞書ツールの認識率の設定を変更すれば改善します。
アプリケーションの実行
前回と同じようにUARTにメッセージを出すようにしています。
「でんきつけて」とコマンドを出すと、GPIO0_24に繋がったLEDを点灯させています。
「らいとをけして」とコマンドを出すと、GPIO0_24に繋がったLEDを消灯させています。
「いまのおんどは」とコマンドを出すと、A0ピンにつながった温度センサーの値を読んで、温度を表示しています。
GPIOは、RTE_Device.h
で該当ピンを1に変更してご使用ください。
#define RTE_GPIO0_24_ID 1
GPIOの初期化
Driver_GPIO.Control(GPIO0_24, GPIO_DIRECTION_OUTPUT_2MA, GPIO_EVENT_DIABLE, NULL);
GPIOのON/OFF制御
Driver_GPIO.WritePin(GPIO0_24, 1); Driver_GPIO.WritePin(GPIO0_24, 0);
UARTメッセージ
温度センサーを使用するにあたり、TZ2100内蔵のADCを有効にして、簡単なドライバを作成して、使っています。
ADCのドライバ
TZ2100内蔵のADCは、クロックゲーティングと機能ブロック毎にリセット設定が可能です。ADCのクロックゲーティングは、デフォルト設定で有効になっているので、今回はそのまま使用しました。
次にADCの機能ブロックは、リセットがかかっています。これを解除する必要があります。リセット解除後は、100us待つ必要があります。
次にADCのモード設定を行います。本来ならば、細かい設定をしていけばいいのですが、ADCのCH0のビット0が、ArduinoピンのA0に相当しているので、CH0を有効にするためのビットをセットします。
void tz2100_adc_init(void) { volatile int dummy, *SMUADC; volatile int *ADCMODE; SMUADC = (volatile int *)(0x5000C000 + 0x1670); ADCMODE = (volatile int *)(0x500D0000 + 0); /* Reset Release */ *SMUADC = 0x00000011; for(dummy = 0; dummy < 10000;dummy++) {}; /* Mode Setting */ *ADCMODE = 0x00000001; }
次に、サンプリング周期レジスタ(SPLT_PER)を設定します。初期値は0になっていますが、0は設定禁止になっていますので、0x1000に設定してみました。
void tz2100_adc_start(void) { /* CH0_DATA */ volatile int *ADCCTRL, *SPLT_PER, *CH0_MODE; SPLT_PER = (volatile int *)(0x500D0000 + 0x14); *SPLT_PER = 0x00001000; CH0_MODE = (volatile int *)(0x500D0000 + 0x100); *CH0_MODE = 0x00000001; ADCCTRL = (volatile int *)(0x500D0000 + 4); *ADCCTRL = 1; }
ADCCTRLレジスタは、ADCの変換Start/Stopの制御ビットです。1をセットすると、ADCが開始します。
int tz2100_adc_get_data(void) { /* CH0_DATA */ volatile int data, *GetADC0; /* Start ADC */ tz2100_adc_start(); /* Convert ADC */ GetADC0 = (volatile int *)(0x500D0000 + 0x00000800); data = (*GetADC0 & 0x0000fff0); data >>= 4; return data; }
読み込んだ値は、12ビット長のデータなので0から4095まで値が変化します。データは、32ビットレジスタの15ビット目からビット4までにデータが入ってきます。読み込んだデータは、4ビット右にシフトして、取り扱いしやすいようにずらしています。
温度センサーの値は、アナログ信号で出力されています。読み込んだ値から、温度データに変換するには、下記の4ステップが必要です。
- \(A = \dfrac{4095.0}{A0} - 1.0\)
- \(R = A * 100,000\)
- \(T =\log(\dfrac{R}{100,000})\)
- \(Temperture = \dfrac{1}{(\dfrac{T}{4275})+(\dfrac{1}{298.15})} - 273.15\)
参考
「いまのおんどは?」と声をかけると、ADCが起動し、温度センサーの値を読み込んで、温度にするための変換式を経て、摂氏温度情報に変換して表示させています。
Grove - Temperature Sensor V1.2
まとめ
今回は、音声コマンドで、GPIOの操作やADCの操作をして、物理的な制御ができることを試して見ました。ぜひ、皆様もTZ2100音声HMIボードを入手して、自分だけの音声によるハードウェア制御を試してみてください。
最新情報をメーカーサイトで見る
こちらも是非
“もっと見る” 実験室
組み込みアプリを止めるな!printfやブレークポイントも使わず内部状態をチェック!
産業機器、オーディオ製品、通信デバイスをはじめとする多くの組み込みアプリケーションは、わずかなタイミングの違いで動きが変化します。そのため、開発・検証のためにprintfなどを仕掛けることが難しく、開発効率が伸び悩むケースも増えています。そこで今回の実験室では、システムを止める事なく内部状態を取得できるデータ計測ツール「EVRICA」を紹介いたします。組み込みアプリケーションの開発や検証に欠かせない、新しい開発ツールです。
IoTエッジコンピューティングをSmartMeshで実践
今回の実験は、Moteに内蔵されている非力なマイコンを使って、振動計測ソリューションのFFTデータをSmartMeshで送信したIoTエッジコンピューティングを実践してみました。
非絶縁型中間バスコンバータ750Wで、48Vと12Vを自由自在
VicorのNBMシリーズの最新デバイスであるNBM2317シリーズは、23×17×7mmという超小型パッケージで最大750W出力、48V→12Vまたは、12V→48Vの双方向において98%のピーク効率を実現した非絶縁型中間バスコンバータ。今回の実験室は、実際に動かしつつ、その性能とメリットを解説している。その様子は、是非動画で見て欲しい。