t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

PS4コントローラーをマクロキーボード化するArduinoにDIPスイッチでモード切り替え実装中

凄く長いタイトルになってしまったけど、ようするにコレの続き。
thom.hateblo.jp

そして、こういうことである。
f:id:t-hom:20210802181253p:plain

初見様用の説明

初見の方に説明すると、これはArduinoというマイコンを使ってプレステ4のDual Shockコントローラーをキーボード入力信号に変換するツールである。
長らく在宅勤務なので少しでも楽に効率よく仕事をしようと思い製作した。傍目にはプレステで遊んでるようにしか見えないけど、PCから見ればただのキーボードなので、ショートカットを駆使してメールを閲覧してる人とやってることは同じ。
詳細は上のリンク先にあるリンク先にあるリンク先をたどれば最初の記事が出てくる。

今回の変更点と経緯

もともと仕事で使っているのだが、時折ゲームや別の用途で設定を変更したい場合が出てくる。
そこで、DIPスイッチというパーツを使ってスイッチのON・OFFを読み取り、マクロを切り替えできるようにする。

今回完成したのはハードウェア部分のみ。テストコードでとりあえず動いたのでもうできたも同然ということで記事を書いてしまった。(できてないけど。)

部品の選定と配線プラン

今回つかった部品はこちらのDIPスイッチ。4スイッチ付いているので4ビット=スイッチの組み合わせは16パターン作れる。

実店舗なら1個何十円かで購入できるけど、これだけのために出かけると電車賃の方が高くつくのでいつものAmazon。
結局色々失敗して3~4個壊す羽目になったので多めに買っといてよかった。

5個で十分だったというのは結果論であって、「やべぇ、あと1個しかねぇ」というメンタルではクリエイティブに色々試すことが出来ない。
やっぱパーツの在庫は多いに越したことは無いのだ。

配線はこんな感じで計画。デジタルの5~8番はUSBホストシールドとはんだで接着してるだけで、電気的には特に意味はないので今回活用する。
f:id:t-hom:20210802182949p:plain
※実際は上のGNDを使った。

試行錯誤の履歴

まず手持ちのワイヤーで接続することを考えてみた。
私が普段使いしてるのはこちらで紹介されている単線のワイヤー。ブレッドボードに直挿しできるので便利なんだけど、もはや針金と紹介されているとおり、相当固い。
blog.siliconhouse.jp

なんで単線メインかというと、当時の私は予備はんだというテクニックを知らず、こんな感じに端子に挿すときにイラっとしてたから。
f:id:t-hom:20210802184807p:plain

そんで単線の太いのをこんな細かい部品にはんだ付けできる自信がなくて、ビニール被膜と芯線の間にDipスイッチの足を突っ込む作戦。。
f:id:t-hom:20210802183530p:plain

何度か足を折りつつ、3個めで成功したんだけど。。
f:id:t-hom:20210802185056p:plain

むり。。固すぎて基盤にはんだ付けしたが最後、フタが閉まらなくなる。

ということで作戦変更。なるべく細い線でやってみよう。

手持ちのアイテムではコレが一番細い線だった。何のパーツか忘れたけど転がってるってことは切っても大丈夫だろう。上に1本映ってる黄色いのは例の単線ワイヤ。
f:id:t-hom:20210802185239p:plain

ただこれ失敗すると後がないので同じようなケーブルを買っておくことにした。
さて、どうやって同じケーブルを探すか。

ケーブル自体になんか書いてあるようだけど、肉眼では読めない。
とりあえずカメラでズーム撮影してみると。。
f:id:t-hom:20210802185500p:plain

ふむ、28AWGというのが芯線の太さの規格らしい。
ビニール被膜(シースというらしい)も含めた太さはノギスで測って0.9ミリくらいだったのでそれに近いのを探す。
Amazonで電子ワイヤーのベンダーを探して、協和ハーモネットというメーカーのサイトのカタログで欲しいワイヤーを探して、再びAmazonで型番検索。

30AWGのこちらを購入した。

こういうのはAmazonだけだと情報不足でさっぱり分からないのでやっぱメーカーカタログの確認が重要。

色々調べた副産物として、ワイヤーストリッパーのどの穴使えば良いのかを学んだ。今まで適当だったんだけど、AWGってそういうことね。。
f:id:t-hom:20210802190245p:plain

ちなみに前述の太いワイヤーのAWG値も気になって探しまわったけどどこにも乗ってなくてかなり時間をロスした。結論、AWG規格に該当するサイズじゃなかった。。近いサイズはAWG22で単線だから左のゲージで下から3つめの穴を使う。


さて、線を買ったらあとは繋ぐだけ。今回の細線なら直接はんだづけできそうだ。なんならDIPスイッチの足が邪魔だから、足が折れたスイッチにはんだ付けしてみた。

全部繋がって「完成!」と思ってスイッチをスライドしてみたらスイッチがポキっと。。どうやらはんだ付けの熱がプラ部分に伝わって劣化&固着を引き起こしたようだ。。

気を取り直して足がついたままでリトライ。
半田ゴテ側にはんだをたっぷりのせ、スイッチの足と電線を重ねたところに一瞬で擦り付けるという荒業でなんとか接着。
f:id:t-hom:20210802191056p:plain

全く褒められた方法ではないがとりあえずくっついた。。

次の心配は、ショートである。
このまま閉めたらスイッチの足が基盤に触れてぶっ壊れるのではと。

そこで絶縁材を探していたところ、ポリイミドテープというものがあることを知った。
リチウムイオン電池とかに使われてるアレ。。といっても伝わらないかと思うので。。コレ↓

頭についてる飴色のがポリイミドという特殊なプラスチックで、耐熱・絶縁という特性がある。

以下の商品を購入。Amazonには耐熱性が無いただのテープを着色しただけの偽物も出回ってるらしいけどコメント見る感じは大丈夫そう。

まぁ今回は絶縁だけで良いので大丈夫だろう。

最終的にはポリイミドテープで足を適当に覆って、ホットボンドで接着し、更に横から上からホットボンドを塗りたくって強引に接着。
f:id:t-hom:20210802192307p:plain

ケースの加工

試作段階では前回プリントしたケースに穴を空けただけ。
Vesselのドライバーにドリルビットで穴を空けた後、タケノコドリルビットで穴を広げる。
f:id:t-hom:20210802192524p:plain

あとはルーターで雑に加工。。案の定汚いけど試作なのでとりあえずOK。
f:id:t-hom:20210802192703p:plain

その後、配線がうまくいってフタが閉まることもテストできたので、Fusion 360でモデルを編集して再印刷。
f:id:t-hom:20210802192922p:plain

Fusion 360の無料サブスクリプションが切れてて購買ページに飛ばされたので一瞬焦ったけど、ちゃんと個人ライセンス(無償)を更新する方法が見つかったので良かった。。
makerslove.com

テストコード

テストなので興味ないと思うけど一応乗せておく。
東方用の設定に、使ってない△ボタンでスイッチの状態をシリアルモニターに流すコードを足しただけ。

#include <Keyboard.h>
#include <Mouse.h>
#include <PS4USB.h>

// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

// #include "Arduino.h"
// #include "DFRobotDFPlayerMini.h"
// DFRobotDFPlayerMini myDFPlayer;

USB Usb;
PS4USB PS4(&Usb);

bool printAngle, printTouch;
uint8_t oldL2Value, oldR2Value;
uint8_t oldRightHatX, oldRightHatY;
uint8_t redundant;

void setup() {
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  Serial.begin(9600);
  if (Usb.Init() == -1) {
    while (1); // Halt
  }
  Serial.println("Started:");
  Mouse.begin();
  redundant = 1;
}

void loop() {
  Usb.Task();

  if (PS4.connected()) {
    if (PS4.getButtonClick(PS)) {
    }
    if (PS4.getButtonPress(TRIANGLE)) {
      for(int i = 5; i<=8; i++){
        Serial.print(i);
        if (digitalRead(i)) {
          Serial.println(" is connected");
        }
        else {
          Serial.println(" is disconnected");
        }
      }
      
    }
    if (PS4.getButtonClick(CIRCLE)) {
    }
    if (PS4.getButtonPress(CROSS)) {
      Keyboard.press('z');
    } else {
      Keyboard.release('z');
    }
    
    if (PS4.getButtonClick(SQUARE)) {
    }

    if (PS4.getButtonPress(UP)) {
      Keyboard.press(KEY_UP_ARROW);
    } else {
      Keyboard.release(KEY_UP_ARROW);
    }
    if (PS4.getButtonPress(RIGHT)) {
      Keyboard.press(KEY_RIGHT_ARROW);
    } else {
      Keyboard.release(KEY_RIGHT_ARROW);
    }
    if (PS4.getButtonPress(DOWN)) {
      Keyboard.press(KEY_DOWN_ARROW);
    } else {
      Keyboard.release(KEY_DOWN_ARROW);
    }
    if (PS4.getButtonPress(LEFT)) {
      Keyboard.press(KEY_LEFT_ARROW);
    } else {
      Keyboard.release(KEY_LEFT_ARROW);
    }

    if (PS4.getButtonPress(R1)) {
      Keyboard.press(KEY_LEFT_SHIFT);
    } else {
      Keyboard.release(KEY_LEFT_SHIFT);
    }
    
    if (PS4.getButtonClick(L1)) {
      Keyboard.press('x');
      delay(40);
      Keyboard.releaseAll();
    }
 
    if (PS4.getButtonClick(OPTIONS)) {
      Keyboard.press(KEY_ESC);
      delay(40);
      Keyboard.releaseAll();
    }
  }
}

終わりに

今回は狭いケースにスイッチを追加するという結構無茶なことをやったのでワイヤーの選定や絶縁処理など色々と勉強になることがあり面白かった。
もう一度やれと言われたらマジ勘弁だけど。

あとはソースコードを整理するだけだが、こればかりは自分用のセッティングなので他人が真似してもしょうがないし、PS4マクロキーボードシリーズはこの記事で最後である。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。