Arduinoとタッチパネルでキーボード操作

概要


Arduino+タッチパネルで、USBキーボードとして動作させるまでを行った。
※キーボードとして実用的なレベルではなく、キー入力できるところまで。

使ったもの


  • Pro Micro(Arduino互換、SparkFun Pro Micro のコピー品 、3.3V品※)
  • 静電式タッチパネル(コントローラ:GOODIX GT9271、インターフェース:I2C)
    https://www.buydisplay.com/10-1-inch-capacitive-touch-panel-with-controller-gt9271-10-point-multi-touch
    購入の際は「6 Pins 0.5mm Pitch ZIF Connector」もあったほうが良いです。
  • FPC基板 ( 0.5mmピッチ、6ピン)
    ZIF Connector 含め、これがないと自分のようにフラットケーブルに直接ハンダ付けする羽目になります。

※ProMicroの出力電圧Vccは3.3V品と5V品があるので注意。 GT9271は3.3Vで駆動するため、3.3V品を使用するか、5V品+降圧回路が必要です。水晶振動子の周波数で見分けられます 。16MHzが5V品で、8MHzが3.3V品です。

参考資料


(余談)
本来、I2Cバスではスレーブ側のアドレスを指定する必要がありますが、サンプルプログラムで定義されているので考慮不要です。もし別のI2Cデバイスを使用する場合は、データシートからI2Cアドレスを参照し、変更する必要があります。

GT927のデータシートから「ResetとINTピンの制御で 0xBA/0xBB か 0x28/29の2つのアドレスを設定できる」と記載があります。
サンプルプログラムでは下記のように定義されています。最下位ビットはWrite/Readを示しアドレスとしては実質7bitになるので、0x5Dとなっています。
Goodix.h
// 0xBA/0xBB (0x5D 7bit)
#define GOODIX_I2C_ADDR_BA  0x5D

プログラムの変更①(タッチの検出の確認)


  • サンプルプログラムを解凍しフォルダ名変更
    arduino-goodix-master → GT911_touch
    inoファイルは同じ名前のフォルダに入れる必要があります。
  • #include “log.h”、log_println文を削除
    ・GT911_touch.ino
    ・GT911_touch.ino の void setup()内
    ・Goodix.h
  • ICACHE_RAM_ATTRを削除

Goodix.cpp
void ICACHE_RAM_ATTR _goodix_irq_handler()
→void _goodix_irq_handler()

よくわかっていませんが、削除しないと「_goodix_irq_handlerが宣言されていない」とコンパイルエラーになります。

  • INT_PINとRST_PINのピンを変更

GT911_touch.ino
#define INT_PIN 4 //ピン7をinterruptとして設定
#define RST_PIN 1

※interruptとして使用するピンの指定は特殊なため注意。
ProMicro/Leonardoの場合、
int 0:3pin、int 1:2pin、int 2:0pin、int 3:1pin、int 4:7pin

  • void handleTouch( )を修正
    タッチを検出すると、タッチされたx,y座標をシリアルで出力させます。

GT911_touch.ino
void handleTouch(int8_t contacts, GTPoint *points) {
Serial.print(“Contacts: “);
Serial.println(contacts);
for (uint8_t i = 0; i < contacts; i++) {
Serial.print(“C”);
Serial.print(i+1);
Serial.print(“:”);
Serial.print(points[i].x);
Serial.print(“,”);
Serial.print(points[i].y);
Serial.print(” “);
}
Serial.println();
}

動作確認①(タッチの検出の確認)


  1. 接続

コネクタがもげやすいらしく、ホットボンド/エポキシ樹脂等で固定したほうがいいかもしれません。こんなのもあるみたいです。
https://akizukidenshi.com/catalog/g/gT-07884/

  1. 書き込み

ボード:SparkFun Pro Micro
プロセッサ:3.3V 8MHz
COMポート:(デバイスマネージャのポート一覧から確認)

※ProMicroでは書き込み時の3.3V/5Vを正しく指定する必要がありますが、ここでは3.3V 8MHzを指定します。5V 16MHzを指定して書き込んでしまうと、PCがUSBデバイスとして正しく認識できなくなります。 その場合は、ブートローダーの再書き込みが必要になります。
参考:https://yskoht.hatenablog.com/entry/2017/12/31/025711

Visual Studio Codeで書き込む場合はデバイスリストにProMicroを追加する必要があります。純正のArduino IDEでも必要かも。
「Ctrl+,」で開く設定画面のsettings.jsonに下記を追加。
“arduino.additionalUrls”: “https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json”

  1. 動作確認

書き込み後、シリアルモニタを起動します。ボーレートは115200bpsです。タッチパネルをタッチすると、以下のように座標が表示され、正常に動作していることが確認できます。このタッチパネルは10点のマルチタッチに対応しているため、最大10点の座標が送られてきます。
他の情報を読み出したい場合は、データシートのレジスタ仕様を参照し変更してください。

タッチパネルを使えるようになりましたので、これでいろんなことができそうです。
次は実際にキーを出力させます。(座標情報は使用しません)

プログラムの変更②(タッチでキーを入力)


  • 定義追加
    Keyboardライブラリインポートします。

GT911_touch.ino

#include “Keyboard.h”

  • void setup()を修正
    ProMicroがUSBキーボードとしてPCから認識されるようになります。

GT911_touch.ino

void setup(){

Keyboard.begin();
}

  • void handleTouch( )を修正
    タッチを検出すると、「a」を入力させます。

void handleTouch(int8_t contacts, GTPoint *points) {
Keyboard.press(‘a’);
delay(100);
Keyboard.releaseAll();
}

動作確認②(タッチでキーを入力)


タッチを検出すると、aが入力されることを確認できました。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA