#include "Joystick.h" //4pin(GND)と5pin(3.6V)もつなぐ #define DATA 4 //1pin #define CMD 5 //2pin #define ATT 6 //6pin #define CLK 7 //7pin Joystick_ Joystick[4] = { Joystick_(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 12, 1, true, true, true, true, false, false, false, false, false, false, false), Joystick_(JOYSTICK_DEFAULT_REPORT_ID+1, JOYSTICK_TYPE_JOYSTICK, 12, 1, true, true, true, true, false, false, false, false, false, false, false), Joystick_(JOYSTICK_DEFAULT_REPORT_ID+2, JOYSTICK_TYPE_JOYSTICK, 12, 1, true, true, true, true, false, false, false, false, false, false, false), Joystick_(JOYSTICK_DEFAULT_REPORT_ID+3, JOYSTICK_TYPE_JOYSTICK, 12, 1, true, true, true, true, false, false, false, false, false, false, false) }; byte padStat[4][8]; byte padOldStat[4][6]; byte header[3]; void setup() { pinMode(DATA, INPUT_PULLUP); pinMode(CMD, OUTPUT); pinMode(ATT, OUTPUT); pinMode(CLK, OUTPUT); for(int i=0; i<4; i++) for(int j=0; j<6; j++) padOldStat[i][j] = 0xff; for(int i=0; i<4; i++) { Joystick[i].begin(true); Joystick[i].setXAxisRange(0, 255); Joystick[i].setYAxisRange(0, 255); Joystick[i].setZAxisRange(0, 255); Joystick[i].setRxAxisRange(0, 255); Joystick[i].setXAxis(0x80); Joystick[i].setYAxis(0x80); Joystick[i].setZAxis(0x80); Joystick[i].setRxAxis(0x80); } } void loop() { read_tapdata(); for(int i=0; i<4; i++) { switch(padStat[i][0]) { case 0x41: //デジタルモード digitalPad(i); break; case 0x73: //アナログモード analogPad(i); break; } } } void read_tapdata() { digitalWrite(ATT, LOW); //コマンドヘッダ header[0] = readData(0x01); header[1] = readData(0x42); header[2] = readData(0x01); for(int i=0; i<4; i++) { padStat[i][0] = readData(0x42); padStat[i][1] = readData(0); padStat[i][2] = readData(0); padStat[i][3] = readData(0); padStat[i][4] = readData(0); padStat[i][5] = readData(0); padStat[i][6] = readData(0); padStat[i][7] = readData(0); } digitalWrite(ATT, HIGH); } byte readData(byte command) { byte data = 0; delayMicroseconds(100); for (int i=0; i<8; i++) { digitalWrite(CMD, bitRead(command, i)); digitalWrite(CLK, LOW); delayMicroseconds(6); bitWrite(data, i, digitalRead(DATA)); digitalWrite(CLK, HIGH); delayMicroseconds(6); } return data; } void digitalPad(int no) { byte b; for(int i=0; i<6; i++) { b = padStat[no][i+2]; if(padOldStat[no][i] != b) { switch(i) { case 0: Joystick[no].setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); if(!bitRead(b, 7)) Joystick[no].setHatSwitch(0, 270); //左 if(!bitRead(b, 6)) Joystick[no].setHatSwitch(0, 180); //下 if(!bitRead(b, 5)) Joystick[no].setHatSwitch(0, 90); //右 if(!bitRead(b, 4)) Joystick[no].setHatSwitch(0, 0); //上 Joystick[no].setButton(8, !bitRead(b,3)); //スタート Joystick[no].setButton(11, 0); //なし Joystick[no].setButton(10, 0); //なし Joystick[no].setButton(9, !bitRead(b,0)); //SELECT break; case 1: Joystick[no].setButton(2, !bitRead(b,7)); //□ Joystick[no].setButton(1, !bitRead(b,6)); //× Joystick[no].setButton(0, !bitRead(b,5)); //○ Joystick[no].setButton(3, !bitRead(b,4)); //△ Joystick[no].setButton(7, !bitRead(b,3)); //R1 Joystick[no].setButton(6, !bitRead(b,2)); //L1 Joystick[no].setButton(5, !bitRead(b,1)); //R2 Joystick[no].setButton(4, !bitRead(b,0)); //L2 break; case 2: Joystick[no].setZAxis(0x80); //軸の中心にリセット break; case 3: Joystick[no].setRxAxis(0x80); //軸の中心にリセット break; case 4: Joystick[no].setXAxis(0x80); //軸の中心にリセット break; case 5: Joystick[no].setYAxis(0x80); //軸の中心にリセット break; } padOldStat[no][i] = b; } } } void analogPad(int no) { byte b; for(int i=0; i<6; i++) { b = padStat[no][i+2]; if(padOldStat[no][i] != b) { switch(i) { case 0: Joystick[no].setHatSwitch(0, JOYSTICK_HATSWITCH_RELEASE); if(!bitRead(b, 7)) Joystick[no].setHatSwitch(0, 270); //左 if(!bitRead(b, 6)) Joystick[no].setHatSwitch(0, 180); //下 if(!bitRead(b, 5)) Joystick[no].setHatSwitch(0, 90); //右 if(!bitRead(b, 4)) Joystick[no].setHatSwitch(0, 0); //上 Joystick[no].setButton(8, !bitRead(b,3)); //スタート Joystick[no].setButton(11, !bitRead(b,2)); //右スティク Joystick[no].setButton(10, !bitRead(b,1)); //左スティク Joystick[no].setButton(9, !bitRead(b,0)); //SELECT break; case 1: Joystick[no].setButton(2, !bitRead(b,7)); //□ Joystick[no].setButton(1, !bitRead(b,6)); //× Joystick[no].setButton(0, !bitRead(b,5)); //○ Joystick[no].setButton(3, !bitRead(b,4)); //△ Joystick[no].setButton(7, !bitRead(b,3)); //R1 Joystick[no].setButton(6, !bitRead(b,2)); //L1 Joystick[no].setButton(5, !bitRead(b,1)); //R2 Joystick[no].setButton(4, !bitRead(b,0)); //L2 break; case 2: Joystick[no].setZAxis(b); //右スティク左右 break; case 3: Joystick[no].setRxAxis(b); //右スティク上下 break; case 4: Joystick[no].setXAxis(b); //左スティク左右 break; case 5: Joystick[no].setYAxis(b); //左スティク上下 break; } padOldStat[no][i] = b; } } }