# 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+](pinout_gps.png) * **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](diagrama_conexion_hardware.png) 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: ```text 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**: ```cpp 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. ```cpp 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 ```cpp #include #include #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`)**: ```cpp gpsSleep(); // Apaga la etapa de radio y antena del GPS ``` 2. **Al salir de la suspensión (`wokeFromSleep`)**: ```cpp 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.