Control por libusb de un USB Missile Launcher

Siempre quise tener un arma de destrucción masiva en mi poder. Cómo imaginar que iban a ser mis compañeros de trabajo (Pere, Sergi) quienes me facilitaran el acceso a una de ellas.

El arma en cuestión:

Bromas aparte y habiendo disparado ya unos cuantos misiles a la cabeza de alguien manualmente con el software que venía en la misma caja del lanza misiles, se me ha ocurrido una aplicación para éste.

Por qué no hacer que el lanza misiles auto-apunte a targets adquiridos por una webcam?. Suena bien. -Espera, esos targets serán humanos? Es obvio.

Para empezar se necesitará tener el control sobre el usb. Para ello, he utilizado la libreria libusb. A partir de ahí se pueden realizar llamadas a cualquier dispositivo usb que haya sido identificado previamente con su productID y su vendorID.

El sistema es bastante sencillo, primero se busca e instancia el dispositivo usb que tenga el productID y vendorID deseados:

for(bus = usb_get_busses(); bus; bus = bus->next)
{
        //para cada dispositivo del bus
        for(device = bus->devices; device; device = device->next)
        {
                //comprobar productID y vendorID
                if(device->descriptor.idVendor == 6465 &&
                        device->descriptor.idProduct == 32801)
                {
                        USBMissileLauncher *newLauncher = new USBMissileLauncher(device);
                        mMissileLaunchers.push_back(newLauncher);
                }
        }
}

Una vez esté instanciado el dispositivo, se pueden llamar las funciones de inicialización de libusb:

usb_init();
usb_find_busses();
usb_find_devices();

Con esto tenemos al lanza misiles listo para escuchar órdenes.

Navegando un poco por google, encontré el mapeo en hexadecimal de cada orden que utiliza la función usb_control_msg().

  • 0x1  / 0x2 : arriba / abajo.
  • 0x4 / 0x8: izquierda / derecha.
  • 0x10: disparo.
  • 0x0: stop.

Sin embargo, pese a que el movimiento es directo, para poder disparar he tenido que enviarle, antes, dos comandos que le sirven de “init” al lanza misiles. También son parámetros de la función usb_control_msg en formato de  buffer[8].

{‘U’, ‘S’, ‘B’, ‘C’, 0, 0, 4, 0}

{‘U’, ‘S’, ‘B’, ‘C’, 0, 64, 2, 0}

Una vez enviados, se interpreta el disparo correctamente.

Ahora que se puede controlar el usb a mi antojo por source, lo adaptaré a un algoritmo de visión por computador para que de en blanco sin necesidad de dirigirlo manualmente. Pero eso será cuando encuentre otro hueco en mi agenda.

Stay tunned!

Etiquedado como , ,

Deja un comentario

Tu dirección de correo electrónico no será publicada.