M5ATOMでハンズフリー踏めくりデバイス作った

未分類

コンテスト用に作成。はんだ付けなしで作れるので、以前作ったM5Atomで作るワイヤレス譜めくりデバイス よりもカンタンに出来上がります。

コードは以下。

M5Stackのライブラリのほか、NimBLEライブラリとESP32 BLE Keyboard library が必要です。まだ整理中ですが、とりあえず。

#include<M5Atom.h>
#include <BleKeyboard.h>
#define DEBUG 0

bool bleState = false;
int base;
bool stateL, stateR;
int mode = 0; 
const int keys[2][2]={{KEY_PAGE_DOWN, KEY_PAGE_UP},{KEY_RIGHT_ARROW, KEY_LEFT_ARROW}};

BleKeyboard bleKeyboard("M5Atom PageTurner");

void set_led(uint8_t r, uint8_t g, uint8_t b){
  int color = (r << 16) | (g << 8) | b;  
  M5.dis.drawpix(0, color);
  delay(30);
}

void showBleState(bool i){
  if(i){
    set_led(0,0,40);  // 青: BLE接続中
  } else {
    set_led(40,0,0);  // 赤: BLE未接続
  }
}

int readTouchPin(){
  int sum = 0;
  for(int i=0; i<100; i++){
    sum += touchRead(32);
    delay(1);
  }
  if(DEBUG){   // 確認
    Serial.print(base);
    Serial.print(" - ");
    Serial.print(sum);
    Serial.print(" = ");
    Serial.print(base - sum);
    Serial.print("\t");
    Serial.println("");
  }
  return sum;
}


void setup() {
  M5.begin(true,false,true);
  setCpuFrequencyMhz(80); // 240 or 160 or 80
  set_led(0,0,0);

  //int sum = 0;
  //sum = readTouchPin();
  delay(2000);
  base = readTouchPin();

  bleKeyboard.begin();
}

void loop() {
  M5.update();

  if(bleKeyboard.isConnected()) {
    if(!bleState){
      bleState= true;
      Serial.println("connected...");
    }
  } else {
    if(bleState){
      bleState = false;
      Serial.println("disconnected......");
    }
  }

  int sum = readTouchPin();

  if(sum < (base - 400)){  //280
    set_led(0,150,0);  // L 緑
    stateL = true;

  } else if(sum < (base - 120)){
    set_led(150,60,0);  // R オレンジ
    stateR = true;

  } else {
    showBleState(bleState);

    if(stateR && !stateL){
      Serial.println("------------------ R ---------");
      stateR = false;
      bleKeyboard.write(keys[mode][0]);
      delay(100);

    } else if(stateL){
      Serial.println("------------------ L ---------");
      stateL = false;
      stateR = false;
      bleKeyboard.write(keys[mode][1]);
      delay(100);
    }
  }
  
  // モード切替
  if(M5.Btn.wasPressed()){
    mode ++;
    if(mode >= 2){
      mode = 0;
    }
    Serial.print("Button Pressed / mode: ");
    Serial.println(mode);
    set_led(0,0,0);
    delay(100);
    for(int i=0; i< mode +1; i++){
      set_led(40,40,40);
      delay(180);
      set_led(0,0,0);
      delay(90);
    }
    delay(300);
  }
}

コンテスト投稿用。

コメント