Skip to content

Instantly share code, notes, and snippets.

@texwill
Created November 23, 2017 13:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save texwill/0b54a8bd8cf8f27e95c42e415721e12e to your computer and use it in GitHub Desktop.
Save texwill/0b54a8bd8cf8f27e95c42e415721e12e to your computer and use it in GitHub Desktop.
サウンドボルテックスコントローラーのやつ
#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