器用貧乏な河童のブログ

何かやってみたことを纏めるためのブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ボルテコン自作してみた

先週の日誌でも書きましたが、K-Shoot MANIAをプレイするためにサウンドボルテックスのコントローラーを自作しましたので紹介してみたいと思います。

KIMG0761.jpgKIMG0762.jpgKIMG0763.jpg
(左:真上から 中:斜めから 右:裏面)

自作するといってもACそっくりの物を作るとなると費用が高額になるので
「機能だけそこそこACに似たものであれば見た目は気にしない」
というコンセプト?で作りました。

なお、ここでは完成品の紹介という形で記事を書いてます。製作の様子が知りたい方はツイートをTogetterでまとめたものがあるのでそちらをどうぞ。


(外装とかボタンとか)

KIMG0698.jpg
いろいろと固定するための台は100円ショップで売ってた木材と木工用ネジを使って適当に組みました。
加工した部分が割れたりしましたが表面は後で隠れるので気にしない気にしない。
あとこれだけの加工を出来る工具を持っていた父親に感謝。なんでφ30mmの木工ドリルなんて持ってるの・・・?


KIMG0744.jpg
台の表面はこちらのブログで公開されている画像を光沢紙に印刷したものを貼ってみました。
STARTボタンの設置位置がかなりずれてるのはわざとです。ぴったり同じ位置に設置しようとしたら補強のために横に渡した角棒に接触してしまうので下にずらしました。
他にBTやFXの位置もズレてますがそこは問題なし。


KIMG0680.jpgKIMG0715.jpgKIMG0768.jpg
ボタンとつまみは秋月の押しボタンスイッチロータリーエンコーダーを使用。
実際のボタンやつまみの形状の再現のためにホームセンターで木の板と丸棒を買ってきて加工して、板は接着、つまみの丸棒はイモネジで固定することにしました。
板を貼る位置で実際のボタンの位置が決めれるので、スイッチを固定する位置はズレましたがここで修正がききました。


KIMG0771.jpg
あと、ボタンをそのまま押すとカチカチ音が大きいので、接着した板と台の間にゴム製のすべり止めを切って挟んでみました。
これだけでそこそこ静かになりました。


KIMG0741.jpgKIMG0745.jpg
一度完成してから、やっぱりボタンを押したら光る機能が欲しくなり、上図の位置に穴を追加してLEDを追加することに。
ボタンが木の板で光を通さないのでこんな場所が光ることになりました。
パネルが光ってるっぽくするため、もともとスイッチに貼る板として使おうと思っていた(100均のプラスチック容器の蓋を切り取った)プラ版を再利用して板と光沢紙の間に挟んであります。ちなみにプラ版は両面テープで台に固定してます。

KIMG0755.jpgKIMG0756.jpg
実際に光らせるとこんな感じになります。

KIMG0770.jpg
ケーマニの操作はキーボードのキー入力で行うため、コントローラーをPCに接続していると常にボタンを押したりつまみを回せば対応するキーが押されることになります。
そうなると他のソフトを触りたい時に不便なので、キーを押す機能のON/OFFを切り替えるためのトグルスイッチを設置してあります。
場所はプレイの邪魔にならない位置ということでSTRATボタンの横にしてみました。


(電子回路関係)

KIMG0766.jpg
操作の読み取り→PCのキー入力を行うためにArduino Leonardoを使ってます。
USB接続のキーボードやマウスとして振る舞う機能が搭載されているということなので利用することにしました。
Arduinoは使ったことが無かったのですがAVRなら何度も使ったことがあるので、分からない点があればググればすぐ分かるだろうと思って新規購入。
実際、機能の使い方に関しては簡単に理解して使うことができました。
電源もPCとUSB接続していれば取ることができるので、コントローラーから出るケーブルが一本で済むのもいいところですね。

KIMG0781.jpgKIMG0776.jpgKIMG0777.jpg
各スイッチやロータリーエンコーダーへの配線はケーブルを直接はんだ付けしてます。
黒のケーブルも持っていたはずですがなぜか行方不明なので赤と緑だけで組んでます。
ロータリーエンコーダーのA相を表すものとGNDラインが赤、ArduinoのIOピンと接続するためのものが緑になっています。
あと板が厚くてエンコーダーとトグルスイッチが固定できなかったのでその部分だけ無理やり削ってあります。

KIMG0732.jpg
ボタンに使っているマイクロスイッチですが、秋月で買った時に付属していたやつだとかなり固かったので、よく音ゲーに使われているオムロンのD2MV-01-1C2を6つ買って取り替えました。
FXはこれよりもうちょっと固いD2MV-01-1C3の方が本家に似ているらしいのですが、まあ軽い方が疲れないからいいだろうということで全部1C2の方にしちゃいました。

KIMG0780.jpg
LEDは手持ちの3mm青色LEDと5mm赤色LEDを利用。
直列で抵抗も接続する必要があったので、固定するついでにユニバーサル基板を切って使うことにしました。
Arduinoとの接続はコネクタを作るのが面倒なのでやっぱりケーブルを直接はんだ付けです。

KIMG0783.jpg
かなり適当ですが、各パーツの配線図です。
Arduinoの入力ピンは全て内部プルアップ抵抗を利用しています。

KIMG0786.jpgKIMG0787.jpgKIMG0784.jpg
各操作パーツとLEDをどのピンに接続しているかの図です。
アナログ入力となっているピンもデジタル入出力ピンとして使えるのでLEDへの出力ピンとして使ってます。



Arduinoのスケッチ

長いのでここをクリックで展開
#include <FlexiTimer2.h>

volatile int push[11]={0,0,0,0,0,0,0,0,0,0,0};
char key[11]={'v','m','s','d','k','l',0,'q','w','o','p'};
int enable_out=0;
int vol_delay=7; //つまみのキーを押し続ける時間

//セットアップ関数(起動時に1回だけ実行される)
void setup() {
	pinMode(2, INPUT_PULLUP); //VOL-L B
	pinMode(3, INPUT_PULLUP); //VOL-L A
	pinMode(4, INPUT_PULLUP); //VOL-R B
	pinMode(5, INPUT_PULLUP); //VOL-R A
	pinMode(6, INPUT_PULLUP); //FX-L
	pinMode(7, INPUT_PULLUP); //FX-R
	pinMode(8, INPUT_PULLUP); //BT-A
	pinMode(9, INPUT_PULLUP); //BT-B
	pinMode(10, INPUT_PULLUP); //BT-C 
	pinMode(11, INPUT_PULLUP); //BT-D
	pinMode(12, INPUT_PULLUP); //START
	pinMode(13, INPUT_PULLUP); //トグルスイッチ
	pinMode(18, OUTPUT); 
	pinMode(19, OUTPUT);
	pinMode(20, OUTPUT); //18~23:LED
	pinMode(21, OUTPUT);
	pinMode(22, OUTPUT);
	pinMode(23, OUTPUT);

	key[6] = KEY_RETURN; //Enterキーの値代入

	FlexiTimer2::set(5,1.0/100000,timerIRQ); // 50us毎にタイマ割込み
	FlexiTimer2::start();
}

//メインループ関数
void loop() {
	if(digitalRead(13)==LOW){ //トグルスイッチがON
		if(enable_out==0){ //今までOFFだったらキー出力有効化
			digitalWrite(18,HIGH); //全LED点灯
			digitalWrite(19,HIGH);
			digitalWrite(20,HIGH);
			digitalWrite(21,HIGH);
			digitalWrite(22,HIGH);
			digitalWrite(23,HIGH);
			if(digitalRead(8) == LOW){ //BT-Aが押されてたら
				enable_out=2; //2:LED光るけどキーは押されないモード
			}
			else{
				enable_out=1; //1:LED光ってキーも押される
			}
			delay(500);
			for(int i=0;i<11;i++) push[i]=0; //pushを全部0に
			Keyboard.begin(); //キー出力有効化
			digitalWrite(18,LOW); //全LED消灯
			digitalWrite(19,LOW);
			digitalWrite(20,LOW);
			digitalWrite(21,LOW);
			digitalWrite(22,LOW);
			digitalWrite(23,LOW);
		}

		for(int i=0;i<11;i++){
			if(i<7){ //0~6=ボタン
				if(digitalRead(i+6) == LOW){ //ボタン押されてる
					push[i] = 2;
					if(enable_out == 1){
					Keyboard.press(key[i]);
					}
					if(i<=5){
					digitalWrite(23-i,HIGH); //対応するLED点灯
					}
				}
			}
			if(i>=7) //7~10=ロータリーエンコーダ
			{
				if(push[i]==vol_delay){ //タイマ割り込みの方でpushにvol_delayが代入されてたら
					if(enable_out == 1){
					Keyboard.press(key[i]); //そのキーを押す
					}
				}
			}

			push[i]--; //pushをデクリメントして
			if(push[i]<=0){ //0以下になってたら
				Keyboard.release(key[i]); //そのキーを離す
				push[i]=0;
				if(i<=5){
					digitalWrite(23-i,LOW); //調べてるのがボタンだったら対応するLEDも消灯
				}
			}
		}
	}
	else //トグルスイッチがOFF
	{
	if(enable_out>=1){ //今までがONだったらキー出力無効化
		Keyboard.releaseAll();
		Keyboard.end();
		delay(100);
		enable_out=0;
		}
	}
}

//ロータリーエンコーダ読み取り用タイマ割込み
void timerIRQ() {
	static byte bp1 = 0;
	static byte bp2 = 0;

	bp1 = bp1 << 1;
	if (digitalRead(3) == LOW) {
		bp1 |= 0x01;
	}
	bp1 = bp1 << 1;
	if (digitalRead(2) == LOW) {
		bp1 |= 0x01;
	}

	bp2 = bp2 << 1;
	if (digitalRead(5) == LOW){
		bp2 |= 0x01;
	}
	bp2 = bp2 << 1;
	if (digitalRead(4) == LOW) {
		bp2 |= 0x01;
	}

	bp1 = bp1 & 0x03F;
	if (bp1 ==  0b110101 || bp1 == 0b101111) { //VOL-L -->
		push[7]-=1;
		if(push[7]<=0){
			push[8]=vol_delay;
		}
	}
	if (bp1 == 0b011111 || bp1 == 0b111010) { //VOL-L <--
		push[8]-=1;
		if(push[8]<=0){
			push[7]=vol_delay;
		}
	}

	bp2 = bp2 & 0x03F;
	if (bp2 ==  0b110101 || bp2 == 0b101111) { //VOL-R --> 
		push[9]-=1;
		if(push[9]<=0){
			push[10]=vol_delay;
		}
	}
	if (bp2 == 0b011111 || bp2 == 0b111010) { //VOL-R <-- 
		push[10]-=1;
		if(push[10]<=0){
			push[9]=vol_delay;
		}
	}
}

そのまま載せましたがちゃんと動くかは無保証です。

タイマ割り込みを使うためにFlexiTimer2のライブラリが必要です。導入方法はこちらの記事がわかりやすかったです。
ロータリーエンコーダーの入力の読み取り方はこちらの記事を参考にさせてもらいました。



そんなこんなで、自作ボルテコントローラーの完成・・・
 の、ハズでしたが!
つまみ(ロータリーエンコーダー)のチャタリングがひどくてプレイに支障があるので、
改善を続行してます!(懐かしのファンタCM風)

現状でもLv10の譜面のつまみ操作であればフルコンも可能な程度の精度はあります。
しかしLv12のつまみが忙しい譜面となってくると、クリアは可能ですがフルコンを目指すとなると絶望的な感じですね。(そもそもフルコンできる腕前が無いですが)
どうしても急な操作に追いつかないことがちょいちょい発生してしまうので、操作は合っててもエンコーダーが原因でコンボは切れることが頻発してます。

ソフトウェアでなんとかカバー出来ないかと試行錯誤してますがやはりハードを改善しない限りは無理そうなので、また小遣いに余裕が出来たらエンコーダーも変えたいと思います。今のエンコーダーの6倍の値段するやつなので辛いところですが・・・


(2015/08/29追記)
こちらのページを参考にしてロータリーエンコーダーのA-C間とB-C間に0.01uFのコンデンサを追加してみたところ、チャタリングがほとんど無くなって快適にプレイできるようになりました。
おかげでエンコーダーを買い換える必要はなさそうです。
1440400596583.jpg


プレイ動画

最後に、プレイ動画を頑張って撮ってみたのでよかったらどうぞ。
  1. 2015/08/24(月) 03:14:56|
  2. 未分類
  3. | トラックバック:0
  4. | コメント:0
<<今週の日誌 2015/08/17 ~ 2015/08/30 | ホーム | 今週の日誌 2015/08/10 ~ 08/16>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://sagozyo9.blog.fc2.com/tb.php/33-8045471a
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

sagozyo9

Author:sagozyo9
毎週日曜に一週間の日誌を書くことにしています。

【最近プレイしてるゲーム】
・PSO2
 ├Ship1/ヒュマ男(メイン)
 ├Ship4/キャス男
 ├Ship5/デュマ男
 └全てGuメイン
・PlanetSide2
 └Connery VS
・Bぷよ
・ETS2

【リンク】
Twitter
@sagozyo9
ニコニコミュニティ
器用貧乏な河童のコミュニティ

最新記事

最新コメント

月別アーカイブ

カテゴリ

未分類 (7)
Minecraft (7)
GoIO (1)
PSO2 (2)
日誌 (17)

カレンダー

10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

カウンター

FC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンターFC2無料カウンター

スポンサードリンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。