Wio Terminalをタッチパネル化

Seeed K.K.の中井です。

TFT液晶や無線LANなどを備えたWio Terminalですが、もっと手軽に操作したいなぁと思ったことはないでしょうか? 5Wayスイッチやボタンも備えていますが、直感的に操作できるとさらに使いやすくなるのではないかと思い、 市販のタッチスクリーンをつけてみることにしました。

f:id:mnakai:20210115174218j:plain

今回使用したタッチスクリーンは、ELECTRONIC ASSEMBLY / EA TOUCH128-2です。データシートで寸法を確認してみたところ、Wio Terminalにそこそこマッチしそうということでこのデバイスを選択してみました。

www.mouser.jp

f:id:mnakai:20210115135742p:plain

このFFCに適合するコネクタはEA WF100-04Sという型番になるのですが、基板に実装されていてすぐにデバッグできそうなものがなかったので Adafruit Touch Screen Breakout Board for 4 pin 1.0mm FPCで代用しました。

www.mouser.jp

どちらもMouserで取り扱いしていたので購入。届いたのがこちらです(写真左)。Wio Terminalに重ねてみる(写真右)と丁度よい大きさですが、若干5Wayスイッチと干渉しました。

f:id:mnakai:20210115141844j:plain

接続してみる

4線(アナログ)式抵抗膜方式のタッチスクリーンということで、それぞれアナログピンに接続します。Wio Terminalの回路図では、LCDインターフェースのコネクタにタッチスクリーン用の信号が用意されているのですが、物理的に配線ができないのであきらめて40ピンコネクタのA0~A3に接続するようにしてみました。

BottomA0
LeftA3
TopA2
RightA1

f:id:mnakai:20210115145815p:plain

タッチスクリーンドライバ

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"

動作確認

youtu.be

変更履歴

日付 変更者 変更内容
2021/1/15 mnakai 作成