| 長いのでここをクリックで展開 |
#include <FlexiTimer2.h> volatile int push[11]={0,0,0,0,0,0,0,0,0,0,0}; char key[11]={'v','m','s','d','k','l',0,'q','w','o','p'}; int enable_out=0; int vol_delay=7; //つまみのキーを押し続ける時間 //セットアップ関数(起動時に1回だけ実行される) void setup() { pinMode(2, INPUT_PULLUP); //VOL-L B pinMode(3, INPUT_PULLUP); //VOL-L A pinMode(4, INPUT_PULLUP); //VOL-R B pinMode(5, INPUT_PULLUP); //VOL-R A pinMode(6, INPUT_PULLUP); //FX-L pinMode(7, INPUT_PULLUP); //FX-R pinMode(8, INPUT_PULLUP); //BT-A pinMode(9, INPUT_PULLUP); //BT-B pinMode(10, INPUT_PULLUP); //BT-C pinMode(11, INPUT_PULLUP); //BT-D pinMode(12, INPUT_PULLUP); //START pinMode(13, INPUT_PULLUP); //トグルスイッチ pinMode(18, OUTPUT); pinMode(19, OUTPUT); pinMode(20, OUTPUT); //18~23:LED pinMode(21, OUTPUT); pinMode(22, OUTPUT); pinMode(23, OUTPUT); key[6] = KEY_RETURN; //Enterキーの値代入 FlexiTimer2::set(5,1.0/100000,timerIRQ); // 50us毎にタイマ割込み FlexiTimer2::start(); } //メインループ関数 void loop() { if(digitalRead(13)==LOW){ //トグルスイッチがON if(enable_out==0){ //今までOFFだったらキー出力有効化 digitalWrite(18,HIGH); //全LED点灯 digitalWrite(19,HIGH); digitalWrite(20,HIGH); digitalWrite(21,HIGH); digitalWrite(22,HIGH); digitalWrite(23,HIGH); if(digitalRead(8) == LOW){ //BT-Aが押されてたら enable_out=2; //2:LED光るけどキーは押されないモード } else{ enable_out=1; //1:LED光ってキーも押される } delay(500); for(int i=0;i<11;i++) push[i]=0; //pushを全部0に Keyboard.begin(); //キー出力有効化 digitalWrite(18,LOW); //全LED消灯 digitalWrite(19,LOW); digitalWrite(20,LOW); digitalWrite(21,LOW); digitalWrite(22,LOW); digitalWrite(23,LOW); } for(int i=0;i<11;i++){ if(i<7){ //0~6=ボタン if(digitalRead(i+6) == LOW){ //ボタン押されてる push[i] = 2; if(enable_out == 1){ Keyboard.press(key[i]); } if(i<=5){ digitalWrite(23-i,HIGH); //対応するLED点灯 } } } if(i>=7) //7~10=ロータリーエンコーダ { if(push[i]==vol_delay){ //タイマ割り込みの方でpushにvol_delayが代入されてたら if(enable_out == 1){ Keyboard.press(key[i]); //そのキーを押す } } } push[i]--; //pushをデクリメントして if(push[i]<=0){ //0以下になってたら Keyboard.release(key[i]); //そのキーを離す push[i]=0; if(i<=5){ digitalWrite(23-i,LOW); //調べてるのがボタンだったら対応するLEDも消灯 } } } } else //トグルスイッチがOFF { if(enable_out>=1){ //今までがONだったらキー出力無効化 Keyboard.releaseAll(); Keyboard.end(); delay(100); enable_out=0; } } } //ロータリーエンコーダ読み取り用タイマ割込み void timerIRQ() { static byte bp1 = 0; static byte bp2 = 0; bp1 = bp1 << 1; if (digitalRead(3) == LOW) { bp1 |= 0x01; } bp1 = bp1 << 1; if (digitalRead(2) == LOW) { bp1 |= 0x01; } bp2 = bp2 << 1; if (digitalRead(5) == LOW){ bp2 |= 0x01; } bp2 = bp2 << 1; if (digitalRead(4) == LOW) { bp2 |= 0x01; } bp1 = bp1 & 0x03F; if (bp1 == 0b110101 || bp1 == 0b101111) { //VOL-L --> push[7]-=1; if(push[7]<=0){ push[8]=vol_delay; } } if (bp1 == 0b011111 || bp1 == 0b111010) { //VOL-L <-- push[8]-=1; if(push[8]<=0){ push[7]=vol_delay; } } bp2 = bp2 & 0x03F; if (bp2 == 0b110101 || bp2 == 0b101111) { //VOL-R --> push[9]-=1; if(push[9]<=0){ push[10]=vol_delay; } } if (bp2 == 0b011111 || bp2 == 0b111010) { //VOL-R <-- push[10]-=1; if(push[10]<=0){ push[9]=vol_delay; } } } |
Author:sagozyo9
毎週日曜に一週間の日誌を書くことにしています。
【最近プレイしてるゲーム】
・PSO2
├Ship1/ヒュマ男(メイン)
├Ship4/キャス男
├Ship5/デュマ男
└全てGuメイン
・PlanetSide2
└Connery VS
・Bぷよ
・ETS2
【リンク】
Twitter
└@sagozyo9
ニコニコミュニティ
└器用貧乏な河童のコミュニティ
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| - | - | - | 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | - | - |