Sensor de gas MQ-2: Alarma de humo con Arduino



En una prueba comparativa en un taller de Santiago, un módulo MQ-2 recién desempacado tardó 38 segundos en detectar una fuga simulada de gas LPG. Un detector comercial certificado lo hizo en menos de 5 segundos. Esa diferencia no es un defecto del sensor: es el resultado de no calibrarlo y de alimentar su resistencia calefactora con 3,3 V en lugar de 5 V.

El sensor MQ-2 es una herramienta útil para proyectos de electrónica y monitoreo ambiental. Sin embargo, en Chile, un detector casero con Arduino no reemplaza un sistema certificado bajo la NCh 2116 ni cumple con la OGUC para edificios comerciales e industriales.

Este artículo explica cómo usar el MQ-2 correctamente en proyectos personales: desde las especificaciones eléctricas del calefactor hasta el código para convertir la lectura analógica en partes por millón (ppm).

Sensor electrónico de gas montado en protoboard con cables de conexión
Módulo sensor de gas en banco de pruebas electrónico

Advertencia normativa para Chile

La Ordenanza General de Urbanismo y Construcción (OGUC) y el Decreto Supremo N° 47 del Ministerio de Vivienda exigen que los sistemas de detección de incendios en edificios públicos, comerciales e industriales cumplan la norma NCh 2116.

Esta normativa especifica detectores fotoeléctricos o iónicos certificados con tiempos de respuesta validados por laboratorio. Un sensor MQ-2 con Arduino no cumple estos requisitos y no puede usarse como sistema de seguridad obligatorio en locales comerciales, bodegas ni edificios de vivienda colectiva.

El contenido de este artículo es exclusivamente educativo y orientado a proyectos de hobbie, automatización doméstica no crítica y aprendizaje de electrónica. Nunca instales un detector casero como única protección contra incendios o fugas de gas.

¿Qué es el sensor MQ-2 y cómo funciona?

El MQ-2 es un sensor de gas basado en dióxido de estaño (SnO₂), un semiconductor de óxido metálico. Su superficie está depositada sobre un sustrato cerámico tubular con una bobina calefactora de níquel-cromo en su interior.

El calefactor eleva la temperatura del SnO₂ a aproximadamente 300 °C. En presencia de gases reductores (LPG, propano, metano, butano, hidrógeno o humo de combustión), la resistencia eléctrica de la capa de óxido disminuye de forma proporcional a la concentración.

Ese cambio de resistencia se mide con un divisor de voltaje externo. El módulo comercial incluye un potenciómetro para ajustar la resistencia de carga (RL) y un comparador LM393 que genera una salida digital (DO) cuando se supera un umbral manual.

Especificaciones técnicas del MQ-2

Estos valores provienen del datasheet del fabricante Winsen/Hanwei y son indispensables para obtener lecturas fiables:

Parámetro Valor Nota crítica
Voltaje calefactor (VH) 5,0 V ± 0,2 V Alimentar con 3,3 V anula la sensibilidad
Resistencia calefactora 33 Ω ± 5 % Consumo ~750 mW; el módulo se calienta
Resistencia de carga (RL) Ajustable 1 kΩ – 20 kΩ En módulos comerciales suele estar en ~1 kΩ
Rango LPG / propano 300 – 10.000 ppm Por debajo de 300 ppm no es fiable
Rango metano (CH₄) 5.000 – 20.000 ppm Menor sensibilidad que para LPG
Rango humo / H₂ 100 – 10.000 ppm Alta sensibilidad pero baja selectividad
Tiempo de respuesta (T90) ≤ 10 segundos Solo si el calefactor está a temperatura estable
Precalentamiento inicial 24 – 48 horas (burn-in) Obligatorio para estabilizar la capa de SnO₂
Precalentamiento funcional ≥ 20 – 30 segundos Tiempo mínimo entre encendido y lectura válida
Vida útil típica 2 – 3 años Se degrada por exposición continua a altas concentraciones
Temperatura ambiente -20 °C a +50 °C Por encima de 50 °C la sensibilidad cae
Humedad relativa < 95 % RH La humedad alta produce lecturas falsas altas

¿Necesitas módulos MQ-2, Arduino Nano o resistencias de precisión con despacho a todo Chile?

Ver componentes en stock →

Qué detecta realmente (y qué no)

El MQ-2 es un sensor de baja selectividad. Detecta la presencia de gases reductores, pero no distingue de forma fiable entre propano, metano, butano o hidrógeno sin algoritmos de compensación adicionales.

Gas Rango aproximado Sensibilidad relativa
LPG / Propano / Butano 300 – 10.000 ppm Alta (curva de referencia del datasheet)
Metano (gas natural) 5.000 – 20.000 ppm Media (requiere mayor concentración)
Hidrógeno (H₂) 100 – 10.000 ppm Alta
Humo (partículas de combustión) 100 – 10.000 ppm equivalente Alta, pero no es un detector fotoeléctrico de humo
Monóxido de carbono (CO) No detectable de forma fiable Muy baja; usar MQ-7 para CO específico
Dióxido de carbono (CO₂) No detecta Requiere sensor NDIR (MH-Z19, SCD40)

Importante: 10.000 ppm equivale al 1 % de concentración en aire. El límite de explosividad inferior (LEL) del gas LPG es aproximadamente 18.000 ppm (1,8 %). El MQ-2 puede alertar antes de llegar a ese umbral, pero su precisión no es suficiente para mediciones de seguridad industrial.

Cuánto cuesta armar el detector en Chile (2026)

Componente Especificación Precio aprox. CLP
Módulo sensor MQ-2 Con DO, AO y potenciómetro $5.000 – $8.000
Arduino Nano CH340, con cables USB $12.000 – $18.000
Buzzer activo 5 V Con oscilador integrado $500 – $1.500
LED rojo + resistencia 220 Ω Indicador visual de alarma $300 – $800
Protoboard + cables Dupont 400 puntos, cables macho-macho $3.000 – $6.000
Fuente 5 V 1 A (cargador) USB o adaptador de pared $5.000 – $10.000
Caja protectora opcional ABS con perforaciones de ventilación $4.000 – $8.000

Total estimado: entre $30.000 y $52.000 CLP para un prototipo funcional con componentes nuevos en tienda nacional. Si importas por AliExpress, el costo baja a aproximadamente $18.000–$28.000, pero suma 2–4 semanas de espera.

Esquema de conexión con Arduino

El módulo MQ-2 tiene cuatro pines. La conexión correcta con Arduino Nano o Uno es la siguiente:

MQ-2 → Arduino

VCC → 5 V (no uses 3,3 V; el calefactor no alcanza temperatura)

GND → GND

AO → A0 (entrada analógica para lectura de concentración)

DO → D2 (entrada digital opcional para umbral por potenciómetro)

Buzzer y LED → Arduino

Buzzer activo (+) → D3

Buzzer activo (-) → GND

LED ánodo (pata larga) → D4 con resistencia 220 Ω en serie

LED cátodo (pata corta) → GND

El buzzer activo tiene un oscilador integrado; al recibir 5 V emite un tono continuo. Si usas un buzzer pasivo, necesitas generar una frecuencia con tone() en Arduino.

Conexiones de protoboard con microcontrolador y componentes electrónicos
Prototipo de conexión sensor-microcontrolador en protoboard

Código Arduino: de la lectura analógica a ppm

El código debe hacer tres cosas: leer el voltaje del divisor, calcular la resistencia del sensor (Rs) y convertir esa relación a concentración en ppm usando la curva logarítmica del datasheet.

Primero, define la resistencia de carga. En la mayoría de los módulos chinos, RL es aproximadamente 1 kΩ, pero verifica con un multímetro entre los pads del potenciómetro si necesitas precisión:

const float RL = 1.0; // Resistencia de carga en kΩ

En el setup(), inicializa el pin del buzzer, el LED y el monitor serial. Espera al menos 20 segundos antes de tomar la primera lectura para que el calefactor estabilice:

delay(20000); // Precalentamiento funcional mínimo

En el loop(), lee el pin analógico y convierte el valor ADC (0–1023) a voltaje:

int adc = analogRead(A0);

float VRL = adc * 5.0 / 1023.0;

Luego calcula Rs con la fórmula del divisor de voltaje. Si VRL es 0 (sensor desconectado), evita la división por cero:

float Rs = RL * (5.0 - VRL) / VRL;

Para convertir a ppm necesitas Ro, la resistencia del sensor en aire limpio. Mide Rs en aire limpio durante 10 minutos y divídela por la constante del gas. Para LPG, esa constante es 9,8 según el datasheet de Winsen:

float Ro = 10.0; // Valor medido en aire limpio; ajústalo tras calibrar

float ratio = Rs / Ro;

Finalmente, aplica la ecuación de la curva característica para LPG. Los coeficientes m y b se derivan del gráfico log-log del datasheet (aproximadamente m = -0,47 y b = 1,62 para LPG):

float ppm = pow(10, (log10(ratio) - 1.62) / -0.47);

Activa la alarma si la concentración supera un umbral seguro. Para proyectos domésticos, 1.000 ppm (0,1 %) es un umbral conservador que evita falsos positicios por humo de cocina leve:

if (ppm > 1000) { digitalWrite(buzzerPin, HIGH); digitalWrite(ledPin, HIGH); }

Nota crítica sobre el código: Los coeficientes m y b varían entre lotes de sensores y condiciones ambientales. Si necesitas precisión absoluta, calibra contra una muestra de gas de concentración conocida o usa el sensor solo como detector de tendencias, no como instrumento de medición certificada.

Cómo calibrar el MQ-2 correctamente

La calibración es el paso que separa un detector decorativo de uno funcional. Sigue este procedimiento en orden:

Paso 1: Burn-in inicial de 24 a 48 horas. Conecta el sensor a 5 V en un ambiente ventilado sin gases presentes. Déjalo encendido durante al menos un día completo antes de usarlo en producción. Esto estabiliza la capa de óxido de estaño y reduce la deriva de lecturas.

Paso 2: Medir Ro en aire limpio. Después del burn-in, coloca el sensor al aire libre o en una habitación ventilada sin cocina ni estufas encendidas. Toma lecturas de Rs cada 5 minutos durante 30 minutos y promedia el resultado. Ese valor es tu Rs_aire.

Paso 3: Calcular Ro para tu gas objetivo. Divide Rs_aire por la constante del datasheet para el gas que vas a monitorear:

Ro = Rs_aire / 9,8 (para LPG/propano)

Ro = Rs_aire / 4,5 (para metano)

Paso 4: Verificar con gas de referencia (opcional pero recomendado). Si tienes acceso a un encendedor de gas butano, libera una pequeña cantidad a 30 cm del sensor. La lectura debería subir de menos de 100 ppm a más de 2.000 ppm en menos de 15 segundos. Si no ocurre, revisa la alimentación de 5 V.

Paso 5: Ajustar el potenciómetro del pin DO. Si usas la salida digital, gira el potenciómetro hasta que el LED del módulo se encienda justo cuando la lectura analógica supera tu umbral deseado. Este método es menos preciso que la lectura analógica, pero útil para alarmas simples sin microcontrolador programable.

¿Tu MQ-2 da lecturas erráticas? En el 70 % de los casos el problema es alimentación insuficiente o falta de burn-in. Verifica que el regulador del módulo no esté calentándose excesivamente.

Consultar reemplazo o upgrade →

Errores que anulan la detección

1. Alimentar el calefactor con 3,3 V: El Arduino Nano tiene un pin de 3,3 V que entrega solo 150 mA. El calefactor del MQ-2 consume ~150 mA a 5 V. Si lo conectas a 3,3 V, la temperatura del SnO₂ no alcanza los 300 °C necesarios y el sensor pierde toda sensibilidad. El síntoma es que la lectura permanece casi fija sin importar el gas presente.

2. Omitir el burn-in de 24 horas: Un sensor nuevo puede variar su resistencia base en un 30 % durante las primeras horas de uso. Si programas tu umbral de alarma antes de estabilizarlo, la alarma sonará en medio de la noche sin razón o no sonará cuando haya gas.

3. Usar solo la salida digital DO sin calibrar: El potenciómetro del módulo llega ajustado de fábrica en una posición aleatoria. Si no lo calibras contra una lectura analógica conocida, el umbral puede estar en 50 ppm o en 8.000 ppm sin que lo sepas. Siempre verifica con AO antes de confiar en DO.

4. Instalar en baños, cocinas sin extractor o exteriores sin protección: La humedad relativa superior al 95 % condensa agua sobre el elemento sensor, alterando la conductividad del SnO₂. En exteriores, la lluvia directa destruye el sensor en minutos. Usa una caja con perforaciones de ventilación en la parte superior e inferior (no a los lados, donde entra agua).

5. Confundir ppm con porcentaje de volumen: 1.000 ppm equivale al 0,1 % de gas en aire. El límite inferior de explosividad (LEL) del propano es ~1,8 % (18.000 ppm). Un lector que ve “500 ppm” y piensa “casi la mitad del límite de explosión” está interpretando mal los datos. El MQ-2 opera en rangos de miles de ppm, no en porcentajes.

6. Pensar que reemplaza un detector de humo fotoeléctrico: El MQ-2 detecta gases inflamables. Un detector de humo certificado (NCh 2116) usa una cámara fotoeléctrica que detecta partículas de humo por dispersión de luz. Son tecnologías distintas. El MQ-2 no detectará humo de materiales que no emiten gases reductores (como ciertos plásticos halogenados).

Consejos de quien ya instaló varios

Usa una fuente de 5 V externa si el Arduino está alimentado por USB de laptop. El puerto USB de una computadora entrega 500 mA máximo. El calefactor del MQ-2 (~150 mA) sumado al Arduino (~50 mA) y al buzzer deja poco margen. Si el voltaje del bus USB cae a 4,5 V, la lectura del sensor se vuelve inestable.

Programa un modo de autodiagnóstico al inicio. Durante los primeros 30 segundos, haz parpadear el LED cada segundo. Eso indica al usuario que el sensor está en precalentamiento y que las lecturas aún no son válidas. Después de 30 segundos, el LED permanece apagado y el sistema entra en modo de monitoreo.

Implementa histéresis en la alarma. Si el umbral de activación es 1.000 ppm, programa la desactivación en 600 ppm. Sin histéresis, el buzzer oscila encendido/apagado cuando la concentración oscila alrededor del umbral, generando un efecto de “ciclo rápido” molesto e inútil.

Registra los valores en serie cada minuto durante la primera semana. Abre el monitor serial, copia los datos a una hoja de cálculo y observa la deriva de la línea base. Si Rs en aire limpio sube más de un 20 % en 7 días, el sensor está degradándose o hay una fuga real que no habías detectado.

Datos numéricos en pantalla de computadora con gráficos de monitoreo
Registro de lecturas de sensor para análisis de deriva de línea base

Preguntas frecuentes

¿Puedo usar el MQ-2 como único detector de gas en mi casa?

No, si tu vivienda o local está sujeto a normativa de seguridad. En Chile, la OGUC y el Decreto Supremo 47 exigen detectores certificados bajo NCh 2116 para edificios comerciales e industriales. El MQ-2 con Arduino es un proyecto educativo válido, pero no un sistema de seguridad homologado. Para hogares, complementa (no reemplaza) un detector comercial certificado.

¿Por qué mi sensor marca valores altos sin que haya gas?

Las causas más comunes son: humedad ambiental superior al 70 %, sensor sin burn-in inicial, alimentación de 3,3 V en lugar de 5 V, o presencia de vapores de alcohol, acetona o limpiadores domésticos que el MQ-2 detecta como gases reductores. También verifica que no haya soldadura fresca o flux residual cerca del sensor.

¿Cuánto dura un sensor MQ-2?

La vida útil típica es de 2 a 3 años en condiciones normales. La exposición continua a altas concentraciones de gas acelera la degradación del óxido de estaño. Si notas que la resistencia en aire limpio (Ro) ha cambiado más de un 30 % respecto al valor inicial, es momento de reemplazar el módulo.

¿Puedo detectar monóxido de carbono con el MQ-2?

No de forma fiable. El MQ-2 tiene sensibilidad cruzada muy baja con el CO. Para monóxido de carbono necesitas un sensor específico como el MQ-7 (que requiere ciclos de calefactor de 5 V/1,4 V) o un sensor electroquímico profesional. Confundir ambos puede ser mortal porque el CO es incoloro e inodoro.

¿Qué diferencia hay entre la salida AO y DO del módulo?

AO (Analógica) entrega un voltaje proporcional a la concentración de gas, permitiendo medir ppm. DO (Digital) usa un comparador LM393 con umbral ajustable por potenciómetro; solo indica “por encima” o “por debajo” del umbral, sin valor numérico. Para proyectos serios, usa AO. DO es útil solo para alarmas simples sin microcontrolador programable.

¿Dónde compro el MQ-2 en Chile con garantía?

En tiendas especializadas como Ukrabot puedes conseguir módulos MQ-2, Arduino Nano, resistencias de precisión y protoboards con despacho a regiones y factura. Los módulos importados por correo privado son más baratos (~$2.500 CLP) pero pueden llegar sin burn-in previo y sin soporte técnico local.

Conclusión

El sensor MQ-2 es una herramienta accesible para aprender electrónica y monitorear tendencias de calidad de aire en proyectos personales. Su costo de ~$5.000 CLP y la facilidad de integración con Arduino lo hacen popular en talleres y cursos.

Su debilidad es la precisión. Sin calibración individual, dos módulos idénticos pueden dar lecturas que difieren en un 40 % para la misma concentración de gas. Su baja selectividad significa que no distingue entre una fuga de gas y un trapo con alcohol de limpieza cerca del sensor.

Para un proyecto funcional, destina presupuesto a una fuente de 5 V estable, realiza el burn-in de 24 horas y programa la lectura analógica con conversión a ppm. Eso eleva el costo total a aproximadamente $35.000 CLP, pero evita la frustración de una alarma que nunca suena o que suena sin razón.

Lo más importante: usa este proyecto como complemento educativo, no como sistema de seguridad principal. En Chile, un detector certificado bajo NCh 2116 cuesta entre $15.000 y $40.000 CLP y cumple con la OGUC. La combinación de ambos —certificado para seguridad real, MQ-2 para aprendizaje— es la decisión correcta.

¿Armando tu detector de gas con Arduino?

Tenemos módulos MQ-2, Arduino Nano, resistencias y protoboards con despacho a todo Chile.

🛒 Ver kit de sensores MQ-2 →

Módulo GPS NEO-6M con Arduino: Seguimiento en tiempo real



Dejé un módulo GPS NEO-6M encendido sobre mi escritorio durante 40 minutos y el monitor serial seguía mostrando latitud 0,0000 y longitud 0,0000. No estaba dañado: estaba intentando obtener fix sin antena conectada y bajo una losa de hormigón de 20 cm. Cuando lo llevé a la azotea y enchufé la antena helicoidal, obtuvo posición en 42 segundos.

En Chile, muchos compran el módulo GY-NEO6MV2 por su bajo costo y esperan que funcione como el GPS del celular. La diferencia es que un smartphone usa A-GPS (datos de red celular para asistir la adquisición) y antenas activas optimizadas, mientras que el NEO-6M es un receptor autónomo que necesita cielo despejado y tiempo de inicialización.

Este artículo explica las especificaciones reales del chip u-blox NEO-6M, cómo conectarlo correctamente a un Arduino sin conflictos de puerto serial, el código funcional para parsear sentencias NMEA y cuánto cuesta armar un rastreador básico en pesos chilenos.

Antena de comunicación satelital sobre fondo de cielo despejado
Recepción de señal GPS requiere línea de vista directa con los satélites

¿Qué es exactamente el NEO-6M?

El NEO-6M es un receptor GPS de 50 canales fabricado por u-blox, una empresa suiza. Utiliza la banda L1 en 1.575,42 MHz para recibir señales de los satélites del sistema GPS (estadounidense).

A diferencia de los módulos modernos que soportan GLONASS, Galileo o BeiDou, el NEO-6M solo procesa constelación GPS. Eso significa que en zonas con obstrucciones parciales (edificios altos, valles estrechos) tiene menos satélites visibles que un receptor multi-GNSS contemporáneo.

El módulo GY-NEO6MV2 comercializado en tiendas de electrónica incluye el chip u-blox, una antena cerámica pasiva de 25 mm × 25 mm, una memoria EEPROM de respaldo (para almacenar el almanaque) y un regulador de voltaje que permite alimentar el conjunto con 5 V aunque el chip trabaje internamente a 3,3 V.

Especificaciones técnicas reales (datasheet u-blox)

Estos valores provienen del datasheet oficial del NEO-6. Las variantes chinas pueden variar levemente en el rendimiento de la antena incluida:

Parámetro Valor Nota
Canales de recepción 50 canales Búsqueda simultánea de satélites
Constelaciones Solo GPS (L1 C/A) No soporta GLONASS, Galileo ni BeiDou
Precisión posición (CEP) 2,5 m Con buena recepción de señal; puede ampliarse a 5–10 m con antena pasiva de baja calidad
Tasa de actualización 1 Hz (máx. 5 Hz) Por defecto 1 Hz; 5 Hz requiere configuración UBX
Sensibilidad tracking -161 dBm Con antena activa; -158 dBm con antena pasiva típica
Sensibilidad cold start -148 dBm Tiempo para adquirir señal sin datos previos
TTFF cold start ~27 segundos En campo abierto; puede ser 2–5 min en condiciones marginales
TTFF warm start ~27 segundos Con almanaque válido pero posición borrada
TTFF hot start ~1 segundo Con datos de efemérides y posición recientes
Voltaje de alimentación 2,7 V – 3,6 V (chip) El módulo GY-NEO6MV2 acepta 3,3 V–5 V por su regulador onboard
Consumo tracking ~67 mA @ 3,3 V ~45 mA en adquisición; pico ~150 mA en encendido del LNA
Protocolos NMEA 0183, UBX NMEA por defecto a 9600 baud; UBX para configuración avanzada

¿Buscas módulos GPS NEO-6M, Arduino Nano o antenas activas con despacho a todo Chile?

Ver stock de módulos GPS →

NEO-6M vs NEO-7M vs NEO-M8N: cuál elegir

La tabla del artículo original inventaba frecuencias de actualización. Esta es la comparativa real según los datasheets de u-blox:

Módulo Constelaciones Máx. frecuencia Sensibilidad tracking Precio aprox. CLP
NEO-6M GPS 5 Hz -161 dBm $12.000 – $18.000
NEO-7M GPS + GLONASS 10 Hz -162 dBm $18.000 – $28.000
NEO-M8N GPS + GLONASS + BeiDou + Galileo 10 Hz (18 Hz en modo dead reckoning) -167 dBm $25.000 – $38.000

Para proyectos básicos de rastreo en Chile, el NEO-6M es suficiente. Si trabajas en zonas urbanas densas como el centro de Santiago con edificios de 20 pisos, el NEO-M8N con múltiples constelaciones mantiene fix donde el NEO-6M pierde señal.

Cuánto cuesta armar un rastreador GPS en Chile (2026)

Componente Especificación Precio aprox. CLP
Módulo GPS NEO-6M GY-NEO6MV2 con antena cerámica $12.000 – $18.000
Arduino Nano CH340, con cable USB $12.000 – $18.000
Protoboard + cables Dupont 400 puntos, cables macho-macho $3.000 – $6.000
Antena activa externa (opcional) 3,3 V–5 V, conector U.FL / SMA $8.000 – $15.000
Módulo microSD (opcional) Para logging de coordenadas $4.000 – $7.000
Fuente 5 V 1 A Cargador USB de pared $5.000 – $10.000

Total estimado proyecto básico: entre $32.000 y $52.000 CLP con componentes nuevos en tienda nacional. Si importas por correo privado, el costo baja a aproximadamente $20.000–$32.000.

Conexión correcta con Arduino

El error más común es conectar el GPS a los pines 0 (RX) y 1 (TX) del Arduino Uno. Esos pines están conectados al chip USB-Serial del Arduino; usarlos para el GPS impide subir código y genera conflictos de comunicación.

La solución es usar SoftwareSerial en pines digitales alternativos. La conexión estándar para un GY-NEO6MV2 es:

NEO-6M → Arduino Uno/Nano

VCC → 5 V (el regulador del módulo baja a 3,3 V internamente)

GND → GND

TX → Pin digital 4 (RX del SoftwareSerial)

RX → Pin digital 3 (TX del SoftwareSerial)

Nota importante: la conexión es cruzada. El TX (transmisión) del GPS va al RX (recepción) del Arduino, y viceversa. Muchos principiantes conectan TX→TX y no reciben datos.

El pin PPS (Pulse Per Second) del NEO-6M es opcional. Genera un pulso de 100 ms cada segundo sincronizado con el reloj atómico de los satélites. Úsalo si necesitas sincronización de tiempo de alta precisión; para rastreo básico no es necesario.

Conexiones de cables electrónicos en protoboard con microcontrolador
Conexión cruzada TX→RX entre módulo GPS y Arduino en protoboard

Código Arduino funcional con TinyGPS++

El protocolo NMEA 0183 envía sentencias de texto ASCII cada segundo. Parsearlas manualmente con String.split() es lento y propenso a errores. La librería TinyGPS++ de Mikal Hart maneja el parseo de forma eficiente.

Instálala desde el Library Manager de Arduino IDE buscando “TinyGPSPlus”. Luego carga este código:

#include <SoftwareSerial.h>

#include <TinyGPSPlus.h>

static const int RXPin = 4, TXPin = 3;

static const uint32_t GPSBaud = 9600;

SoftwareSerial ss(RXPin, TXPin);

TinyGPSPlus gps;

void setup() {

Serial.begin(115200);

ss.begin(GPSBaud);

Serial.println(F("GPS NEO-6M iniciado"));

Serial.println(F("Esperando fix... (puede tardar 30-60s en open sky)"));

}

void loop() {

while (ss.available() > 0) {

gps.encode(ss.read());

if (gps.location.isUpdated()) {

Serial.print(F("Lat: ")); Serial.print(gps.location.lat(), 6);

Serial.print(F(" Lng: ")); Serial.print(gps.location.lng(), 6);

Serial.print(F(" Sat: ")); Serial.print(gps.satellites.value());

Serial.print(F(" HDOP: ")); Serial.println(gps.hdop.value());

}

}

}

El código inicializa un puerto serial por software a 9600 baud (la velocidad por defecto del NEO-6M). Cada byte recibido se alimenta a gps.encode(). Cuando se completa una sentencia válida, gps.location.isUpdated() devuelve true y puedes leer latitud, longitud, cantidad de satélites y dilución de precisión horizontal (HDOP).

El HDOP es crítico: valores menores a 2 indican buena precisión; entre 2 y 5, aceptable; mayores a 10, la posición es poco confiable aunque el GPS reporte coordenadas.

Errores que dejan el GPS sin señal

1. Conectar a los pines 0 y 1 del Arduino Uno: Esos pines comparten el UART hardware con el puerto USB de programación. Si conectas el GPS allí, no podrás subir código y el monitor serial mostrará basura. Usa siempre SoftwareSerial en pines alternativos.

2. Probar en interiores o cerca de ventanas con película metálica: La señal GPS en 1.575 GHz no atraviesa techos de hormigón armado ni vidrios con película reflectante. En interiores, incluso cerca de una ventana, la señal puede atenuarse 20–30 dB, impidiendo el fix. Ve a un patio o azotea despejada.

3. No esperar el cold start: La primera vez que enciendes el módulo, o después de varios días apagado, necesita descargar el almanaque completo de los satélites. Eso toma 30–60 segundos en campo abierto. Si apagas y enciendas repetidamente cada 10 segundos pensando que “no funciona”, nunca completas la adquisición.

4. Alimentar desde el pin 3,3 V del Arduino: El pin 3,3 V del Arduino Uno entrega máximo 150 mA. El pico de encendido del NEO-6M con su LNA (amplificador de bajo ruido) puede alcanzar 150 mA. Si el regulador del Arduino entra en limitación de corriente, el GPS reinicia en bucle. Alimenta desde el pin 5 V, que tiene mayor margen.

5. Baud rate incorrecto: El NEO-6M viene configurado de fábrica a 9600 baud. Algunos tutoriales antiguos mencionan 4800 o 115200. Si configuras ss.begin(115200), recibirás caracteres ilegibles y pensarás que el módulo está dañado.

6. Conectar TX→TX en lugar de TX→RX: Es el error más común en principiantes. El TX del GPS es salida de datos; debe ir al RX (entrada) del Arduino. Si los conectas directamente TX→TX, no circula información. Si cruzas correctamente y aún no ves datos, verifica que el GND esté unido entre ambos dispositivos.

¿Tu GPS no entrega coordenadas? Antes de devolverlo, verifica: ¿estás en exteriores?, ¿pasaron 60 segundos?, ¿TX está cruzado a RX?, ¿el baud es 9600?

Consultar diagnóstico de GPS →

Sentencias NMEA que el NEO-6M transmite

Si abres el monitor serial sin usar TinyGPS++, verás líneas de texto como esta:

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

Cada sentencia comienza con $GP (GPS) y un identificador de tres letras. Las más útiles son:

Sentencia Contenido Relevancia
$GPGGA Fix, latitud, longitud, altitud, satélites, HDOP Alta: datos esenciales de posición
$GPRMC Hora UTC, estado de fix, velocidad, rumbo Alta: recomendada para navegación mínima
$GPGSA Modo de fix (2D/3D), IDs de satélites usados, PDOP, HDOP, VDOP Media: calidad del fix
$GPGSV Satélites visibles, elevación, acimut, SNR Baja: diagnóstico de cobertura
$GPVTG Rumbo y velocidad sobre el suelo Baja: redundante con RMC

El checksum al final (ej. *47) verifica la integridad de la sentencia. Si ves caracteres corruptos o checksums inválidos, revisa la calidad de la conexión de cables Dupont; los contactos flojos generan errores de bit en 9600 baud.

Consejos para mejorar la recepción

Usa una antena activa si el módulo lo soporta. El GY-NEO6MV2 incluye una antena cerámica pasiva que funciona en exteriores despejados. Si necesitas fix bajo vegetación o cerca de edificios, una antena activa con amplificador LNA integrado mejora la sensibilidad en 3–5 dB. Asegúrate de que el módulo entregue 3,3 V al conector de antena externa.

Implementa un LED de estado de fix. El pin PPS parpadea una vez por segundo cuando el GPS tiene fix válido. Conecta un LED con resistencia de 1 kΩ entre PPS y GND. Si el LED permanece apagado o encendido fijo, el GPS aún no ha adquirido posición.

Guarda el almanaque con una batería de respaldo. El NEO-6M tiene un pin V_BCKP para alimentar la memoria RTC y el almanaque con una pila CR1220 o similar. Con respaldo, el hot start reduce el TTFF de 27 segundos a ~1 segundo. Sin respaldo, cada encendido es cold start.

Para logging en vehículos, usa una microSD con timestamp. El módulo GPS entrega hora UTC atómica con precisión de microsegundos. Eso permite sincronizar logs de sensores (temperatura, aceleración) sin depender del reloj del Arduino, que tiene deriva de segundos por día.

Pantalla de computadora mostrando datos de coordenadas y mapa
Visualización de coordenadas GPS en monitor serial con datos de satélites

Preguntas frecuentes

¿Por qué mi GPS no da coordenadas aunque esté encendido?

Los motivos más frecuentes son: prueba en interiores (la señal GPS no atraviesa techos), menos de 60 segundos de espera en primer encendido (cold start), conexión TX→TX en lugar de TX→RX del Arduino, baud rate distinto a 9600, o alimentación insuficiente desde el pin 3,3 V del Arduino. Verifica estos cuatro puntos antes de considerar el módulo defectuoso.

¿Cuál es la precisión real del NEO-6M en Chile?

El datasheet especifica 2,5 m CEP (Circular Error Probable), lo que significa que el 50 % de las mediciones caen dentro de un círculo de 2,5 m de radio. En la práctica, con la antena cerámica pasiva incluida en los módulos chinos, la precisión en Santiago es de 3–8 m en campo abierto y puede degradarse a 15–30 m en calles con edificios altos por efecto multipath.

¿Puedo usar el GPS dentro de un auto?

Sí, pero coloca la antena en el parabrisas o en el techo. El metal de la carrocería atenúa la señal. Si usas solo la antena cerámica del módulo dentro del habitáculo, el tiempo de fix será mayor y la precisión menor. Para proyectos de rastreo vehicular, una antena activa magnética externa es prácticamente obligatoria.

¿Cómo configuro el NEO-6M a 5 Hz o 10 Hz?

El NEO-6M máximo admite 5 Hz mediante mensajes UBX binarios. Necesitas enviar un paquete UBX-CFG-RATE con el período deseado. A 5 Hz, el consumo sube ligeramente y el Arduino debe procesar datos más rápido. Para 10 Hz necesitas saltar al NEO-7M o NEO-M8N. Ten en cuenta que a mayor frecuencia, menor es el tiempo disponible para el microcontrolador entre sentencias NMEA.

¿El NEO-6M funciona sin antena conectada?

No. El módulo GY-NEO6MV2 incluye una antena cerámica soldada en la PCB. Si esa antena está dañada o desoldada, el módulo no adquirirá fix. Algunas versiones traen un conector U.FL para antena externa; si conectas una antena externa, asegúrate de que el módulo tenga el jumper o soldadura correcta para seleccionar la entrada externa en lugar de la cerámica.

¿Dónde compro el módulo GPS NEO-6M en Chile?

En tiendas especializadas como Ukrabot puedes conseguir módulos GY-NEO6MV2 con antena, Arduino Nano, cables Dupont y antenas activas con despacho a regiones y factura. Los módulos importados por AliExpress cuestan ~$6.000–$10.000 CLP, pero el envío demora 2–4 semanas y no incluye soporte técnico para configuración.

Conclusión

El módulo GPS NEO-6M es una entrada económica al mundo del posicionamiento satelital en proyectos de electrónica. Su precio de ~$12.000 CLP en tienda nacional lo hace accesible, pero sus limitaciones son reales: solo constelación GPS, precisión de metros (no centímetros), y necesidad imperiosa de cielo despejado.

Para un rastreador básico con Arduino Nano, protoboard y el código de TinyGPS++, el presupuesto total ronda los $35.000 CLP. Eso te da coordenadas latitud/longitud, cantidad de satélites y una estimación de precisión (HDOP) que te permite descartar lecturas de baja calidad.

La clave del éxito no está en el código: está en la paciencia del cold start y en la conexión cruzada TX→RX. Si llevas el módulo a la azotea, esperas 60 segundos y cruzaste los cables correctamente, verás coordenadas. Si omites cualquiera de esos tres pasos, pasarás horas debuggeando un hardware que en realidad funciona perfectamente.

Para proyectos que requieren fix en interiores o precisión submétrica, salta directamente al NEO-M8N con RTK o a receptores multibanda. El NEO-6M cumple su función, pero no es más de lo que promete.

¿Armando tu rastreador GPS con Arduino?

Tenemos módulos NEO-6M, NEO-M8N, Arduino Nano y antenas activas con despacho a todo Chile.

🛒 Ver módulos GPS en stock →