Registrador de Datos de Alto Rendimiento para Globo Meteorológico con Arduino
Componentes y suministros
| Componente | Cantidad |
|---|---|
| Termómetro digital programable 1-Wire DS18B20 (Maxim Integrated) | 2 |
| Sensor de temperatura DHT22 | 1 |
| Acelerómetro de triple eje ADXL335 (SparkFun) | 1 |
| Headers macho 36 posiciones 1 fila (0.1") | 2 |
| Arduino Mega 2560 | 1 |
| LED SMD 5050 | 1 |
| Resistencia 4.75k ohm | 2 |
| Resistencia 100 ohm | 3 |
| Resistencia 10k ohm | 1 |
| Tarjeta MicroSD | 1 |
| Módulo lector MicroSD | 1 |
Herramientas necesarias
- Soldador (genérico)
- Estaño sin plomo
Aplicaciones y servicios online
- Arduino IDE
Sobre este proyecto
¡Hola a todos! Probablemente se pregunten: ¿se puede enviar un Arduino al espacio? Casi. Usando un globo meteorológico, puedes enviar un Arduino, una cámara, pan de ajo o lo que quieras a un tercio del camino al espacio. Aunque es solo un tercio del camino, casi el 99% de la atmósfera no está presente, por lo que lo llamamos "el borde del espacio". Esta guía es extensa, pero a menos que solo la estés revisando, asegúrate de leer todo hasta la Ruta 1. ¡Vamos a ello!
Tres rutas según tu nivel y objetivos
Hay tres rutas a seguir según lo que busques y tu nivel de habilidad. Todas requieren conocimientos de soldadura debido a los vientos extremos en la estratosfera. Ninguna es mejor que otra; solo depende de tus intereses.
- Ruta 1: Registrador de datos simple usando protoboard, varios sensores, con poca soldadura.
- Ruta 2: Shield PCB prediseñado (placa de circuito impreso) para una placa limpia y profesional, diseñada y probada por nosotros.
- Ruta 3: Diseñar tu propio PCB. Esta guía no profundiza en el diseño de PCB, pero ofrece pautas clave y enlaces a tutoriales excelentes.
Consejos para elegir
- Ruta 1: La más fácil, permite flexibilidad en sensores, placa y funciones. Requiere soldadura básica para asegurar la integridad mecánica durante el vuelo.
- Ruta 2: La más restrictiva: sensores y placa Arduino específicos, pero obtienes un PCB limpio, sin preocupaciones de cableado ni código, y es una excelente introducción a los PCBs. Proporcionamos archivos Gerber, configuraciones de exportación y código. Los PCBs son económicos (5 unidades por ~$2, varía según proveedor).
- Ruta 3: La más difícil, requiere diseño de PCB/shield, programación completa y soldadura. Si ya sabes hacerlo, probablemente no necesites esta guía, pero hay restricciones y detalles críticos que aquí se cubren.
Reglas y regulaciones críticas (EE. UU. / FAA)
Antes de empezar, debes conocer las restricciones legales. El lanzamiento de globos puede estar regulado según tu ubicación. Esta guía no cubre selección de globo, construcción de la cápsula de carga ni llenado; hay muchos tutoriales para eso. Aquí las restricciones clave para tu registrador (basadas en FAA para EE. UU.):
- La cápsula no puede emitir señales de teléfono móvil. Si llevas uno, debe estar en modo avión.
- Si usas GPS para recuperación, necesitas licencia de radioaficionado (HAM), que requiere examen y tarifa.
- Si la relación peso/superficie supera 3.0 oz/pulg², el peso total debe ser < 4 libras.
- Cada carga individual debe pesar < 6 libras.
- Si hay dos cargas, el peso total debe ser < 12 libras.
Enlace a directrices completas de la FAA (EE. UU.)
Ruta 1 – Protoboard
Consideraciones previas
Antes de diseñar, define qué sensores necesitas. El esquema incluye: sensor de temperatura/humedad, sensor barométrico, IMU y módulo MicroSD. Para la mayoría de proyectos basta. Si quieres localizar la cápsula, añade un módulo GPS.
Opciones de recuperación
- Módulo GPS SPOT: Fácil, alcance ilimitado (satélites), buena autonomía, fácil compra. Desventajas: caro, no funciona boca abajo, señal bloqueable por objetos gruesos. Usamos SPOT 3 Satellite Messenger (Amazon) con gimbal impreso en 3D para mantenerlo vertical.
- Radio APRS: La más fiable, permite enviar datos y coordenadas, da altitud precisa. Requiere licencia HAM (examen + tarifa). No incluye diagrama de cableado; debes investigar por tu cuenta.
- Teléfono móvil: No recomendado. Requiere sacar el teléfono del modo avión tras el vuelo, suele ser más caro que un SPOT, y solo sirve como respaldo poco fiable.
Planificación del vuelo
- Define si el Arduino desplegará el paracaídas remotamente.
- Elige sensores considerando temperaturas hasta -40 °C.
- Planifica la alimentación: el frío reduce el rendimiento de baterías; usa fuente grande y aislamiento (caja de poliestireno) manteniendo el límite de peso.
- Haz una lista de verificación (checklist) con: datos deseados, cámara a bordo, componentes, y diseña el registrador según la cápsula.
Esquemático y cableado (Ruta 1)
El Mega 2560 es excesivo para estos sensores, pero nuestro código lo requiere. Si usas un Nano, cambia los pines del módulo MicroSD a los SPI de tu placa.
Lista de componentes (Ruta 1)
- SparkFun ADXL337 (o ADXL335 según disponibilidad)
- Headers
- Módulo MicroSD
- Sensor humedad DHT22
- Sensor temperatura DS18B20
- Protoboard
- Arduino Mega
Puedes añadir otro DS18B20 para temperatura interna y más sensores, pero para usar el código proporcionado sigue el diagrama.
Código (Ruta 1)
// Configuración DHT22
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Configuración Tarjeta SD
#include
#include
File sdcard_file;
int CS_pin = 10;
// Sensor temperatura DS18B20
#include
#include
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int scale = 3; // 3 (±3g) para ADXL337, 200 (±200g) para ADXL377
boolean micro_is_5V = true; // true si microcontrolador 5V (Arduino Uno/Mega), false si 3.3V
void setup() {
Serial.begin(9600);
sensors.begin();
dht.begin();
pinMode(CS_pin, OUTPUT);
if (SD.begin()) {
Serial.print("Tarjeta SD detectada!");
} else {
Serial.print("Error detectando tarjeta SD");
return;
}
sdcard_file = SD.open("data.csv", FILE_WRITE);
if (sdcard_file) {
// Cabeceras CSV
sdcard_file.print("DS18B20");
sdcard_file.print(",");
sdcard_file.print("DHT22 Temp");
sdcard_file.print(",");
sdcard_file.print("Hum");
sdcard_file.print(",");
sdcard_file.print("H.InX");
sdcard_file.print(",");
sdcard_file.print("rawX");
sdcard_file.print(",");
sdcard_file.print("rawY");
sdcard_file.print(",");
sdcard_file.print("rawZ");
sdcard_file.print(",");
sdcard_file.print("scaledX");
sdcard_file.print(",");
sdcard_file.print("scaledY");
sdcard_file.print(",");
sdcard_file.print("scaledZ");
sdcard_file.print(",");
sdcard_file.println(" ");
} else {
Serial.print("error inicializando tarjeta SD");
}
}
void loop() {
delay(222);
// Acelerómetro
int rawX = analogRead(A0);
int rawY = analogRead(A1);
int rawZ = analogRead(A2);
float scaledX, scaledY, scaledZ;
if (micro_is_5V) {
scaledX = mapf(rawX, 0, 675, -scale, scale);
scaledY = mapf(rawY, 0, 675, -scale, scale);
scaledZ = mapf(rawZ, 0, 675, -scale, scale);
} else {
scaledX = mapf(rawX, 0, 1023, -scale, scale);
scaledY = mapf(rawY, 0, 1023, -scale, scale);
scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
}
// Temperatura DS18B20
sensors.requestTemperatures();
int etemp = sensors.getTempCByIndex(0);
// Humedad y temperatura DHT22
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
return;
}
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
// Escritura en SD
sdcard_file.print(etemp);
sdcard_file.print(",");
sdcard_file.print(t);
sdcard_file.print(",");
sdcard_file.print(h);
sdcard_file.print(",");
sdcard_file.print(hic);
sdcard_file.print(",");
sdcard_file.print(rawX);
sdcard_file.print(",");
sdcard_file.print(rawY);
sdcard_file.print(",");
sdcard_file.print(rawZ);
sdcard_file.print(",");
sdcard_file.print(scaledX);
sdcard_file.print(",");
sdcard_file.print(scaledY);
sdcard_file.print(",");
sdcard_file.print(scaledZ);
sdcard_file.print(",");
sdcard_file.print(" ");
sdcard_file.println(" ");
sdcard_file.close();
delay(223);
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
Consejos importantes
- Verifica cableado y prueba cada sensor por separado si hay problemas.
- La tarjeta SD/MicroSD debe formatearse en FAT16 o FAT32 y ser ≤ 16 GB.
- Añade LEDs indicadores de estado para confirmar funcionamiento antes del lanzamiento.
- Si el módulo SD falla, cambia la fuente de alimentación; algunos módulos son muy sensibles al voltaje.
¡Listo! Tu registrador leerá temperatura, humedad y aceleración, guardándolos en la tarjeta SD. Para altitud necesitas GPS: el 90% de los barómetros fallan above 30,000 ft (tu globo probablemente supere eso). Para el resto del proyecto (globo, cápsula, llenado), consulta nuestro canal de YouTube o contáctanos.
Ruta 2 – PCB Prediseñado (The Eclipse PCB)
Esta ruta usa un shield PCB ya diseñado para obtener: temperatura interna, externa, humedad y acelerómetro. Requiere soldar los componentes en el PCB.
Componentes adicionales
- LED SMD 5050
- SparkFun ADXL337
- Headers (muchos)
- Módulo MicroSD
- DHT22
- 2× DS18B20
- Arduino Mega
- PCB "Eclipse" (archivos Gerber en GitHub)
Pedir el PCB
- Descarga el ZIP del repositorio GitHub y extrae el archivo Gerber "Eclipse". Mantén el ZIP comprimido; los fabricantes lo aceptan así.
- Busca "PCB service" (ej. JLCPCB, PCBWay, fabricantes en EE. UU.). El proveedor no importa; todos entregan calidad alta a buen precio.
- Sube el ZIP y configura:
- Capas y dimensiones: sin cambios
- Single PCB
- Espesor 1.6 mm
- Color: verde (producción más rápida)
- Acabado HASL (con plomo) — cambia si usas estaño sin plomo
- Cobre 1 oz
- Sin dedos de oro, sin agujeros castellados
- Prueba Flying Probe completa
- Cantidad deseada
- Ordena y espera la fabricación. Aprovecha para comprar los sensores.
Montaje del PCB
Al usar sensores en breakout boards y el PCB como shield, el montaje es sencillo. Sigue la guía de soldadura (imagen en el original). Suelda todos los headers laterales; encajarán sobre el Arduino Mega y harán todo el cableado.
Funcionamiento del PCB
Dentro del PCB hay pistas de 0.35 mm que conectan cada sensor a los headers correspondientes, que a su vez conectan al Arduino. Esto da una construcción limpia, robusta y fiable, superior a protoboards y breadboards.
Prueba y código
- Coloca el shield sobre el Mega y conéctalo al PC.
- Abre Arduino IDE y carga el código v1.6 del repositorio GitHub.
- Formatea la MicroSD a FAT16/FAT32 (≤ 16 GB; 2 GB sobran para 2 horas de vuelo).
- Inserta la tarjeta, sube el código. En el monitor serie verás mensaje de éxito y el datalogging inicia.
- Espera 10 s, retira la tarjeta y léela en PC: habrá un archivo .csv con tus datos.
Código (Ruta 2 – incluye barómetro MPL3115A2 y LEDs de estado)
// Configuración DHT22
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Tarjeta SD
#include
#include
File sdcard_file;
int CS_pin = 10;
// DS18B20
#include
#include
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Barómetro MPL3115A2
#include
#include
Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
int scale = 3;
boolean micro_is_5V = true;
// LEDs
int Blue = 7;
int Red = 6;
int Green = 5;
void setup() {
pinMode(23, INPUT); // Detecta interruptor para parar escritura y guardar datos
sensors.begin();
pinMode(Blue, OUTPUT);
pinMode(Red, OUTPUT);
pinMode(Green, OUTPUT);
digitalWrite(Green, HIGH);
dht.begin();
pinMode(CS_pin, OUTPUT);
if (SD.begin()) {
// Parpadeo verde: SD OK
for(int i=0;i<3;i++){ digitalWrite(Green, LOW); digitalWrite(Green, HIGH); }
} else {
digitalWrite(Green, LOW);
digitalWrite(Red, HIGH);
delay(5000);
return;
}
sdcard_file = SD.open("data.csv", FILE_WRITE);
if (sdcard_file) {
digitalWrite(Red, LOW);
digitalWrite(Blue, LOW);
digitalWrite(Green, HIGH);
} else {
// Secuencia error: rojo/azul
digitalWrite(Green, LOW);
digitalWrite(Red, HIGH); delay(1000);
digitalWrite(Red, LOW); digitalWrite(Blue, HIGH); delay(1000);
digitalWrite(Green, LOW); digitalWrite(Red, HIGH); delay(1000);
digitalWrite(Red, LOW); digitalWrite(Blue, HIGH); delay(1000);
digitalWrite(Red, HIGH); digitalWrite(Blue, LOW);
}
// Cabeceras CSV (incluye presión y altitud del barómetro)
sdcard_file.print(",");
sdcard_file.print("DS18B20");
sdcard_file.print(",");
sdcard_file.print("DHT22 Temp");
sdcard_file.print(",");
sdcard_file.print("Hum");
sdcard_file.print(",");
sdcard_file.print("H.InX");
sdcard_file.print(",");
sdcard_file.print("Int. Temp");
sdcard_file.print(",");
sdcard_file.print("Pres. Pasc.");
sdcard_file.print(",");
sdcard_file.print("alt.");
sdcard_file.print(",");
sdcard_file.print("rawX");
sdcard_file.print(",");
sdcard_file.print("rawY");
sdcard_file.print(",");
sdcard_file.print("rawZ");
sdcard_file.print(",");
sdcard_file.print("scaledX");
sdcard_file.print(",");
sdcard_file.print("scaledY");
sdcard_file.print(",");
sdcard_file.print("scaledZ");
}
void loop() {
delay(222);
digitalWrite(Green, LOW);
digitalWrite(Blue, HIGH);
if(! baro.begin()) { }
float pascals = baro.getPressure();
float altm = baro.getAltitude();
float tempC = baro.getTemperature();
// Acelerómetro
int rawX = analogRead(A0);
int rawY = analogRead(A1);
int rawZ = analogRead(A2);
float scaledX, scaledY, scaledZ;
if (micro_is_5V) {
scaledX = mapf(rawX, 0, 675, -scale, scale);
scaledY = mapf(rawY, 0, 675, -scale, scale);
scaledZ = mapf(rawZ, 0, 675, -scale, scale);
} else {
scaledX = mapf(rawX, 0, 1023, -scale, scale);
scaledY = mapf(rawY, 0, 1023, -scale, scale);
scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
}
// DS18B20
sensors.requestTemperatures();
// DHT22
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) { return; }
float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);
// Escritura
sdcard_file.println(sensors.getTempCByIndex(0));
sdcard_file.print(",");
sdcard_file.print(t);
sdcard_file.print(",");
sdcard_file.print(h);
sdcard_file.print(",");
sdcard_file.print(hic);
sdcard_file.print(",");
sdcard_file.print(tempC);
sdcard_file.print(",");
sdcard_file.print(pascals);
sdcard_file.print(",");
sdcard_file.print(altm);
sdcard_file.print(",");
sdcard_file.print(rawX);
sdcard_file.print(",");
sdcard_file.print(rawY);
sdcard_file.print(",");
sdcard_file.print(rawZ);
sdcard_file.print(",");
sdcard_file.print(scaledX);
sdcard_file.print(",");
sdcard_file.print(scaledY);
sdcard_file.print(",");
sdcard_file.print(scaledZ);
sdcard_file.print(",");
delay(223);
sdcard_file.close();
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
¡Registrador completado! Lee temp, humedad, aceleración y (opcional) presión/altitud barométrica (solo válida < 30,000 ft). Para altitud real usa GPS. Consulta nuestra guía completa y canal de YouTube para el resto del proyecto.
Ruta 3 – Diseñar tu propio PCB
Esta guía NO enseña a diseñar PCBs. Debes saber hacerlo o aprender antes. Aquí solo damos pautas clave (basadas en regulaciones EE. UU.) para que no infrinjas normas.
Lluvia de ideas
Define qué datos quieres: temperatura, humedad, altitud, calidad del aire, radiación, GPS, etc. El sensor de temperatura debe leer hasta -50 °C (-58 °F) con máxima precisión. Ojo: la radiación solar en alta atmósfera calienta el sensor, dando lecturas más altas que la real.
Recuperación
Mismas tres opciones que Ruta 1 (SPOT, APRS, móvil). Investiga a fondo.
Peso
Tu carga debe cumplir los límites FAA: < 12 lb total, < 6 lb individual, < 4 lb si relación peso/área > 3 oz/pulg². No uses barómetro para altitud (falla > 30,000 ft).
Alimentación y térmica
Las temperaturas en la estratosfera son extremadamente bajas. Las baterías fallan, el Arduino puede fallar. La mejor estrategia: mete el registrador en una caja de poliestireno (styrofoam) para mantener temperatura interna cerca de ambiente. Considera paneles solares o calentadores químicos (hand warmers).
Diseño y verificación
Tras definir sensores y requisitos, diseña el esquemático y PCB (shield o PCB completo). Verifica TODO exhaustivamente: funcionamiento, cumplimiento de normas, integridad mecánica.
¡Registrador listo! Para altitud usa GPS. Consulta nuestra guía completa y canal de YouTube.
Conclusión
Los globos meteorológicos son una forma genial y sencilla de enviar cosas a la estratosfera: cámaras (usamos una 360°), obtener imágenes y datos increíbles con pocas regulaciones. ¡Pero LEE ESTO!!
- Sigue todas las reglas.
- Añade un reflector de radar y presenta un NOTAM (aviso a navegantes) antes del vuelo.
- Es posible que tu carga impacte un avión; NO quieres dañar ni arriesgar vidas.
- Haz todo lo posible para reducir riesgos: sujeciones fuertes, nada que se suelte.
- La FAA tiene pocas restricciones; no las obligues a endurecerlas incumpliéndolas.
Espero sinceramente que esta guía te ayude. Nos encanta hacerlas. Si quieres apoyar nuestro club, suscríbete a nuestro canal de YouTube y comenta o contáctanos con dudas. ¡Feliz Arduino-ing! (¿es incluso un término?) — NM Rocketry Reviews
Partes personalizadas y cajas
Archivo .stl del gimbal para mantener el SPOT Personal Tracker vertical durante el vuelo.
Esquemáticos
- Para Ruta 1: esquemático y referencia.
- Repositorio GitHub para archivos PCB y código: github.com/nmrocketryreviews/HADLdatalogger
Proceso de manufactura
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Sistema de Sensor de Temperatura Multiposición para Integración en Hogar Inteligente
- Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
- MotionSense: Detección inteligente de intrusos con Arduino y ESP8266
- Prevención de Incendios en Impresoras 3D: Sistema de Seguridad con Sensor Inteligente
- Pixel Chaser: Juego LED Interactivo de Un Toque con Arduino Nano
- Crear un medidor IoT web con Arduino, Yaler e IFTTT
- Levitación magnética repulsiva con Arduino: Circuito simple y guía DIY
- Reloj flip Arduino con matriz LED 8×8: proyecto DIY de reloj en tiempo real
- Estación Meteorológica Portátil Arduino por $10 – Nano, DHT22, BMP180 y LCD
- CoroFence: Detector Térmico Avanzado con Sensor PIR e Integración IoT