前提
Arduino Leonardoでキーボード、マウス、ゲームパッドが複合したデバイスを作成しています
実現したいこと
ロータリーエンコーダーを用いてキー入力、マウス入力、パッド入力(特にアナログパッド)を行えるようにしたいです。
発生している問題・エラーメッセージ
エラーメッセージは表示されていない。 コンパイルも正常に通るようである。 しかし、書き込みが書き込み中...で止まってしまう。
利用しているもの
HID-Project
NKROKeyboard
Gamepad
Mouse
Rotary
Polling
LiquidCrystal-I2C-library
LiquidCrystal_SoftI2C
該当のソースコード
cpp
1#include <HID-Project.h> 2#include <HID-Settings.h> 3#include <Rotary.h> 4#include <LiquidCrystal_SoftI2C.h> 5// Set SDA to pin A0 and SCL to pin A1 6SoftwareWire *wire = new SoftwareWire(A0, A1); 7// Set the LCD address to 0x27 for a 16 chars and 2 line display 8LiquidCrystal_I2C lcd(0x27, 16, 2, wire); 9 10Rotary r = Rotary(8, 9); 11 12void setup() { 13 14 Serial.begin(9600); 15 r.begin(true); 16 NKROKeyboard.begin(); 17 Mouse.begin(); 18 Gamepad.begin(); 19 20 lcd.begin(); 21 lcd.backlight(); 22 lcd.setCursor(0, 0); 23 for (int i = 0; i <= 13; i++) { // 13pinすべてアップ 24 pinMode(i, INPUT_PULLUP); 25 } 26} 27 28void loop() { 29 30 unsigned char result = r.process(); 31 if (result) { 32 33 if (result == DIR_CW) { 34 Serial.println("CW_Right"); 35 lcd.print("CW_Right"); 36 NKROKeyboard.press('a'); 37 NKROKeyboard.releaseAll(); 38 Mouse.move(5, 5); 39 40 41 42 43 } else if (result != DIR_CW) { 44 Serial.println("CCW_Left"); 45 lcd.print("CCW_Left"); 46 NKROKeyboard.press(KEY_BACKSPACE); 47 NKROKeyboard.releaseAll(); 48 Mouse.move(-5, -5); 49 50 } 51 Gamepad.xAxis(random(0xFFFF)); 52 Gamepad.yAxis(random(0xFFFF)); 53 Gamepad.write(); 54 } 55}
試したこと
Gamepad.xAxis(random(0xFFFF));
Gamepad.yAxis(random(0xFFFF));
Gamepad.write();
これら3つをコメントアウトすると正常に書き込みができます
現状なぜ、Gamepadが使用できないのかがわからず、検索にも困っています。
GamePadのサンプルを単体で動かしてみる→書込み、動作確認済み
NKROのサンプル→書込み、動作確認済み
Mouseのサンプル→書込み、動作確認済み
SoftWireLCDのサンプル→書込み、動作確認済み
Arduino IDEを最新のもので再インストールを行った
ボードの標準ライブラリ再インストールを行った
cpp
1#include <HID-Project.h> 2#include <HID-Settings.h> 3#include <Rotary.h> 4#include <LiquidCrystal_SoftI2C.h> 5// Set SDA to pin A0 and SCL to pin A1 6SoftwareWire *wire = new SoftwareWire(A0, A1); 7// Set the LCD address to 0x27 for a 16 chars and 2 line display 8LiquidCrystal_I2C lcd(0x27, 16, 2, wire); 9 10Rotary r = Rotary(8, 9); 11 12void setup() { 13 14 Serial.begin(9600); 15 r.begin(true); 16 // NKROKeyboard.begin(); 17 Mouse.begin(); 18 Gamepad.begin(); 19 20 lcd.begin(); 21 lcd.backlight(); 22 lcd.setCursor(0, 0); 23 for (int i = 0; i <= 13; i++) { // 13pinすべてアップ 24 pinMode(i, INPUT_PULLUP); 25 } 26} 27 28void loop() { 29 30 unsigned char result = r.process(); 31 if (result) { 32 33 if (result == DIR_CW) { 34 Serial.println("CW_Right"); 35 lcd.print("CW_Right"); 36 // NKROKeyboard.press('a'); 37 // NKROKeyboard.releaseAll(); 38 Mouse.move(5, 5); 39 40 41 42 43 } else if (result != DIR_CW) { 44 Serial.println("CCW_Left"); 45 lcd.print("CCW_Left"); 46 // NKROKeyboard.press(KEY_BACKSPACE); 47 // NKROKeyboard.releaseAll(); 48 Mouse.move(-5, -5); 49 50 } 51 Gamepad.xAxis(random(0xFFFF)); 52 Gamepad.yAxis(random(0xFFFF)); 53 Gamepad.write(); 54 } 55}
としてみた。
すると書き込みは通った。
そしてNKROKeyboard.begin();を非コメント化すると書き込みはできなくなった。
よってNKROKeyboardが邪魔していることがわかる。
cpp
1 2void setup() { 3 4 Serial.begin(9600); 5 r.begin(true); 6 NKROKeyboard.begin(); 7//この部分を非コメントアウト 8 Mouse.begin(); 9 Gamepad.begin(); 10 11 lcd.begin(); 12 lcd.backlight(); 13 lcd.setCursor(0, 0); 14 for (int i = 0; i <= 13; i++) { // 13pinすべてアップ 15 pinMode(i, INPUT_PULLUP); 16 } 17} 18 19
この問題を回避する方法がわからないため、困っている。
あなたの回答
tips
プレビュー