Paso 3: Hacer que los botones funcionan
En este punto, tenía el portátil montado, cargado de Tetris y funcionaría a través de su lazo demo cada minuto o dos. Pero quería botones! Lo siento por la falta de cuadros, estaba hasta unas 2 horas ir en este momento...
Hora de poner mi Arduino para trabajar. La ruta de acceso del botón para Game Boy se ve así:
- Boton, cerrar el circuito de tierra a uno de los pines de entrada digitales (yo usé el pull-UPS internas para que los pernos Leer normalmente alta hasta que se pulsa el botón).
- Arduino Lee entradas cada pocos milisegundos, detecta pulsar botón.
- Arduino debounces el empuje del botón.
- Arduino envía señal sobre su emulador de puerto serial incorporado para cada pulsación de botón. (Lo que ves en el monitor de Arduino serial.)
- Aplicación python lee del puerto serie, los datos brutos se asigna a la clave correcta que se empujará.
- Aplicación Python utiliza "xte" emular un keypress, alimentación para la aplicación actual. Nota: esto es específico de Linux, el código tendría que ser totalmente diferente para Windows.
- Emulador de gameboy Ve el keypress y voila(ish)!
No puede recomendar Arduino lo suficiente para este tipo de cosas. Tuve un parpadeo de los LED en 1 minuto, luego serie de comunicación hasta en 5 minutos. Por suerte tuve algún código Python ahí para leer el puerto serial por lo que el principal problema que debía resolver era conseguir la entrada en el emulador.
Para eso usé xte, que es una aplicación que puede alimentar a los eventos de entrada directamente en el servidor de la ventana. Estaba preocupado al principio porque el emulador no parece recoger las prensas; Agregar un retraso entre el abajo y eventos ayudado pero todavía fue un poco insensible.
Creo que el problema era que sólo tenía el Arduino emiten tecla eventos, lo que significa que la aplicación Python tenía que simular parejas evento arriba/abajo. Luego el emulador debe han estado haciendo su propio contra rebotes. Hubiera sido mejor clave y se asignan directamente a los mismos eventos via xte y dejar que el emulador a manejarlo.
Compartí el código en Github.