|
|
# Proyecto de Investigación: Integración del Sensor NDIR MH-Z19B vía UART
|
|
|
|
|
|
Este repositorio documenta la integración, adquisición y visualización de datos del sensor de dióxido de carbono (CO₂) **MH-Z19B**.
|
|
|
|
|
|
El propósito principal de este proyecto es estudiar y comprender la arquitectura del protocolo de comunicación asíncrona **UART** a bajo nivel en sistemas embebidos basados en Linux utilizando una **Raspberry Pi 4**. Esta implementación integra una prueba experimental para la integración de sensores que formarán parte del desarrollo de microestaciones destinadas al monitoreo de la calidad del aire, desarrolladas durante el **Verano de la Investigación Científica y Tecnológica del Programa Delfín 2026**.
|
|
|
|
|
|
---
|
|
|
# Objetivo del Proyecto
|
|
|
|
|
|
Implementar un controlador de bajo nivel para el sensor **MH-Z19B** utilizando comunicación **UART**, permitiendo que muestre las mediciones de CO₂ en tiempo real en la terminal. Esta implementación constituye la base para el desarrollo de futuras microestaciones inteligentes destinadas al monitoreo ambiental y la calidad del aire.
|
|
|
|
|
|
---
|
|
|
|
|
|
# Especificaciones Técnicas del Sensor (MH-Z19B)
|
|
|
|
|
|
El **MH-Z19B** es un sensor compacto que utiliza la tecnología **NDIR (Non-Dispersive Infrared)** para medir la concentración de dióxido de carbono (CO₂) en el aire. Esta tecnología se basa en que las moléculas de gas absorben luz infrarroja a longitudes de onda muy específicas por lo que proporciona alta selectividad, buena estabilidad y no depende de la concentración de oxígeno para realizar las mediciones.
|
|
|
|
|
|
Las principales características del sensor son:
|
|
|
|
|
|
| Característica | Valor |
|
|
|
| :--- | :--- |
|
|
|
| Tecnología | NDIR (Non-Dispersive Infrared) |
|
|
|
| Gas medido | CO₂ |
|
|
|
| Rango de medición | 0–2000 ppm o 0–5000 ppm (configurable) |
|
|
|
| Voltaje de alimentación | 3.6–5.5 V DC |
|
|
|
| Tiempo de precalentamiento | 3 minutos |
|
|
|
| Comunicación | UART TTL |
|
|
|
| Velocidad de transmisión | 9600 baudios |
|
|
|
| Configuración UART | 8 bits de datos, sin paridad, 1 bit de parada (8N1) |
|
|
|
| Vida útil estimada | Mayor a 5 años |
|
|
|
|
|
|
---
|
|
|
|
|
|
# Material
|
|
|
## Hardware
|
|
|
|
|
|
- Raspberry Pi 4
|
|
|
- Sensor MH-Z19B
|
|
|
- Cables Jumper
|
|
|
- MicroSD card with Raspberry Pi OS
|
|
|
|
|
|
## Software
|
|
|
- UART (TTL)
|
|
|
- Lenguaje C
|
|
|
- Linux
|
|
|
- Git
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
# Conexiones de Hardware (Capa Física)
|
|
|
|
|
|
Para establecer correctamente la comunicación UART entre el sensor y la Raspberry Pi 4 es necesario cruzar las líneas de transmisión y recepción.
|
|
|
|
|
|
| Pin MH-Z19B | Función | Raspberry Pi 4 | Descripción |
|
|
|
| :--- | :--- | :--- | :--- |
|
|
|
| Vin (Pin 6) | Alimentación | Pin físico **2** o **4** (5 V) | Alimenta el sensor. |
|
|
|
| GND (Pin 7) | Tierra | Pin físico **6** (GND) | Referencia eléctrica común. |
|
|
|
| TXD (Pin 3) | Transmisión | Pin físico **10** (GPIO15 / RXD) | Envía los datos del sensor hacia la Raspberry Pi. |
|
|
|
| RXD (Pin 2) | Recepción | Pin físico **8** (GPIO14 / TXD) | Recibe los comandos enviados por la Raspberry Pi. |
|
|
|
|
|
|

|
|
|
|
|
|
---
|
|
|
|
|
|
# Guía de Uso
|
|
|
|
|
|
## 1. Actualizar el Sistema
|
|
|
|
|
|
```bash
|
|
|
sudo apt update && sudo apt upgrade -y
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 2. Instalar Dependencias
|
|
|
|
|
|
```bash
|
|
|
sudo apt install git gcc -y
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 3. Habilitar UART
|
|
|
|
|
|
Ejecutar:
|
|
|
|
|
|
```bash
|
|
|
sudo raspi-config
|
|
|
```
|
|
|
|
|
|
Ir a:
|
|
|
|
|
|
```text
|
|
|
Interface Options
|
|
|
└── Serial Port
|
|
|
```
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|
Configurar:
|
|
|
|
|
|
```text
|
|
|
Would you like a login shell to be accessible over serial?
|
|
|
No
|
|
|
```
|
|
|

|
|
|
```
|
|
|
Would you like the serial port hardware to be enabled?
|
|
|
Yes
|
|
|
```
|
|
|

|
|
|
|
|
|
Reiniciar el sistema:
|
|
|
|
|
|
```bash
|
|
|
sudo reboot
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 4. Clonar el Repositorio
|
|
|
|
|
|
```bash
|
|
|
git clone https://gitea.itmorelia.com/Verano-Delfin-2026/CO2-Sensor.git
|
|
|
cd CO2-Sensor
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
# Compilación del Controlador en C
|
|
|
|
|
|
```bash
|
|
|
cd MHZ19B
|
|
|
```
|
|
|
|
|
|
Compilar el controlador:
|
|
|
|
|
|
```bash
|
|
|
gcc mhz19b_driver.c -o driver_co2
|
|
|
```
|
|
|
|
|
|
Asignar permisos:
|
|
|
|
|
|
```bash
|
|
|
sudo chmod +x driver_co2
|
|
|
```
|
|
|
|
|
|
Ejecutar el programa:
|
|
|
|
|
|
```bash
|
|
|
sudo ./driver_co2
|
|
|
```
|
|
|
|
|
|
El controlador se comunicará con el sensor mediante el dispositivo:
|
|
|
|
|
|
```text
|
|
|
/dev/serial0
|
|
|
```
|
|
|
Este no es un puerto físico real, sino un acceso directo que el sistema operativo de la Raspberry Pi crea automáticamente para apuntar al puerto serial principal que está mapeado a los pines físicos de la placa.
|
|
|
|
|
|
---
|
|
|
|
|
|
# Arquitectura General del Sistema
|
|
|
|
|
|
```mermaid
|
|
|
graph TD
|
|
|
%% Sensor físico
|
|
|
A[ Sensor MH-Z19B] -->|UART 9600 baudios| B
|
|
|
|
|
|
%% Placa/Hardware
|
|
|
B{{ Raspberry Pi 4}} --> C
|
|
|
|
|
|
%% Proceso de Software
|
|
|
C( Driver en C) -->|Imprime datos| D
|
|
|
|
|
|
%% Terminal
|
|
|
D[[ Terminal ]]
|
|
|
```
|
|
|
---
|
|
|
|
|
|
# Conclusión
|
|
|
|
|
|
El uso del protocolo UART implica un gran desafío debido a su necesidad de programación a bajo nivel en C. Durante la fase de depuración se logró identificar que dejar que el sistema operativo controle los tiempos lo hace muy propenso a fallas de sincronización. Esto se evidenció en la recepción de "basura" hexadecimal, la captura de tramas incompletas de apenas 3 bytes, el congelamiento del sistema por saturación de peticiones.
|
|
|
|
|
|
A pesar de esto, UART sigue siendo uno de los pilares dentro de los sistemas embebidos por ser una herramienta directa, robusta y útil. No solo permite una transmisión de datos confiable en tiempo real, sino que otorga el control absoluto sobre el hardware.
|
|
|
|
|
|
# Limitaciones
|
|
|
|
|
|
Aunque este mini proyecto cumple su objetivo de leer el CO₂ y probar la comunicación UART, tiene las siguientes limitaciones prácticas que debemos tomar en cuenta:
|
|
|
|
|
|
- **Tiempos no exactos:** La Raspberry Pi funciona como una computadora normal y no está diseñada para controlar el tiempo con una precisión matemática perfecta. Esto hace que las pausas para comunicarse con el sensor tengan ligeras variaciones.
|
|
|
- **El programa se "pausa" a esperar:** Actualmente, el código en C se detiene por completo hasta que el sensor responde. Esto funciona bien para un solo sensor, pero si en el futuro queremos conectar varios a la vez, el sistema se volvería lento porque tendría que esperar a uno por uno en lugar de atenderlos al mismo tiempo. |