# Pico Invaders

Hoy os proponemos un proyecto rápido y muy divertido donde, además de usar nuestra querida impresora 3D, usaremos la Raspberry Pi Pico para fabricar nuestro propio juego arcade retro: **Pico Invaders**. Con unos pocos componentes, algo de MicroPython y piezas impresas en 3D tendréis un juego completamente funcional en las manos.

## ¿Qué es MicroPython?

MicroPython es una implementación de Python 3 escrita en C, diseñada específicamente para microcontroladores y dispositivos embebidos. Nos permite programar hardware como la Raspberry Pi Pico usando una sintaxis muy cercana a Python estándar, sin necesidad de compilar el código.

{% hint style="info" %}
MicroPython no es compatible con todas las librerías estándar de Python 3. Algunas funciones avanzadas no están disponibles, pero para proyectos de hardware como este es más que suficiente.
{% endhint %}

## Componentes necesarios

Para este proyecto necesitaremos los siguientes componentes:

* [Pulsador 12mm](https://www.amazon.es/GTIWUNG-Interruptor-Momentaneo-Moment%C3%A1neo-Utilizado/dp/B08VNB6BX5/ref=sr_1_41?tag=3dwork-21)
* [Pantalla OLED 0,96" I2C SSD1306 128x64 píxeles](https://www.amazon.es/dp/B074N9VLZX?tag=3dwork-21)
* [Raspberry Pi Pico](https://www.amazon.es/microcontrolador-Raspberry-procesador-Dual-Core-Compatible/dp/B09TSWP4RV/ref=sr_1_24?tag=3dwork-21)
* [Buzzer pasivo](https://www.amazon.es/gp/product/B07RDHNT1P/ref=ewc_pr_img_2?tag=3dwork-21)
* [Piezas impresas (Printables)](https://www.printables.com/model/72272-rpi-pico-arcade)

## Impresión 3D

Lo primero es descargar el modelo desde Printables, diseñado por [thatdecade](https://www.printables.com/social/48474-thatdecade). Las piezas encajan por fricción, sin necesidad de tornillos ni pegamento.

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/y9c32VlJz6dv56w0Hnwm/image.png" alt="Modelo Pico Arcade en Printables"><figcaption><p>Modelo Pico Arcade disponible en Printables</p></figcaption></figure>

Si queréis personalizar el texto de la parte superior de la carcasa, podéis hacerlo directamente desde Bambu Studio usando la herramienta de texto sobre el modelo. En pocos minutos tendréis vuestra versión personalizada lista para imprimir.

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/Y9PnnPBpGssJzX8IXrIY/image.png" alt="Personalización del texto en Bambu Studio"><figcaption><p>Personalización del texto en Bambu Studio</p></figcaption></figure>

{% hint style="warning" %}
Soldad los cables a los pulsadores **antes** de insertarlos en la carcasa. Una vez encajados es muy difícil sacarlos sin dañar las piezas.
{% endhint %}

## Configuración de MicroPython en la Pi Pico

Antes de ensamblar todo, vamos a preparar el entorno de programación. El proceso es sencillo y tarda menos de 5 minutos.

{% stepper %}
{% step %}

#### Descargar el firmware

Descargad el firmware UF2 correspondiente a vuestra placa:

* [Firmware Raspberry Pi Pico](https://micropython.org/download/rp2-pico/rp2-pico-latest.uf2)
* [Firmware Raspberry Pi Pico W (con Wifi)](https://micropython.org/download/rp2-pico-w/rp2-pico-w-latest.uf2)
  {% endstep %}

{% step %}

#### Flashear el firmware

Mantened pulsado el botón **BOOTSEL** de la Pi Pico mientras la conectáis al ordenador por USB. Soltad el botón una vez conectada.

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/5toyvzil0GrrDnlKzrk2/image.png" alt="Botón BOOTSEL en la Raspberry Pi Pico"><figcaption><p>Mantened BOOTSEL pulsado al conectar el USB</p></figcaption></figure>

La Pico aparecerá como una unidad de almacenamiento llamada **RPI-RP2**. Arrastrad el archivo UF2 descargado a esa unidad. La Pico se reiniciará automáticamente con MicroPython instalado.

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/0wHhW03n2aLtJjBNcxoo/image.png" alt="Unidad RPI-RP2 en el explorador de archivos"><figcaption><p>Copiar el firmware UF2 a la unidad RPI-RP2</p></figcaption></figure>

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/TAT6obpF8ZeIyDg21yNm/image.png" alt="Selección del firmware UF2 correcto"><figcaption><p>Seleccionad el firmware según vuestro modelo de Pico</p></figcaption></figure>
{% endstep %}

{% step %}

#### Instalar Thonny IDE

Descargad e instalad [Thonny](https://thonny.org/), el IDE más sencillo para trabajar con MicroPython. Es multiplataforma (Windows, Mac, Linux) y detecta la Pi Pico automáticamente.

Una vez abierto, id a **Tools → Options → Interpreter** y seleccionad **MicroPython (Raspberry Pi Pico)**.

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/YY9Oz7GbNEqCZuDWpeqB/image.png" alt="Configuración del intérprete en Thonny"><figcaption><p>Seleccionad MicroPython (Raspberry Pi Pico) como intérprete</p></figcaption></figure>

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/e7uMXStBmOzC1NXdyhzg/image.png" alt="Thonny conectado a la Pi Pico"><figcaption><p>Thonny listo para programar la Pi Pico</p></figcaption></figure>
{% endstep %}
{% endstepper %}

{% embed url="<https://www.raspberrypi.com/documentation/microcontrollers/micropython.html>" %}

## Ensamblado

Con el firmware instalado y el entorno listo, toca ensamblar el hardware.

Las piezas impresas encajan por presión, sin necesidad de pegamento. El orden recomendado es:

1. Soldad los cables a los **pulsadores** antes de montarlos en la carcasa (una vez encajados no salen sin forzar)
2. Insertad los pulsadores en sus alojamientos hasta que encajen
3. Conectad la **pantalla OLED** a la Pi Pico (I2C: SDA → GP0, SCL → GP1)
4. Conectad el **buzzer** (GP15 o el pin que indique el código)
5. Introducid la Pi Pico en su alojamiento con los cables recogidos hacia el fondo de la carcasa

{% hint style="danger" %}
El botón **BOOTSEL** de la Pi Pico queda accesible desde el interior de la carcasa y puede pulsarse accidentalmente. Si el juego no arranca, comprobad que no esté presionado.
{% endhint %}

## Programación

### Prueba inicial: blink LED

Antes de cargar el juego, comprobad que todo está correcto con este script de prueba. Si el LED integrado de la Pi Pico parpadea, el entorno funciona perfectamente.

```python
from machine import Pin, Timer
led = Pin(25, Pin.OUT)
timer = Timer()

def blink(timer):
    led.toggle()

timer.init(freq=2.5, mode=Timer.PERIODIC, callback=blink)
```

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/HHwbphbYk9UUPNQncP9S/image.png" alt="Test blink en Thonny"><figcaption><p>El LED integrado parpadea si el entorno es correcto</p></figcaption></figure>

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/ueSrEwX2Sltaiu7ZzY2H/image.png" alt="Código blink ejecutándose en Thonny"><figcaption><p>Ejecución del test en Thonny</p></figcaption></figure>

### Librería SSD1306

Para que la pantalla OLED funcione necesitáis instalar la librería `ssd1306`. Descargadla y copiadla a la Pi Pico usando Thonny (guardad el archivo directamente en la placa):

{% embed url="<https://github.com/stlehmann/micropython-ssd1306/blob/master/ssd1306.py>" %}

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/RPk97Hh99t0aHi1a8TY0/image.png" alt="Librería ssd1306 en Thonny"><figcaption><p>Copiad ssd1306.py a la Pi Pico desde Thonny</p></figcaption></figure>

### Código Pico Invaders

Con la librería instalada, ya podéis cargar el código del juego. Descargad `PicoInvadersWithButtons.py` del repositorio de printnplay y copiadlo a la Pi Pico con Thonny. Guardadlo como `main.py` para que se ejecute automáticamente al encender la Pico.

{% embed url="<https://github.com/printnplay/Pico-MicroPython/blob/main/PicoInvadersWithButtons.py>" %}

<figure><img src="https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/j6nNo5si9y1zPO9Uvs6O/image.png" alt="Pico Invaders en funcionamiento"><figcaption><p>Pico Invaders en marcha</p></figcaption></figure>

![](https://content.gitbook.com/content/4SOiUz9PiuHFIwg2qk03/blobs/EsHIpzMxoWiD27L5Wq9b/image.png)
