Команды контроллера Xbox 360 на Uno-совместимую плату через USB-модуль

usb m5stack

Я пытаюсь получать команды на стороннюю совместимую с Arduino-Uno плату от контроллера Xbox 360 через USB-модуль M5Stack но я не вижу ожидаемого поведения (см. заголовок Ожидаемое поведение).

Для ясности: я говорю о чтении команд с контроллера Xbox с помощью Arduino, а не не об эмуляции контроллера Xbox с помощью Arduino.

Оборудование

  • Bluno Nano. (Плата, совместимая с Arduino-Uno, в форм-факторе, подобном Nano, с загрузкой программ и последовательной связью через соответствующий USB-ключ Bluetooth. Однако вместо этого я использую проводное USB-соединение с моим ПК.) Плата распознается как Uno. с помощью Arduino IDE. Эта же плата работала, как и ожидалось, для других проектов.

  • USB-модуль M5Stack (с чипом MAX3421E), который в первую очередь предназначен для совместимости с модулем микроконтроллера M5Stack. В любом случае USB-модуль взаимодействует с помощью SPI.

  • беспроводной контроллер Xbox 360, но я подключил его к USB-модулю с помощью USB-кабеля, который подключается к контроллеру с помощью проприетарного разъема. Должен быть в рабочем состоянии.

Я не использую беспроводной приемник Xbox 360 для подключения к контроллеру Xbox и не хочу подключаться к это без проводов.

Проводка

  • Я подключил GND (#1/3/5), +5V (#28, VBUS), SCLK (#11, GPIO18), MISO (#9, GPIO19) и MOSI (#7, GPIO23) ) USB-модуля к соответствующим контактам Bluno Nano: GND, +5V, SCK (D13), MISO (D12) и MOSI (D11).

  • Я попытался подключить контакт EN USB-модуля (#6) к +5 В, чтобы убедиться, что он включен.

  • Я попытался потянуть штифт SS вверх/вниз. Я не пробовал подключать его к контактам D10 или D8, которые я видел как контакты SS на схемах распиновки Arduino Nano.

  • Я не пробовал подключать контакт INT (#2, GPIO35) к чему-либо.

  • Я считаю, что это единственные полезные контакты на USB-модуле.

Схема модуля USB

Полезная распиновка находится в правом нижнем углу.

Попытки

  • Отключение и повторное подключение USB-кабеля Bluno Nano к компьютеру.

  • Нажатие кнопки сброса Bluno Nano.

  • Отключение и повторное подключение USB-кабеля контроллера Xbox к USB-модулю или наоборот (т. е. начиная с его отключения).

  • Нажатие или удерживание центральной кнопки "X" кнопка или другие кнопки на контроллере, предположительно, чтобы включить его или, возможно, войти в какой-то режим настройки подключения.

  • Использование проводной USB-мыши вместо контроллера Xbox.

  • Пробуем различные комбинации вышеперечисленного в разном порядке.

Я убедился, что на USB-модуль подается питание (даже несмотря на то, что у него нет светодиодного индикатора питания), используя его дополнительные контакты 5V и GND для успешного управления цифровым входным контактом Bluno Nano с высоким или низким уровнем.

Я убедился, что на контроллер Xbox подается питание, так как центральная точка "X" кнопка загорается при нажатии.

Программное обеспечение

  • Windows 11

  • IDE 2.0 для Arduino

  • USB_Host_Shield_2.0 версии 1.6.2 (последней), установленной через диспетчер библиотек. Обратите внимание, что эта библиотека, по-видимому, в первую очередь предназначена для конкретного USB-хост-шилда, но я вижу, что она используется с другими USB-хост-шилдами, в том числе в документации моего USB-модуля. В нем есть библиотека для Xbox 360, которая работает с USB-контроллером или беспроводным контроллером, с примеры скетчей для каждого.

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

В последовательном мониторе Arduino IDE я установил скорость передачи данных 115 200, чтобы она соответствовала скорости, указанной в любом скетче из примера.

Ожидаемое поведение

Для печати в последовательном мониторе (<...> я обозначаю свои комментарии):

XBOX USB Library Started  <instead of "OSC did not start" followed by unresponsiveness to controller button presses, etc.>
<Xbox controller commands upon controls/buttons being pressed, e.g., "LeftHatX: ...">

Попытки

  • В документации USB Host Shield 2.0 говорится об использовании с контроллером Xbox 360: "Для использования через USB используйте библиотеку XBOXUSB, а для беспроводного использования используйте библиотеку XBOXRECV. Обратите внимание, что беспроводной контроллер НЕ МОЖЕТ использоваться через USB!». Мне неясно, требует ли мое проводное USB-подключение к моему беспроводному контроллеру библиотеку XBOXUSB или XBOXRECV, поэтому я пробовал обе библиотеки (попробовал оба сопровождающих примера скетча) безрезультатно.

  • Я пытался удалить следующие фрагменты кода по одному и в некоторых комбинациях, но безрезультатно. Программа загружается успешно в любом случае.

    #include <SPI.h>
    
    #if !defined(__MIPSEL__)
      while (!Serial); // Дождитесь подключения последовательного порта — используется на платах Leonardo, Teensy и других со встроенным последовательным соединением USB CDC
    #endif
    
    XBOXUSB Xbox(&Usb);
    <...along with the code in `loop()` that requires it to be defined.>
    
    if (Usb.Init() == -1) {
      Serial.print(F("\r\nOSC did not start"));
      while (1); //halt
    }
    Serial.print(F("\r\nXBOX USB Library Started"));
    

    Здесь произошел сбой программы, поскольку Usb.Init() == -1.

  • Я пытался изменить

    if (Usb.Init() == -1) {
      Serial.print(F("\r\nOSC did not start"));
      while (1); // остановка
    }
    Serial.print(F("\r\nXBOX USB Library Started"));
    

    в

    while (Usb.Init() == -1);
    Serial.print(F("\r\nXBOX USB Library Started"));
    

    при попытке установить соединение (пока я нажимал кнопку "X" и другие кнопки контроллера) безрезультатно.

  • Я также попытался изменить тот же фрагмент на

    Usb.Init()
    

    в попытке проигнорировать возвращаемое значение -1 (которое, как я полагаю, представляет собой ошибку) и продолжить работу, но безрезультатно.

  • Использование старой версии библиотеки USB Host Shield 2.0.

  • Установка следующего в settings.h библиотеки без видимых изменений в выводе.

    /* Установите для этого параметра значение 1, чтобы активировать отладку serial*/
    #define ENABLE_UHS_DEBUGGING 1
    
  • Установка следующих параметров в XBOXUSB.cpp и XBOXRECV.cpp без видимых изменений в выводе.

    #define EXTRADEBUG // Раскомментируйте, чтобы получить еще больше отладочных данных
    #define PRINTREPORT // Раскомментируйте, чтобы распечатать отчет, отправленный контроллером Xbox 360
    

Чтобы попробовать использовать проводную USB-мышь вместо контроллера Xbox, я использовал USB_Host_Shield_2.0/examples/HID/USBHIDBootMouse/USBHIDBootMouse.ino, а также попытался внести некоторые из вышеперечисленных модификаций, чтобы не в любом случае помогло, что навело меня на мысль, что проблема не связана с контроллером Xbox или библиотекой для него.

Я также попробовал пример скетча из Документация по USB-модулю M5Stack после удаления частей, которые относятся к модулю микроконтроллера M5Stack и не нужны для целей тестирования. Это ничем не отличалось.


Я совершенно не знаю, что еще можно попробовать с точки зрения аппаратного и программного обеспечения. Я пробовал искать много вопросов. Я подозреваю, что упускаю что-то простое и очевидное или что мои настройки не работают по какой-либо причине.

Спасибо


Обновить

После устранения проблемы Usb.Init() путем подключения контакта SS USB-модуля соединение с контроллером Xbox по-прежнему не устанавливалось и команды не принимались.

, 👍3

Обсуждение

ОБНОВЛЕНИЕ: я успешно прошел Usb.Init(), подключив контакт SS к D10 (либо с XBOXUSB, либо с XBOXRECV), но основной код в loop(), который теперь достигнут, также не работает, потому что Xbox .Xbox360Connected == 0. Это так, даже если я отмечаю «Xbox.Xbox360Connected» после задержки или после нажатия кнопок на контроллере Xbox., @Lazy Titanic

ОБНОВЛЕНИЕ: у меня работает то же самое, но с проводной USB-мышью и USB_Host_Shield_2.0/examples/HID/USBHIDBootMouse/USBHIDBootMouse.ino., @Lazy Titanic

* Я попытался потянуть SS-вывод вверх / вниз * - я собирался предположить, что SS-вывод обычно управляется программным обеспечением, и что его утверждение обычно сигнализирует о начале «транзакции» - однако протокол определяет это., @Nick Gammon

Вы уверены, что контроллер *также* отправляет данные через USB, а не только по беспроводной сети?, @Nick Gammon

@NickGammon Думаю, ты прав насчет контакта SS. Что касается того, предназначен ли USB для данных, а не только для питания, я не могу быть уверен на 100%, но я подозреваю, что это для данных, потому что фирменный разъем USB-кабеля с контроллером Xbox 360 имеет своего рода «манжету» вокруг него. кажется, что это очень намеренно блокирует нажатие кнопки «Подключить» на задней панели контроллера; USB-кабель по своей конструкции препятствует беспроводному соединению. Как мне это проверить — попробовать поиграть с контроллером в клетке Фарадея? :D, @Lazy Titanic

Что ж, если бы у вас был USB-анализатор (который стоит недешево), вы могли бы увидеть, изменяются ли отправляемые данные при нажатии кнопок., @Nick Gammon

@NickGammon Спасибо! Я мог бы подумать о том, чтобы попробовать другой контроллер и/или кабель, купить беспроводной приемник Xbox 360 или использовать джойстик вместо контроллера., @Lazy Titanic


1 ответ


0

Я обнаружил, что при подключении USB-кабеля к ПК вместо USB-модуля контроллер отображается как "Беспроводной контроллер Xbox 360 через Play & Зарядный комплектquot; в разделе «Периферийные устройства Xbox 360»; в диспетчере устройств.

Оказывается, "Play & Зарядный комплектquot; относится к съемной перезаряжаемой батарее контроллера и кабелю USB.

Согласно этому, " Комплект для игры и зарядки несет только энергию. Он не содержит данных, необходимых для подключения контроллера к ПК».

,