メイン・コンテンツまでスキップ

9. タッチ・コントローラ

動機

ユーザがアプリケーションを操作できるようにするには、タッチ・コントローラからタッチ座標を読み出せる必要があります。 このステップで開発するコードは、この後のTouchGFX抽象化レイヤ開発で使用します。

Note
ボードの立ち上げにタッチ・コントローラが関係しない場合は、このステップをスキップしてください。

目標

このステップの目標は、ディスプレイのタッチ・コントローラからタッチ座標を読み出せるようにすることです。

検証

次の表に、このセクションの検証ポイントを示します

検証ポイント検証内容
タッチ・コントローラとマイクロコントローラが設定されているマイクロコントローラが、I2Cなどを介してタッチ・コントローラを読み出せるように設定されていること。
タッチ・コントローラのレジスタを読み出せるTouchGFX抽象化レイヤがこのコードを使用してコントローラからタッチ座標を取得できること。
期待される読出し性能が得られるポーリングは、アプリケーションのレンダリング時間に含まれます。 ポーリングに長時間を要する場合は、タッチ・ポーリングを別のスレッドに移動するか、割込みに基づく動作に変更する必要があります。

前提条件

  • タッチ・コントローラ搭載のディスプレイ
  • タッチ・コントローラから読み出すドライバ

作業内容

このステップは、タッチ・コントローラと通信するためのマイクロコントローラの設定と、タッチ・コントローラとやり取りするドライバ・コードの作成の2つの要素で構成されます。

ほとんどのタッチ・コントローラは、I2Cバスに接続されます。 I2C通信は、STM32CubeMXの[Connectivity]>[I2C1]で設定します。

I2Cの設定

STM32マイクロコントローラの多くはI2Cコントローラを複数備えているため、タッチ・コントローラに接続されているものを選択します。 関連するGPIOも設定してください。

使用するタッチ・コントローラのドライバ・コードがない場合は、自分でゼロから作成する必要があります。 マイクロコントローラのSTM32Cubeファームウェア・パッケージには、I2C通信のサンプルが含まれています。 それらから開始できます。 タッチ座標を取得するために読み出すレジスタについては、タッチ・コントローラのデータシートを確認してください。 最初に確認するのは、タッチ・コントローラのI2Cアドレスです。続いてテストのためにデバイスIDのレジスタを読み出します。

I2Cの基本動作を確認したら、後でTouchGFXに組み込むときに必要となるドライバ関数を開発する必要があります。 この関数は、タッチを検出したときにTrue、検出していないときにFalseを返し、タッチ座標を示します。

以下は、このようなコードの例で、ドライバ・コードは関数myTouchController_GetStateによって抽象化されています。

main.c
    uint16_t x;
uint16_t y;

TouchControllerState state;
if (myTouchController_GetState(&state))
{
x = state.touchY;
y = state.touchX;
//break point here
}

タッチ・コントローラからxとyの正確な値が受信されていることを、デバッガで確認します。

タッチ・コントローラの中には複数のタッチ・ポイントをレポートできるものがあります。 TouchGFXではこの機能をサポートしていないため、無視して構いません。 ほとんどの場合、最初のタッチ・ポイントを選択するだけです。

「TouchGFX ALの開発」の抽象化レイヤの記事で、これらの値をTouchGFXに送信する方法を解説しています。

期待通りの性能が得られること

TouchGFXアプリケーションと同じスレッドでコードを実行する場合、1ms以内にタッチをサンプリングできる必要があります。 速度が不足している場合は、後の段階で、コードを独立したタスクに移動することを検討してください。