音声コマンドのプロトタイプをArduinoシールド互換ボードとTZ2100で作ってみた

ボード構成

今回の実験は、TZ2100音声HMIボードに搭載されているArduino互換ピンを使用して、Seeed社のGrove Kitに含まれているLEDをつけたり、アナログ入力ピンに温度センサーをつないでみました。

TZ2100音声HMIボードのピン配列

図

Seeed社のGrove Kit V3

Arduinoシールドは、Seeed社のGrove Kit V3を使用しています。このキットに含まれているLEDと温度センサーを音声で制御します。

Seeed Grove Kit V3

図

今回使用した音声コマンド

今回使用した音声コマンドは、以下の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ステップが必要です。

1) \(A = \frac{4095.0}{A0} - 1.0\)

2) \(R = A * 100,000\)

3) \(T =\log(\frac{R}{100,000})\)

4) \(Temperture = \frac{1}{(\frac{T}{4275})+(\frac{1}{298.15})} - 273.15\)

参考

「いまのおんどは?」と声をかけると、ADCが起動し、温度センサーの値を読み込んで、温度にするための変換式を経て、摂氏温度情報に変換して表示させています。

Grove - Temperature Sensor V1.2

まとめ

今回は、音声コマンドで、GPIOの操作やADCの操作をして、物理的な制御ができることを試して見ました。ぜひ、皆様もTZ2100音声HMIボードを入手して、自分だけの音声によるハードウェア制御を試してみてください。