Usando el Controlador Xbox ONE en Wio Terminal
Este repositorio presenta cómo usar un Controlador Xbox ONE en Wio Terminal. Con este ejemplo, puedes implementar el uso de un Controlador Xbox para jugar juegos usando el Wio Terminal!

Requisitos
Para trabajar con este ejemplo, necesitarás un Adaptador USB OTG y un Módulo USB a Serial, donde el adaptador OTG se usa para conectar con el controlador Xbox y el módulo USB a Serial para leer las salidas del Wio Terminal.
Nota: Se usa el Controlador Xbox ONE en este ejemplo. Si usas un controlador Xbox 360 o clones, por favor revisa XBOXOLD.ino
en el ejemplo.
Procedimientos
-
Sube el código al Wio Terminal usando
Arduino IDE
. -
Desconecta el cable USB tipo-C del Wio Terminal que se usó para subir el código.
-
Conecta tu Controlador Xbox ONE al adaptador OTG y luego al puerto USB-C del Wio Terminal.
Controlador Xbox ONE
->Adaptador OTG
->Wio Terminal(Puerto Tipo-C)
-
Conecta el Módulo USB a Serial al Wio Terminal como sigue:
TXD(Módulo USB a Serial)
->RXD(Pin 10 en Wio Terminal)
RXD(Módulo USB a Serial)
->TXD(Pin 8 en Wio Terminal)
3.3V(Módulo USB a Serial)
->3.3V(Pin 1 en Wio Terminal)
GND(Módulo USB a Serial)
->GND(Pin 6 en Wio Terminal)
-
Conecta el Módulo USB a Serial a tu computadora. Dependiendo de qué Módulo USB a Serial uses, descarga el controlador USB para el módulo para que tu computadora pueda reconocerlo.
-
Para usuarios de Windows, puedes abrir el Administrador de Dispositivos para verificar si es reconocido. Debería aparecer un nuevo
COM
.- Para usuarios de Mac, usa
ls /dev/cu.*
en terminal para verificar la disponibilidad del módulo.
- Para usuarios de Mac, usa
-
Para ver datos del Serial:
-
Windows: Descarga e instala PuTTY. Selecciona
Serial
y cambia elCOM
en línea Serial al COM que apareció en el Administrador de Dispositivos, también cambia la Velocidad a115200
y presiona Abrir. Debería aparecer una Terminal. Ahora, si empiezas a presionar botones en el controlador Xbox ONE, deberías ver la salida serial! -
Mac: Abre terminal e instala
screen
usandobrew install screen
. Una vez instalado, usa el comandoscreen /dev/cu.usbserial 115200
donde/dev/cu.usbserial
debería coincidir con lo anterior. Deberías poder ver la salida serial del Wio Terminal!
-
Nota Importante: Porque el puerto USB del Wio Terminal está siendo usado para USB, para subir otro programa al Wio Terminal requiere entrar al modo Bootloader presionando el botón de encendido dos veces(el LED se atenuará), entonces deberías poder ver el puerto nuevamente.
Configuraciones de Host USB
Para habilitar Host USB en Wio Terminal, debes configurar dos pines. Necesitas establecer PIN_USB_HOST_ENABLE
a LOW y OUTPUT_CTR_5V
a HIGH.
Puedes hacer esto simplemente agregando el siguiente código en el void setup()
:
digitalWrite(PIN_USB_HOST_ENABLE, LOW);
digitalWrite(OUTPUT_CTR_5V, HIGH);
Código Completo
#include <XBOXONE.h>
#define SerialDebug Serial1
USBHost UsbH;
XBOXONE Xbox(&UsbH);
void setup() {
SerialDebug.begin(115200);
if (UsbH.Init()) {
SerialDebug.print(F("\r\nUSB host did not start"));
while (1); //halt
}
SerialDebug.print(F("\r\nXBOX USB Library Started"));
//Coqnfigure pins to enable USB Host on Wio Terminal
digitalWrite(PIN_USB_HOST_ENABLE, LOW);
digitalWrite(OUTPUT_CTR_5V, HIGH);
}
void loop() {
UsbH.Task();
if (Xbox.XboxOneConnected) {
if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500 || Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500 || Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500 || Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
if (Xbox.getAnalogHat(LeftHatX) > 7500 || Xbox.getAnalogHat(LeftHatX) < -7500) {
SerialDebug.print(F("LeftHatX: "));
SerialDebug.print(Xbox.getAnalogHat(LeftHatX));
SerialDebug.print("\t");
}
if (Xbox.getAnalogHat(LeftHatY) > 7500 || Xbox.getAnalogHat(LeftHatY) < -7500) {
SerialDebug.print(F("LeftHatY: "));
SerialDebug.print(Xbox.getAnalogHat(LeftHatY));
SerialDebug.print("\t");
}
if (Xbox.getAnalogHat(RightHatX) > 7500 || Xbox.getAnalogHat(RightHatX) < -7500) {
SerialDebug.print(F("RightHatX: "));
SerialDebug.print(Xbox.getAnalogHat(RightHatX));
SerialDebug.print("\t");
}
if (Xbox.getAnalogHat(RightHatY) > 7500 || Xbox.getAnalogHat(RightHatY) < -7500) {
SerialDebug.print(F("RightHatY: "));
SerialDebug.print(Xbox.getAnalogHat(RightHatY));
}
SerialDebug.println();
}
if (Xbox.getButtonPress(L2) > 0 || Xbox.getButtonPress(R2) > 0) {
if (Xbox.getButtonPress(L2) > 0) {
SerialDebug.print(F("L2: "));
SerialDebug.print(Xbox.getButtonPress(L2));
SerialDebug.print("\t");
}
if (Xbox.getButtonPress(R2) > 0) {
SerialDebug.print(F("R2: "));
SerialDebug.print(Xbox.getButtonPress(R2));
SerialDebug.print("\t");
}
SerialDebug.println();
}
// Set rumble effect
static uint16_t oldL2Value, oldR2Value;
if (Xbox.getButtonPress(L2) != oldL2Value || Xbox.getButtonPress(R2) != oldR2Value) {
oldL2Value = Xbox.getButtonPress(L2);
oldR2Value = Xbox.getButtonPress(R2);
uint8_t leftRumble = map(oldL2Value, 0, 1023, 0, 255); // Map the trigger values into a byte
uint8_t rightRumble = map(oldR2Value, 0, 1023, 0, 255);
if (leftRumble > 0 || rightRumble > 0)
Xbox.setRumbleOn(leftRumble, rightRumble, leftRumble, rightRumble);
else
Xbox.setRumbleOff();
}
if (Xbox.getButtonClick(UP))
SerialDebug.println(F("Up"));
if (Xbox.getButtonClick(DOWN))
SerialDebug.println(F("Down"));
if (Xbox.getButtonClick(LEFT))
SerialDebug.println(F("Left"));
if (Xbox.getButtonClick(RIGHT))
SerialDebug.println(F("Right"));
if (Xbox.getButtonClick(START))
SerialDebug.println(F("Start"));
if (Xbox.getButtonClick(BACK))
SerialDebug.println(F("Back"));
if (Xbox.getButtonClick(XBOX))
SerialDebug.println(F("Xbox"));
if (Xbox.getButtonClick(SYNC))
SerialDebug.println(F("Sync"));
if (Xbox.getButtonClick(L1))
SerialDebug.println(F("L1"));
if (Xbox.getButtonClick(R1))
SerialDebug.println(F("R1"));
if (Xbox.getButtonClick(L2))
SerialDebug.println(F("L2"));
if (Xbox.getButtonClick(R2))
SerialDebug.println(F("R2"));
if (Xbox.getButtonClick(L3))
SerialDebug.println(F("L3"));
if (Xbox.getButtonClick(R3))
SerialDebug.println(F("R3"));
if (Xbox.getButtonClick(A))
SerialDebug.println(F("A"));
if (Xbox.getButtonClick(B))
SerialDebug.println(F("B"));
if (Xbox.getButtonClick(X))
SerialDebug.println(F("X"));
if (Xbox.getButtonClick(Y))
SerialDebug.println(F("Y"));
}
delay(1);
}