Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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

Aplicaciones y servicios online

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.

Consejos para elegir

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.):

  1. La cápsula no puede emitir señales de teléfono móvil. Si llevas uno, debe estar en modo avión.
  2. Si usas GPS para recuperación, necesitas licencia de radioaficionado (HAM), que requiere examen y tarifa.
  3. Si la relación peso/superficie supera 3.0 oz/pulg², el peso total debe ser < 4 libras.
  4. Cada carga individual debe pesar < 6 libras.
  5. 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

  1. 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.
  2. 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.
  3. 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

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)

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

¡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

Pedir el PCB

  1. Descarga el ZIP del repositorio GitHub y extrae el archivo Gerber "Eclipse". Mantén el ZIP comprimido; los fabricantes lo aceptan así.
  2. Busca "PCB service" (ej. JLCPCB, PCBWay, fabricantes en EE. UU.). El proveedor no importa; todos entregan calidad alta a buen precio.
  3. 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
  4. 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

  1. Coloca el shield sobre el Mega y conéctalo al PC.
  2. Abre Arduino IDE y carga el código v1.6 del repositorio GitHub.
  3. Formatea la MicroSD a FAT16/FAT32 (≤ 16 GB; 2 GB sobran para 2 horas de vuelo).
  4. Inserta la tarjeta, sube el código. En el monitor serie verás mensaje de éxito y el datalogging inicia.
  5. 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!!

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

Proceso de manufactura

  1. Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
  2. Sistema de Sensor de Temperatura Multiposición para Integración en Hogar Inteligente
  3. Mando USB para juegos DIY con Arduino – Construye tu propio gamepad de alto rendimiento
  4. MotionSense: Detección inteligente de intrusos con Arduino y ESP8266
  5. Prevención de Incendios en Impresoras 3D: Sistema de Seguridad con Sensor Inteligente
  6. Pixel Chaser: Juego LED Interactivo de Un Toque con Arduino Nano
  7. Crear un medidor IoT web con Arduino, Yaler e IFTTT
  8. Levitación magnética repulsiva con Arduino: Circuito simple y guía DIY
  9. Reloj flip Arduino con matriz LED 8×8: proyecto DIY de reloj en tiempo real
  10. Estación Meteorológica Portátil Arduino por $10 – Nano, DHT22, BMP180 y LCD
  11. CoroFence: Detector Térmico Avanzado con Sensor PIR e Integración IoT