ACターンテーブルを家庭用コントローラーで使う

家庭用の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;
        }
    }
}

コメント

タイトルとURLをコピーしました