Created
November 23, 2017 13:17
-
-
Save texwill/0b54a8bd8cf8f27e95c42e415721e12e to your computer and use it in GitHub Desktop.
サウンドボルテックスコントローラーのやつ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <HID-Settings.h> | |
#include <HID-Project.h> | |
//keys | |
char keys[7] = {'d','f','j','k','c','m','6'}; //左から順にBT-AからBT-D、FX-L、FX-R、STARTの割り当て | |
int key[7] = {11,10,9,8,7,6,12}; //startが12ピンになっているので注意(ミスです) | |
int keyState[7] = {0,0,0,0,0,0,0}; //キーの状態を格納 | |
//rotary | |
int rotaryFlag[2][2] = {{0,0},{0,0}}; //ロータリーエンコーダからの値を一つ前と現在の値を格納 | |
int rotaryState[4][2] = {{0,0},{0,1},{1,1},{0,1}}; //ロータリーエンコーダの取りうる状態 | |
int rotaryState2[4] = {0,1,3,2}; //ロータリーエンコーダの取りうる値を計算用に置換するための値 | |
int countA = 200; //このへんの値を変えると細かく反応させることができる。小さすぎると速く回さないといけない気がする | |
int countB = 200; //同上 | |
//other | |
int i; | |
int val[2]; | |
void setup() { //下準備 | |
NKROKeyboard.begin(); | |
for(i=0;i<7;i++){ | |
pinMode(key[i], INPUT); | |
} | |
for(i=2;i<6;i++){ | |
pinMode(i, INPUT); | |
} | |
} | |
void loop() { | |
//ボタンのの状態を取得 | |
for(i=0;i<7;i++){ | |
keyState[i] = digitalRead(key[i]); | |
if(keyState[i]==1)NKROKeyboard.add(keys[i]);else NKROKeyboard.remove(keys[i]); | |
} | |
i = rotaryCheck(5,4,1); | |
switch(i){ | |
case 0: | |
if(countA>200){ | |
NKROKeyboard.remove('l'); | |
NKROKeyboard.remove(';'); | |
}else{ | |
countA++; | |
} | |
break; | |
case 1: | |
NKROKeyboard.add('l'); | |
NKROKeyboard.remove(';'); | |
countA = 0; | |
break; | |
case 2: | |
NKROKeyboard.add(';'); | |
NKROKeyboard.remove('l'); | |
countA = 0; | |
break; | |
default: | |
break; | |
} | |
i = rotaryCheck(3,2,0); | |
switch(i){ | |
case 0: | |
if(countB>200){ | |
NKROKeyboard.remove('a'); | |
NKROKeyboard.remove('s'); | |
} | |
else{ | |
countB++; | |
} | |
break; | |
case 1: | |
NKROKeyboard.add('a'); | |
NKROKeyboard.remove('s'); | |
countB =0; | |
break; | |
case 2: | |
NKROKeyboard.add('s'); | |
NKROKeyboard.remove('a'); | |
countB =0; | |
break; | |
default: | |
break; | |
} | |
NKROKeyboard.send(); | |
} | |
int rotaryCheck(int a,int b,int LR){ | |
//ロータリーエンコーダのA相B相の状態の取得 | |
val[0]=digitalRead(a); | |
val[1]=digitalRead(b); | |
//状態を2進数から10進数に置き換え | |
for(i=0;i<4;i++){ | |
if(memcmp(val,rotaryState[i] ,sizeof(int) * 2) == 0){ | |
rotaryFlag[1][LR] = i; | |
} | |
} | |
//読みこぼしの場合 | |
if(rotaryFlag[0][LR] ==0 && rotaryFlag[1][LR] ==3 || rotaryFlag[0][LR] ==3 && rotaryFlag[1][LR] ==0 ||rotaryFlag[0][LR] ==1 && rotaryFlag[1][LR] ==2 ||rotaryFlag[0][LR] ==2 && rotaryFlag[1][LR] ==1 ){ | |
rotaryFlag[0][LR] = rotaryFlag[1][LR]; | |
return 3; | |
} | |
//左右どちらに向かって回転しているか | |
if(rotaryFlag[0][LR] != rotaryFlag[1][LR]){ | |
if(rotaryFlag[0][LR] ==0 && rotaryFlag[1][LR] ==2 ){ | |
rotaryFlag[0][LR] = rotaryFlag[1][LR]; | |
return 2; | |
} | |
else if(((rotaryState2[rotaryFlag[0][LR]]<<1)+rotaryState2[rotaryFlag[1][LR]])%4>1){ | |
rotaryFlag[0][LR] = rotaryFlag[1][LR]; | |
return 1; | |
}else{ | |
rotaryFlag[0][LR] = rotaryFlag[1][LR]; | |
return 2; | |
} | |
}else{ //停止状態 | |
return 0; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment