fbpx
ArduinoNovidade

Como utilizar o USB Host Shield com controle de Xbox no Arduino UNO

Combinar o USB Host Shield com o Arduino é uma maneira de expandir o potencial dessa placa microcontroladora. Ao fazê-lo, habilitamos o Arduino para se conectar e se comunicar com diversos dispositivos USB. Desde teclados e mouses até controles de jogos, ampliando as oportunidades para projetos criativos e inovadores.

Neste tutorial, aprenderemos como estabelecer uma conexão entre o Arduino UNO e um controle de Xbox, utilizando o USB Host Shield. Seja para criar uma nova maneira de interagir com seus jogos ou para integrar o controle e videogame em seus projetos maker, este tutorial será um excelente ponto de partida.

A imagem conta com um Arduino UNO conectado ao USB Host Shield que esta ligado ao controle de xbox através de um adaptador.
Figura 1 – USB Host shield sendo usado no projeto com controle de Xbox

ESQUEMÁTICO DE LIGAÇÃO

Conecte o USB Host Shield ao topo do Arduino UNO. Certifique-se de que os pinos estejam alinhados corretamente. Em seguida, conecte o adaptador do controle do Xbox ao USB Host Shield. Este adaptador permitirá a comunicação entre o controle e o Arduino UNO.

OBSERVAÇÃO: É recomendado utilizar uma alimentação externa (entre 7V e 12V) no USB Host Shield, por meio da porta Vin, pois a saída USB do computador pode não fornecer corrente suficiente para suportar este Shield. Isso pode resultar em falhas de funcionamento ou até mesmo a não operação do dispositivo.

ELABORANDO O CÓDIGO

Após realizar todas as conexões, vamos à programação. Neste projeto, aprenderemos como estabelecer uma conexão entre o Arduino UNO e um controle de Xbox, utilizando o USB Host Shield.

Para facilitar a comunicação entre o Arduino e dispositivos USB usando o USB Host Shield, vamos utilizar a biblioteca USB Host Shield library 2.0. Para instalá-la, abra o Gerenciador de Bibliotecas através do caminho: Ferramentas> Gerenciar Bibliotecas… ou por meio do atalho Ctrl+Shift+I. Em seguida, busque por USB Hostshield library 2.0 e clique em instalar, conforme a Figura 2.

Imagem da tela da ide do arduino mostrando a Instalação da biblioteca USB Hostshield library 2.0 através do Gerenciador de Bibliotecas.
Figura 2 – Instalação da biblioteca USB Hostshield library 2.0 através do Gerenciador de Bibliotecas.

Logo após, podemos prosseguir com a programação. Neste projeto, utilizaremos um código exemplo da biblioteca. Para isso, acesse o caminho: Arquivo> Exemplos > USB Host Shield Library 2.0 > Xbox > XBOXRECV.

Imagem mostrando o caminho para selecionar o exemplo XBOXRECV.
Figura 3 – Caminho para o exemplo XBOXRECV.

Logo após, o seguinte código será exibido na tela.

/*
 Example sketch for the Xbox Wireless Reciver library - developed by Kristian Lauszus
 It supports up to four controllers wirelessly
 For more information see the blog post: http://blog.tkjelectronics.dk/2012/12/xbox-360-receiver-added-to-the-usb-host-library/ or
 send me an e-mail:  kristianl@tkjelectronics.com
 */

#include <XBOXRECV.h>

// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

USB Usb;
XBOXRECV Xbox(&Usb);

void setup() {
  Serial.begin(115200);
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
  Serial.print(F("\r\nXbox Wireless Receiver Library Started"));
}
void loop() {
  Usb.Task();
  if (Xbox.XboxReceiverConnected) {
    for (uint8_t i = 0; i < 4; i++) {
      if (Xbox.Xbox360Connected[i]) {
        if (Xbox.getButtonPress(LT, i) || Xbox.getButtonPress(RT, i)) {
          Serial.print("LT: ");
          Serial.print(Xbox.getButtonPress(LT, i));
          Serial.print("\tRT: ");
          Serial.println(Xbox.getButtonPress(RT, i));
          Xbox.setRumbleOn(Xbox.getButtonPress(LT, i), Xbox.getButtonPress(RT, i), i);
        }

        if (Xbox.getAnalogHat(LeftHatX, i) > 7500 || Xbox.getAnalogHat(LeftHatX, i) < -7500 || Xbox.getAnalogHat(LeftHatY, i) > 7500 || Xbox.getAnalogHat(LeftHatY, i) < -7500 || Xbox.getAnalogHat(RightHatX, i) > 7500 || Xbox.getAnalogHat(RightHatX, i) < -7500 || Xbox.getAnalogHat(RightHatY, i) > 7500 || Xbox.getAnalogHat(RightHatY, i) < -7500) {
          if (Xbox.getAnalogHat(LeftHatX, i) > 7500 || Xbox.getAnalogHat(LeftHatX, i) < -7500) {
            Serial.print(F("LeftHatX: "));
            Serial.print(Xbox.getAnalogHat(LeftHatX, i));
            Serial.print("\t");
          }
          if (Xbox.getAnalogHat(LeftHatY, i) > 7500 || Xbox.getAnalogHat(LeftHatY, i) < -7500) {
            Serial.print(F("LeftHatY: "));
            Serial.print(Xbox.getAnalogHat(LeftHatY, i));
            Serial.print("\t");
          }
          if (Xbox.getAnalogHat(RightHatX, i) > 7500 || Xbox.getAnalogHat(RightHatX, i) < -7500) {
            Serial.print(F("RightHatX: "));
            Serial.print(Xbox.getAnalogHat(RightHatX, i));
            Serial.print("\t");
          }
          if (Xbox.getAnalogHat(RightHatY, i) > 7500 || Xbox.getAnalogHat(RightHatY, i) < -7500) {
            Serial.print(F("RightHatY: "));
            Serial.print(Xbox.getAnalogHat(RightHatY, i));
          }
          Serial.println();
        }

        if (Xbox.getButtonClick(UP, i)) {
          Xbox.setLedOn(LED1, i);
          Serial.println(F("Up"));
        }
        if (Xbox.getButtonClick(DOWN, i)) {
          Xbox.setLedOn(LED4, i);
          Serial.println(F("Down"));
        }
        if (Xbox.getButtonClick(LEFT, i)) {
          Xbox.setLedOn(LED3, i);
          Serial.println(F("Left"));
        }
        if (Xbox.getButtonClick(RIGHT, i)) {
          Xbox.setLedOn(LED2, i);
          Serial.println(F("Right"));
        }

        if (Xbox.getButtonClick(START, i)) {
          Xbox.setLedMode(ALTERNATING, i);
          Serial.println(F("Start"));
        }
        if (Xbox.getButtonClick(BACK, i)) {
          Xbox.setLedBlink(ALL, i);
          Serial.println(F("Back"));
        }
        if (Xbox.getButtonClick(L3, i))
          Serial.println(F("L3"));
        if (Xbox.getButtonClick(R3, i))
          Serial.println(F("R3"));

        if (Xbox.getButtonClick(LB, i))
          Serial.println(F("LB"));
        if (Xbox.getButtonClick(RB, i))
          Serial.println(F("RB"));
        if (Xbox.getButtonClick(XBOX, i)) {
          Xbox.setLedMode(ROTATING, i);
          Serial.print(F("Xbox (Battery: "));
          Serial.print(Xbox.getBatteryLevel(i)); // The battery level in the range 0-3
          Serial.println(F(")"));
        }
        if (Xbox.getButtonClick(SYNC, i)) {
          Serial.println(F("Sync"));
          Xbox.disconnect(i);
        }

        if (Xbox.getButtonClick(A, i))
          Serial.println(F("A"));
        if (Xbox.getButtonClick(B, i))
          Serial.println(F("B"));
        if (Xbox.getButtonClick(X, i))
          Serial.println(F("X"));
        if (Xbox.getButtonClick(Y, i))
          Serial.println(F("Y"));
      }
    }
  }
}

Realize a transferência do código para a placa e, em seguida, abra o monitor serial do Arduino IDE para visualizar os dados recebidos. Desse modo, quando um botão do controle for pressionado, a informação será exibida na tela, conforme a Figura X.

Imagem do monitor serial do Arduino IDE exibindo os dados recebidos.
Figura 4 – Monitor serial do Arduino IDE exibindo os dados recebidos.

Observe na Figura 4 que, na aba do monitor serial, é mostrado que os dados das coordenadas no joystick e, logo após, as teclas A, X, Y e B do controle foram pressionadas.

Se você chegou até aqui, parabéns! Agora, use a criatividade para programar outros projetos.

Dúvidas? Deixe seu comentário
Estagiário no setor de desenvolvimento na Casa da Robótica

Graduando em Engenharia da Computação pela Faculdade Independente do Nordeste. Estagiário do setor de desenvolvimento da Casa da Robótica.

Bacharel em Engenharia de Computação. Um dos criadores do Blog da Robótica. Faz parte da equipe Casa da Robótica desde 2017. Apaixonado por tecnologias e pelas “loucuras” que é possível criar usando microcontroladores e impressoras 3D. Ex-BBB, mas isso é uma longa história... que poderá ser contada posteriormente.

Deixe uma pergunta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.