obd2_gauge/hardware/GPS_N32_INTEGRACION.md
Sebastian Nieto d124d013ab feat(ui): transiciones fluidas de 4 pantallas, integracion GPS y buffer de transicion persistente sin fragmentacion de memoria
- Buffer de transicion persistente (sprTrans) de 25KB asignado una sola vez en setup() para evitar fallos de memoria heap contigua
- Eliminacion de carga y descarga dinamica de fuentes en renderPage2ToSprite durante las transiciones para evitar fugas de RAM
- Timeout de seguridad por hardware de 250ms en waitForTouchRelease() para prevenir bloqueos por ruido en la lamina resistiva
- Pantallas 2 y 3: Reloj atomico GPS con DSEG7 de 80pt y Telemetria satelital completa (rumbo, satelites, altitud, coordenadas)
- Documentacion de conexion y pines para modulo GPS N32+/U-blox
2026-10-11 18:33:03 -03:00

6.2 KiB

Integración Módulo GPS N32+ con Modo Reposo por Comandos UBX

Placa ESP32-2432S028 (CYD)

Este documento detalla la conexión física, el protocolo binario para poner a dormir y despertar el módulo GPS N32+ (U-blox) mediante comandos serie, y el esquema de integración con el firmware del instrumental OBD-II.


1. Especificaciones y Pinout del Módulo N32+ GPS

Pinout del Módulo GPS U-blox N32+

  • Chipset: U-blox 7 / NEO-7M (o compatible).
  • Protocolo de salida: NMEA 0183 (mensajes $GPRMC, $GPGGA, $GPVTG).
  • Protocolo de configuración: Binario U-blox (UBX).
  • Velocidad predeterminada (Baudrate): 9600 bps (8N1).
  • Voltaje de alimentación: 5V (conectado a Vin del conector P1).
  • Nivel lógico UART: 3.3V (compatible directo con ESP32 sin conversores).
  • Consumo activo: ~45 a 60 mA.
  • Consumo en modo reposo (Software Standby / Backup): ~0.3 a 0.5 mA.

2. Esquema de Conexión Física (Bidireccional)

Diagrama de conexión GPS y Sensores a la Placa CYD

Para recibir datos de navegación y al mismo tiempo poder enviar comandos de suspensión y despertar, se utiliza la ficha de 4 pines del conector rotulado como UART (o P1) en la parte trasera de la placa CYD:

Pin del GPS N32+ Pin en Conector UART (P1) Función Notas
VCC / V+EN (Naranja) Pin 1 (Vin 5V) Alimentación 5V directo del regulador/USB
RX (Blanco / Amarillo) Pin 2 (GPIO 1 / TX0) TX del ESP32 Salida serial para enviar comandos UBX de reposo
TX (Azul / Verde) Pin 3 (GPIO 3 / RX0) RX del ESP32 Entrada serial UART0 (sentencias NMEA a 9600 bps)
GND (Verde / Negro) Pin 4 (GND) Masa común Retorno de corriente

Programación por cable USB: Dado que el conector UART comparte internamente las líneas GPIO 1 y GPIO 3 con el chip conversor USB-Serie (CH340), desconectar la ficha de 4 pines del GPS al flashear nuevo firmware por cable USB para evitar interferencias en la carga. Una vez completada la carga, reconectar la ficha para el funcionamiento normal.


3. Comandos Binarios UBX de Reposo y Despertar

El chip U-blox cuenta con el mensaje binario UBX-RXM-PMREQ (Class 0x02, ID 0x41), que ordena la desconexión inmediata de la etapa de radiofrecuencia y procesado satelital.

A. Trama para poner a dormir al GPS (Sleep / Backup Mode)

Estructura de 16 bytes con sincronismo, encabezado, longitud, payload y checksum Fletcher:

Header:   0xB5 0x62 (Sync UBX)
Class:    0x02      (RXM)
ID:       0x41      (PMREQ)
Length:   0x08 0x00 (8 bytes de payload)
Payload:  0x00 0x00 0x00 0x00 (Duración = 0: suspensión indefinida hasta despertar)
          0x02 0x00 0x00 0x00 (Flags: modo Backup / Software Standby)
Checksum: 0x4D 0x3B (CK_A, CK_B)

Array en C++ listo para enviar:

const uint8_t UBX_SLEEP_CMD[] = {
  0xB5, 0x62, 0x02, 0x41, 0x08, 0x00,
  0x00, 0x00, 0x00, 0x00,
  0x02, 0x00, 0x00, 0x00,
  0x4D, 0x3B
};

B. Secuencia para despertar al GPS (Wake-up)

U-blox admite el despertar por actividad en la línea serie (Wake on UART). Basta con transmitir una ráfaga corta de bytes (por ejemplo 0xFF) para que el receptor reactive sus osciladores y vuelva al modo activo.

void gpsWake() {
  // Envío de ráfaga de pulsos para despertar el receptor U-blox
  uint8_t wakeBuffer[16];
  memset(wakeBuffer, 0xFF, sizeof(wakeBuffer));
  gpsSerial.write(wakeBuffer, sizeof(wakeBuffer));
  gpsSerial.flush();
}

4. Código Modelo para Integrar en el Firmware

#include <HardwareSerial.h>
#include <TinyGPSPlus.h>

#define GPS_RX_PIN 3  // Conector UART Pin 3 (RX0 ESP32, entrada desde TX del GPS)
#define GPS_TX_PIN 1  // Conector UART Pin 2 (TX0 ESP32, salida hacia RX del GPS)
#define GPS_BAUDRATE 9600

#define gpsSerial Serial // Usamos UART0 por hardware nativo
TinyGPSPlus gps;

bool gpsIsSleeping = false;

// Inicialización del puerto serie para GPS
void setupGPS() {
  pinMode(GPS_RX_PIN, INPUT_PULLUP);
  gpsSerial.begin(GPS_BAUDRATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
}

// Poner el GPS en modo reposo de ultra bajo consumo
void gpsSleep() {
  if (gpsIsSleeping) return;
  
  // Trama UBX-RXM-PMREQ para modo Backup permanente
  const uint8_t ubxSleep[] = {
    0xB5, 0x62, 0x02, 0x41, 0x08, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x02, 0x00, 0x00, 0x00,
    0x4D, 0x3B
  };
  
  gpsSerial.write(ubxSleep, sizeof(ubxSleep));
  gpsSerial.flush();
  gpsIsSleeping = true;
  Serial.println(">>> [GPS] Modulo GPS puesto en modo reposo (Sleep).");
}

// Despertar el GPS
void gpsWake() {
  if (!gpsIsSleeping) return;

  // Enviar ráfaga de sincronismo en línea serie para disparar el evento Wake-on-UART
  for (uint8_t i = 0; i < 32; i++) {
    gpsSerial.write(0xFF);
  }
  gpsSerial.flush();
  gpsIsSleeping = false;
  Serial.println(">>> [GPS] Modulo GPS despertado.");
}

// Lectura continua en el bucle principal
void processGPS() {
  if (gpsIsSleeping) return;

  while (gpsSerial.available() > 0) {
    gps.encode(gpsSerial.read());
  }
}

5. Integración con el Sistema de Reposo Existente

En el archivo sketch/obd2_gauge/config.h:

  1. Al entrar en suspensión (enterLightSleep):

    gpsSleep(); // Apaga la etapa de radio y antena del GPS
    
  2. Al salir de la suspensión (wokeFromSleep):

    gpsWake(); // Reactiva el receptor U-blox
    

6. Funcionalidades a Implementar Posteriormente

  1. Velocidad Real vs Velocidad OBD-II:

    • Lectura: gps.speed.kmph().
    • Comparación directa con la velocidad reportada por la ECU (PID 010D).
  2. Cronómetro 0 a 100 km/h (Performance Meter):

    • Detección automática de detención (speed == 0).
    • Disparo del cronómetro al detectar movimiento (speed > 1.0 km/h).
    • Registro del tiempo exacto en milisegundos al cruzar los 100.0 km/h.
  3. Hora Satelital Atómica y Fecha:

    • Lectura de gps.time.hour(), gps.time.minute(), gps.time.second().
    • Ajuste de huso horario (hora - 3 para huso horario UTC-3).
  4. Altitud y Rumbo:

    • gps.altitude.meters() para altitud msnm.
    • gps.course.deg() para orientación y brújula digital.