, 48 tweets, 18 min read Read on Twitter
¡Vamos a construirnos una retro consola con ayuda de un arduino!
Lo primero que necesitamos, obviamente, es un arduino uno, un cable USB para conectarlo al PC y el software para poder programarlo.
Yo utilizo el Arduino IDE, lo podéis conseguir aquí: arduino.cc/en/Main/Softwa…
Una vez tengais todo instalado, toca abrir el IDE de arduino y asegurarse de que tenemos seleccionado el que toca.
Si podemos acceder a la información de la placa es que todo va bien.
Tu Arduino debería verse así.
Si es la primera vez que usas uno, te estarás preguntando qué es este trasto.
Básicamente es un microcontrolador con una placa que permite utilizarlo como kit para experimentos de electrónica.
Y qué es un microcontrolador? Pues una especie de CPU "pequeñita" con algunos extras que permite que pueda manejarse sola (o casi sola!). Gracias a Arduino podemos flashear este chip y añadir nuestros propios programas, y conectarlo a otros dispositivos.
Entonces tenemos un dispositivo que permite ejecutar programas que creemos nosotros y comunicarse con otros cacharros...
Eso significa que podemos hacernos nuestra propia consola pong! 🤓
Ok, entonces para hacerse una consola necesitamos alguna forma de input, una salida de video y, si nos queremos poner sibaritas, sonido (aunque un simple zumbido).

Pues vamos a empezar con el mando!🕹️
Hay muchas formas de hacer un input, la opción más simple es poner varios pulsadores en una PCB y conectarla al Arduino.
Pero si tienes un joystick tipo Atari, pues mejor hacerse con un conector D9, soldar algunos cables y hacerte un puerto para joysticks en tu consola 😎
En mi caso voy a conectar los cables que van al D9, cada cable va a una de las tomas digitales del Arduino, empezando por la 2 y terminando en la 6 (Up, down, left, right y el boton).
Además tenemos que conectar el pin marcado como Gnd en la toma Gnd del Arduino (Ground).
Parece que la imagen del conector da problemas asi que pongo otra!
Tenemos que conectar los UP, DOWN, LEFT, RIGHT y FIRE a los pines de Digital de Arduino.
Luego conectamos el GROUND al pin GND de Arduino.
Con eso podemos comprobar la señal eléctrica según pasa por el mando.
Volvemos al IDE de Arduino, presionamos Archivo/Nuevo y escribimos nuestro programita, le damos a subir para que lo cargue en el chip, abrimos la consola en Herramientas/Monitor serie y probamos a utilizar el mando para ver si detecta nuestros movimientos...
Éxito!
Vamos a analizar el programa, para entender qué hemos hecho.
La base de un programa de arduino es muy simple, tienes una función "setup" que sirve para inicializar cosas y una función "loop" que se ejecuta en bucle hasta que tu arduino explote o dejes de pagar a iberdrola.
En mi programa, creo unas definiciones para referirme a cada uno de los inputs del joystick, ya que soy una vaga.

En setup() inicializo los pines que esté utilizando para el joystick, marcándolos como OUTPUT (salida).

Espera, si estamos usando un joystick, eso no es un INPUT?
Tenemos que entender OUTPUT en los términos de electrónica. Configurar como output este pin significa que el sistema enviará una señal eléctrica. Esto es útil, por ejemplo, para encender un LED.

Pero nosotros queremos leer un input, en este caso un joystick, qué sentido tiene?
Pues simple, si enviamos una señal eléctrica y luego comprobamos el estado de la señal en ese pin, veremos si el circuito está abierto o cerrado. Y para eso da igual como configures el pin, si OUTPUT o INPUT.
Tenemos que pensar en términos electronicos, no estamos escribiendo software que se abstrae totalmente del hardware, del plano físico. Aquí estamos interactuando directamente con la materia 😱
Bueno, tras trollear un poco, vamos a dejar esos pinMode como INPUT simplemente por corrección política. Pero tened en cuenta que en este caso DA IGUAL, ya que lo que estamos haciendo es simplemente comprobar la corriente en ese pin.

Ah... y ese Serial.begin ???
El serial begin es simplemente para inicializar la comunicación con vuestro ordenador vía terminal. Esto es súper útil cuando estáis programando algo y queréis obtener algún input de por que vuestro programa no funciona, o si funciona que os diga FUNCIONE!
arduino.cc/en/Serial/Begin
En la función de loop() tenemos unas cuantas cosas, vamos a verlas!

Empezamos con esos misteriosos digitalWrite: básicamente sirven para definir el estado de corriente del pin, si se configuran como HIGH enviara la corriente que se use como señal de estado, normalmente 3.3v o 5v
Pero espera... si definimos el pin para que envíe esa señal, realmente hace falta hacerlo a cada ciclo de ejecución? Revisamos la documentación y resulta que no... pues vamos a moverlo al setup!

Probamos el programa y todo parece funcionar, guay!
Nos queda esta parte del loop, como puedes imaginar Serial.print sirve para poder mostrar cosas en el monitor (o consola). Utilizamos esto para poder testar nuestro montaje del joystick y asegurarnos de que está funcionando.
digitalRead puede leer el estado de un pin, que básicamente puede estar en HIGH (1) o LOW (0). Los unos y ceros de la informática!!!
A nivel electrónico, el 1 lógico se marca con un voltaje fijo, en este caso puede ser 5v o 3.3v dependiendo de la placa.
Entonces... qué estamos haciendo que me he perdido 😖

Es más fácil de lo que parece, hacemos que cada pin envíe una señal, y luego leemos el pin para ver si la señal "retorna" (o mejor dicho, si el circuito está cerrado o abierto).
Al presionar un botón o la palanca del joystick, estamos abriendo o cerrando el circuito, por lo que la lectura será distinta en cada estado.
Ya tenemos una forma lógica de leer el estado de nuestro mando!
Guay... y ese delay(1000); del final?

Es simplemente para no saturar el terminal enviando miles de mensajes, con delay hacemos que al final de cada ciclo se paré por un tiempo, en concreto los milisegundos que le indiquemos.

Aquí le decimos que espere un segundo de cada vez.
Esto está muy bien, pero ahora que tenemos un mando que podemos controlar... qué tal si mostramos algo? que para algo se llaman VIDEO juegos...

Pues vamos a ello, a mostrar una señal de video!
En cómo generar una señal de video podría dar un curso entero, pero no te asustes! Hoy vamos a ver el ejemplo más simple.

Vamos a Herramientas y seleccionamos Administrar Bibliotecas...

Dentro buscamos TVOUT y la instalamos. Esta librería hará el trabajo sucio 😎👍
Si visitamos la página de esta librería podemos obstener el pinout, o lo que es lo mismo, donde poner los cables para poder conseguir ver algo:

github.com/pkendall64/ard…
Cogemos un cable de vídeo compuesto (el típico rojo, blanco y amarillo que usas con las consolas viejas) lo pelamos y lo conectamos a la PCB, y de ahí al pin 9 y 7 un extremo, y al GND el otro.
Idealmente habría q usar resistencias, pero la mayoría de teles podrán mostrarlo igual
Yo me he adelantado y ya tengo algo funcionando 😋

Tranquilo, ahora vemos cómo!
Si tenéis las resistencias, irían tal que así:
Si las ponéis veréis que la imagen es más clara, pero no os preocupéis si no las tenéis, como digo la mayoría de teles mostrarán algo igual.
Vamos a escribir un programa muy simple para ver si nuestro frankenstein funciona:
Al darle a compilar y subir deberíais ver algo así en el televisor.

Ya tenemos vídeo!
Ten en cuenta que en mi caso he inicializado la señal como PAL, si quieres probar en modo NTSC reemplaza la línea por:
TV.begin(NTSC);

Según de donde sea tu televisor, puede que te interese/necesites inicializar la señal PAL o NTSC.
Os dejo un programa completo: una versión simple de Pong 🤓
Si pegáis esto en vuestro IDE de Arduino y compiláis, podréis echaros una partida 👍
pastebin.com/SktXZY3Y
Y si conectas el otro cable al pin de audio, verás que el ejemplo tiene sonido 🎶
Ya tenemos sonido de la era del spectrum! 🥰
Vamos a revisar por encima lo que hace el codigo de nuestra consola...

Para empezar, en el setup configuramos el joystick como ya vimos.

Además inicializamos la librería de vídeo y elegimos la fuente a utilizar (vamos a hacerlo todo en modo texto para simplificar).
Además me guardo el ancho de la pantalla, para más adelante.

Y llamo a una función resetGame(), que como su nombre indica, inicializa todos los datos de la partida: posición del jugador, puntuación, posición y dirección de la pelota.
El bucle del juego comienza comprobando si el jugador está presionando el mando a la izquierda o derecha y en caso de que la pala pueda moverse en esa dirección, actualiza su posición.
Lo siguiente es la lógica de la pelota, primero compruebo si el timer que he creado para la pelota ha llegado al máximo que quiera ponerle (en este caso 1), con esto podemos ajustar la velocidad de la pelota.
Luego intento mover la pelota en la dirección actual que tenga, si ha llegado al límite, cambiamos la dirección y reproducimos un sonido de impacto.
La dirección arriba es parecida, solo que al llegar al tope aumentamos la puntuación.
Si viaja hacia abajo, hay que comprobar si choca con la pala, o por el contrario cae al vacío infinito... en ese caso mostramos la pelota caída, reiniciamos el juego, esperamos un poco para darle tiempo al jugador a prepararse y... comienza el juego de nuevo!
Al final del loop siempre pondremos un actualizar pantalla con un delay_frame que nos sirva para sincronizar con la pantalla.
La función de updateScreen es muy simple, se encarga de limpiar la pantalla, dibujar la puntuación, pintar la pelota y la pala en sus posiciones actuales.
Y para reproducir el sonido llamamos a la función tone, los parámetros indican el pin de salida (11), la frecuencia (666) y la duración (25).
Y así de sencillo, ya tenemos una retro consola funcionando.
Ahora puedes hacer tus propios juegos, investigar cómo generar vídeo por tu cuenta, mejorar el audio... Infinitas posibilidades 😃
Missing some Tweet in this thread?
You can try to force a refresh.

Like this thread? Get email updates or save it to PDF!

Subscribe to Cristina Ramos
Profile picture

Get real-time email alerts when new unrolls are available from this author!

This content may be removed anytime!

Twitter may remove this content at anytime, convert it as a PDF, save and print for later use!

Try unrolling a thread yourself!

how to unroll video

1) Follow Thread Reader App on Twitter so you can easily mention us!

2) Go to a Twitter thread (series of Tweets by the same owner) and mention us with a keyword "unroll" @threadreaderapp unroll

You can practice here first or read more on our help page!

Follow Us on Twitter!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just three indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3.00/month or $30.00/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!