Far East PinballさんのEastern スタンド一体型アーケードスティック for NSを暫定修理する編

日常,電子工作Eastern スタンド一体型アーケードスティック for NS,Far East Pinball,アケコン,修理(暫定),同人ハード

USB-C版 Promicro互換機で修理チャレンジ

なんかできそうだったのでサクッとやりました
むずかしい修理ではないですが、行う場合は自己責任でお願いします

はんだ付けをしてスケッチ→検証→転送、PCで動作確認で問題なし

メリットは元の配線がそのまま活用できることですかね

問題はガワ内部のスリットとmicroUSBソケットのサイズが
微妙にUSB-C版は幅が広く、そのまま刺さらないというトラブル

コネクタの方は外から開けられたのですが
ガワの方からは一体形成なので至難
やるにしても、すじ彫りタガネとか必要そうなので

とりあえず使えるくらいで妥協、抜き差しを何回か行って問題なし。

セイミツではなくサンワだと
レバーピンをハンダしても問題なく使えました
セイミツではレバー方向プレートついてるとダメかもしれないので
その時はケーブル直ハンダしてください。
端子が微妙にはみ出てるのは、後でカプトンテープ貼っときます;

コード

SwitchControlLibrary 2.02
Arduino IDE 2.3.2
Arduino AVR board 1.83
ArduinoSTL 1.3.3
この環境で検証と転送しています。

なおboard.txtを編集してVID=0x0f0d, PID=0x0092にする必要があります
このポッ拳コントローラー偽装をしないとSwitchで動作しないと思います。

調べるとIDEは旧版を推奨するページが多いのですが
特段の問題なくビルドできました
ポケモン自動化関係だらけで、バージョン2の情報はほぼない状況なので
それがさらに分かりにくくしてる気がしますね;

参考にしたサイトさん

LED回りは未実装ですので、FASTLEDなどを組み込んで
SwitchControlLibraryのホットキーでレバー指定を増やすか
後述の方法が良いと思います。

#include <SwitchControlLibrary.h>

// レバー(方向キー)のピンアサイン
const int PIN_LEVER_UP = 5;
const int PIN_LEVER_DOWN = 6;
const int PIN_LEVER_RIGHT = 7;
const int PIN_LEVER_LEFT = 8;
const int PIN_LEVER_GND = 9;

// 通常ボタンのピンアサイン
const int PIN_Y = A1;
const int PIN_X = A2;
const int PIN_R = A3;
const int PIN_B = 14;
const int PIN_A = 15;
const int PIN_ZR = A0;

// コインスロットとシフトボタンのピンアサイン
const int PIN_COIN_RIGHT = 10;  // 右コインスロット(+ボタン / シフト時-ボタン)
const int PIN_COIN_LEFT = 16;   // 左コインスロット(シフトボタン)

// 前回の状態を保存(チャタリング防止)
bool lastShiftState = false;

void setup() {
  SwitchControlLibrary();
  
  // レバー用GNDピンを出力モードにして LOW に設定
  pinMode(PIN_LEVER_GND, OUTPUT);
  digitalWrite(PIN_LEVER_GND, LOW);
  
  // レバーのピンを入力プルアップモードに設定
  pinMode(PIN_LEVER_UP, INPUT_PULLUP);
  pinMode(PIN_LEVER_DOWN, INPUT_PULLUP);
  pinMode(PIN_LEVER_LEFT, INPUT_PULLUP);
  pinMode(PIN_LEVER_RIGHT, INPUT_PULLUP);
  
  // ボタンのピンを入力プルアップモードに設定
  pinMode(PIN_Y, INPUT_PULLUP);
  pinMode(PIN_X, INPUT_PULLUP);
  pinMode(PIN_R, INPUT_PULLUP);
  pinMode(PIN_B, INPUT_PULLUP);
  pinMode(PIN_A, INPUT_PULLUP);
  pinMode(PIN_ZR, INPUT_PULLUP);
  pinMode(PIN_COIN_RIGHT, INPUT_PULLUP);
  pinMode(PIN_COIN_LEFT, INPUT_PULLUP);
}

void loop() {
  // シフトボタンの状態を読み取る
  bool shiftPressed = (digitalRead(PIN_COIN_LEFT) == LOW);
  
  // レバー(方向キー)の入力を読み取る
  bool leverUp = (digitalRead(PIN_LEVER_UP) == LOW);
  bool leverDown = (digitalRead(PIN_LEVER_DOWN) == LOW);
  bool leverLeft = (digitalRead(PIN_LEVER_LEFT) == LOW);
  bool leverRight = (digitalRead(PIN_LEVER_RIGHT) == LOW);
  
  // ハットスイッチ(十字キー)の設定
  if (leverUp && leverRight) {
    SwitchControlLibrary().moveHat(Hat::UP_RIGHT);
  } else if (leverUp && leverLeft) {
    SwitchControlLibrary().moveHat(Hat::UP_LEFT);
  } else if (leverDown && leverRight) {
    SwitchControlLibrary().moveHat(Hat::DOWN_RIGHT);
  } else if (leverDown && leverLeft) {
    SwitchControlLibrary().moveHat(Hat::DOWN_LEFT);
  } else if (leverUp) {
    SwitchControlLibrary().moveHat(Hat::UP);
  } else if (leverDown) {
    SwitchControlLibrary().moveHat(Hat::DOWN);
  } else if (leverLeft) {
    SwitchControlLibrary().moveHat(Hat::LEFT);
  } else if (leverRight) {
    SwitchControlLibrary().moveHat(Hat::RIGHT);
  } else {
    SwitchControlLibrary().moveHat(Hat::NEUTRAL);
  }
  
  // シフトボタンが押されていない場合の通常モード
  if (!shiftPressed) {
    // 上段: Y, X, R
    if (digitalRead(PIN_Y) == LOW) {
      SwitchControlLibrary().pressButton(Button::Y);
    } else {
      SwitchControlLibrary().releaseButton(Button::Y);
    }
    
    if (digitalRead(PIN_X) == LOW) {
      SwitchControlLibrary().pressButton(Button::X);
    } else {
      SwitchControlLibrary().releaseButton(Button::X);
    }
    
    if (digitalRead(PIN_R) == LOW) {
      SwitchControlLibrary().pressButton(Button::R);
    } else {
      SwitchControlLibrary().releaseButton(Button::R);
    }
    
    // 下段: B, A, ZR
    if (digitalRead(PIN_B) == LOW) {
      SwitchControlLibrary().pressButton(Button::B);
    } else {
      SwitchControlLibrary().releaseButton(Button::B);
    }
    
    if (digitalRead(PIN_A) == LOW) {
      SwitchControlLibrary().pressButton(Button::A);
    } else {
      SwitchControlLibrary().releaseButton(Button::A);
    }
    
    if (digitalRead(PIN_ZR) == LOW) {
      SwitchControlLibrary().pressButton(Button::ZR);
    } else {
      SwitchControlLibrary().releaseButton(Button::ZR);
    }
    
    // 右コインスロット: +ボタン
    if (digitalRead(PIN_COIN_RIGHT) == LOW) {
      SwitchControlLibrary().pressButton(Button::PLUS);
    } else {
      SwitchControlLibrary().releaseButton(Button::PLUS);
    }
    
    // シフト時に使うボタンはリリース
    SwitchControlLibrary().releaseButton(Button::HOME);
    SwitchControlLibrary().releaseButton(Button::CAPTURE);
    SwitchControlLibrary().releaseButton(Button::L);
    SwitchControlLibrary().releaseButton(Button::LCLICK);
    SwitchControlLibrary().releaseButton(Button::RCLICK);
    SwitchControlLibrary().releaseButton(Button::ZL);
    SwitchControlLibrary().releaseButton(Button::MINUS);
  }
  // シフトボタンが押されている場合のシフトモード
  else {
    // 上段: HOME, CAPTURE, L
    if (digitalRead(PIN_Y) == LOW) {
      SwitchControlLibrary().pressButton(Button::HOME);
    } else {
      SwitchControlLibrary().releaseButton(Button::HOME);
    }
    
    if (digitalRead(PIN_X) == LOW) {
      SwitchControlLibrary().pressButton(Button::CAPTURE);
    } else {
      SwitchControlLibrary().releaseButton(Button::CAPTURE);
    }
    
    if (digitalRead(PIN_R) == LOW) {
      SwitchControlLibrary().pressButton(Button::L);
    } else {
      SwitchControlLibrary().releaseButton(Button::L);
    }
    
    // 下段: 左スティック押し込み, 右スティック押し込み, ZL
    if (digitalRead(PIN_B) == LOW) {
      SwitchControlLibrary().pressButton(Button::LCLICK);
    } else {
      SwitchControlLibrary().releaseButton(Button::LCLICK);
    }
    
    if (digitalRead(PIN_A) == LOW) {
      SwitchControlLibrary().pressButton(Button::RCLICK);
    } else {
      SwitchControlLibrary().releaseButton(Button::RCLICK);
    }
    
    if (digitalRead(PIN_ZR) == LOW) {
      SwitchControlLibrary().pressButton(Button::ZL);
    } else {
      SwitchControlLibrary().releaseButton(Button::ZL);
    }
    
    // 右コインスロット: -ボタン
    if (digitalRead(PIN_COIN_RIGHT) == LOW) {
      SwitchControlLibrary().pressButton(Button::MINUS);
    } else {
      SwitchControlLibrary().releaseButton(Button::MINUS);
    }
    
    // 通常時に使うボタンはリリース
    SwitchControlLibrary().releaseButton(Button::Y);
    SwitchControlLibrary().releaseButton(Button::X);
    SwitchControlLibrary().releaseButton(Button::R);
    SwitchControlLibrary().releaseButton(Button::B);
    SwitchControlLibrary().releaseButton(Button::A);
    SwitchControlLibrary().releaseButton(Button::ZR);
    SwitchControlLibrary().releaseButton(Button::PLUS);
  }
  
  // レポートをSwitchに送信
  SwitchControlLibrary().sendReport();
  
  // 少し待機(ポーリング間隔)
  delay(1);
}

LED制御や他機種対応も考えるなら、手間暇考えても前の記事で書いたように
ProMicroサイズのUSB-CなPICOでGP2040CE使うのが楽だろうと思います。

そのまま認識すると思いますし
GPIOを合わせてホットキーを本家とそろえるだけです
ピンアサインは上記のソースの最初の方に書いてあるので
参考にしてCE側のWEBで変更してください
番号との対象はこちらのサイトの画像を見ればわかると思います。

申し訳ないんですが上記のコードは
うちのSwitchが電源はいらんので未検証です。
とりあえずPCで使えればいいかなって(ひどい)

勢いでとりあえず使えるようにしました。

まあ修理という目標は、暫定でも達成できたのでよかったかな?
縦横を気軽に変えられて意外と便利ですねコレ。

さすがにはんだ付けも慣れてきた感じです(油断大敵

日常,電子工作

Posted by あんこ