3Dプリンターでキースイッチ仕様のコンパクトなIIDXコントローラーを作る
以前、令和のビーマニポケットと称して制作したミニコントローラーが好評を得て、当時は耐久性に不安が残るため販売できるような商品ではなかったが、「キースイッチを使用してはどうか?」というアドバイスを貰い、制作に取り組んでいた
ちょうど別件(ギターフリークスコントローラーの自作)でキースイッチを扱う機会があり、余った部品をこちらに流用できないかと考えていたところだ(結果としてギタフリコンより制作費を費やしたのは言うまでもない)
キースイッチを3Dプリンター製品に組み込むノウハウはギタフリコンの制作過程で身につけたものの、小さな本体に格納するにはとにかく配線が邪魔すぎる。そのためPCB基板を自前で設計・発注を行うことにした。当記事ではそこに至るまでの、市販部品で組み立てられる設計図を解説していく
キースイッチ仕様コンパクトIIDXコントローラーの3Dモデル
(※Fusion360のSTL出力がバグるので3mf形式に変更)
以下、各パーツについて説明していく
また、各印刷時間とフィラメント使用量は、Ultimaker Curaの初期設定(レイヤー高さ0.12mm、インフィル密度20%)の数値とする
今回は全てレイヤー高さ0.28mm、インフィル密度20%でも問題無く制作できた
1,同梱されている各モデルの解説
mini_iidx_above
印刷時間:7時間50分
フィラメント使用量:39g
いわゆる天板部分。ハンドメイドコントローラーと同じくロータリーエンコーダーを使用するための穴が開けられている
2P側のモデルとなっているため、1P側で使うにはスライサーソフトで左右反転する
mini_iidx_below
印刷時間:16時間15分
フィラメント使用量:80g
キースイッチ用の基板を取り付ける穴とブレッドボード用の溝、端子用の切れ込みがある
2P側のモデルとなっているため、1P側で使うにはスライサーソフトで左右反転する
mini_iidx_separator
印刷時間:6時間32分
フィラメント使用量:25g
組み立て時にボタンを安定させるためのセパレーター。基板を浮かせず安定させ、配線がスイッチに干渉しないようにする役目もある
2P側のモデルとなっているため、1P側で使うにはスライサーソフトで左右反転する
mini_iidx_button & turntable & turntable_top
button
印刷時間:29分
フィラメント使用量:2g
turntable
印刷時間:1時間5分
フィラメント使用量:6g
turntable_top
印刷時間:11分
フィラメント使用量:0g(そんなわけない)
topだけ写真から抜けているが一式。これらは1P2Pで共通
2,組み立て方
3Dモデルで解説した通り、キースイッチの他に基板も用いる。今回使用したキースイッチはKailh Boxの茶色。ギタフリDAOコンで使用されているものと同じだ
これはMX系キースイッチと互換性があるらしく、広く普及した規格である。DIP化キットもいくつかあるが、今回は3Dモデルと合わせるため以下の商品を使う
キースイッチに関しても多くのストアで販売されているが、筆者はヨドバシで販売されているものを購入した
各自好みのキースイッチがあればそれらを使用してもいい
また、キースイッチ、基板、そして各種マイコンボード等を接続する方法も必要になる。基板に直接はんだ付けしてもいいが、筆者はXHコネクタを使用した。2ピンのサイド型で、基板の1,2と数字が書いてある部分に繋ぐ
そのままではスペースが足りないので、後ろの羽の部分をニッパー等で切断して使う
上記のスイッチにXHのケーブルを接続する。これも秋月電子で既製品が販売されている。コネクタと合わせてどうぞ
マイコンボードについては恒例のPro Microを使用する。今回はULITMATE MOBILE版での使用も想定しているため、TYPE-Cコネクタの製品を使用した
ロータリーエンコーダーも秋月電子のお世話になる。こちらも直接はんだ付けしてもいいし、DIP化キットを経由してもいい
今回はブレッドボードを使用するが、上記のXHケーブルは配線部分に何も端子が付いていない。そのため簡単に取り付けられるターミナルブロックを使用する。はんだを使わずに端子を固定できるため組み立てやすいし、メンテも簡単。2.54ピッチの8ピンで事足りる
このバネ式ターミナルブロックの注意点として、配線の被覆を長めに剥かないと入ってくれない。XHケーブルで剥かれているデフォルト状態の2倍くらいに向いて差し込む
ブレッドボードはアマゾンに売っているものを使用したが、5列×2の規格ならどれでも使えるはず。秋月電子にも売っている
TYPE-CのPro Microを差し込み、8ピンのターミナルブロックをGNDから2ピン~8ピンの範囲に接続する。各スイッチのGNDを結合してGNDに繋ぎ、1鍵~7鍵は各2ピン~8ピンに繋ぐ。邪魔な配線は切断する
ロータリーエンコーダーは両端を10ピン、16ピンに繋ぎ、中央はGNDに繋ぐ
Pro Microは端子を奥にして2ピン~8ピンが左となっているため、1P側で作る際はPro Microを上下反転させると配線しやすい
上部と下部の固定にはM3の25mmネジを使用する。下部にはナットを入れるための溝があるのでバリを取る
上記のM3ネジとナットを使い、上部と下部を固定すれば組み立ては完了となる
3,ファームウェア
ファームウェアについてもE1~E4が無いだけでハンドメイドコントローラーと同じ。以下コピペ
まず公式サイトからArduino IDEをダウンロード、インストールする
インストールしたら、ファームウェアに使うHIDライブラリなるものもダウンロードする。下記リンクから最新版をどうぞ
ロータリーエンコーダー用のライブラリもダウンロードする
IDEを起動したらメニューの「スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストール」で上記HIDライブラリとEncoderライブラリを選択してインストールする
あとはUSB接続で基板をPCに繋ぎ、「ツール→ボード→Arduino AVR Boards→Arduino Leonard」を選択、同メニューのシリアルポート欄で基板が接続されていれば、下記のプログラムをインストールする
(アルモバ用のファームウェアをインストールする場合は4の項まで飛ばす。上記ライブラリは必要になります)
#include <Arduino.h>
#include "HID-Project.h"
#include <limits.h>
#include <Encoder.h>
// ピン番号 1~7鍵→E1~E4
int button[13] = {0, 2, 3, 4, 5, 6, 7, 8, 0, 9, 14, 15, A0};
bool button_prev[13];
#define log_timer 50 //スクラッチ入力許容度
#define scratch_timer 50 //スクラッチの入力が残る時間
Encoder Enc(10, 16);
int input_log[log_timer];
int max_value;
int min_value;
int timer;
int i;
void setup() {
for (i = 1; i < 13; i++) pinMode(button[i], INPUT_PULLUP);
Gamepad.begin();
}
void loop() {
int i;
//delay(1); delayは消してみる
max_value = INT_MIN;
min_value = INT_MAX;
//過去log_timer秒分のロータリーエンコーダーの値を記録し最小値と最大値を調べる
for (i = 0; i < log_timer; i++) {
if (i == log_timer - 1) input_log[i] = Enc.read();
else input_log[i] = input_log[i + 1];
max_value = max(max_value, input_log[i]);
min_value = min(min_value, input_log[i]);
}
// 鍵盤の処理 皿の入力タイミングと合わせるために1ms遅延させる
for (i = 1; i < 13; i++) {
if (button_prev[i] == true) {
Gamepad.press(i);
}
else {
Gamepad.release(i);
}
}
for (i = 1; i < 13; i++) {
if (digitalRead(button[i]) == LOW) {
button_prev[i] = true;
}
else {
button_prev[i] = false;
}
}
//台揺れなどのチャタリング防止のために2以上動いてたらスクラッチ判定
if (max_value - min_value > 1 || max_value - min_value < -1) {
if (input_log[log_timer - 1] > input_log[log_timer - 2]) {
Gamepad.release(20);
Gamepad.press(21);
timer = scratch_timer;
}
if (input_log[log_timer - 1] < input_log[log_timer - 2]) {
Gamepad.release(21);
Gamepad.press(20);
timer = scratch_timer;
}
}
if (timer < 0) {
Gamepad.release(20);
Gamepad.release(21);
}
timer--;
Gamepad.write();
}
これをコピペして左上の「マイコンボードに書き込む」を押せば基板にインストールされ、ゲームパッドとして使用可能になる
4,ファームウェア(ULTIMATE MOBILE)
せっかく持ち運びしやすい小型のコントローラーを作ったのだからスマホ版beatmaniaIIDX、ULTIMATE MOBILEでも使いたくなる
ただし注意点として、Pro MicroにはBluetooth機能は備わっていないため有線での接続限定となる(Bluetoothモジュールが搭載されているマイコンボードもあるが対応は未定)
当noteでは詳細には書かないが(保身)、以下の記事の「デバイス情報を書き換える」の項を参考にすると何かが起こるかもしれない(Arduino IDEで指定したボードに対応させた表記が必要)
加えて、インストールするスケッチは以下の通り。ライブラリは上の項(3)で説明したものをインストールしておく必要がある
#include <Arduino.h>
#include <HID-Project.h>
#include <Encoder.h>
// ピン番号 1~7鍵→E1~E4
int button[13] = {0, 2, 3, 4, 5, 6, 7, 8, 0, 9, 14, 15, A0};
Encoder Enc(10, 16);
int enc_now;
int enc_prev;
int x;
int i;
void setup() {
for (i = 0; i < 13; i++) pinMode(button[i], INPUT_PULLUP);
Gamepad.xAxis(0);
Gamepad.begin();
}
void loop() {
int i;
//delay(1); delayは消してみる
enc_now = Enc.read();
if (enc_now != enc_prev) x += enc_now-enc_prev;
if (x > 127) x-=255;
else if (x < -128) x+=255;
Gamepad.xAxis(x*256);
enc_prev = enc_now;
for (i = 0; i < 13; i++) {
if (digitalRead(button[i]) == LOW) {
Gamepad.press(i);
}
else {
Gamepad.release(i);
}
}
Gamepad.write();
}
5,完成!
こちらは上記のモデル以前に制作したプロトタイプの試遊動画になっている
これは調整を加えた正式品。USB TYPE-Cケーブルで接続して使用できる。ダイソーに売っているケーブルで接続可能
せっかくスマホ版があるんだからコ◯ミがこういうの作って販売すればいいのにね