Button box для игр (доп.кнопки)

SanSaySP
Offline
Зарегистрирован: 23.11.2017

Есть код для 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

при этом библиотека с этими... "переменными" подгружена и если просто закомментить код с ними, то программа по сути работает, но правда частично - часть кнопок работает, а часть нет, но это другой вопрос, пока хочу добиться, чтобы этой ошибки не было, может вся проблема в ней.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

И где же эта библиотека? Давайте посмотрим - действительно ли есть ли существуют указанные выше макросы.

SanSaySP
Offline
Зарегистрирован: 23.11.2017

sadman41 пишет:

И где же эта библиотека? Давайте посмотрим - действительно ли есть ли существуют указанные выше макросы.

Лежить по пути "C:\Users\1\Documents\Arduino\libraries"

в одноименной папке "Joystick"

в ней есть файл "Joystick.h" в котором есть................

 

ой дурак... накачал кучу библиотек с одинаковыми названиями файлов и думал они одинаковые, но оказывается у их файлов разный код и подгруженная библиотека действительно не содержала эти макросы. Черд. Спасибо!

GooGT
Offline
Зарегистрирован: 07.10.2018

А сможет ли кто-нибудь помочь в скрещивании этого кода и ещё одного, с аналоговыми осями того же автора с ютуб AMSTUDIO?

вот он: https://www.youtube.com/watch?v=iKIrbF6GnZ0

Суть такова: собрал себе руль, для симрейсинга. Есть уже 3 разные версии. На последнем есть специальные лепестки, отвечающие за выжим сцепления, но в програмировании не силен, а у автора нет кода, где бы были хотя бы 2 аналоговые оси, 4 поворотных энкодера и несколько кнопок в одном.

Небольшая демонстрация моего изделия: https://youtu.be/sgsy6JPzt3E

 

SanSaySP
Offline
Зарегистрирован: 23.11.2017

GooGT пишет:

4 поворотных энкодера и несколько кнопок в одном.

А без аналоговых осей ты смог реализовать энкодеры и кнопки?

А то кнопки в виде матрицы я так и не смог сделать, чтобы заработали... планирую делать кнопки с резисторами (резистивно последовательное подключение), такой способ подключения кнопок уже более 2-х лет работает на моей самопальной КПП.

Там же есть и оси...

А собственно в чем проблема со скрещиванием скетчей? У того автора есть и скетч с осями, и есть скетч с энкодерами+кнопки.

GooGT
Offline
Зарегистрирован: 07.10.2018

НУ сам я ничего не реализовывал. У автора есть кнопки+энкодер, на основе этого счетча и построен руль. Нужен скетч кнопки+энкодеры+оси. Не засовывать же 2 ардуины в 1 руль..

SanSaySP
Offline
Зарегистрирован: 23.11.2017

Зачем 2 ардуины? )))

Берешь открываешь 2 скетча и из одного все вставляешь во второй... типо:

все что до "void setup()" во втором скетче вставляешь так же до "void setup()" в первый

все что внутри "void setup()" второго скетча так же вставляешь внутрь "void setup()" первого

все что внутри "void loop()" второго скетча так же вставляешь внутрь "void loop()" первого

ну и все что после "void loop()" - аналогично.

Только внимательно пины надо проверить, чтобы не пересекались.

Respekt
Offline
Зарегистрирован: 06.07.2019

Всем привет! Не давно начал изучать 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

 

Помогите исправить ошибку, пожалуйста.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Компилятор не согласен с Вашим утверждением.

Respekt
Offline
Зарегистрирован: 06.07.2019

А как сделать, что бы он согласился?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

В соответствии со стандартом языка C указать в #include имя файла заголовка.

Respekt
Offline
Зарегистрирован: 06.07.2019

Так он указан. Быть может находится не в том месте? Как проверить правильные пути и ссылки?

SanSaySP
Offline
Зарегистрирован: 23.11.2017

Respekt пишет:

Оба они находятся в дирректории Arduino\libraries\ArduinoJoystickLibrary-master

Здорова, тоже играю в ЕТС, для нее сделал КПП и баттонбокс, по твоей проблеме - думаю эти файлы должны находиться по пути "D:\Мои документы\Arduino\libraries\Joystick", а не "ArduinoJoystickLibrary-master"

Respekt
Offline
Зарегистрирован: 06.07.2019

пробовал... не идет, та же ошибка. buttonbox у тебя собран на этом же скетче с библиотекой?

SanSaySP
Offline
Зарегистрирован: 23.11.2017

А где у тебя вообще лежит папка "Arduino\libraries"?

Взят за основу этот скетч, но я там долго мудохался, чет там переписывал, переделывал и как писал выше - так и не смог сделать чтобы кнопки заработали через матрицу и переделал на резистивно последовательное подключение.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Respekt пишет:

Так он указан. Быть может находится не в том месте? Как проверить правильные пути и ссылки?

По предоставленной Вами информации однозначно можно заключить только одно: компилятор не находит файла. Телепаты сейчас все картоху пропалывают, так что придется включить свою голову и подумать, какая информация была бы полезна для решения этого ребуса.

Respekt
Offline
Зарегистрирован: 06.07.2019

https://github.com/MHeironimus/ArduinoJoystickLibrary  библиотека

https://github.com/OpenSimHardware/Buttsimp Скетчи (именно joy пытаюсь)

Счачав два архива, пытаюсь разобраться в прошивке. В итоге ошибка описанная мною выше.

SanSaySP
Offline
Зарегистрирован: 23.11.2017

Respekt пишет:

В итоге ошибка описанная мною выше.

Ты так и не написал полный путь, где у тебя лежат файлы Keypad.h и Joystick.h

Respekt
Offline
Зарегистрирован: 06.07.2019

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

SanSaySP
Offline
Зарегистрирован: 23.11.2017

Respekt пишет:

C:\Users\username\Documents\Arduino\libraries\ArduinoJoystickLibrary-master\Joystick\src\Joystick.h

Я ж тебе писал, что путь у тя походу не верный... нужно

"D:\Мои документы\Arduino\libraries\Joystick", а не "ArduinoJoystickLibrary-master"

Keypad.h тоже нужен, да и у тебя ошибки же выходят.

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вобщем, ошибки тут две:

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:
 

//initialize an Joystick with 34 buttons;
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
                   JOYSTICK_TYPE_JOYSTICK, 34, 0,
                   false, false, false, false, false, false,
                   false, false, false, false, false);

После правок :

Using library Keypad in folder: C:\Users\xxx\Documents\Arduino\libraries\Keypad (legacy)
Using library Joystick at version 2.0.5 in folder: C:\Users\xxx\Documents\Arduino\libraries\Joystick 
Sketch uses 9242 bytes (32%) of program storage space. Maximum is 28672 bytes.
Global variables use 487 bytes (19%) of dynamic memory, leaving 2073 bytes for local variables. Maximum is 2560 bytes.

 

Respekt
Offline
Зарегистрирован: 06.07.2019

Оказывается, у меня в принцепе не было библиотеки keypad. https://github.com/Chris--A/Keypad   скачал-скопировал-скетч компилируется, без ошибок. Пробую дальше.