SDVX用のコントローラーを作ってみる
前書き
この記事は無料です。
サウンドボルテックスのコントローラーを作りました。
なぜ作ったのか
前回IIDXのコントローラーが作れなかったからSDVXでリベンジ。
使用するもの
Arduino
Arduino Leonardo(atmega32u4)(検証済み)
互換品はこれ
Arduino Micro(atmega32u4)(未検証検証済み)
Pro Micro(atmega32u4)(未検証検証済み→コード変更が必要かも)
Due(Atmel SAM3X8E)(未検証)
Zero(ATSAMD21G18A)(未検証)
などのHID機能が使えるマイコンが使用されているもの
Uno、Nano、Mini、他の328ベースのボードは向いてなさそうです
外部割り込みが2箇所しかないため。(4箇所必要)
HIDデバイスとして認識させるのもちょっと苦労しますし。
HIDプロジェクト
Nキーロールオーバーキーボード
ゲームパッド、マウスの機能を利用します。
Rotary-master
前回はロータリーエンコーダーの処理を
1から書き起こしましたが、ライブラリがありましたのでこれを利用します
ボタン類
照光式押しボタン薄型60φ正方形
照光式押しボタン薄型45φ長方形 スモーク
この灰色ボタンだけは付属LEDが12Vなので注意。
Arduinoでは12vは取れないと思います(要検証)
やっぱりArduino単体では12vを取ることができなさそう…
ただし12vを別に用意してそれから取って上げれば、めんどくさいね…
照光式押しボタン薄型30φ正方形
LED持ってるよor光らなくていいよって人はこっち
専用ハーネス
普通のハーネスだと予想しているので作れると思います。(要検証)H4P-SHF-AAを使用していることがわかりました。
自作は簡単にできますので、可能な方はぜひやってみてください。
ロータリーエンコーダー
つまみノブ
両方ともビットトレードワンが出しています。
もっと本格的な物があれば情報更新したいと思います。
AliExpressにこんなものがありました。
https://ja.aliexpress.com/item/32824600814.html
ソフト面
ソフト麺ではない
最も大事なプログラムです。
githubに上げることにしました。
githubの使い方の学習も兼ねました。
前回はタイマー割り込みを利用してエンコーダーの状態の取得などを行いましたが、ライブラリがありましたのでこれを利用します。
前回のコードでは
NKROキーボード
マウス機能
タイマー割り込みゲームパッド機能
これらが同時に機能しないことがわかったのです。
タイマー割り込みではなく外部割り込みを使用すると全て併用でき
SDVXにもK-ShootManiaにも対応できると考え
外部割り込みを採用しました。
ボタン
こちらは単純にボタンが押されたらキーボードのキーを押すようにしています。
pressよりaddのほうが早いらしいのでadd
for (int i = 0; i < (sizeof(button.keymap) / sizeof(button.keymap[0])); i++)
{
if (!digitalRead(i) == HIGH)
{
NKROKeyboard.add(button.keymap[i]);
}
else if (!digitalRead(i) == LOW)
{
NKROKeyboard.remove(button.keymap[i]);
}
}
つまみ(ロータリーエンコーダー)
つまみ部分のサンプルプログラムから
/*
Rotary Encoder - Interrupt Example
This is the same as "Interrupt.ino" but works
the Pro Micro from Sparkfun which uses the
Atmega32U4 microcontroller. This controller
does not have the PCIE2 or PCMSK2 registers used in the
Interrupt example. Instead these are moved
to the PCIE0 and PCMSK0 registers instead.
These registers support interrupts on Pro Micro
pins 8, 9, 10 or 11. This example wires the encoder
to pins 8 and 9.
Note that the interrupt vector also changes to
correspond to the PCIE0 interrupt.
The circuit:
* encoder pin A to Arduino pin 8
* encoder pin B to Arduino pin 9
* encoder ground pin to ground (GND)
*/
#include <Rotary.h>
Rotary r = Rotary(8, 9);
void setup() {
Serial.begin(9600);
r.begin();
PCICR |= (1 << PCIE0);
PCMSK0 |= (1 << PCINT4) | (1 << PCINT5);
sei();
}
void loop() {
}
ISR(PCINT0_vect) {
unsigned char result = r.process();
if (result == DIR_NONE) {
// do nothing
}
else if (result == DIR_CW) {
Serial.println("ClockWise");
}
else if (result == DIR_CCW) {
Serial.println("CounterClockWise");
}
}
LCD
LCDで現在の状況を把握するためにI2Cで通信を行っています。
しかしArduino Leonardoは
D2:SDA
D3:SCL
このように共有しています。
ボタンでD2D3使いたいですし…
ハードウェアI2CではなくソフトウェアI2Cで
A0:SDA
A1:SCL
としてわりあててあります。
#include <LiquidCrystal_SoftI2C.h>
// Set SDA to pin A0 and SCL to pin A1
SoftwareWire *wire = new SoftwareWire(A0, A1);
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2, wire);
ハード面
ハード面の試作品を作る。
ブレッドボードに配線し、正常に動作することを確認する。
単体でデバッグができるようにLCDも繋いだ
Arduinoの接続ピン詳細
D0:BT-A
D1:BT-B
D2:BT-C
D3:BT-D
D4:FX-L
D5:FX-R
D6:スタートボタン
D7:なし
D8:VOL-L(ロータリーエンコーダー1のA相)
D9:VOL-L(ロータリーエンコーダー1のB相)
D10:VOL-R(ロータリーエンコーダー2のA相)
D11:VOL-R(ロータリーエンコーダー2のB相)
D12:なし
D13:なし
A0:LCDのSDA
A1:LCDのSDL
A2:なし
A3:なし
A4:なし
A5:なし
5V:ロータリーエンコーダー両方の電源、LCDの電源
GND:グランド
なし=自由枠ですが、時々通信が同じピンを使っていることがあるので
ソースコードを改造して使う場合は注意してください。
基板を設計中です。
これをプリント基板制作会社に依頼することで基板が送られてきます。
ここから失敗談。
使用ソフトはkicadです。 配線にはFreeroutingを利用しています。
allpcbに発注したのですが、問題発生。
シルクがあるけど注文のときにはシルク指定されてませんでしたけども、ファイルに従って作りますか?とのこと。
英語で返信して、回答を待ちます。
特に問題がなければ、オーダーが通るはずです。
なんと発注した基板間違えて制作していました。作り直し。15ドルくらい損です。損なぁ
H4P-SHF-AAのフットプリントがkicadで見つけられなかったのでとりあえずXHコネクタで作っています。
基板
さて、上記で基板を間違えて制作してしまいましたが、どうにかこうにか正常に動く基板を作成しました。
こちらのように基板を作成…
つまりArduinoのシールドにしました。
これにより、ArduinoLeonardoに上から刺すだけで簡単にコントローラーとして使うことができます。
今回はALLPCBでなくJLCPCBを使いました。
安い。本当に安い。配送を考えてあげれば4ドルくらいで買えます。
15ドルかかっていたものが4ドルになりました。
ガーバーデータはこちらに置いておきます。
基板制作後
これにより非常に簡単な接続になりました。
専用ハーネスの場合は
左の四角から順に赤(5v)、黒(LEDのGND)、緑左(NO)、緑右(COM)
とつなぎます。
もし旧型のスイッチの場合は赤(LEDのプラス=5v)黒(LEDのマイナス)緑左(Arduinoの信号=NO)緑右(ArduinoのGND=COM)になっていますので、注意しながら接続します。
LEDはこっち。+とかマークを付けていくといいと思う。
シールドを乗せる
このようにして用意して…
乗っける!!
ハーネスを接続!
点きました!!
このあとにちゃんと色分けしたもの作りました
NHとXHコネクタです。
ハード面(外装)
コントローラーの外装部分の制作に取り掛かります。
ボタン、ロータリーエンコーダーなどをはめ込む板が必要になり、それを支える部分も必要になります。
まずは天板の制作に取り掛かります
天板
天板の図面の作成にはFusion 360を使いました。
参考にしたサイトはこちらです。
うさっちゃんさまに感謝いたします。
参考図面からモデルを作っていきます…
工程は省略。
このようなモデルを作成しました。
これを三面図にします。
これをもとに天板を作成します。
しかし…500mmX300mmは結構な大きさですね。
独自に小さくしてもいいかもしれません80%キーボードみたいな。
今までに作ったものを合体
というわけで小さくしてボタンをはめたものがこれ
大きさは少し小さめにしました。
なので限界までロータリーエンコーダの位置を削っています。
Arduinoと自作基板を接続し、動作を確認できました。
メモ
木枠でもなんでもいいので支えを作成
LEDの項目に参考URLを記述する
参考にしたサイト一覧
ないと作れませんでした。
感謝します。
この記事が気に入ったらサポートをしてみませんか?