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