Застрял, делая мульти, много кнопок, джойстиков

shift-register joystick

Я застрял, я решил обратиться сюда за помощью... Обратите внимание, что я новичок, и это, по сути, мой первый проект Arduino после блинка...

Я создаю виртуальные панели кабины для DCS World, используя Arduino Leonardo в качестве HID-устройства. Я использую три SN74HC165 Shift-In регистра для мультикнопок (24) - как мне показалось проще всего - и в целом работает...

Итак, я решил, что использую только 4 контакта на Leonardo, так почему бы не попробовать настроить 3 из этих "кластеров переключения" (12 контактов), чтобы они отображались как 3 отдельных джойстика?

У меня работает один, а в Windows10 появляются еще 2 джойстика... теперь моя проблема: как мне настроить еще 2 кластера "shiftIn Clusters". Я много чего перепробовал, но вынужден полагаться на помощь извне. (потому что я действительно не знаю, что делаю)

Изменить для уточнения: таким образом, каждому джойстику требуется 3 или 4 регистра сдвига, что дает 24–32 кнопки на каждом джойстике

Shift In Lib: https://github.com/…/Ardu…/blob/master/ShiftIn/src/ShiftIn.h

Joy2 Lib: https://github.com/MHeironimus/ArduinoJoystickLibrary

Вот изображение нужного мне макета: https://i.imgur.com/eZfMMzI.png

... любая помощь уменьшит головную боль, спасибо за ваше время

#include <ShiftIn.h> 
#include <Joystick.h>           

// используем <n> сдвиговые регистры
ShiftIn<3> shift;             // используем три регистра сдвига


// Создаем джойстик
// ТЕСТИРОВАНИЕ МУЛЬТИ-ДЖОЙСТИКОВ
// 1/3 Работает!!!
// 3/3 появляются в Windows
// ????? нужно добавить разделы shiftIn для 2-го и 3-го джойстиков????
// (добавьте использование вывода + измените содержимое строки 77-79)


#define JOYSTICK_COUNT 3
Joystick_ Joystick[JOYSTICK_COUNT] = {
  Joystick_(0x03, JOYSTICK_TYPE_GAMEPAD, 32, 0, false, false, false, false, false, false, false, false, false, false, false), 
  Joystick_(0x04, JOYSTICK_TYPE_GAMEPAD, 32, 0, false, false, false, false, false, false, false, false, false, false, false),
  Joystick_(0x05, JOYSTICK_TYPE_GAMEPAD, 32, 0, false, false, false, false, false, false, false, false, false, false, false),
};

// Установите значение true, чтобы протестировать режим «Автоматическая отправка», или false, чтобы протестировать режим «Ручная отправка».
//const bool testAutoSendMode = true;
const bool testAutoSendMode = false;

const unsigned long gcCycleDelta = 1000;
const unsigned long gcAnalogDelta = 25;
const unsigned long gcButtonDelta = 500;
unsigned long gNextTime = 0;
unsigned int gCurrentStep = 0;
int gJoystickId = 0;



/*
// РАБОЧАЯ СЕКЦИЯ Одиночный джойстик с Shift Reg
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
  32, 0,                        // Количество кнопок, количество переключателей шляпы
  false, false, false,          // X и Y, но без оси Z
  false, false, false,          // Нет Rx, Ry или Rz
  false, false,                 // Нет руля или газа
  false, false, false);         // Нет акселератора, тормоза или рулевого управления
*/



void setup() {

  shift.begin(8, 9, 11, 12);  // устанавливаем выводы сдвигового регистра
// shift[1].begin(7, 6, 5, 4); // устанавливаем выводы сдвигового регистра
// сдвиг[2].begin(3, 2, 1, 0); // устанавливаем выводы сдвигового регистра

 Joystick[0].begin();
 Joystick[1].begin();
 Joystick[2].begin();
}


void loop() {

  if (shift.update()) {
    for (int i = 0; i < shift.getDataWidth(); i++)
    Joystick[0].setButton(i, shift.state(i));            // просто нажмите или отпустите кнопку
  }
/*if (shift[1].update()) {
    for (int i = 0; i < shift[1].getDataWidth(); i++)
    Joystick[0].setButton(i, shift[1].state(i));            // просто нажмите или отпустите кнопку
  }
if (shift[2].update()) {
    for (int i = 0; i < shift[2].getDataWidth(); i++)
    Joystick[0].setButton(i, shift[2].state(i));            // просто нажмите или отпустите кнопку
  }
  delay(10);
*/ 
}

, 👍0


1 ответ


Лучший ответ:

1

Каждый экземпляр ShiftIn обрабатывает только одно соединение. Вам нужно создать несколько экземпляров.

ShiftIn shift1<3>;
ShiftIn shift2<3>;
ShiftIn shift3<3>;

Затем вы начинаете каждый из них:

void setup() {      
    shift1.begin(8, 9, 11, 12); 
    shift2.begin(7, 6, 5, 4); 
    shift3.begin(3, 2, 1, 0);
    ... etc ...
}

Каждый shiftx — это совершенно отдельная сущность. Вы можете просто повторить свой блок кода для каждого объекта shift:

if (shift1.update()) {
    for (int i = 0; i < shift1.getDataWidth(); i++)
    Joystick[0].setButton(i, shift1.state(i)); 
}

if (shift2.update()) {
    for (int i = 0; i < shift2.getDataWidth(); i++)
    Joystick[1].setButton(i, shift2.state(i)); 
}

if (shift3.update()) {
    for (int i = 0; i < shift3.getDataWidth(); i++)
    Joystick[2].setButton(i, shift3.state(i)); 
}

Вы можете упорядочить объекты ShiftIn в массив, как вы это делаете с объектами Joystick, а затем просмотреть их в цикле, но это довольно бессмысленно только для трех из них.

,

Спасибо за ваш ответ! Я не ясно изложил свой вопрос, мне нужно как минимум 24 кнопки на каждом джойстике, поэтому 3 сдвиговых регистра на каждом джойстике.. Я добавил картинку, @FedaykinWolf

@FedaykinWolf Ах да. Я неправильно понял. Я изменю свой ответ., @Majenko

Это было!!! первую часть я не понимаю, как запустить 3 экземпляра (также я пытался изменить «ShiftIn», а не «Shift»... Большое спасибо! внезапно моя головная боль вылечена., @FedaykinWolf

@FedaykinWolf Еще один вариант сэкономить проводку — соединить их все вместе, чтобы сделать один `ShiftIn shift<9>;, и сделать так, как я делал раньше., @Majenko

Еще раз спасибо! Я думал об этом варианте, но мне нужно, чтобы он был немного более модульным, чтобы я мог быстро и легко менять типы кабин (F-16, F-18, A-10)., @FedaykinWolf