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