Button box для игр (доп.кнопки)
- Войдите на сайт для отправки комментариев
Ср, 03/10/2018 - 20:47
Есть код для Button box, вроде как рабочий,
//BUTTON BOX //USE w ProMicro //Tested in WIN10 + Assetto Corsa //AMSTUDIO //20.8.17 #include <Keypad.h> #include <Joystick.h> #define ENABLE_PULLUPS #define NUMROTARIES 4 #define NUMBUTTONS 24 #define NUMROWS 5 #define NUMCOLS 5 byte buttons[NUMROWS][NUMCOLS] = { {0,1,2,3}, //0,1,2,3,4 {5,6,7,8,9}, {10,11,12,13,14}, {15,16,17,18,19}, {20,21,22,23,4}, //{20,21,22,23}, }; struct rotariesdef { byte pin1; byte pin2; int ccwchar; int cwchar; volatile unsigned char state; }; rotariesdef rotaries[NUMROTARIES] { {0,1,24,25,0}, //0,1 - куда подключен энкодер; 24,25 - кнопки джойстика {2,3,26,27,0}, {4,5,28,29,0}, {6,7,30,31,0}, }; #define DIR_CCW 0x10 #define DIR_CW 0x20 #define R_START 0x0 #ifdef HALF_STEP #define R_CCW_BEGIN 0x1 #define R_CW_BEGIN 0x2 #define R_START_M 0x3 #define R_CW_BEGIN_M 0x4 #define R_CCW_BEGIN_M 0x5 const unsigned char ttable[6][4] = { // R_START (00) {R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START}, // R_CCW_BEGIN {R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START}, // R_CW_BEGIN {R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START}, // R_START_M (11) {R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START}, // R_CW_BEGIN_M {R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW}, // R_CCW_BEGIN_M {R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW}, }; #else #define R_CW_FINAL 0x1 #define R_CW_BEGIN 0x2 #define R_CW_NEXT 0x3 #define R_CCW_BEGIN 0x4 #define R_CCW_FINAL 0x5 #define R_CCW_NEXT 0x6 const unsigned char ttable[7][4] = { // R_START {R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START}, // R_CW_FINAL {R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW}, // R_CW_BEGIN {R_CW_NEXT, R_CW_BEGIN, R_START, R_START}, // R_CW_NEXT {R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START}, // R_CCW_BEGIN {R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START}, // R_CCW_FINAL {R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW}, // R_CCW_NEXT {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START}, }; #endif byte rowPins[NUMROWS] = {19,18,17,16,15}; //19,18,17,16,15 21,20,19,18,15 byte colPins[NUMCOLS] = {14,12,11,10,9}; // 14,16,10,9,8 Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 32, 0, false, false, false, false, false, false, false, false, false, false, false); void setup() { Joystick.begin(); rotary_init();} void loop() { CheckAllEncoders(); CheckAllButtons(); } void CheckAllButtons(void) { if (buttbx.getKeys()) { for (int i=0; i<LIST_MAX; i++) { if ( buttbx.key[i].stateChanged ) { switch (buttbx.key[i].kstate) { case PRESSED: case HOLD: Joystick.setButton(buttbx.key[i].kchar, 1); break; case RELEASED: case IDLE: Joystick.setButton(buttbx.key[i].kchar, 0); break; } } } } } void rotary_init() { for (int i=0;i<NUMROTARIES;i++) { pinMode(rotaries[i].pin1, INPUT); pinMode(rotaries[i].pin2, INPUT); #ifdef ENABLE_PULLUPS digitalWrite(rotaries[i].pin1, HIGH); digitalWrite(rotaries[i].pin2, HIGH); #endif } } unsigned char rotary_process(int _i) { unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1); rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate]; return (rotaries[_i].state & 0x30); } void CheckAllEncoders(void) { for (int i=0;i<NUMROTARIES;i++) { unsigned char result = rotary_process(i); if (result == DIR_CCW) { Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0); }; if (result == DIR_CW) { Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0); }; } }
но у меня выдает ошибку:
ARDUINO_BUTTON_BOXV2:95: error: 'JOYSTICK_DEFAULT_REPORT_ID' was not declared in this scope
ARDUINO_BUTTON_BOXV2:96: error: 'JOYSTICK_TYPE_JOYSTICK' was not declared in this scope
exit status 1
'JOYSTICK_DEFAULT_REPORT_ID' was not declared in this scope
при этом библиотека с этими... "переменными" подгружена и если просто закомментить код с ними, то программа по сути работает, но правда частично - часть кнопок работает, а часть нет, но это другой вопрос, пока хочу добиться, чтобы этой ошибки не было, может вся проблема в ней.
И где же эта библиотека? Давайте посмотрим - действительно ли есть ли существуют указанные выше макросы.
И где же эта библиотека? Давайте посмотрим - действительно ли есть ли существуют указанные выше макросы.
Лежить по пути "C:\Users\1\Documents\Arduino\libraries"
в одноименной папке "Joystick"
в ней есть файл "Joystick.h" в котором есть................
ой дурак... накачал кучу библиотек с одинаковыми названиями файлов и думал они одинаковые, но оказывается у их файлов разный код и подгруженная библиотека действительно не содержала эти макросы. Черд. Спасибо!
А сможет ли кто-нибудь помочь в скрещивании этого кода и ещё одного, с аналоговыми осями того же автора с ютуб AMSTUDIO?
вот он: https://www.youtube.com/watch?v=iKIrbF6GnZ0
Суть такова: собрал себе руль, для симрейсинга. Есть уже 3 разные версии. На последнем есть специальные лепестки, отвечающие за выжим сцепления, но в програмировании не силен, а у автора нет кода, где бы были хотя бы 2 аналоговые оси, 4 поворотных энкодера и несколько кнопок в одном.
Небольшая демонстрация моего изделия: https://youtu.be/sgsy6JPzt3E
4 поворотных энкодера и несколько кнопок в одном.
А без аналоговых осей ты смог реализовать энкодеры и кнопки?
А то кнопки в виде матрицы я так и не смог сделать, чтобы заработали... планирую делать кнопки с резисторами (резистивно последовательное подключение), такой способ подключения кнопок уже более 2-х лет работает на моей самопальной КПП.
Там же есть и оси...
А собственно в чем проблема со скрещиванием скетчей? У того автора есть и скетч с осями, и есть скетч с энкодерами+кнопки.
НУ сам я ничего не реализовывал. У автора есть кнопки+энкодер, на основе этого счетча и построен руль. Нужен скетч кнопки+энкодеры+оси. Не засовывать же 2 ардуины в 1 руль..
Зачем 2 ардуины? )))
Берешь открываешь 2 скетча и из одного все вставляешь во второй... типо:
все что до "void setup()" во втором скетче вставляешь так же до "void setup()" в первый
все что внутри "void setup()" второго скетча так же вставляешь внутрь "void setup()" первого
все что внутри "void loop()" второго скетча так же вставляешь внутрь "void loop()" первого
ну и все что после "void loop()" - аналогично.
Только внимательно пины надо проверить, чтобы не пересекались.
Всем привет! Не давно начал изучать Arduino, уже сделал себе ручку селектор с кнопками для ETS2 ATS на Logitech 27. Использую кнопки для повышенных\пониженных скоростей - нижний верхний ряды КПП. Залил код в pro micro, на три кнопки. Собираюсь делать buttonbox, прикупил кнопки. Прежде чем делать корпус хочу разобраться с прошивкой. Пытаюсь заливать скетч как в первом после, добавил библиотеку, но появились ошибки:
buttsimpjoy:16:20: error: Keypad.h: No such file or directory
compilation terminated.
exit status 1
Keypad.h: No such file or directory
Тут используется два файла на сколько я понимаю: Keypad.h и Joystick.h. Оба они находятся в дирректории Arduino\libraries\ArduinoJoystickLibrary-master
Помогите исправить ошибку, пожалуйста.
Компилятор не согласен с Вашим утверждением.
А как сделать, что бы он согласился?
В соответствии со стандартом языка C указать в #include имя файла заголовка.
Так он указан. Быть может находится не в том месте? Как проверить правильные пути и ссылки?
Оба они находятся в дирректории Arduino\libraries\ArduinoJoystickLibrary-master
Здорова, тоже играю в ЕТС, для нее сделал КПП и баттонбокс, по твоей проблеме - думаю эти файлы должны находиться по пути "D:\Мои документы\Arduino\libraries\Joystick", а не "ArduinoJoystickLibrary-master"
пробовал... не идет, та же ошибка. buttonbox у тебя собран на этом же скетче с библиотекой?
А где у тебя вообще лежит папка "Arduino\libraries"?
Взят за основу этот скетч, но я там долго мудохался, чет там переписывал, переделывал и как писал выше - так и не смог сделать чтобы кнопки заработали через матрицу и переделал на резистивно последовательное подключение.
Так он указан. Быть может находится не в том месте? Как проверить правильные пути и ссылки?
По предоставленной Вами информации однозначно можно заключить только одно: компилятор не находит файла. Телепаты сейчас все картоху пропалывают, так что придется включить свою голову и подумать, какая информация была бы полезна для решения этого ребуса.
https://github.com/MHeironimus/ArduinoJoystickLibrary библиотека
https://github.com/OpenSimHardware/Buttsimp Скетчи (именно joy пытаюсь)
Счачав два архива, пытаюсь разобраться в прошивке. В итоге ошибка описанная мною выше.
В итоге ошибка описанная мною выше.
Ты так и не написал полный путь, где у тебя лежат файлы Keypad.h и Joystick.h
C:\Users\username\Documents\Arduino\libraries\ArduinoJoystickLibrary-master\Joystick\src\Joystick.h
Keypad.h вообще нигде не вижу. Он и не нужен я так понимаю, раз идет эмуляция джойстика. Keypad.h убирал из скейча, толку нет. Проверил как видет Arduino IDE библиотеку путем загрузки: фаил-примеры- тут я не увидел подгруженную библиотеку. Скопировал папку Joystick из архива с библиотекой, снова иду по пути фаил-примеры-Joystick и вижу примеры, загружаю, проверяю - все работает без ошибок.
Проверяю скетч из архива: в итоге вижу ошибку которой еще не было ;) Ругается на клавиатуру по всей вероятности....
buttsimpjoy:87:1: error: 'Keypad' does not name a type
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);
^
C:\Users\username\Desktop\sc\buttsimpjoy\buttsimpjoy.ino: In function 'void setup()':
buttsimpjoy:92:3: error: 'Joystick' was not declared in this scope
Joystick.begin();
^
C:\Users\username\Desktop\sc\buttsimpjoy\buttsimpjoy.ino: In function 'void CheckAllButtons()':
buttsimpjoy:108:14: error: 'buttbx' was not declared in this scope
char key = buttbx.getKey();
^
buttsimpjoy:109:14: error: 'NO_KEY' was not declared in this scope
if (key != NO_KEY) {
^
buttsimpjoy:110:5: error: 'Joystick' was not declared in this scope
Joystick.setButton(key, 1); delay(50); Joystick.setButton(key, 0);
^
C:\Users\username\Desktop\sc\buttsimpjoy\buttsimpjoy.ino: In function 'void CheckAllEncoders()':
buttsimpjoy:143:7: error: 'Joystick' was not declared in this scope
Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
^
buttsimpjoy:146:7: error: 'Joystick' was not declared in this scope
Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
^
exit status 1
'Keypad' does not name a type
C:\Users\username\Documents\Arduino\libraries\ArduinoJoystickLibrary-master\Joystick\src\Joystick.h
Я ж тебе писал, что путь у тя походу не верный... нужно
"D:\Мои документы\Arduino\libraries\Joystick", а не "ArduinoJoystickLibrary-master"
Keypad.h тоже нужен, да и у тебя ошибки же выходят.
Вобщем, ошибки тут две:
1) Лишний уровень вложенности в библиотеке. The deploy.bat file can be executed to install the Joystick folder on Microsoft Windows machines (assuming a default Arduino installation) => смотрим deploy.bat и видим xcopy /E /I Joystick\*.* "%HOMEDRIVE%%HOMEPATH%\Documents\Arduino\libraries\Joystick"
2) Автор buttsimpjoy.ino забыл объявить объект Joystick:
После правок :
Оказывается, у меня в принцепе не было библиотеки keypad. https://github.com/Chris--A/Keypad скачал-скопировал-скетч компилируется, без ошибок. Пробую дальше.