ドラムマニア専コン自作(完)
この記事は、ラムマニア専コン自作Drummaniaコントローラ自作に関するまとめページみたいなものです。
興味があれば以下の記事も参考にしてください。
興味があれば以下の記事も参考にしてください。
わざわざ自作せずとも、YAMAHAのDTXやrolandのV-Drumとかを買えばいいのですが、1度着手してしまった手前後にひけなくなりました(笑)
と言うわけで、音を検出して反応するドラムマニアの専用自作コントローラーがついに完成しました。
と言うわけで、音を検出して反応するドラムマニアの専用自作コントローラーがついに完成しました。
まずは前作の反省点から。
↓これが前作の音検出回路です。PIC16F84Aを1つ使っています。
PIC1つで、5つの音を検出をしています。ここで問題なのが、PICは、基本的には同時に1つの作業しかできない点です。
つまり、2パッドの同時押しができないわけです。一応、微小な時間差で同時押しを再現していますが、音楽ゲームなだけに致命的な問題です。
つまり、2パッドの同時押しができないわけです。一応、微小な時間差で同時押しを再現していますが、音楽ゲームなだけに致命的な問題です。
いろいろ考えた挙句、16F84Aから12F509にマイコンを変えました。12F509(12C509A互換)は100円程度という価格で、何度でも書き換えができるため開発向けです^-^
んで、低価格であることをいいことに、このマイコンを5つ使うことにしました。マルチマイコンなら同時押しも完璧です^-^
んで、低価格であることをいいことに、このマイコンを5つ使うことにしました。マルチマイコンなら同時押しも完璧です^-^
あと、前作の自作専用コントローラは、いまいち反応が遅いように感じられました。今回は反応速度も向上させたいところです。
↓今回の全景。
↓今作の全部景2
↓回路を作るのも大変でしたが、実は、振動対策が一番大変でした。
となりのパッドに、振動が伝わってしまうと、隣のパッドまで反応してしまって厄介なのです。
そこで、パッドの下にクッション材を敷きました。
となりのパッドに、振動が伝わってしまうと、隣のパッドまで反応してしまって厄介なのです。
そこで、パッドの下にクッション材を敷きました。
↓さらにコンデンサマイクに遮音シートを巻いて、周囲の雑音を拾わないようにしました。
↓こんな感じ。
↓パッドの上にさらにゴムパッドを敷きました。これで完璧。
↓bassDrum部分です。バスドラは、音を検出するのではなく、まんまペダルを踏むとボタンがポチっとおされる仕掛けにしました。
↓メインの基盤です。可変抵抗を指でつまめるタイプにしました。
また、パッドを叩くと対応したLEDが光るようにしました。これで、いちいちパソコンを使わなくても、感度調節ができます。
こんな感じで感度の調節が楽にできます。
また、パッドを叩くと対応したLEDが光るようにしました。これで、いちいちパソコンを使わなくても、感度調節ができます。
こんな感じで感度の調節が楽にできます。
↓裏面です。
↓基盤はこんな感じで取り付けました。
↓前回はUSBから5Vをとりましたが、今回はPICを5コ使っているので念のためACアダプターから別電源を引きました。
↓前回、ちょっと反応が遅かったのでいろいろ調べてみたところ、DDPがレスポンスいいとの情報をゲット。ということで、USB接続ではなく、PSコントローラを改造してDDP接続することにしました。
回路図
一応回路図を載せておきます。失敗しても自己責任でお願いします。
↓1パッドあたりの回路図です。実際にはこの回路が5コ必要になります。
点線枠の抵抗値を自分なりにいろいろ調整してください。反応感度が変わります。
点線枠の抵抗値を自分なりにいろいろ調整してください。反応感度が変わります。
PICが必要な理由
PICを介さないでPCに入力すると、パットを一発叩いただけでも連打扱いになってしまう。
だからPICには、入力の一発目を検出して、0.07秒くらい入力を受け付けないようにプログラムしておく。
PICを使わなくても実現できるんだろうけど、
PICなら入力を受け付けない時間を正確かつ自由に変更できるから便利なのです。
だからPICには、入力の一発目を検出して、0.07秒くらい入力を受け付けないようにプログラムしておく。
PICを使わなくても実現できるんだろうけど、
PICなら入力を受け付けない時間を正確かつ自由に変更できるから便利なのです。
12C509に書きこむプログラムのソースファイルです。
;********************************************************************** ; * ; Filename:Drummania_Controller_ECU.asm * ; Date:2008-11-15 * ; Device:PIC12F509 * ; * ; Author:penta * ; HomePage:http://www33.atwiki.jp/pentagon/ * ; * ; * ;********************************************************************** ; * ; Program_Notes: * ; - GP3がHighになると、所定時間GP0がLowになる * ; - 所定時間中はGP3への入力は受け付けない(チャタリング対策のため) * ; - おまけで所定時間中はGP1がHighになる(確認用LEDを取り付けるため) * ; * ;********************************************************************** ; * ;***** PIC12F509 のピン配置 * ; _____ * ; +5V--(Vdd)1| U |8(Vss)--GND * ; (GP5)2| |7(GP0)-->PS_Controller * ; (GP4)3| |6(GP1)--10KΩ--LED--GND * ; +5V--SW--+--(GP3)4|____|5(GP2) * ; | * ; 10KΩ * ; | * ; GND * ; * ;********************************************************************** LIST P=12F509 ;プロセッサの機種を指定する #INCLUDE P12F509.INC ;プロセッサの変数定義の指定 __CONFIG 0x0A ;コンフィグ・ワードの設定 ;コードプロテクトしない。 ;ウォッチドッグタイマを使用しない ;外部リセットを使用しない ;内蔵クロックを使用する ;****************************** Note ********************************** ; __CONFIG _CP_OFF & _WDT_OFF & _MCLRE_OFF & _IntRC_OSC * ; * ; -- -- -- -- -- -- -- MCLRE CP WDTE FOSC1 FOSC0 * ;bit 11 10 9 8 7 6 5 4 3 2 1 0 * ; 0 0 0 0 0 0 0 0 1 0 1 0(0x0A)* ;********************************************************************** ;***** 変数の定義 ; ORG 0x07 TIM1 EQU 0x07 ;タイマーカウンタ TIM2 EQU 0x08 ;タイマーカウンタ TIM3 EQU 0x09 ;タイマーカウンタ ;***** ; ORG 0x3FF ;リセット・ベクター ; ;12F508 は 0x1FF番地 ORG 0x000 ;プログラム実行開始番地 MOVWF OSCCAL ;OSCCAL レジスタファイルを更新 ;****************************** Note ********************************** ; 内蔵クロックを使用する場合は工場出荷時にリセットベクター 0x3FF 番地 * ; にインストラクション 'MOVLW k' であらかじめ書き込まれている補正値を * ; 読込んで 'OSCCAL' レジスタの値(上位7ビット)を更新する必要がある * ; 内蔵クロックを使用しない場合は、'MOVWF OSCCAL'は不要 * ;********************************************************************** ;***** ポートの初期設定 ; MOVLW 0x08 ;GP3を入力ポートに(001000) TRIS 0x06 ;(f=6) MOVLW 0xDF ;T0CSは'0'、GP2は出力ピン OPTION ;OPTIONレジスタに書き込む ;***** START START: GP0_OFF MOVLW B'000001' ;GP0をHighに。 MOVWF GPIO ;この時、PSコントローラは反応しない SW1 BTFSS GPIO,3 ;GP3がHighになったら次のステップをスキップ GOTO GP0_OFF ;GP3がLowならGP0_OFFに戻る GP0_ON MOVLW B'000010' ;GP0をLowに。GP1(確認用LED)をHighに。 MOVWF GPIO ;GPIOレジスタファイルに書き込む CALL DELAY ;タイマールーチンのよびだし GOTO GP0_OFF ;***** タイマールーチン ;****************************** Note ********************************** ;公式 * ;T={4(TIM2)((TIM3)+1)+3}*0.4*(10/4)<μS> * ;TIM2=10,TIM3=249でT=0.010003s * ;TIM1=100(0x64)で約1秒 * ;通常は、TIM1をいじって時間を調節する。 * ;********************************************************************** DELAY MOVLW 0x07 ;TIM1の設定。通常はここをいじる。 MOVWF TIM1 ;TIM1=7(0x07)。0.07秒 WA1 MOVLW 0x0A ;TIM2の設定。TIM2=10(0x0A) MOVWF TIM2 WA2 MOVLW 0xF9 ;TIM3の設定。TIM3=249(0xF9) MOVWF TIM3 WA3 NOP DECFSZ TIM3,F GOTO WA3 DECFSZ TIM2,F GOTO WA2 DECFSZ TIM1,F GOTO WA1 RETLW 0 ;RETURNの代用 END
↓hexファイルです。
:020000040000FA :100000002500080C0600DF0C0200010C2600660724 :10001000050A020C26000D09050A070C27000A0C28 :100020002800F90C29000000E902130AE802110A6D :06003000E7020F0A0008C0 :021FFE000A00D7 :00000001FF
実際にたたいているとこの動画
ちゃんと反応してますよ-0-
これで家でドラムマニアができます^-^
感想
これでDTXmaniaやPS2用のDrummania、アーケードHDDで起動したアーケード版Drummaniaで思う存分、練習できます。
2年近くかかってしまいましたが、ようやく完成です。もう思い残すことはありません。ゲーセンのパッドの方が叩き心地はよいけど、自作コントローラののほうが反応はいいです。軽いタッチでも反応してくれます。
添付ファイル
- DSCN1431.jpg
- Oscillation Detector with 12F509.jpg
- [081228_21h43m17s]_.jpg
- [081228_21h43m24s]_.jpg
- [081229_07h41m18s]_.jpg
- [081229_07h41m46s]_.jpg
- [081229_07h42m14s]_.jpg
- [081229_07h43m13s]_.jpg
- [081229_07h43m48s]_.jpg
- [081229_07h44m05s]_.jpg
- [081229_07h44m23s]_.jpg
- [081229_07h49m00s]_.jpg
- [081229_07h58m12s]_.jpg
- [081229_08h14m33s]_.jpg