Seeed K.K.の中井です。
TFT液晶や無線LANなどを備えたWio Terminalですが、もっと手軽に操作したいなぁと思ったことはないでしょうか? 5Wayスイッチやボタンも備えていますが、直感的に操作できるとさらに使いやすくなるのではないかと思い、 市販のタッチスクリーンをつけてみることにしました。
今回使用したタッチスクリーンは、ELECTRONIC ASSEMBLY / EA TOUCH128-2です。データシートで寸法を確認してみたところ、Wio Terminalにそこそこマッチしそうということでこのデバイスを選択してみました。
このFFCに適合するコネクタはEA WF100-04Sという型番になるのですが、基板に実装されていてすぐにデバッグできそうなものがなかったので Adafruit Touch Screen Breakout Board for 4 pin 1.0mm FPCで代用しました。
どちらもMouserで取り扱いしていたので購入。届いたのがこちらです(写真左)。Wio Terminalに重ねてみる(写真右)と丁度よい大きさですが、若干5Wayスイッチと干渉しました。
接続してみる
4線(アナログ)式抵抗膜方式のタッチスクリーンということで、それぞれアナログピンに接続します。Wio Terminalの回路図では、LCDインターフェースのコネクタにタッチスクリーン用の信号が用意されているのですが、物理的に配線ができないのであきらめて40ピンコネクタのA0~A3に接続するようにしてみました。
Bottom | A0 |
Left | A3 |
Top | A2 |
Right | A1 |
タッチスクリーンドライバ
4線式のタッチスクリーンは、X軸(X+とX-)に電位差を作り、タッチされた位置をY軸(Y+かY-)で電圧測定する。Y軸を測定する場合にはその逆をやればよいので、プログラム的にはこんな感じになります。
// X軸(X+とX-)に電位差を作るために、X+をHigh Level、X-をGNDに設定 pinMode(XP, OUTPUT); pinMode(XM, OUTPUT); digitalWrite(XP, HIGH); digitalWrite(XM, LOW); // Y軸(Y+とY-)を入力に設定 pinMode(YP, INPUT); pinMode(YM, INPUT); // Y+で電圧値を取得 x = analogRead(YP);
調べてみると、Wio Terminalのボードパッケージ(Seeed SAMD Boards)に同梱しているTFT_eSPI(Seeed_Arduino_LCD)ライブラリがすでに4線式タッチパネルに対応していました。 そのため、User_Setup.hで下記のように有効にしてあげるとタッチ位置を取得できるようになります。が、、
--- User_Serup.h.orig +++ User_Setup.h @@ -170,13 +170,14 @@ // // ################################################################################## -// #define TOUCH +#define TOUCH //for four wire touch -//#define FOURWIRETOUCH -//#define YP A2 // must be an analog pin, use "An" notation! -//#define XM A1 // must be an analog pin, use "An" notation! -//#define XP A3 // can be a digital pin, +#define FOURWIRETOUCH +#define YP A2 // must be an analog pin, use "An" notation! +#define XM A1 // must be an analog pin, use "An" notation! +#define XP A3 // can be a digital pin, +#define YM A0 //for adx
ノイズ除去
上記でタッチスクリーンを有効にして、同ライブラリのexamples/Generic/Touch_calibrateをビルドして書き込んでみると何もしていないのにタッチしたような挙動が頻発します。 アナログ読み出しに関連した部分を2つほど変更しました。
--- Touch.cpp.orig +++ Touch.cpp @@ -52,7 +52,14 @@ ***************************************************************************************/ uint8_t TFT_eSPI::validTouch(uint16_t* x, uint16_t* y, uint16_t threshold) { uint16_t x_tmp, y_tmp; - + #ifdef FOURWIRETOUCH +#include "Extensions/Touch_Drivers/4WiresTouch/getRaw.h" + if (temp_z <= threshold) { + return false; + } + *x = temp_x; + *y = temp_y; + #else if (getTouchRawZ() <= threshold) { return false; } @@ -63,6 +70,7 @@ *x = x_tmp; *y = y_tmp; +#endif return true; }
--- defined.h.orig +++ defined.h @@ -1,7 +1,7 @@ #if defined(__SAMD21G18A__) // #else -#define USE_FAST_PINIO +//#define USE_FAST_PINIO #endif #include "User_Setup.h"
動作確認
変更履歴
日付 | 変更者 | 変更内容 |
---|---|---|
2021/1/15 | mnakai | 作成 |