概要
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品です。
参考資料
- サンプルプログラム
公開されているプログラムに変更を加えて動作させます。
https://github.com/nik-sharky/arduino-goodix - GT9271のデータシート
https://www.distec.de/fileadmin/pdf/produkte/Touchcontroller/DDGroup/GT9271_Datasheet.pdf
レジスタの仕様も記載あります。 今回はタッチ数、x座標、y座標のみ参照しています。
(余談)
本来、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();
}
動作確認①(タッチの検出の確認)
- 接続
コネクタがもげやすいらしく、ホットボンド/エポキシ樹脂等で固定したほうがいいかもしれません。こんなのもあるみたいです。
https://akizukidenshi.com/catalog/g/gT-07884/
- 書き込み
ボード: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”
- 動作確認
書き込み後、シリアルモニタを起動します。ボーレートは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が入力されることを確認できました。