見出し画像

サターンコントローラーの無線化計画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ケースを作ります。

この記事が気に入ったらサポートをしてみませんか?