> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oryx.mechatronstudio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Firmware del ESP32

> Qué es el sketch, cómo cargarlo y qué topes tiene.

El generador necesita un sketch cargado una sola vez. Recibe la señal que está
abierta en el editor y la reproduce por sus salidas.

<Note>
  **No se conecta a internet, ni a una nube, ni a ningún servidor**: el enlace es
  siempre punto a punto, por el cable USB.
</Note>

## Qué hace falta

| Qué                | Detalle                                            |
| ------------------ | -------------------------------------------------- |
| Placa              | ESP32 clásica (WROOM / DevKit v1)                  |
| Core               | Arduino para ESP32, 2.x o 3.x                      |
| Librerías externas | Ninguna                                            |
| Archivo            | `firmware/oryx_signal_esp32/oryx_signal_esp32.ino` |

## Cómo se carga

<Steps>
  <Step title="Instalar el core">
    Arduino IDE → Gestor de tarjetas → **esp32 by Espressif Systems**.
  </Step>

  <Step title="Elegir la placa">
    *ESP32 Dev Module*, y el puerto donde está conectada.
  </Step>

  <Step title="Subir el sketch">
    Abrir `oryx_signal_esp32.ino` y subir. No necesita librerías externas.
  </Step>

  <Step title="Cerrar el monitor serie">
    Antes de conectar desde la app: si está abierto, el puerto queda ocupado.
  </Step>
</Steps>

El monitor serie (115200) muestra un saludo al arrancar. Todo lo que imprime el
equipo para que lo lea una persona va con `#` adelante, para no confundirse con
las respuestas del protocolo.

<Tip>
  El código del firmware también está dentro de la app, en **Dispositivo →
  Firmware para el ESP32**, con un botón para copiarlo.
</Tip>

## Salidas

| Modo          | Dónde sale                                                                     |
| ------------- | ------------------------------------------------------------------------------ |
| **Digital**   | GPIO 16, 17, 18, 19, 21, 22, 23, 13 — un pin por canal, en el orden del editor |
| **Analógico** | GPIO 25 (DAC1) y GPIO 26 (DAC2) — hasta dos canales                            |

### Voltaje

En **analógico**, el voltaje escala directo lo que sale por el DAC, entre 0 y
3,3 V.

En **digital**, un pin no sabe de niveles intermedios: sale a 3,3 V o a 0. Ahí
el valor de voltaje se saca por **GPIO 25 como tensión de referencia continua**,
pensada para alimentar la etapa externa —divisor, buffer o traductor de nivel—
que fija la altura real de los pulsos.

<Warning>
  Sin esa etapa externa, los pines salen siempre a 3,3 V y el ajuste de voltaje no
  cambia nada.
</Warning>

## Topes del equipo

| Qué                            | Cuánto |
| ------------------------------ | ------ |
| Canales digitales              | 8      |
| Canales analógicos             | 2      |
| Cambios de estado (digital)    | 2048   |
| Muestras por canal (analógico) | 6000   |
| Tiempo de paso mínimo          | 5 µs   |

Si tu señal no entra, la app te lo dice antes de mandarla y te explica qué se
ajustó.

## Ciclos y tiempo de paso

Los dos ajustan lo mismo desde dos lados:

* Con **ciclos en 0**, manda el tiempo de paso tal cual.
* Con **ciclos en más de 0**, una vuelta entera de la señal es una vuelta del
  motor:

```
tiempo de paso (µs) = 60 000 000 / (rpm × pasos totales)
```

Cambiar cualquiera de los dos **rehace la vuelta que está en curso**, para que
el cambio se vea en el osciloscopio en el momento. El contador de vueltas no se
pone en cero: para eso está *Reiniciar*.

## Cuándo se para sola la señal

Si el cable se suelta o cierras la pestaña, la señal se para y las salidas bajan.
Es a propósito: el equipo no puede enterarse de que del otro lado ya no hay
nadie, así que si pasa un rato sin recibir órdenes da el enlace por terminado.
