Controles de pinball externos para una tableta con Android

Con este truco de Ruben , se pueden  agregar controles flipper pinball externas a un dispositivo  Android.
Para ellos Rubén decidióir con la TI Launchpad para este proyecto. La placa   MSP430 dev ofrece comunicaciones serie a través de una conexión USB, pero no es tan fácil encontrar el cable correcto. En este caso la tableta soporta USB On the Go (OTG), pero la placa se identifica como un dispositivo de ACM que debe ser manejado de manera diferente.
Con el fin de conseguir la tableta de hablar con el Launchpad compiló un módulo CDC_ACM de los fundamentos de Linux que componen cada sistema operativo Android. En este caso, el módulo se adapta para el chip de Allwinner A10 dentro de su modelo de tableta, pero no debe ser demasiado difícil de adaptar su guía para otros procesadores.

La idea se basa en conectar un MSP430 a un dispositivo Android (de hecho, la idea era utilizar el MSP430 Launchpad como caja de GPIO de bajo costo para una tableta de Android ).Pero Ruben, y pensó en el puerto de audio para la comunicación, y  entonces pensó    en    la  compatibilidad  USB OTG. Por lo tanto, ha compilado el módulo CDC_ACM de la tableta (Allwinner A10 based) para emular el puerto serie a través de USB.
Luego, en el lado MSP430 Launchpad, necesitaba una librería para usar el puerto serie. Encontró MSP430-softuart por Stefan Wendler y lo utilizó para la comunicación bidireccional en Android Tablet MSP430-Launchpad.

Para hacer una demostración, ha modificado el código de fuente abierta Pinball vectorial añadiendo soporte para el acceso al puerto serie (utilizando serialport-api de Google . Este Pinball Vector modificado tiene las aletas vinculados a MSP430 botones de Launchpad. Cuando se pulsan los botones en P2.5 y P2.3 estén flippers se activan. Un LED también está conectado en P1.6 para activarlo cuando se recibe el comando «palanca» de la aplicación para Android.

Vídeo de demostración aquí:

 

 

Este es el código fuente para el MSP430

#include 
#include 

#include "uart.h"

#define LED1 BIT0
#define LED2 BIT6
#define BUTTON1 BIT5
#define BUTTON2 BIT3

static volatile bool r = false;
static volatile bool l = false;

int main(void)
{
   WDTCTL = WDTPW + WDTHOLD;  // Stop watchdog timer 

   BCSCTL1 = CALBC1_1MHZ;  // Initialize clock  
   DCOCTL = CALDCO_1MHZ;

   P1DIR |= (LED1 + LED2); // Set BIT0 and BIT6 as output
   P1OUT &= ~(LED1 + LED2); // LEDs off

   P2REN |= (BUTTON1 + BUTTON2); // Select pull-up resitors por P2.3 and P2.5

   P2IE |= (BUTTON1 + BUTTON2); // Enabling Button interrupts

   P2IFG &= ~(BUTTON1 + BUTTON2); // Clear interrupt flags for the buttons

   uart_init();

   __enable_interrupt();

   uint8_t c;

   while(1)
   {
      if(uart_getc(&c)) {
         if (c == 't')
         {
            P1OUT ^= (LED2); // Toggle LED2          
         }
      }
      if (l)
      {
            uart_putc('l'); // Send "left" command via UART
            l = false;
      }
      if (r)
      {
            uart_putc('r'); // Send "right" command via UART
            r = false;
      }
   }
}

// Port 2 interrupt service
#pragma vector=PORT2_VECTOR

__interrupt void Port_2(void)
{
   if ((P2IFG & BUTTON2))
   {
      P1OUT ^= LED1;  // Toggle LED1
      P2IFG &= ~BUTTON2; // Clear BUTTON2 interrupt flag  
      P2IES ^= BUTTON2; // Interrupt called on High-to-Low and Low-to-High 
      l = true;
   }
   if ((P2IFG & BUTTON1))
   {
      P1OUT ^= LED1; // Toggle LED1
      P2IFG &= ~BUTTON1; // Clear BUTTON1 Interrupt flag
      P2IES ^= BUTTON1; // Interupt called on High-to-Low and Low-to-High
      r = true;
   }

}

Por supuesto, usted podría ir una ruta diferente y  usar  Bluetooth para la conectividad. Hemos visto varios periféricos para juegos que utilizan esta técnica con dispositivos Android.

Fuente aqui

Deja una respuesta