Arduino Promicroを用いたPC操作デバイスを作っているのですが
ロータリーエンコーダの挙動についてわからないことが多くお力添えをいただきたいです。
やりたいことは、エンコーダーを回した際に特定のキー(今回は「R」「T])をPCに入力することです。回す方向に応じて片方のキー入力を得たいです。
起こっている問題は、エンコードをどちらの方向に1クリック回しても、入力としてRとTが連続で返ってくることです。ワンクリックどちらに回してもTR、TR、TRと入力されます。
使用しているエンコーダーはマルツ購入の『ロータリエンコーダ 設定用光学式エンコーダスイッチ付き 1軸 分解能25 出力相A&B 電圧出力【REC16K25-201】』です
ArduinoIDEでのコードは以下になります。
Java
1 2 3#include "Keyboard.h" 4#include <Encoder.h> 5#define ALL_BUTTONS 3 6 7const int button[] = {0, 4, 5}; 8Encoder myEnc(2, 3); 9 10int buttonState[ALL_BUTTONS] = {HIGH}; 11int previousButtonState[ALL_BUTTONS] = {HIGH}; 12 13 14long oldPosition = -999; 15 16void keyboard_shortcut(int buttonID); 17 18void setup() { 19 20 for (int i=0;i<ALL_BUTTONS;i++) { 21 pinMode(button[i], INPUT); 22 } 23 24 Keyboard.begin(); 25} 26 27void loop() { 28 29 for (int i=0;i<ALL_BUTTONS;i++) { 30 buttonState[i] = digitalRead(button[i]); 31 32 if ((buttonState[i] != previousButtonState[i]) && (buttonState[i] == HIGH)) { 33 keyboard_shortcut(i); 34 } 35 36 previousButtonState[i] = buttonState[i]; 37 } 38 39 long newPosition = myEnc.read(); 40 Serial.begin(9600); 41 Serial.println(newPosition); 42 43 if (newPosition != oldPosition) { 44 if (newPosition > oldPosition) { 45 keyboard_shortcut(15); 46 } 47 else { 48 keyboard_shortcut(16); 49 } 50 oldPosition = newPosition; 51 delay(200); 52 } 53} 54 55 56void keyboard_shortcut(int buttonID) { 57 switch (buttonID) { 58 case 0: 59 Keyboard.press('A'); 60 break; 61 case 1: 62 Keyboard.press('D'); 63 break; 64 case 2: 65 Keyboard.press('E'); 66 break; 67 case 15: 68 Keyboard.press('R'); 69 break; 70 case 16: 71 Keyboard.press('T'); 72 break; 73 default: 74 break; 75 } 76 delay(100); 77 Keyboard.releaseAll(); 78}
利用環境
Windows10
ArduinoIDE1.8
ArduinoPromicro
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。