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用の簡易ゲームパッドをゲットです!



