Застрял, делая мульти, много кнопок, джойстиков
Я застрял, я решил обратиться сюда за помощью... Обратите внимание, что я новичок, и это, по сути, мой первый проект 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);
*/
}
@FedaykinWolf, 👍0
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
, а затем просмотреть их в цикле, но это довольно бессмысленно только для трех из них.
- if(Serial.available()>0) VS while(Serial.available()>0)
- 74HC595 к 4 значному 7 сегменту с использованием библиотеки SevSegShift
- Чтение нескольких аналоговых входных контактов
- 74HC595 регистр сдвига не работает
- LSB/MSB и shiftOut
- Прочитать значение регистра в arduino
- Вибрационный геймпад Arduino с силовой обратной связью
- Экспонируйте два устройства HID Joystick с одной платой RP2040 (Waveshare Pi Pico Zero)
Спасибо за ваш ответ! Я не ясно изложил свой вопрос, мне нужно как минимум 24 кнопки на каждом джойстике, поэтому 3 сдвиговых регистра на каждом джойстике.. Я добавил картинку, @FedaykinWolf
@FedaykinWolf Ах да. Я неправильно понял. Я изменю свой ответ., @Majenko
Это было!!! первую часть я не понимаю, как запустить 3 экземпляра (также я пытался изменить «ShiftIn», а не «Shift»... Большое спасибо! внезапно моя головная боль вылечена., @FedaykinWolf
@FedaykinWolf Еще один вариант сэкономить проводку — соединить их все вместе, чтобы сделать один `ShiftIn shift<9>;, и сделать так, как я делал раньше., @Majenko
Еще раз спасибо! Я думал об этом варианте, но мне нужно, чтобы он был немного более модульным, чтобы я мог быстро и легко менять типы кабин (F-16, F-18, A-10)., @FedaykinWolf