家庭用の5鍵をアーケードスタイルコントローラー(ASC)で遊びたい!という願望を叶えるための準備
アーケードのターンテーブルのセンサーを読み取って、プレステの上下信号に変換するモジュールを作成します。
仕組み
ターンテーブルの回転を検知するには2つのセンサー(フォトインタラプタ・透過型フォトセンサ)を使用します。
こちらのサイトが詳しい。
家庭用専コン:ターンテーブルの仕組み
プログラム
ターンテーブルから取得した左右の信号を、プレステの上下キーに変換するプログラムを作成。
今回はPIC10F320を使用しました。
// CONFIG
#pragma config FOSC = INTOSC
#pragma config BOREN = ON
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config LVP = OFF
#pragma config LPBOR = ON
#pragma config BORV = LO
#pragma config WRT = OFF
#include <xc.h>
#define _XTAL_FREQ 4000000
char currentScrState=0b00;
char lastScrState=0b00;
// タイマー割込みの処理
void __interrupt() InterTimer( void )
{
if (TMR2IF == 1) { // タイマー2の割込み発生か?
TMR2IF = 0;
RA2 = 1;
RA1 = 1;
TMR2IE = 0;
}
}
void main(void) {
OSCCON = 0b01010000; //4Mhz
TRISA = 0b1001; //RA3 Left In(RO); RA2 UpOut; RA1 DownOut; RA0 RightIn;
PORTA = 0b0110; //出力初期化
ANSELA = 0; //アナログ不使用
T2CON = 0b01111111; //Prescaler 64; Timer2 On; Postscaler 16 1.024ms
PR2 = 146; //1.024ms*147=150.528ms
TMR2 = 0;
TMR2IF = 0; //タイマー2割込フラグ(T2IF)を0にする
TMR2IE = 0; //タイマー2の割り込みを停止
PEIE = 1;
GIE = 1;
while(1){
//センサー読み取り
currentScrState=(PORTA & 0b1000)>>2 | (PORTA & 0b01);
char scr = lastScrState << 2 | currentScrState;
if ( lastScrState != currentScrState) {
//上スクラッチ
//if ( scr == 2 || scr == 11 || scr == 13 || scr == 4 ) { //全センサーの立ち上がり・下がり検出(感度がACの4倍)
if ( scr == 2) { // 左センサーの立ち上がり時のみ検出(ACと同頻度)
RA1=1;
RA2=0; //上信号出力
TMR2IE = 1;
TMR2IF = 0; //停止タイマースタート
TMR2 = 0; //タイマー値リセット
}
//下スクラッチ
//if ( scr == 1 || scr == 7 || scr == 14 || scr == 8 ) { //全センサーの立ち上がり・下がり検出(感度がACの4倍)
if ( scr == 7 ) { // 左センサーの立ち上がり時のみ検出(ACと同頻度)
RA2=1;
RA1=0; //下信号出力
TMR2IE = 1;
TMR2IF = 0; //停止タイマースタート
TMR2 = 0; //タイマー値リセット
}
lastScrState = currentScrState;
}
}
}
コメント