本日は、お楽しみの中華部品キット、Kuman K4からTouchセンサモジュールを取り上げさせていただきます。使わないでいると動かなくなっているかも知れないので、久しぶりに動かすのはGigaDevice社製RISC-Vマイコン、GD32VF103の評価ボードであります。ぶちゃけデジタル信号1本、何の発見もないか、と思っていたら意外にね。
※「部品屋根性」投稿順Indexはこちら
さて、キットに入っているタッチセンサモジュールは、下の写真のようなものです。同心円の部分が容量性のタッチパッドになっており、それを左下のGND端子の直上にあるSOT23のパッケージのICがセンスしているようです。(デバイスの拡大写真は上のアイキャッチ画像に)
出力は、ただ1ピン、それもデジタルであります。このモジュールに関する唯一のドキュメントはKuman社の付属DVD内のドキュメントであります。折角なので日本語版のドキュメントから1箇所引用させていただきましょう。
指などタッチスイッチセンサーをタッチしたら、センサーは12秒続いて1(高電位信号)を出力します。
え、12秒も信号出し続けるの?なんで?ちょっと使い道が分かりません。このモジュールで使われているセンサチップのデータシートを調べてみることにいたしました。まずはTONTEK社へのリンクはこちら。
この会社のホームページを見て、「俺はモグリだな」と痛感いたしました。また、業界の奥深さを噛み締めましたです。
-
- 台湾の会社
- 4ビットマイコンも製品ラインにあり
規模は小さいですが、立派なマイコン屋さんでした。1986年創業、40年近くも生き延びてきておられます。敬礼。思わず本サイトの
の台湾の表を見直しました。Tontek社ありません。これはちゃんと調べて追加せねば。。。1990年代には月に2,3回も台湾に行っていたというのに、私は知らなかった(もしかすると忘れたのかも知れないが。)すみません。
ま、ただ、今回はタッチスイッチ専用のチップらしくマイコンは入っていないみたい。データシートを読んでいくと、
12秒続くのはFast modeというセンシングモード
でした。μAオーダーの低消費電力を狙った石なので、普段Low Power modeで動いており、このときには160ms間隔でしかタッチスイッチをセンスしていないようです。しかし、タッチを検出すると20ms間隔でタッチスイッチをセンスするFast modeというモードに入るのだそうで。このモードが12秒くらい以上続くと。だからタッチスイッチの信号が12秒も1に張り付くということは無さそうですな。やってみましょう。
Seeed社製GD32VF103VBT6デモボードのGNDと3V3電源端子、そしてPortCのpin10にセンサモジュールを接続いたしました。こんな感じ。
例によって、プログラムは、GD32-SDKのライブラリを使い、VS code上のPlatformIOが準備してくれる環境(実はボードはLongan nanoだと騙して?使っている。それでもOK)で、ビルド&デバッグしとります。
main関数はこんな感じ。センサの状態を反映しているtouchFlagという変数が0(つまりタッチスイッチがオフ)になると、タッチ中カウントアップされていたtouchCounterという変数をデバッグ用のUARTに出力するようになっています。
int main( void ) { int loopCount = 0; initializePeriph(); usart0_config(); timer5_config(); delay_1ms(1000); gpio_bit_set(GPIOB, GPIO_PIN_1); while(1) { printf("LOOP : %d\n", loopCount++); //RED delay_1ms(1000); gpio_bit_reset(GPIOB, GPIO_PIN_5); delay_1ms(1000); gpio_bit_set(GPIOB, GPIO_PIN_5); //Check TPP Flag if (touchFlag == 0) { printf("LAST COUNT: %d\n", touchCounter); } } }
実際に、センサを見張っているのは、1000分の1秒毎のTimer5割り込みで起動される以下のハンドラの中のtpp223()という関数です。
void TIMER5_IRQHandler(void) { if(SET == timer_interrupt_flag_get(TIMER5, TIMER_INT_FLAG_UP)){ /* clear channel 0 interrupt bit */ timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP); tpp223(); } }
見張りの関数の中はこんな感じ。先ほどの変数を立てたり、降ろしたり、数えたりすると同時に、タッチスイッチが押されている間、ボード上のLEDを点灯させるようになってます。
void tpp223(void) { FlagStatus stat = gpio_input_bit_get(GPIOC, GPIO_PIN_10); if ((touchFlag == 0) && (stat == SET)) { touchFlag = 1; touchCounter = 0; gpio_bit_reset(GPIOB, GPIO_PIN_0); //BLUE } else if ((touchFlag == 1) && (stat == RESET)) { touchFlag = 0; gpio_bit_set(GPIOB, GPIO_PIN_0); //BLUE } else if (stat == SET) { touchCounter++; } }
これを走らせてみると
-
- 指で触っている間だけLED点灯する
- そのときのカウンタ値は5,60くらいの値が最小な感じ。
- 押し続ければ数千にもなる(タイマ1msなので、1000分の1すれば秒)
- 十分時間を置いた後、あまり短い接触だと反応しないことがある(例のLow powerモードでは160ms毎チェックだからと思われる。
ちゃんとスイッチです。Tontek社のTonTouch。それにしても、Tontek社調べておかないと。