Far East PinballさんのEastern スタンド一体型アーケードスティック for NSを暫定修理する編
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で使えればいいかなって(ひどい)
〆
まあ修理という目標は、暫定でも達成できたのでよかったかな?
縦横を気軽に変えられて意外と便利ですねコレ。
さすがにはんだ付けも慣れてきた感じです(油断大敵



























ディスカッション
コメント一覧
まだ、コメントがありません