# 02 — Arquitectura y funcionamiento

> Parte de una serie de 4 documentos. Este cubre el "cómo funciona" técnico. Para contexto de qué es el producto y por qué, ver `01-vision-general.md`. Para el razonamiento detrás de cada decisión de diseño, ver `03-decisiones-de-diseno-y-problemas-resueltos.md`. Para componentes de hardware, ver `04-bom-hardware.md`.

## Arquitectura de componentes

### Lado del pen (hardware nuevo a construir)
- **MCU con BLE integrado** — recibe datos del IMU y el micrófono, se comunica con el celular.
- **IMU de 6 ejes** (acelerómetro + giroscopio) — mide el movimiento fino de la mano al escribir.
- **Micrófono MEMS** con buena respuesta en banda ultrasónica (~20-22kHz), ubicado a ~3cm de la punta — capta los pulsos del celular.
- **Sensor de presión en la punta** — detecta contacto con el papel y activa la captura de escritura.
- **Sensor de contacto en el extremo opuesto** (zona de la goma/borrado) — detecta modo borrado.
- **Dos botones físicos** en el tercio superior del barrel — navegación de página (anterior/siguiente).
- **Batería recargable pequeña + circuito de carga + conector USB-C.**

### Lado del celular (sin hardware nuevo, solo software)
- **Los dos parlantes ya existentes** actúan como dos anclas de posición conocida, emitiendo los pulsos ultrasónicos.
- **App** que genera esos pulsos sincronizados, recibe los datos del pen por BLE, corre el algoritmo de fusión de sensores, y alimenta el motor de reconocimiento de escritura.

## Diagrama de flujo

```mermaid
flowchart TB
    subgraph MOVIL["📱 Móvil (modo escritura)"]
        SPK1[Parlante 1]
        SPK2[Parlante 2]
        BLE_M[Radio BLE]
        APP[App: motor de fusión + reconstrucción]
        SPK1 --> APP
        SPK2 --> APP
        BLE_M <--> APP
    end

    subgraph PEN["🖊️ Pen"]
        IMU[IMU: accel + gyro]
        MIC[Micrófono]
        MCU[Microcontrolador]
        BLE_P[Radio BLE]
        BTN["Botones página +\nsensor borrado"]
        IMU --> MCU
        MIC --> MCU
        BTN --> MCU
        MCU --> BLE_P
    end

    SPK1 -- "pulso ultrasónico A (f1)" --> MIC
    SPK2 -- "pulso ultrasónico B (f2)" --> MIC
    BLE_P <-- "timestamps + datos IMU + eventos de botón" --> BLE_M

    APP --> FUSION["Filtro de Kalman:\nfusiona posición acústica (absoluta, ruidosa, ~20-50Hz)\ncon integración IMU (relativa, suave, alta frecuencia)"]
    FUSION --> TRAZO["Trazo reconstruido 2D"]
    TRAZO --> RECON["Reconocimiento de escritura online"]
    RECON --> DOC["Texto digital → plataforma de documentos/grafo"]
```

## Pipeline paso a paso

### 0. Calibración de la distancia entre parlantes
La separación entre los dos parlantes varía según el modelo de teléfono, así que hay que calibrarla en vez de asumir un valor fijo. Se resuelve en dos etapas:

**a) Calibración inicial de un toque (una sola vez por dispositivo)**
Al configurar el pen por primera vez, el usuario apoya la punta directamente sobre cada parlante, uno por vez. En ese instante el tiempo de vuelo es ~0, así que ese momento sirve como offset de referencia. Con el pen luego tocando una tercera posición conocida, se triangula por geometría la distancia real entre ambos parlantes. Este valor se guarda en el perfil del dispositivo y no hace falta repetirlo en sesiones futuras.

**b) Auto-reajuste continuo con el IMU**
Durante el uso normal, cuando el sistema detecta un trazo recto y corto (el margen de un renglón, el asta de una "l"), usa la longitud de ese trazo medida por el IMU como referencia, y ajusta el parámetro de distancia entre parlantes hasta que la triangulación acústica coincida. Optimización de una sola variable, corre en segundo plano, sin pedirle nada extra al usuario.

### 1. Sincronización de reloj
Móvil y pen sincronizan su clock vía BLE (necesario para medir tiempo de vuelo del sonido con precisión).

### 2. Emisión de pulsos acústicos
El móvil emite pulsos ultrasónicos (~20-22 kHz) alternando entre parlante 1 y parlante 2, cada uno identificable por frecuencia o código distinto.

### 3. Captura en el pen
El micrófono del pen detecta cada pulso; por tiempo de vuelo se calcula la distancia a cada parlante:
```
distancia = tiempo_vuelo × velocidad_del_sonido (≈343 m/s)
```

### 4. Triangulación (posición absoluta, baja frecuencia)
Con las dos distancias y la separación conocida entre parlantes, se triangula la posición 2D del pen. Da posición absoluta, pero a ~20-50 Hz y con ruido.

### 5. Integración del IMU (relativa, alta frecuencia)
El IMU mide aceleración y rotación a cientos de Hz. Integrando dos veces se obtiene trayectoria relativa suave, pero con deriva si no se corrige.

### 6. Fusión con filtro de Kalman
Combina ambas señales: la posición acústica corrige la deriva del IMU, el IMU suaviza los saltos entre mediciones acústicas. Resultado: trayectoria 2D fiel al trazo real.

### 7. Reconocimiento de escritura
La trayectoria reconstruida (secuencia de puntos x,y en el tiempo) se pasa a un modelo de reconocimiento de escritura online (reconocimiento de trazos, no OCR de imagen estática) para convertir a texto.
