M5Stack:ジョイスティック&ボタンユニット

M5Stack の GROVE 端子に接続できる部品として、ジョイスティックユニットと2ボタンユニットがあったので、買いました!

スイッチサイエンス:M5Stack用ジョイスティックユニット
https://www.switch-science.com/catalog/4050/

スイッチサイエンス:M5Stack用デュアルボタンユニット
https://www.switch-science.com/catalog/4048/

レゴの連結ブロックを使って…

こうじゃ!簡易ジョイパッドの完成!

M5Stack FIRE付属の連結パーツと、補強用に1×3のレゴブロックを使いました。

ジョイスティックはポートA、ボタンはポートBに接続します。

ちょっとコードが短いが気にしない!


値を読み取るプログラムはこういう感じです。

#include <M5Stack.h>
int joyX;
int joyY;
int joyPress;
int buttonA;
int buttonB;
int buttonApin = 26; //赤ボタン
int buttonBpin = 36; //青ボタン

void setup() {
  M5.begin();
  Wire.begin();
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);
}

void loop() {
  Wire.requestFrom(0x52,3);
  while(Wire.available()){
    joyX = Wire.read();//X(ジョイパッド的には Y)
    joyY = Wire.read();//Y(ジョイパッド的には X)
    joyPress = Wire.read();//Press 
  }
  if (digitalRead(buttonApin) == LOW)
  {
    buttonA = 1;
  }else{
    buttonA = 0;
  }
  if (digitalRead(buttonBpin) == LOW)
  {
    buttonB = 1;
  }else{
    buttonB = 0;
  }
  Serial.printf("X:%d, ", joyX);
  Serial.printf("Y:%d, ", joyY);
  Serial.printf("Press:%d, ", joyPress);
  Serial.printf("ButtonA:%d, ", buttonA);
  Serial.printf("ButtonB:%d", buttonB);
  Serial.println();
 delay(1000);
}

実行結果はこちら。


ジョイスティックは、単純なスイッチではなくて、内部にATmega328Pチップを搭載してI2Cで通信してます。アドレスは 0x52。

まずは Wire.begin(); を忘れずに。

その後、

Wire.requestFrom(0x52,3);

これを送った後、ジョイスティックのX方向の値、Y方向の値、押し込みの状態を順に取得できます。

while(Wire.available()){
  joyX = Wire.read();//X
  joyY = Wire.read();//Y
  joyPress = Wire.read();//Press 
}

( X , Y )は、ニュートラル時に (126 ,117)付近で、スティックを動かすと、5~240あたりの間で変化してました。ある程度個体差あると思います。

ボタン押し込みは、押し込んでいないときは0、押し込み時に1になりました。


デュアルスイッチは単純なスイッチです。ポートBに接続すると、赤ボタンは26番ピン、青ボタンは36番ピンが割り当てられます。

int buttonApin = 26; //赤ボタン
int buttonBpin = 36; //青ボタン

それぞれのピンをインプット(プルアップ)に設定しておけば、

pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);

押されていないときに、HIGH(1)、押されたときに LOW(0)になります。

if (digitalRead(buttonApin) == LOW) {
  //押された
}else{
  //押されてない
}

ということで、M5Stack用の簡易ゲームパッドをゲットです!