Slither[1] es un simpático juego online tipo snake[2], es multiplayer y el
gusanito se alimenta tanto de la comida que va creciendo en el tablero como de los
otros gusanos al morir, lo que ocurre al chocar la cabeza contra el cuerpo de algún
otro.
Se maneja mediante el mouse para apuntar hacia donde ir y el botón principal para acelerar. El gusano va hacia donde esté el cursor del mouse, lo cual no es muy amigable para hacer maniobras bruscas y más para mi que no soy muy diestro y al estar prestando atención a la ubicación de
la comida y los demás gusanos, se me corre el puntero del mouse y
eventualmente hago maniobras incorrectas.
Me imaginé que si tuviera un paddle[3] me iría mejor, así que decidí hacerme uno.
¿Por
que mejor no te lo comprás? me podrías preguntar. Pues, por que no
alcanza, hay que hacer algunas configuraciones para que el movimiento
"circular" del paddle, en una sola dimensión, o sea, que gire para un lado u otro, se convierta
en un movimiento de rotación alrededor de un punto del puntero en dos dimensiones.
No
dije "el puntero del mouse", pues está claro que el puntero se puede
mover con el mouse, el teclado o un joystick. Si tuviera un paddle
debería escribir un programa y modificar alguna configuración para que
se hiciera esa conversión en la máquina. Y probablemente tendría que configurar o iniciar algo
cada vez que lo use.
Me parece mejor
hacer un paddle que se haga pasar por un mouse y genere el movimiento de
rotación por si mismo, que funcione igual en cualquier equipo que
entienda un mouse.
La tarea entonces es hacer algo que gire,
medirlo, transformarlo en dos desplazamientos en X e Y para finalmente pasarlo a la
computadora como si fueran eventos de un mouse.
Necesito además tres botones:
- El botón principal para acelerar.
- Un botón para aumentar el radio.
- Otro para disminuirlo.
Los dos últimos son "internos" al dispositivo, ajustan el radio de giro, la computadora no los conoce.
El escenario de uso es:
- Posicionarse sobre el gusano
- Conectar el paddle
- Aumentar el radio, el puntero se desplazará hacia arriba
- Usar
- En cualquier momento, se puede cambiar el radio
Las actividades iniciales que hay que llevar a cabo son:
- Inyectar eventos, ya sea como mouse usb o serial.
- Leer un encoder rotativo.
- Transformar un desplazamiento en una sola dimensión en un movimiento circular.
- Construir un encoder rotativo resistente.
- Interfasear componentes.
Los elementos de los que dispongo son:
- Microcontroladores
- edu-ciaa-nxp [4]
- teensy [5]
- attiny85
- attiny85 con uart usb
- atmega 328
- Sensores
- encoder rotativo tipo potenciómetro
- encoder de un mouse de bolita
- cámara sensora de un mouse óptico.
Esta es la idea más general:
+----+ +------------+ +----------------+ +--------+
| PC +---+ usb/serial +---+ transformación +---+ sensor +
+----+ +------------+ +----------------+ +--------+
La edu-ciaa-nxp es la más potente de las opciones, la mejor para hacer debug, la que más dispositivos tiene y además tiene una importante comunidad [6] pero es overkill para producción. Probablemente se pueda registrar como un mouse serial con sencillez.
Teensy tiene el hardware y las librerías para registrase como mouse, teclado, joystick, midi y me parece que pendrive, pero tambien es overkill
Attiny85 serviría para algunas pruebas, pues sólo tiene 6 pines. El que tiene uart usb tiene 4, dos los usa en la uart.
Atmega 328 sería lo más económico, pero me obligaría a incursionar en conectarle la electrónica extra para comunicarse ya sea uart o usb.
Tengo un poquito de experiencia en todos salvo Attiny85. Atmega 328 incluso lo he programado con ISP y tengo una entrada casi lista para publicar.
El encoder tipo potenciómetro es apto para experimentar pero no para uso pesado.
El otro encoder me traería un desafío de tipo mecánico.
El sensor del mouse óptico vé en dos dimensiones, pero con que registre en una sola mirando alguna superficie del elemento giratorio, alcanzaría. El único problema es que no puedo hallar el USB que tenía, así que voy a usar un PS/2 con un adaptador a USB, es lo que hay...
Adicionalmente, en lugar de usar las partes del mouse, mejor se podría modificar al mouse.
+------------------------------------+
| mouse |
+----+ | +-----+ +---------+ +--------+ |
| PC +-----+ usb +---+ micro +---+ sensor + |
+----+ | +-----+ +-+-----+-+ +--------+ |
| | | |
| +-------+-+ +-+-------+ |
| | botón 1 | | botón 2 | |
| +---------+ +---------+ |
+------------------------------------+
El
microcontrolador en el medio haría la conversión a (X,Y) e interpretaría a los botones, mmh, quizás alcance con 6 entradas/salidas. En ese caso el Attiny85 sería lo más sencillo y barato.
Apuntaré a esta última solución, pero aprovecharé
la facilidad de uso de la edu-ciaa-nxp para los prototipos, quizás luego pase por teensy.
Voy a tener que seguir mi habitual método de planificación adaptativa, que es mucho más adaptativa que planificación y más o menos se parece a esto:
- Inyectar eventos usb
- Con teensy
- Con edu-ciaa-nxp
- Transformación
- Con papel y lápiz
- Con php en la pc
- Con c en la pc
- Con c en edu-ciaa-nxp
- Con c en teensy/attiny/atmega
- Lectura encoder
- Encoder existente
- Encoder construido
- Construcción encoder
- Con piezas giratorias de mouse mecánico
- Con sensor óptico
- Interfases
- 5v a 3.3v para conectar encoder existente a edu-ciaa-nxp
- modificar los mensajes del sensor óptico con edu-ciaa-nxp
- con solución final
Como hay múltiples caminos posibles, no los hago explícitos, pero el éxito de algunos puntos produce que no haga falta transitar todos.
Sigue en
Slither - 2 - encoder con edu-ciaa-nxp
[1] http://slither.io/
[2] https://en.wikipedia.org/wiki/Snake_%28video_game%29
[3] https://en.wikipedia.org/wiki/Game_controller#Paddle
[4] http://proyecto-ciaa.com.ar/devwiki/doku.php?id=desarrollo:edu-ciaa:edu-ciaa-nxp
[5] https://www.pjrc.com/teensy/
[6] http://proyecto-ciaa.com.ar/ y sus varios foros
https://groups.google.com/forum/#!forum/ciaa-firmware
https://groups.google.com/forum/#!forum/ciaa-hardware
https://groups.google.com/forum/#!forum/ciaa-ide
https://groups.google.com/forum/#!forum/ciaa-linux