M5StickCの公式IRQ通知サンプル追加

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

GitHub上にIRQ通知ができないというIssueが作られ、それに答える形で公式スケッチが追加されましたので、中身を確認したいと思います。

スケッチ例(GitHub)

#include "M5StickC.h"
static void clear_mpu6880IRQ() {
  uint8_t temp;
  // set int active is LOW
  M5.I2C.writeByte(0x68, 0x37, 0xc8);
  // disable irq
  M5.I2C.writeByte(0x68, 0x38, 0x00);
  // clear irq status
  M5.I2C.readByte(0x68, 0x39, &temp);
}
static void clear_200qIRQ() {
  M5.I2C.writeByte(0x6C, 0x13, 0xe0);
}
static void axp192_disableAllIRQ() {
  M5.I2C.writeByte(0x34, 0x40, 0x00);
  M5.I2C.writeByte(0x34, 0x41, 0x00);
  M5.I2C.writeByte(0x34, 0x42, 0x00);
  M5.I2C.writeByte(0x34, 0x43, 0x00);
}
static void axp192_clearAllIRQStatus() {
  M5.I2C.writeByte(0x34, 0x44, 0xff);
  M5.I2C.writeByte(0x34, 0x45, 0xff);
  M5.I2C.writeByte(0x34, 0x46, 0xff);
  M5.I2C.writeByte(0x34, 0x47, 0xff);
  M5.I2C.writeByte(0x34, 0x4d, 0xff);
}
static void axp192_enableBtnIRQ() {
  M5.I2C.writeByte(0x34, 0x42, 0x03);
}
static uint8_t axp192_getBtnIRQStatus() {
  uint8_t status;
  M5.I2C.readByte(0x34, 0x46, &status);
  // clear btn irq
  M5.I2C.writeByte(0x34, 0x46, 0xff);
  return status;
}
void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  Wire.begin(21, 22, 400000);
  clear_mpu6880IRQ();
  clear_200qIRQ();
  pinMode(35, INPUT);
  axp192_disableAllIRQ();
  axp192_clearAllIRQStatus();
  axp192_enableBtnIRQ();
}
void loop() {
  delay(1000);
  M5.Lcd.setCursor(0, 0);
  uint8_t PinStatus = digitalRead(35);
  uint8_t IRQStatus = axp192_getBtnIRQStatus();
  M5.Lcd.printf("pin 35 status: %d\r\n", PinStatus);
  M5.Lcd.printf("axp192 btn status: %d\r\n", IRQStatus);
  Serial.printf("pin 35 status: %d\r\n", PinStatus);
  Serial.printf("axp192 btn status: %d\r\n", IRQStatus);
}

M5StickCの電源ボタンを押すと通知が発生するスケッチ例になります。

原理

GPIO35にいろいろなIRQ通知用の信号が接続されていますが、本体側の回路でプルアップがされていません。通常ですと使えないのですがIMU(SH200Q or MPU6880)はHIGH出力ができるので、プルアップのかわりに使っています。

IRQ通知があるときにはアクティブで、IRQ通知がないときにはネガティブになります。IMUの設定ではアクティブローに設定して、IRQ通知をすべてクリアしています。つまりネガティブ状態になり、HIGHが出力されている状態です。

この状態で、AXP192などがIRQ通知を行うとGPIO35がLOWに落ちますので、通知を確認することができます。

欠点として、誰がLOWに落としているかはこの時点ではわかりませんのでI2Cで個別に確認するか、一人しか通知を出さないようにしておく必要があります。

細かい原理

昔に調べた上記と同じ仕組みになっていました。まだライブラリには組み込まれていないので、直接I2Cで設定を入れる必要があります。

まとめ

実際のところあまりIRQ通知が必要なことは少ないので、本当に必要なとき以外は使わないほうがいいとは思います。

コメント