見出し画像

サターンコントローラーの無線化計画4

専用基板を設計、ソフトも仕上げました

どうも無駄な努力です。
サターンコントローラーの無線化計画、ポンコツな切り貼りプログラムを修正しました。

無駄な箇所は直して、Bluetoothの信号のカラ打ちをなくしました。
一部は付け焼き刃的ですが、for文や比較用の旧値変数でループを軽くしました。
とりあえず操作が軽い!!
前回のソフトに比べて昇竜拳、スクリューパイルドライバーも軽くなり、楽しくなりました。

微修正はあるだろうけど最終バージョンかな?

微修正はするだろうけどまともに使えるバージョンと言っていいでしょう。
あと、修正したい点は下記だけです。

  • ループの時間は短くしたが、Bluetoothコントローラーとしての正式な周期を見つけて設定する必要あり
    (現在はザックリloopの最後にdelay3msを入れてます)

  • 出来る限り省電力化

#include <BleGamepad.h>
#include <M5Atom.h>

BleGamepad bleGamepad;

// pin番号を設定
    const int s0pin = 21;
    const int s1pin = 25;
    const int d0pin = 22;
    const int d1pin = 33;
    const int d2pin = 19;
    const int d3pin = 23;

// s0とs1の変化で信号が変わるためd0からd3を配列化
    int d0[4];
    int d1[4];
    int d2[4];
    int d3[4];

// d0からd3の変化確認用に旧値の配列を作成、不一致の数値を代入
    int old0[4] = {2,2,2,2};
    int old1[4] = {2,2,2,2};
    int old2[4] = {2,2,2,2};
    int old3[4] = {2,2,2,2};

// ATOM liteの現旧ボタン値、不一致の数値を代入
    int btn;
    int oldbtn = 2;

// 方向キーの重複を避けるために作った変数
    int hat = 1111;
    int oldhat = 1111;

// LED点滅タイマー
    int ontime;
    int offtime;

void setup()
{
    Serial.begin(115200);
     M5.begin(true, false,true); 
    delay(10);  // delay10ms
    
    bleGamepad.begin();

    pinMode(d0pin, INPUT); // d0 pin
    pinMode(d1pin, INPUT); // d1 pin
    pinMode(d2pin, INPUT); // d2 pin
    pinMode(d3pin, INPUT); // d3 pin
    pinMode(s0pin, OUTPUT); // s0 pin
    pinMode(s1pin, OUTPUT); // s1 pin
}
    
void loop()
{
    if (bleGamepad.isConnected())
    {

// LED点滅タイマー
    if (ontime <= 20){
    ontime = ontime + 1;
    M5.dis.drawpix(0, 0xf0f0f0);
    } else if (offtime <= 2000) {
    offtime = offtime + 1;
    M5.dis.drawpix(0, 0x000000);
    } else {
    ontime = 0;
    offtime = 0;
    }

// ATOM liteのボタン情報更新
    M5.update();

// コントローラーのON/OFF読み込み
    for (int s0=0; s0 <= 1; s0++){
      for (int s1=0; s1 <= 1; s1++){

    digitalWrite(s0pin, s0 );
    digitalWrite(s1pin, s1 );

    delayMicroseconds(100); //これがないと読み込みミス発生

    d0[s0*2+s1] = digitalRead(d0pin);
    d1[s0*2+s1] = digitalRead(d1pin);
    d2[s0*2+s1] = digitalRead(d2pin);
    d3[s0*2+s1] = digitalRead(d3pin);
      
      }

// 省電力に効果有無は不明だが、s0とs1をOFFにしておく
    digitalWrite(s0pin, 0 );
    digitalWrite(s1pin, 0 );
    }

// 読み込んだボタンの情報に変化があればBluetoothで送信
    if (d0[0] != old0[0]) {
     if (d0[0] == 0) {
      bleGamepad.press(BUTTON_6);
      }  else {
      bleGamepad.release(BUTTON_6);
      }
    }

    if (d1[0] != old1[0]) {
     if (d1[0] == 0) {
      bleGamepad.press(BUTTON_5);
      }  else {
      bleGamepad.release(BUTTON_5);
      } 
    }

    if (d2[0] != old2[0]) {
     if (d2[0] == 0) {
      bleGamepad.press(BUTTON_4);
      }  else {
      bleGamepad.release(BUTTON_4);
      } 
    }

    if (d3[0] != old3[0]) {
     if (d3[0] == 0) {
      bleGamepad.press(BUTTON_8);
      }  else {
      bleGamepad.release(BUTTON_8);
      }
    }

    if (d0[2] != old0[2]) {
     if (d0[2] == 0) {
      bleGamepad.press(BUTTON_2);
      }  else {
      bleGamepad.release(BUTTON_2);
      } 
    }

    if (d1[2] != old1[2]) {
     if (d1[2] == 0) {
      bleGamepad.press(BUTTON_3);
      }  else {
      bleGamepad.release(BUTTON_3);
      } 
    }

    if (d2[2] != old2[2]) {
     if (d2[2] == 0) {
      bleGamepad.press(BUTTON_1);
      }  else {
      bleGamepad.release(BUTTON_1);
      }
    }

    if (d3[2] != old3[2]) {
     if (d3[2] == 0) {
      bleGamepad.press(BUTTON_9);
      }  else {
      bleGamepad.release(BUTTON_9);
      } 
    }

    if (d3[3] != old3[3]) {
     if (d3[3] == 0) {
      bleGamepad.press(BUTTON_7);
      }  else {
      bleGamepad.release(BUTTON_7);
      } 
    }

// 現値を旧値にコピー
    for (int i=0; i <= 3; i++){
      old0[i] = d0[i];
      old1[i] = d1[i];
      old2[i] = d2[i];
      old3[i] = d3[i];
    }

// ATOM liteのボタンに変化があればボタン10として送信
    btn =  M5.Btn.isPressed();
    if ( btn != oldbtn) {
     if ( btn == 1) {
      bleGamepad.press(BUTTON_10);
      }  else {
      bleGamepad.release(BUTTON_10);      
      }
      oldbtn = btn; // 現値を旧値にコピー
    }

// 方向キーに変化があれば、方向キーをBluetoothで送信
    hat = d0[1]*1000 + d1[1]*100 + d2[1]*10 + d3[1];
    if (oldhat != hat) {
     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;

     case 1111:
     bleGamepad.setHat1(HAT_CENTERED);
     break;     
     }
     oldhat = hat; // 現値を旧値にコピー
    }
    
     delay(3); // 周回動作時間の調整用

    }
}

次は専用基板も順調!

ATOM LiteとATOM TailBATを固定して普通のツールとして使えるような基板をKICADで作図しました。
サンプル基板をJLCpcbで現在作ってもらってます!
設計ミスがあり、修正版はPCBgogoで作ってもらうことにしましたww

シルク印刷の8,5,39,38,7,6がS3 LiteのGPIO番号です(電源系は同じ)

そうそう、この基板の製作発注をする数時間前にATOM S3 Liteがスイッチサイエンスさんから発表されたので、ピンアサイン表だけ書き加えました!
※上の基板画像、シルク印刷参照

ATOM S3 Liteの方が省電力であってほしい、、、と願いながら酒を飲んで寝落ちしてましたww
スイッチサイエンスさんで欲しいものが合計3000円を超すようになったら即買い予定です。

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