【M5Stack_Core2】Gesture recognition for Core2, on Arduino.

公式のまねっこ

f:id:chiyoh:20200930235928p:plain

f:id:chiyoh:20200930235945p:plain

f:id:chiyoh:20201001000006p:plain

f:id:chiyoh:20201001000024p:plain

//
// touch_gesture
// ver.02 2020/09/30 chiyoh
// 
#include <M5Core2.h>
#include <utility/Sprite.h>
#include <touch.h>
#include <stdio.h>
#define ESP32

#define CST_DEVICE_ADDR 0x38
#define CST_DEVICE_READ_MAX 4
#define CST_DEVICE_WRITE_MAX 4
#define CST_DEVICE_REG_TD_STATUS 0x02
#define CST_DEVICE_REG_P1 0x03
#define CST_DEVICE_REG_GESTURE_ENABLE 0xd0
#define CST_DEVICE_REG_GESTURE_ID 0xd3

TFT_eSprite stext1 = TFT_eSprite(&M5.Lcd);
TFT_eSprite stext2 = TFT_eSprite(&M5.Lcd);


// 1byte Write
uint8_t touchWrite1(uint8_t reg, int8_t value)
{
    // write mode  w:reg w:value s
    Wire1.beginTransmission(CST_DEVICE_ADDR);
    Wire1.write(reg);
    Wire1.write(value);
    uint8_t result = Wire1.endTransmission();
    return result;
}

// 1byte Read
uint8_t touchRead1(uint8_t reg)
{
  // read mode   w:reg r:value s
  uint8_t value;
  Wire1.beginTransmission(CST_DEVICE_ADDR);
  Wire1.write(reg);
  Wire1.endTransmission(false);
  Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, (uint8_t)1);
  value = Wire1.read();
  return value;
}

// burstRead
uint8_t touchReadBurst(uint8_t reg, uint8_t size, uint8_t* data) {
  uint8_t result=0;
  Wire1.beginTransmission((uint8_t)CST_DEVICE_ADDR);
  Wire1.write(reg);
  Wire1.endTransmission(false);
  result = Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, size);

  for(uint8_t i=0; i<size; i++){
    data[i] = Wire1.read();
  }

  return result;
}

uint8_t td_status(){
  return touchRead1((uint8_t)CST_DEVICE_REG_TD_STATUS);
}

void gesture_enable(){
  touchWrite1((uint8_t)CST_DEVICE_REG_GESTURE_ENABLE, 0x01);
}
uint8_t gestureID(){
  return touchRead1((uint8_t)CST_DEVICE_REG_GESTURE_ID);
}

char* gestureName(uint8_t id){
  char* gName;
  switch(id){
    case 0x00:
      gName = "no-gesture";
      break;
    case 0x20:
      gName = "right-slide";
      break;
    case 0x21:
      gName = "left-slide";
      break;
    case 0x22:
      gName = "up-slide";  // 途中で止める?突き抜けると0になる?
      break;
    case 0x23:
      gName = "down-slide";
      break;
    case 0x24:
      gName = "double-click";
      break;

    case 0x30:
      gName = "o gesture";
      break;
    case 0x31:
      gName = "w gesture";
      break;
    case 0x32:
      gName = "m gesture";
      break;
    case 0x33:
      gName = "e gesture";
      break;
    case 0x34:
      gName = "c gesture";
      break;
    case 0x35:
      gName = "g gesture";
      break;
    case 0x36:
      gName = "a gesture";
      break;
    case 0x37:
      gName = "d gesture";
      break;

    case 0x40:
      gName = "n gesture";
      break;
    case 0x41:
      gName = "???"; 
      break;
    case 0x42:
      gName = "b gesture";
      break;
    case 0x43:
      gName = "(q) ???";
      break;
    case 0x44:
      gName = "L gesture";
      break;
    case 0x45:
      gName = "P gesture";
      break;
    case 0x46:
      gName = "S gesture";
      break;
    case 0x47:
      gName = "u gesture";
      break;

    case 0x50:
      gName = "@ gesture";
      break;
    case 0x51:
      gName = "(<) ???";
      break;
    case 0x52:
      gName = "> gesture";
      break;
    case 0x53:
      gName = "^ gesture";
      break;
    case 0x54:
      gName = "v gesture";
      break;

    case 0x60:
      gName = "3 gesture";
      break;
    case 0x61:
      gName = "6 gesture";
      break;
    case 0x62:
      gName = "(8) ???";
      break;
    case 0x63:
      gName = "7 gesture";
      break;
    case 0x64:
      gName = "(9) ???";
      break;
    case 0x65:
      gName = "2 gesture";
      break;

      case 0x70:
      gName = "h gesture";
      break;
    case 0x71:
      gName = "k gesture";
      break;
    case 0x72:
      gName = "y gesture";
      break;
    case 0x73:
      gName = "r gesture";
      break;
    
    default:
      gName = "???";
  
  }
  return gName;
}

uint8_t touchPoint(uint16_t* x, uint16_t* y){
  uint8_t e,dat[4];
  dat[0] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +0));
  dat[1] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +1));
  dat[2] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +2));
  dat[3] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +3));
  e = (dat[0] >> 6) & 0x03;
  *x = ((dat[0]<<8)|dat[1]) & 0x0fff;
  *y = ((dat[2]<<8)|dat[3]) & 0x0fff;
  return e;
}

void setup() {
  M5.begin();   // 外部I2C off
  Serial.printf("\n");
  Serial.flush();
  delay(50);
  yield();

  stext1.setColorDepth(8);
  stext1.createSprite(320, 32);
  stext1.fillSprite(TFT_WHITE);
  stext1.setTextColor(TFT_BLACK);
  stext2.setColorDepth(8);
  stext2.createSprite(320, 32);
  stext2.fillSprite(TFT_WHITE);
  stext2.setTextColor(TFT_BLACK);
  
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.clear(WHITE);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.printf("touch GESTURE Test!");
  gesture_enable();
  delay(500);
  yield();
}

uint8_t tds=0;
uint8_t tds_old=0;
uint8_t id=0;
uint8_t id_old=0;

void loop() {
  char buf[80];
  char* c;
  uint16_t x,y;
  uint8_t e,e_old;

  tds = td_status();
  e = touchPoint(&x, &y);
  sprintf(buf,"event:%d,%d P1(%d,%d)",tds,e,x,y);
  stext1.fillSprite(TFT_WHITE);
  stext1.drawString(buf, 0, 0, 4); // (0,0) font #4
  stext1.pushSprite(16, 32);

  if(tds==1){
    if(tds_old==0){
      M5.Lcd.fillScreen(WHITE);
      M5.Lcd.fillCircle(x, y, 8, RED);
      tds_old=1;
    }else{
      M5.Lcd.fillCircle(x, y, 4, BLUE);
    }
  }else if(tds_old==1){
    tds_old=0;
  }
  
  id = gestureID();
  if(id != id_old){
    id_old = id;
    c = gestureName(id);
    sprintf(buf,"gesture:%d(%s)",id,c);
    stext2.fillSprite(TFT_WHITE);
    stext2.drawString(buf, 0, 0, 4); // (0,0) font #4
    stext2.pushSprite(16, 64);
  }

  delay(50);
  yield();
  
}

【M5Stack_Core2】タッチパネルの組み込みジェスチャー動いた。

何とか動いたけど。いろいろと調べないと。

スライド f:id:chiyoh:20200929014800p:plain

クリック f:id:chiyoh:20200929014832p:plain

S字ジェスチャー f:id:chiyoh:20200929014855p:plain

とりあえずサンプルプログラム
gesture_id が分かりにくい。とりあえず、いろいろ文字を書いてみてどのコードになるのか調査しないと。

注意:gesture_idは、10分くらい動かして調べたCODE No.なので違う文字ジェスチャーの可能性もある。
gesture_id:いくつか更新2020/09/29

//
// touch_gesture
// ver.01 2020/09/28 chiyoh
// 
#include <M5Core2.h>
#include <utility/Sprite.h>
#include <touch.h>
#include <stdio.h>
#define ESP32

#define CST_DEVICE_ADDR 0x38
#define CST_DEVICE_READ_MAX 4
#define CST_DEVICE_WRITE_MAX 4
#define CST_DEVICE_REG_TD_STATUS 0x02
#define CST_DEVICE_REG_P1 0x03
#define CST_DEVICE_REG_GESTURE_ENABLE 0xd0
#define CST_DEVICE_REG_GESTURE_ID 0xd3

TFT_eSprite stext1 = TFT_eSprite(&M5.Lcd);
TFT_eSprite stext2 = TFT_eSprite(&M5.Lcd);


// 1byte Write
uint8_t touchWrite1(uint8_t reg, int8_t value)
{
    // write mode  w:reg w:value s
    Wire1.beginTransmission(CST_DEVICE_ADDR);
    Wire1.write(reg);
    Wire1.write(value);
    uint8_t result = Wire1.endTransmission();
    return result;
}

// 1byte Read
uint8_t touchRead1(uint8_t reg)
{
  // read mode   w:reg r:value s
  uint8_t value;
  Wire1.beginTransmission(CST_DEVICE_ADDR);
  Wire1.write(reg);
  Wire1.endTransmission(false);
  Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, (uint8_t)1);
  value = Wire1.read();
  return value;
}

// burstRead
uint8_t touchReadBurst(uint8_t reg, uint8_t size, uint8_t* data) {
  uint8_t result=0;
  Wire1.beginTransmission((uint8_t)CST_DEVICE_ADDR);
  Wire1.write(reg);
  Wire1.endTransmission(false);
  result = Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, size);

  for(uint8_t i=0; i<size; i++){
    data[i] = Wire1.read();
  }

  return result;
}

uint8_t td_status(){
  return touchRead1((uint8_t)CST_DEVICE_REG_TD_STATUS);
}

void gesture_enable(){
  touchWrite1((uint8_t)CST_DEVICE_REG_GESTURE_ENABLE, 0x01);
}
uint8_t gestureID(){
  return touchRead1((uint8_t)CST_DEVICE_REG_GESTURE_ID);
}

char* gestureName(uint8_t id){
  char* gName;
  switch(id){
    case 0x00:
      gName = "no-gesture";
      break;
    case 0x20:
      gName = "right-slide";
      break;
    case 0x21:
      gName = "left-slide";
      break;
    case 0x22:
      gName = "up-slide";  // 途中で止める?突き抜けると0になる?
      break;
    case 0x23:
      gName = "down-slide";
      break;
    case 0x24:
      gName = "double-click";
      break;

    case 0x30:
      gName = "o gesture";
      break;
    case 0x31:
      gName = "w gesture";
      break;
    case 0x32:
      gName = "m gesture";
      break;
    case 0x33:
      gName = "e gesture";
      break;
    case 0x34:
      gName = "C gesture";
      break;
    case 0x35:
      gName = "g gesture";  // 9→g(9を書く感じで初めてgで終わる)
      break;
    case 0x36:
      gName = "a gesture";
      break;
    case 0x37:
      gName = "d gesture";  // 筆記体
      break;

    case 0x40:
      gName = "n gesture";
      break;
    case 0x41:
      gName = "???"; 
      break;
    case 0x42:
      gName = "b gesture";
      break;
    case 0x43:
      gName = "(q) ???";  // a sとかに認識する書き順不明
      break;
    case 0x44:
      gName = "L gesture";
      break;
    case 0x45:
      gName = "P gesture";
      break;
    case 0x46:
      gName = "S gesture";
      break;
    case 0x47:
      gName = "u gesture";
      break;

    case 0x50:
      gName = "@ gesture";
      break;
    case 0x51:
      gName = "(<) ???";  // Cと認識するから <はないのかも
      break;
    case 0x52:
      gName = "> gesture";
      break;
    case 0x53:
      gName = "^ gesture";
      break;
    case 0x54:
      gName = "v gesture";
      break;

    case 0x60:
      gName = "3 gesture";
      break;
    case 0x61:
      gName = "6 gesture";
      break;
    case 0x62:
      gName = "(8) ???"; // 書き順不明
      break;
    case 0x63:
      gName = "7 gesture";  // Lを回転した形で
      break;
    case 0x64:
      gName = "(9) ???";  // 書き順不明
      break;
    case 0x65:
      gName = "2 gesture";
      break;

      case 0x70:
      gName = "h gesture";
      break;
    case 0x71:
      gName = "k gesture"; // ブロック体(一筆書き)
      break;
    case 0x72:
      gName = "y gesture"; // ブロック体(一筆書き)
      break;
    case 0x73:
      gName = "r gesture";
      break;
    
    default:
      gName = "???";
  
  }
  return gName;
}

uint8_t touchPoint(uint16_t* x, uint16_t* y){
  uint8_t e,dat[4];
  dat[0] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +0));
  dat[1] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +1));
  dat[2] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +2));
  dat[3] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +3));
  e = (dat[0] >> 6) & 0x03;
  *x = ((dat[0]<<8)|dat[1]) & 0x0fff;
  *y = ((dat[2]<<8)|dat[3]) & 0x0fff;
  return e;
}

void setup() {
  M5.begin();   // 外部I2C off
  Serial.printf("\n");
  Serial.flush();
  delay(50);
  yield();

  stext1.setColorDepth(8);
  stext1.createSprite(320, 32);
  stext1.fillSprite(TFT_WHITE);
  stext1.setTextColor(TFT_BLACK);
  stext2.setColorDepth(8);
  stext2.createSprite(320, 32);
  stext2.fillSprite(TFT_WHITE);
  stext2.setTextColor(TFT_BLACK);
  
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.clear(WHITE);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.printf("touch GESTURE Test!");
  gesture_enable();
  delay(500);
  yield();
}

void loop() {
  char buf[80];
  char* c;
  uint16_t x,y;
  uint8_t tds = td_status();
  uint8_t e = touchPoint(&x, &y);
  uint8_t id = gestureID();

  sprintf(buf,"event:%d,%d P1(%d,%d)",tds,e,x,y);
  stext1.fillSprite(TFT_WHITE);
  stext1.drawString(buf, 0, 0, 4); // (0,0) font #4

  c = gestureName(id);
  sprintf(buf,"gesture:%d(%s)",id,c);
  stext2.fillSprite(TFT_WHITE);
  stext2.drawString(buf, 0, 0, 4); // (0,0) font #4
  stext1.pushSprite(16, 32);
  stext2.pushSprite(16, 64);
  delay(500);
  yield();
  
}

【M5Stack_Core2】タッチライブラリ使ってみた

サンプルスケッチにいくつか処理を追加

わかったこと、タッチパネルの機能はほとんど使ってない。ジェスチャに関しては、収得ポイントを使ってライブラリで行っている。F/Wの機能は使っていない。

#include <M5Core2.h>
#include <touch.h>

#define ESP32

// 画面を上下2分割してジェスチャスタート、エンドポイントとする
TouchZone topHalf(0,0,320,120);         // 上側
TouchZone bottomHalf(0,120,320,160);    // 下側

TouchZone leftHalf(0,0,160,240);         // 上側
TouchZone rigthHalf(160,120,160,240);    // 下側

Gesture swipeDown(topHalf, bottomHalf, "Swipe Down");        // ソフトジェスチャ(↓)
Gesture swipeUp(bottomHalf, topHalf, "Swipe Up");            // ソフトジェスチャ(↑)
Gesture swipeLeft(rigthHalf, leftHalf, "Swipe Left");        // ソフトジェスチャ(←)
Gesture swipeRight( leftHalf, rigthHalf,    "Swipe Rigth");  // ソフトジェスチャ(→)

// 画面を4分割してボタンとして割り振る
TouchButton lt = TouchButton(0, 0, 160, 120, "left-top");          // 左上
TouchButton lb = TouchButton(0, 120, 160, 120, "left-bottom");     // 左下
TouchButton rt = TouchButton(160, 0, 160, 120, "right-top");       // 右上
TouchButton rb = TouchButton(160, 120, 160, 120, "right-bottom");  // 右下

void setup() {
  M5.begin();
  M5.Touch.addHandler(eventDisplay);  // イベント発生したら実行
  M5.Touch.addHandler(colorButtons, TE_BTNONLY + TE_TOUCH + TE_RELEASE);

  swipeDown.addHandler(yayWeSwiped_down);  // スタートポイントからエンドポイントに移動したら実行
  swipeUp.addHandler(yayWeSwiped_up);  //  スタートポイントからエンドポイントに移動したら実行
  swipeLeft.addHandler(yayWeSwiped_left);  //  スタートポイントからエンドポイントに移動したら実行
  swipeRight.addHandler(yayWeSwiped_right);  //  スタートポイントからエンドポイントに移動したら実行

  rt.addHandler(dblTapped, TE_DBLTAP); // 右上ゾーンイベントのダブルクリックが発生したら実行

}

void loop() {
  // ループは、アップデートのみ。つまり、タッチのコールバックに登録されたファンクションで処理が行われている。
  M5.update();
}

void eventDisplay(TouchEvent& e) {
  Serial.printf("%-12s finger%d  %-18s (%3d, %3d)", M5.Touch.eventTypeName(e), e.finger, M5.Touch.eventObjName(e),  e.from.x, e.from.y);
  if (e.type != TE_TOUCH && e.type != TE_TAP && e.type != TE_DBLTAP) {
    Serial.printf("--> (%3d, %3d)  %5d ms", e.to.x, e.to.y, e.duration);
  }
  Serial.println();
}

void colorButtons(TouchEvent& e) {
  TouchButton& b = *e.button;
  M5.Lcd.fillRect(b.x, b.y, b.w, b.h, b.isPressed() ? WHITE : BLACK);
}

void yayWeSwiped_down(TouchEvent& e) {
  Serial.println("--- SWIPE DOWN DETECTED ---");
}

void yayWeSwiped_up(TouchEvent& e) {
  Serial.println("--- SWIPE UP DETECTED ---");
}

void yayWeSwiped_right(TouchEvent& e) {
  Serial.println("--- SWIPE RIGHT DETECTED ---");
}

void yayWeSwiped_left(TouchEvent& e) {
  Serial.println("--- SWIPE LEFT DETECTED ---");
}

void dblTapped(TouchEvent& e) {
  Serial.println("--- TOP RIGHT BUTTON WAS DOUBLETAPPED ---");
}

TE_TOUCH タッチした(接触した)

TE_TOUCH     finger0  left-bottom        (110, 196)
TE_RELEASE   finger0  left-bottom        (110, 196)--> (110, 196)     13 ms
TE_TAP       finger0  left-bottom        (110, 196)
TE_TOUCH     finger0  left-bottom        ( 81, 208)
TE_RELEASE   finger0  left-bottom        ( 81, 208)--> ( 81, 208)     52 ms
TE_TAP       finger0  left-bottom        ( 81, 208)
TE_TOUCH     finger0  left-bottom        ( 51, 227)
TE_RELEASE   finger0  left-bottom        ( 51, 227)--> ( 51, 227)     26 ms
TE_TAP       finger0  left-bottom        ( 51, 227)
TE_TOUCH     finger0  left-bottom        ( 34, 220)
TE_RELEASE   finger0  left-bottom        ( 34, 220)--> ( 34, 220)     39 ms
TE_TAP       finger0  left-bottom        ( 34, 220)

パネルに接触時に発生

TE_MOVE 移動した(スワイプ)

TE_TOUCH     finger0  left-top           (  6, 107)
TE_MOVE      finger0  left-top           (  6, 107)--> ( 10, 107)     13 ms
TE_MOVE      finger0  left-top           ( 10, 107)--> ( 15, 107)     26 ms
TE_MOVE      finger0  left-top           ( 15, 107)--> ( 22, 107)     52 ms
TE_MOVE      finger0  left-top           ( 22, 107)--> ( 30, 107)     65 ms
TE_MOVE      finger0  left-top           ( 30, 107)--> ( 39, 107)     91 ms
TE_MOVE      finger0  left-top           ( 39, 107)--> ( 48, 107)    104 ms
TE_MOVE      finger0  left-top           ( 48, 107)--> ( 57, 107)    117 ms
TE_MOVE      finger0  left-top           ( 57, 107)--> ( 66, 107)    143 ms
TE_MOVE      finger0  left-top           ( 66, 107)--> ( 75, 107)    156 ms
TE_MOVE      finger0  left-top           ( 75, 107)--> ( 84, 107)    169 ms
TE_RELEASE   finger0  left-top           (  6, 107)--> ( 84, 107)    195 ms
TE_PRESSED   finger0  left-top           (  6, 107)--> ( 84, 107)    203 ms

タッチしてスワイプして離した。スワイプ中はTE_MOVEが発生

TE_RELEASE ジェスチャー後ある程度時間がたった?

ほかのイベントみればわかるがほとんど指を離したイベントで発生している。 タップとダブルタップでは発生してないので、ある程度の継続時間が必要かも。 PRESSEDでは発生している。

TE_GESTURE ジェスチャーした

TE_TOUCH     finger0  left-top           (153,  61)
TE_MOVE      finger0  left-top           (153,  61)--> (153,  70)     39 ms
TE_MOVE      finger0  left-top           (153,  70)--> (153,  85)     52 ms
TE_MOVE      finger0  left-top           (153,  85)--> (153, 106)     78 ms
TE_MOVE      finger0  left-top           (153, 106)--> (153, 137)     91 ms
TE_MOVE      finger0  left-top           (153, 137)--> (153, 157)    117 ms
TE_RELEASE   finger0  left-top           (153,  61)--> (153, 157)    130 ms
TE_GESTURE   finger0  Swipe Down         (153,  61)--> (153, 157)    130 ms
--- SWIPE DOWN DETECTED ---

上から下にスワイプした

TE_TAP シングルタップ 短く叩いた

TE_TOUCH     finger0  left-bottom        (108, 151)
TE_TAP       finger0  left-bottom        (120, 149)
TE_RELEASE   finger0  left-bottom        (108, 151)--> (108, 151)     26 ms

クリックした

TE_DBLTAP ダブルタップ 二回叩いた

TE_TOUCH     finger0  left-bottom        (135, 128)
TE_RELEASE   finger0  left-bottom        (135, 128)--> (135, 128)     26 ms
TE_DBLTAP    finger0  left-bottom        (135, 128)

ダブルクリップした

TE_DRAGGED ボタンからボタンへ移動(ドラッグ)

TE_TOUCH     finger0  left-top           ( 96,  62)
TE_MOVE      finger0  left-top           ( 96,  62)--> ( 96,  69)     13 ms
TE_MOVE      finger0  left-top           ( 96,  69)--> ( 96,  81)     39 ms
TE_MOVE      finger0  left-top           ( 96,  81)--> ( 96,  97)     52 ms
TE_MOVE      finger0  left-top           ( 96,  97)--> ( 96, 114)     65 ms
TE_MOVE      finger0  left-top           ( 96, 114)--> ( 96, 133)     91 ms
TE_RELEASE   finger0  left-top           ( 96,  62)--> ( 96, 133)    104 ms
TE_DRAGGED   finger0  left-top           ( 96,  62)--> ( 96, 133)    112 ms

スワイプなんだけど、画面四分割でボタン化しているのでその間を挟んでドラックしたイメージ

TE_PRESSED 離した(指が離れた)

TE_TOUCH     finger0  left-bottom        (108, 191)
TE_RELEASE   finger0  left-bottom        (108, 191)--> (108, 191)    585 ms
TE_PRESSED   finger0  left-bottom        (108, 191)--> (108, 191)    593 ms

クリックより遅い感じで離した

マルチタッチ

TE_TAP       finger0  right-bottom       (273, 156)
TE_TOUCH     finger0  left-top           ( 88,  57)
TE_TOUCH     finger1  left-bottom        ( 73, 191)
TE_MOVE      finger1  left-bottom        ( 73, 191)--> ( 73, 190)    178 ms
TE_MOVE      finger1  left-bottom        ( 73, 190)--> ( 73, 189)    269 ms
TE_RELEASE   finger1  left-bottom        ( 73, 191)--> ( 73, 189)    477 ms
TE_PRESSED   finger1  left-bottom        ( 73, 191)--> ( 73, 189)    485 ms
TE_RELEASE   finger0  left-top           ( 88,  57)--> ( 88,  57)    511 ms
TE_PRESSED   finger0  left-top           ( 88,  57)--> ( 88,  57)    519 ms

finger0 が、1本指目、finger1が2本指目。

TE_MOVE      finger1  left-bottom        (261, 222)--> (319, 229)    143 ms
TE_RELEASE   finger1  left-bottom        (135, 206)--> (319, 229)    156 ms
TE_GESTURE   finger1  Swipe Rigth        (135, 206)--> (319, 229)    156 ms
--- SWIPE RIGHT DETECTED ---
TE_RELEASE   finger0  left-top           (124,  57)--> (124,  57)   1417 ms
TE_PRESSED   finger0  left-top           (124,  57)--> (124,  57)   1425 ms

2本指目のイベントはほとんどできるけど、スワイプUP/DOWNは厳しい。1本目の影響がないY軸ラインにいないとできないのかも。

TE_TOUCH     finger0  left-top           (125,  56)
TE_TOUCH     finger1  left-bottom        ( 98, 175)
TE_RELEASE   finger1  left-bottom        ( 98, 175)--> ( 98, 175)     34 ms
TE_RELEASE   finger0  left-top           (125,  56)--> (125,  56)     56 ms
TE_TAP       finger1  left-bottom        ( 98, 175)
TE_TAP       finger0  left-top           (125,  56)

同時マルチタップ 。反応見る限り、下手に組み込みF/Wで判定よりソフトでジェスチャ処理したほうがよさそう?

【M5Stack_Core2】新しいタッチライブラリ

M5Core2のライブラリが更新されて、タッチパネルのライブラリが大幅に更新されました。
ざっと見た感じ、このBLOGで指摘していた感じのことがドキュメントに書かれています。 やっぱり、そうなのね。という感じです。 タッチライブラリですが、

  • Arduinoスタイルのボタン対応
  • タッチジェスチャー対応 ※ライブラリで対応
  • マルチタッチ一部対応(垂直のみ) ※本体を90°回転してもパネルは物理的に変わらないので反応しない。
  • タッチゾーン登録(あらかじめボタンエリア登録)
  • wasPressed() ボタンを離した
  • isPressed() ボタンを押した
  • ジェスチャー、ゾーン1、2を登録して1から2に移動中にジェスチャーをして判定
  • イベント関数
  • TE_TOUCH タッチした(接触した)
  • TE_MOVE 移動した(スワイプ)
  • TE_RELEASE ジェスチャー後ある程度時間がたった?
  • TE_GESTURE ジェスチャーした
  • TE_TAP シングルタップ 短く叩いた
  • TE_DBLTAP ダブルタップ 二回叩いた
  • TE_DRAGGED ボタンからボタンへ移動(ドラッグ)
  • TE_PRESSED 離した(指が離れた)

初リリースされて、まだ、数週間ですが、既にレガシーAPI呼ばわりされている。M5Core2 Factory Test等で 使用されていた、isPressed()関数とgetPressedPoint()関数、HotZonesは、一応まだ残しておくけど、今後 使わないでねって。おもっきりあちこちの雑誌とかでこう使うとか紹介されてそう。

サンプルスケッチとかがあるので使ったら使い方がわかるよと書かれているのでこれから使ってみようと思います。

【M5Stack_Core2】タッチパネル調査

タッチパネルのレジスタ仕様がm5StackのWebに公開されていたので確認したけどやりたいことがうまくいかない。 しかし、ジェスチャやその他の部分に関しては、コミュニティの掲示板の方でやり取りがあるから公式ライブラリの方にボタンファンクションは追加されるのかな。

【M5Stack_Core2】Core2_Factory_testとは?

Core2_Factory_testは、製品に出荷時に組み込まれているプログラムなのだが、どっちかというとプロモーションっぽいところがある。 工場出荷時の最終チェックプログラムと考えると、スペックをこれですべてチェック出来ているのか不安になる。 しばらくは、使い方やタッチスクリーンのプログラムの流れとかを学習するように解析をしたり、中途半端に切り捨てられた機能を 元通りにしていく感じか。なんかこれ、学習用プログラム(未完成)っぽい要素があってそういう意味でも出荷チェックプログラムじゃないよね。

【M5Stack_Core2】Core2_Factory_test解析

jpeg file f:id:chiyoh:20200919225422p:plain

mono file f:id:chiyoh:20200919225444p:plain

@rem jpeg バッテリーチャージ
python code2bin.py batPower.c

@rem jpeg 時間再描画
python code2bin.py clockImage.c

@rem jpeg 起動画面
python code2bin.py Core2Cover.c

@rem jpeg メイン画面
python code2bin.py Core2Main.c

@rem jpeg アプリ(IMU)メニュー画面
python code2bin.py imageMenu.c

@rem jpeg SDカード再描画
python code2bin.py sdCardImage.c

@rem jpeg SYSTEMアプリ画面
python code2bin.py SettingAppImage.c

@rem jpeg タイマーアプリ
python code2bin.py TimerAppImage.c

@rem jpeg タッチスクリーン座標再描画
python code2bin.py touchImage.c

@rem jpeg WIFIアプリ画面
python code2bin.py WifiSacn.c

@rem audio タッチ音
python code2bin.py bibisig.c

@rem audio 起動音
python code2bin.py preview_R.c


@rem 7 DisBatbuff.drawColorBitmap(31,19,27,11, batRect[sytState.batCount], 0xff9c00, 0x000000);
python code2drawColorBitmap.py batRect.c -width 27 27 27 27 27 27 27

@rem 11 DisClockbuff.drawColorBitmap(posx[0],26,24,42, DigNumber[ sytState.Rtctime.Hours / 10 ], 0xff9c00, 0x1a1100);
python code2drawColorBitmap.py digNumber.c -width 24 24 24 24 24 24 24 24 24 24 24

@rem 11 DisClockbuff.drawColorBitmap(posx[4],33,18,35, DigNumber_35px[ sytState.Rtctime.Seconds / 10 ], 0xff9c00, 0x1a1100);
python code2drawColorBitmap.py digNumber_35px.c -width 18 18 18 18 18 18 18 18 18 18 18

@rem 6  DisClockbuff.drawColorBitmap(0,0,164,17, rectptrBuff[sytState.clockCount], 0xff9c00, 0x000000);
python code2drawColorBitmap.py image.c -width 164 164 164 164 164 164

@rem 4  Disbuff.drawColorBitmapAlpha(posx,posy,53,33, (uint8_t*)ptr2, color, 0x000000);
python code2drawColorBitmap.py initImage.c -width 53 53 53 53

@rem 16 DisBatbuff.drawColorBitmap(3,20,7,10, Number_7x10px[batVoltage1], 0xff9c00, 0x000000);
@rem    DisTouchbuff.drawColorBitmap(19,15,3,10, (uint8_t*)Number_7x10px[13], 0xff9c00, 0x000000);
@rem    DisBatbuff.drawColorBitmap(3,37,60,10, Number_7x10px[14], color, 0x000000);
python code2drawColorBitmap.py Number8x7.c -width 7 7 7 7 7 7 7 7 7 7 7 7 7 3 60 7

@rem 4
@rem     DisPowerbuff.drawColorBitmap(0,65,77,37, (uint8_t*)image_External, color2, 0x000000);
@rem     DisPowerbuff.drawColorBitmap(0,0,77,37, (uint8_t*)image_Internal, color1, 0x000000);
@rem     DisPowerbuff.drawColorBitmap(0,39,77,24, (uint8_t*)image_power, 0xff9c00, 0x000000);
@rem     DisPowerbuff.drawColorBitmap(54,posy,20,31, (uint8_t*)image_PowerC, 0xae2828, 0x000000);
python code2drawColorBitmap.py power.c -width 77 77 77 20

@rem 7
@rem (未使用)
python code2drawColorBitmap.py rect_320_20.c -width 320 320 320 320 320 320 320

@rem 6
@rem   Disbuff.drawColorBitmap(122,98,76,44, TouchFishBuff[count_n], 0xff9c00, 0x000000);
python code2drawColorBitmap.py touchFish.c -width 76 76 76 76 76 76