見出し画像

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の方

LEDはこっち。+とかマークを付けていくといいと思う。

シールドを乗せる

このようにして用意して…

乗っける!!

ハーネスを接続!

点きました!!


テスト中

このあとにちゃんと色分けしたもの作りました

NHとXHコネクタです。

ハード面(外装)

コントローラーの外装部分の制作に取り掛かります。
ボタン、ロータリーエンコーダーなどをはめ込む板が必要になり、それを支える部分も必要になります。

まずは天板の制作に取り掛かります

天板

天板の図面の作成にはFusion 360を使いました。
参考にしたサイトはこちらです。

うさっちゃんさまに感謝いたします。

参考図面からモデルを作っていきます…
工程は省略。

SDVX天板

このようなモデルを作成しました。
これを三面図にします。

こんなクソ親切に全部寸法書く必要はないです。つまみの穴の直径は2R=9mmです

これをもとに天板を作成します。
しかし…500mmX300mmは結構な大きさですね。
独自に小さくしてもいいかもしれません80%キーボードみたいな。

今までに作ったものを合体

というわけで小さくしてボタンをはめたものがこれ


大きさは少し小さめにしました。
なので限界までロータリーエンコーダの位置を削っています。

Arduinoと自作基板を接続し、動作を確認できました。



メモ
木枠でもなんでもいいので支えを作成
LEDの項目に参考URLを記述する

参考にしたサイト一覧

ないと作れませんでした。
感謝します。


この記事が気に入ったらサポートをしてみませんか?