4
6

More than 3 years have passed since last update.

M5StickCのボタン反応の検出感度向上を2ステップで目指します

Last updated at Posted at 2021-07-11

2ステップでM5StickCのボタン反応の検出感度向上を目指します

1 はじめに

ボタン状態更新はM5.updateをコールして行います

しかし、M5.updateのコールをloopタスクでポーリングで行うと、
ポーリング周期によっては状態変化を取りこぼすことがありました

そこで、ボタン状態変化を割り込みで検知し、割り込みからM5.updateをコールするようにしました

取りこぼしが気持ち減った気がするけど

本当に減ったのかな???

2 準備

ステップ1 割り込み登録

setupに下記を追加します

  attachInterrupt(digitalPinToInterrupt(buttonA_GPIO), buttonA_isr, CHANGE);
  attachInterrupt(digitalPinToInterrupt(buttonB_GPIO), buttonB_isr, CHANGE);
パラメータ 条件
LOW ピンがLOWのとき発生
CHANGE ピンが変化したときに発生
RISING ピンがLOWからHIGHに変わったときに発生
FALLING ピンがHIGHからLOWに変わったときに発生

ステップ2 割り込みハンドラ実装

static void buttonA_isr(void) {
  M5.update();
  Serial.printf("A interrupt %d\n", millis() );
}

static void buttonB_isr(void) {
  M5.update();
  Serial.printf("B interrupt %d\n", millis() );
}

準備完了です

3 コード全体

#include <M5StickC.h>
#include <LovyanGFX.hpp>

static LGFX lcd;

// button gpio number
const uint8_t buttonA_GPIO = 37;
const uint8_t buttonB_GPIO = 39;

static void buttonA_isr(void) {
  M5.update();
  Serial.printf("%d A interrupt\n", millis() );
}

static void buttonB_isr(void) {
  M5.update();
  Serial.printf("%d B interrupt\n", millis() );
}

void setup() {

  // put your setup code here, to run once:
  Serial.begin(115200);

  // Initialize the M5Stack object
  M5.begin();

  lcd.init();                       // 初期化

  // START
  lcd.fillScreen(BLACK);
  lcd.setCursor(10, 10);
  lcd.setTextColor(WHITE);
  lcd.setTextSize(1);
  lcd.printf("START");

  attachInterrupt(digitalPinToInterrupt(buttonA_GPIO), buttonA_isr, CHANGE);
  attachInterrupt(digitalPinToInterrupt(buttonB_GPIO), buttonB_isr, CHANGE);

}

void loop() {
  // put your main code here, to run repeatedly:

  if(M5.BtnA.wasPressed() != 0 ) {
    Serial.printf("%d was pressA\n", millis());
    lcd.println("was pressA");
    delay(10);
  }

  if(M5.BtnA.isPressed() != 0 ) {
    Serial.printf("%d is pressA\n", millis());
    lcd.println("is pressA");
    delay(10);
  }

  if(M5.BtnB.wasPressed() != 0 ) {
    Serial.printf("%d was pressB\n", millis() );
    lcd.println("was pressB");
    delay(10);
  }

  if(M5.BtnB.isPressed() != 0 ) {
    Serial.printf("%d is pressB\n", millis() );
    lcd.println("is pressB");
    delay(10);
  }

}

4.結果

実験でボタンを連打しても検出もれをしなくなった

良かった

18797 A interrupt
18803 was pressA 
18903 is pressA
18967 A interrupt
23147 B interrupt
23153 was pressB
23263 is pressB
23294 B interrupt
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6