読者です 読者をやめる 読者になる 読者になる

スプラトゥーンが最高すぎてIchigoJamにアナログスティックを装備した話

ゲームパッドのアナログスティックを交換

2015年の最高傑作。いや、ここ十数年での最高傑作だと思ってるスプラトゥーンが最高すぎてずっとやってるんだけど、だんだんWii UゲームパッドのLアナログスティックがおかしくなってきた。走ってるのにゆっくり歩きになるとか、かなり致命的な症状が頻発するようになってきたのだ。

ゲームパッドのAとBと+と-を3秒間押してキャリブレーションやり直したりしても改善したりしなかったりという状況はもう、アナログスティックの可変抵抗部品が磨耗したりして、いい感じの抵抗値にならなくなってきたんだろうなということで部品だけアマゾンで買ってみた。

この部品、縦横に動く可変抵抗と押し込んだ時のスイッチが実装された小さな基盤。これをごっそり交換するので作業の難しさは特にない。そう、特殊なネジを回すためのY字ドライバーさえあればね。

アネックス(ANEX) 特殊精密ドライバー Y型 No.3470A

アネックス(ANEX) 特殊精密ドライバー Y型 No.3470A

で、交換してめでたしめでたし。イカちゃんはうまく動くようになってストレスフリー。あとは機械の不調を言い訳にできない実力の世界。(最近不調っす)

こういう部品はどういうルートで出回っているんだろうか?純正なのかコピーなのか?新品なのか中古なのか?とか気になることは保留しつつ。

「倒したら戻ってこない不良品」というアマゾンレビューについて追記(2016/6/26)

アナログスティックのパーツ、アマゾンのレビューで見ると「スティックを倒したら戻ってこない不良品」ってのがたまにあるけど、そのことについて一言追記しておく。(ゴミやほこりだらけとか、汚れ系の指摘については言及しない)

まず、Wii Uに装着すれば、そこまでの角度で倒すことはないからロックされることもない。

確かにゲームパッドに装着せずに生のパーツのままスティックを倒したら戻ってこない。軽いクリック感でロックされる状態。逆方向に軽く力を加えれば元のセンターに復帰できる。しかし、これは不良品じゃなくてゲームパッドに装着すればそこまで倒すことはないくらい、生のパーツを無理やり倒している状態だと考える。

なぜ「無理やり」と判断するかというと、このパーツはおそらくALPSのこのページにある部品。同ページの外型図を見ると、スティック(図ではLever)はどちらにも倒していない状態をセンターとして、「Any direction」に対して「46°max.」が倒せる範囲と記されている。

生のパーツのままスティックを倒して戻ってこない時、これは確かにスティックの角度は46°(センターからすると、その半分の23°)を超えている。この時の角度はざっくり言うと約60°(センターから30°くらい)倒し込んでいる。この倒し方は仕様の範囲を超えた使用方法だから、戻ってこないことがあってもそれは不良とは言えない。

ちなみに、アマゾンから送られてくるスティックパーツではなく、手元のWii Uゲームパッドから取り出したスティックパーツも同様に倒しすぎたら戻ってこない。

廃品利用

調査

交換して不要になった方の部品は、捨てるのがもったいないのでちょっと調べて何かに使えないか考えてみて、結果このブログに思い出として記録しておくことになった。

写真にあるように5ピンのコネクタが付いている。これがゲームパッドのメイン基盤につながるところ。 f:id:rohi:20160110021053j:plain

テスター片手にそれぞれのピンの信号が何かを調べてみたので、以下に記す。名前は適当につけた。

  1. GND
  2. X(横方向のスティック位置。抵抗値は左>右)
  3. 電源
  4. Y(縦方向のスティック位置。抵抗値は下>上)
  5. SW(スティック押し込み時にGNDとつながる)

IchigoJamにつなぐ

電源ONで即BASIC起動のおっさんホイホイなIchigoJamはデジタル入力もアナログ入力もできるので、つないでみることにする。

ちょうどいいコネクタを持ってなかったので、コネクタの裏側の端子に近くにあったフラットケーブルをペタペタ半田付けした。間にコネクタやらジャンバケーブルやら適当なものを挟んで基盤とIchigoJamを接続する。

GNDにはIchigoJamのGND、電源にはVCC、Xはアナログ入力の5番目であるOUT1、Yはアナログ入力の6番目であるOUT2、SWはデジタル入力の1番目であるIN1に接続する。

IchigoJamのBASICからアクセスする

BASICのプログラムからはSWの方はIN(1)でポートの状態を取得できて、押し込んでいいないときは1、押し込んだときは0が得られる。

XとYはANA(5)とANA(6)でそれぞれ0〜1023の値を取得することになるが、まずはデジタル出力になっている各端子を、アナログ入力に切り替えて使う必要がある。

Xの場合はOUT1をアナログ入力にするため「OUT 1, -1」を、Yの場合は同じく「OUT 2, -1」を実行する。この切り替えのための-1出力は、アナログ入力を繰り返すだけなら初期化時だけやれば良い。

Xは左に倒したとき最大値、中立センターで中間値、右に倒したときに最小値となる。理想的には。大体の場合、端まで倒しきっても1023や0といった最大/最小値が得られることもないだろうし、中立にしても511が得られるわけでもないだろうって感じなので、キャリブレーションというものがあってだねって話になる。Yは上に倒したとき最小値、下に倒したときに最大値となるが、Xと同様にそんなにきっちりとした値が得られるわけではない。

ゲームでは使い物にならないくらいの廃品再利用なので、新品だともっときれいな値が取れたりするのかもしれないけど、まぁとりあえずあるものでやってみよう。

プログラム

スティック位置にアスタリスクを表示して、スティックをグリグリしたらアスタリスクがグリグリ画面をうろうろする。画面中にアスタリスクがたまりすぎたらスティックを押し込んで画面クリア。そんなプログラムを作ってみた。

キャリブレーションも何もないのでAD変換値そのままを画面に荒くプロットしているようなものだが、ポインティグデバイスを装備してIchigoJamが急激に進化した気分が味わえた。

10 'ANALOG
20 CLS
30 OUT 1, -1 : OUT 2,-1
40 X = ANA(5) : Y = ANA(6)
50 'LOCATE U, V : ? " ";
60 U = 32 - (X + 1) / 32 - 1
70 V = (Y + 1) / 45 - 1
80 LOCATE 0, 0 : ? DEC$(U, 3); DEC$(V, 3); DEC$(IN(1), 2)
90 LOCATE U, V : ? "*";
100 IF IN(1) = 0 CLS
110 GOTO 40

10行目はコメント。FILESコマンドでファイル一覧が表示されるときに「ANALOG」と表示されるようにするためのコメント。

20行目で画面クリア。

30行目でデジタル出力端子OUT1とOUT2を両方ともアナログ入力に切り替える。ここまでが初回限りの初期化処理。

40行目でXとYにそれぞれAD変換値を取り込む。

50行目はコメンドアウトしているが、有効化すれば前回位置アスタリスク消去後に出力されるようになるので、アスタリスクが画面中にたまることはなくなる。

60行目、70行目はAD変換値を画面サイズに収まるように変換している。Xは左>右なのでその反転も含めて実施してUとVに設定する。

80行目、計算したU、V、そしてスティク押し込み状態(押し込んで0)を画面最上行に表示する。桁数が増減したときの上書きがきれいになるようにDEC$()の第2引数に桁数指定を実施している。昔のBASICで言うところのUSINGとかなんとかか。

90行目、新しい位置へのアスタリスクの出力。

100行目、この時点でスティックが押し込まれていたら画面を消去して気分をリセット。

110行目、アナログ入力処理へジャンプ。時間待ちも何もなしに、全速力でこのループを走らせている。

まとめ

余った部品をIchigoJamで再利用することができた。文字しか出ない画面でもダイレクトに位置指定できるポインティングデバイスを接続するとちょっとワクワクすることがわかった。

ちなみに、アマゾンではIchigoJam用アナログジョイスティックというのが売られていて、多分同じような感じで使うのかなぁと想像しつつ、Wii Uゲームパッドの部品交換で不要部品ができたときは今回のような廃品利用に挑戦していただくのもよいかと。