サターンコントローラーの無線化計画3
ポンコツですけどソフトは完成
どうも無駄な努力です。
サターンコントローラーの無線化計画、ポンコツな切り貼りプログラムですけど無事に完成。
無駄な箇所がちらほら見えますが、スト2でスクリューパイルドライバーが出せるまでは行けました!
思い付きで作ったワリには良い出来です。
※改善すべき点はいっぱいですけどねww
コメントアウトを入れました
人に教えるようなプログラムではありませんが、コメントアウトを入れて構造がわかるようにしました。ミドルウェアに携わっている方、コメント欄で修正や指摘をしてくれると嬉しいです!無線化計画4でマシなプログラムに直せました!
改善するべき箇所
押しボタン1から10について、OFF時のカラ打ちをなくす
(たぶんバッテリーの持ち具合に関わるはず)ベタ打ちのコードを短くする
#include <BleGamepad.h>
#include <M5Atom.h>
BleGamepad bleGamepad;
void setup()
{
Serial.begin(115200);
M5.begin(true, false,true);
delay(10); // delay10ms
bleGamepad.begin();
pinMode(19, INPUT); // d2 pin
pinMode(22, INPUT); // d3 pin
pinMode(23, INPUT); // d0 pin
pinMode(33, INPUT); // d1 pin
pinMode(21, OUTPUT); // s0 pin
pinMode(25, OUTPUT); // s1 pin
}
char d0[4]; // s0とs1の変化で信号が変わるため2次元化
char d1[4]; // s0とs1の変化で信号が変わるため2次元化
char d2[4]; // s0とs1の変化で信号が変わるため2次元化
char d3[4]; // s0とs1の変化で信号が変わるため2次元化
int hat; // 方向キーの重複を避けるために作った変数
int ontime; // LED点滅タイマー
int offtime; // LED消灯タイマー
void loop()
{
if (bleGamepad.isConnected())
{
// LED点滅タイマー
if (ontime <= 20){
ontime = ontime + 1;
M5.dis.drawpix(0, 0xf0f0f0);
} else if (offtime <= 200) {
offtime = offtime + 1;
M5.dis.drawpix(0, 0x000000);
} else {
ontime = 0;
offtime = 0;
}
// ATOM liteのボタン情報更新
M5.update();
//s0とs1がOFF時のd0からd3のボタン情報読み込み
digitalWrite(21, LOW );
digitalWrite(25, LOW );
delay(1); //これがないと読み込みミス発生
d0[0] = digitalRead(22);
d1[0] = digitalRead(33);
d2[0] = digitalRead(19);
d3[0] = digitalRead(23);
//s0がOFF時、s1がON時のd0からd3のボタン情報読み込み
digitalWrite(21, LOW );
digitalWrite(25, HIGH );
delay(1);
d0[1] = digitalRead(22);
d1[1] = digitalRead(33);
d2[1] = digitalRead(19);
d3[1] = digitalRead(23);
//s0がON時、s1がOFF時のd0からd3のボタン情報読み込み
digitalWrite(21, HIGH );
digitalWrite(25, LOW );
delay(1);
d0[2] = digitalRead(22);
d1[2] = digitalRead(33);
d2[2] = digitalRead(19);
d3[2] = digitalRead(23);
//s0とs1がon時のd0からd3のボタン情報読み込み
digitalWrite(21, HIGH );
digitalWrite(25, HIGH );
delay(1);
d0[3] = digitalRead(22);
d1[3] = digitalRead(33);
d2[3] = digitalRead(19);
d3[3] = digitalRead(23);
// 読み込んだボタンの情報をBluetoothで送信、押してない場合はOFF
if (d0[0] == 0) {
bleGamepad.press(BUTTON_6);
} else {
bleGamepad.release(BUTTON_6);
}
if (d1[0] == 0) {
bleGamepad.press(BUTTON_5);
} else {
bleGamepad.release(BUTTON_5);
}
if (d2[0] == 0) {
bleGamepad.press(BUTTON_4);
} else {
bleGamepad.release(BUTTON_4);
}
if (d3[0] == 0) {
bleGamepad.press(BUTTON_8);
} else {
bleGamepad.release(BUTTON_8);
}
if (d0[2] == 0) {
bleGamepad.press(BUTTON_2);
} else {
bleGamepad.release(BUTTON_2);
}
if (d1[2] == 0) {
bleGamepad.press(BUTTON_3);
} else {
bleGamepad.release(BUTTON_3);
}
if (d2[2] == 0) {
bleGamepad.press(BUTTON_1);
} else {
bleGamepad.release(BUTTON_1);
}
if (d3[2] == 0) {
bleGamepad.press(BUTTON_9);
} else {
bleGamepad.release(BUTTON_9);
}
if (d3[3] == 0) {
bleGamepad.press(BUTTON_7);
} else {
bleGamepad.release(BUTTON_7);
}
// ATOM liteのボタンをボタン10として送信
if ( M5.Btn.isPressed() == 1) {
bleGamepad.press(BUTTON_10);
} else {
bleGamepad.release(BUTTON_10);
}
// 前回入力値と不一致、または方向キー未入力はhatスイッチを中心とする
if (hat != d0[1]*1000 + d1[1]*100 + d2[1]*10 + d3[1]) {
bleGamepad.setHat1(HAT_CENTERED);
} else if (d0[1]*1000 + d1[1]*100 + d2[1]*10 + d3[1] == 1111) {
bleGamepad.setHat1(HAT_CENTERED);
}
// 方向キーに重さを付けて、hatとする
hat = d0[1]*1000 + d1[1]*100 + d2[1]*10 + d3[1];
// hatの数値で方向キーをBluetoothで送信
switch(hat) {
case 101:
bleGamepad.setHat1(HAT_UP_LEFT);
break;
case 110:
bleGamepad.setHat1(HAT_UP_RIGHT);
break;
case 111:
bleGamepad.setHat1(HAT_UP);
break;
case 1001:
bleGamepad.setHat1(HAT_DOWN_LEFT);
break;
case 1010:
bleGamepad.setHat1(HAT_DOWN_RIGHT);
break;
case 1011:
bleGamepad.setHat1(HAT_DOWN);
break;
case 1101:
bleGamepad.setHat1(HAT_LEFT);
break;
case 1110:
bleGamepad.setHat1(HAT_RIGHT);
break;
}
delay(10); // 周回動作時間の調整用
}
}
次は専用基板(専用ケース?)を作る
ソフトはポンコツながら、とりあえず作れたので仮でヨシとする。
ざっくりした構想はありますが、ATOM LiteとATOM TailBATを固定して普通のツールとして使えるような基板orケースを作ります。