Variometro Acústico Ultra‑Sensible: Barómetro de Precisión para Pilotos
Componentes y materiales
| Componente | Cantidad |
|---|---|
| SparkFun Arduino Pro Mini 328 - 3.3V/8MHz | 1 |
| Sensor barométrico GY-63 (MS5611) 3.3V | 1 |
| Dipswitch de 8 posiciones | 1 |
| Zumbador activo con oscilador interno | 1 |
| Multiplexor 8x1 4051 3.3V | 1 |
| Batería LiPo 1S 3.7V 350mAh con cables y conectores | 1 |
| Módulo elevador de tensión + cargador USB LiPo TP5400 | 1 |
| Resistencias: red de 8x4.7k, 220Ω, 2x10k; condensadores 47uF, 470uF | 1 juego |
| Fusible rearmeable 0.5A | 1 |
| Caja plástica ABS negra 78x39x22 mm | 1 |
| Interruptor deslizante on/off | 1 |
| Conector hembra 6 pines (para FTDI) | 1 |
| Pines macho varios (17 pines en distintas configuraciones) | 1 juego |
| Pines macho 90° 4 pines (para sensor de presión) | 1 |
| 30 cm alambre rígido forrado para puentes y conexiones | 1 |
| Cordón verde | 1 |
Descripción del proyecto
Introducción
Este instrumento lo utilizan los pilotos durante el vuelo (planeadores, parapentes, alas delta, globos, etc.) para localizar el núcleo de las térmicas y ascender de forma más eficiente.
Descripción general
Se trata de un barómetro extremadamente sensible que emite señales acústicas tanto en ascenso como en descenso. Los sonidos son pitidos simples (beep-beep) a intervalos de un segundo, dos por segundo o más durante el ascenso (mayor tasa de ascenso = mayor frecuencia de pitidos). Su sensibilidad es tal que comienza a pitar con apenas unos centímetros por segundo de velocidad vertical; basta levantar lentamente el brazo sosteniendo el variometro para oírlo. En caso de descenso, emite pitidos largos y continuos (beeeeeep) a partir de -1 m/s.
Lista de componentes
- Arduino Pro Mini 3.3V 8 MHz como microcontrolador
- Sensor de presión barométrica GY-63 (MS5611) 3.3V
- Dipswitch de 8 posiciones
- Zumbador (activo con oscilador interno)
- Multiplexor 8x1 4051 3.3V
- Batería LiPo 1S 3.7V 350mAh + cables rojo/negro 10cm y conectores M+F
- Módulo step-up + cargador USB LiPo TP5400 (AZDelivery)
- Resistencias varias, red de 8x4.7k, 220Ω, 2x10k, condensadores 47uF, 470uF
- Fusible rearmeable 0.5A
- Caja plástica ABS negra pequeña, 78x39x22 mm
- Interruptor deslizante on/off
- Conector hembra 6 pines (para FTDI)
- Pines macho (2x, 2x, 2x, 2x, 2x, 4x, 1x, 1x y 1x)
- Pines macho 90° 4 pines para circuito del sensor P
- 30 cm alambre rígido forrado para puentes y conexiones
- Cordón verde
El esquemático Fritzing muestra todo lo necesario para construir el circuito. Atención: el condensador cerámico marrón debajo del interruptor negro es en realidad el fusible rearmeable (no encontré el símbolo adecuado). En lugar de 8 resistencias individuales usé una red de resistencias única que integra 8x4.7kΩ; es el componente negro de 9 pines encima del dipswitch azul (1 pin común + 8 resistencias). El archivo Fritzing está disponible para descarga.
Significado del dipswitch
El dipswitch azul (8 micro-interruptores en una carcasa) permite seleccionar y cambiar parámetros de funcionamiento:
- Pin 1: No utilizado (cualquier posición)
- Pin 2: Volumen bajo/alto (cortocircuita la resistencia en serie con el zumbador)
- Pines 3 y 4: Alarma de descenso (m/s): -999 (sin alarma), -1, -2, -3 (código binario de 2 bits)
- Pines 5 y 6: Frecuencia de pitido en ascenso (Hz): +1, +1.5, +2, +3 (código binario)
- Pines 7 y 8: Sensibilidad (m/s): +0.0 (máxima), +0.1, +0.2, +0.5 (código binario)
Detalle de cada grupo:
- Pines 3-4 (alarma hundimiento): 00=-999 (desactivada), 01=-1, 10=-2, 11=-3 m/s. Ejemplo: posición 2 (10) pita solo si la tasa de hundimiento supera -2 m/s. Para probar: usar un ascensor bajando del 3er al 1er piso.
- Pines 5-6 (frecuencia): A misma velocidad de ascenso, +2 Hz pita más rápido que +1 Hz. Algunos prefieren pitidos más lentos para menos "estrés".
- Pines 7-8 (sensibilidad): +0.0 = máxima sensibilidad (pita con <10 cm/s); puede pitar quieto por cambios mínimos de presión (cerrar una puerta) o ruido eléctrico, pero es estable y útil. +0.5 = mucha menos sensibilidad, requiere mayor velocidad vertical. Prueba: ascensor subiendo del 1er al 3er piso.
Electrónicamente, pines 1 y 3-8 se leen analógicamente mediante el multiplexor 4051; el software decide si están on/off (valor >512). El Arduino selecciona cada uno de los 8 puertos mediante 3 bits de salida (000 a 111). Ver función readDIPswitch() en el código.
Cuidado con la batería
Los dos resistores de 10k y el condensador de 47uF forman un divisor de tensión para monitorizar la batería. Las LiPo son críticas si se descargan por debajo de 3.3V. Cada 10 segundos (BATTinterval) la función checkBATT() verifica la tensión; si es baja, el zumbador emite 6 pitidos cortos en un segundo. ¡Apaga y recarga pronto!
IMPORTANTE: Haz al menos un AGUJERO en la caja para que el aire llegue al sensor de presión. Yo hice dos: uno para oír el zumbador y otro para ver el LED de carga al conectar el micro-USB. Con agujeros, el variometro ya no es estanco.
El PCB
Se usa PCB de una sola cara, por eso incluye algunos puentes de alambre (líneas punteadas) para resolver el enrutamiento. Aquí se muestra la cara de componentes; abajo están ambos archivos (componentes y soldadura, espejados) para descargar e imprimir con láser en hojas "amarillas" o "azules" (estas últimas son mejores pero más caras). Al imprimir: desactivar ahorro de tóner, usar 1200 dpi para negro intenso. La transferencia de tóner se hace con plancha caliente. Imprimir ambas caras da acabado "profesional".
Se usan una docena de pines de Arduino. Soldar los pines no usados es innecesario: déjalos libres. Coloca el conector hembra 6 pines en la cara superior del Pro Mini para permitir futura conexión FTDI y actualizaciones de firmware.
El circuito step-up USB va boca abajo. Sujétalo con dos pines macho fuertes (sin carcasa plástica) junto al conector USB donde dice "Power USB": suelda pines y conector juntos. 3 cables conectan GND-, BATT+ y OUT+ a este circuito.
El sensor barométrico
El GY-63 (MS5611) va en una pequeña placa y se comunica por I2C. Incluye sensor de temperatura (no usado). El programa llama a readPSensor(), núcleo del software. Lo que necesitamos es el cambio relativo de altitud: la función lee muchas veces por segundo y acumula en PrexTotal; cada medio segundo (PrexInterval) calcula el cambio medio de altitud y genera los pitidos según ajustes del dipswitch. Este filtrado simple es suficiente; probé filtro de Kalman y algoritmos Madgwick/Mahony sin mejora significativa.
Actualizaciones / Consejos
¡Eso es todo! Disfruté mucho con este proyecto. ¡Tú también!
Marco Zonca
Código
Código del Variometro Acústico (Arduino)
/* Variometro para parapente - Marco Zonca 2020
Arduino MiniPro 3.3V, GY-63 (MS5611), dipswitch 8, zumbador, Mux 4051,
LiPo 1S 3.7V 350mA, step-up 3.7V->5V + cargador USB
Dipswitch: 1=no usado 2=volumen hw low/high 3=\ alarma hundimiento: OFF -1.0 -2.0 -3.0 m/s 4=/
5=\ freq pitidos: +1.0 +1.5 +2.0 +3.0 Hz 6=/ 7=\ sensibilidad: +0.0 +0.1 +0.2 +0.5 m/s 8=/ */
#include <MS5611.h>
#include <NewTone.h>
const int muxIOpin = 15;
const int vbattPin = 14;
const int muxbit0 = 4;
const int muxbit1 = 5;
const int muxbit2 = 6;
const int buzzerPin = 7;
const int DIPSWinterval = 5000;
const int BATTinterval = 10000;
const int PrexInterval = 500;
const boolean isDebug = false;
float sensibility[5];
float frequency[5];
float sinkalarm[5];
long n=0;
boolean dipswitch[9];
String dips;
unsigned long prevDIPSWmillis = 0;
unsigned long prevBATTmillis = 0;
float n1=0, n2=0, SensorVBatt=0;
double referencePressure = 0;
unsigned long prevPrexMillis = 0, currPrexMillis = 0;
double realPressure = 0;
float absoluteAltitude = 0, relativeAltitude = 0;
float avgAltitude = 0, avgPrevAltitude = 0;
long PrexCounter = 0;
float PrexTotal = 0, PrexVario = 0;
boolean isFirstCalc = true;
MS5611 psensor;
void setup() {
Serial.begin(9600);
pinMode(muxbit0, OUTPUT);
pinMode(muxbit1, OUTPUT);
pinMode(muxbit2, OUTPUT);
pinMode(buzzerPin, OUTPUT);
sensibility[4]=0; sensibility[3]=0.5; sensibility[2]=0.2; sensibility[1]=0.1; sensibility[0]=0.0;
frequency[4]=0; frequency[3]=3.0; frequency[2]=2.0; frequency[1]=1.5; frequency[0]=1.0;
sinkalarm[4]=0; sinkalarm[3]=-3.0; sinkalarm[2]=-2.0; sinkalarm[1]=-1.0; sinkalarm[0]=-999.9;
readDIPswitch();
psensor.begin();
referencePressure = psensor.readPressure();
if (isDebug) Serial.println("Vario is on");
NewTone(buzzerPin,4); delay(750); noNewTone();
}
void loop() {
readPSensor();
if ((prevDIPSWmillis+DIPSWinterval) < millis()) { readDIPswitch(); prevDIPSWmillis=millis(); }
if ((prevBATTmillis+BATTinterval) < millis()) { checkBATT(); prevBATTmillis=millis(); }
}
void readPSensor() {
realPressure = psensor.readPressure();
absoluteAltitude = psensor.getAltitude(realPressure);
relativeAltitude = psensor.getAltitude(realPressure, referencePressure);
PrexCounter++;
PrexTotal += relativeAltitude;
currPrexMillis = millis();
if (currPrexMillis - prevPrexMillis >= PrexInterval) {
avgAltitude = PrexTotal / PrexCounter;
if (isFirstCalc) { avgPrevAltitude=avgAltitude; isFirstCalc=false; }
PrexVario = (avgAltitude-avgPrevAltitude) * (1000/PrexInterval); // m/s
if ((PrexVario <= sensibility[4]) && (PrexVario >= sinkalarm[4])) noNewTone();
if (PrexVario > sensibility[4]) NewTone(buzzerPin, (int)(PrexVario+frequency[4])); // ascenso
if (PrexVario < sinkalarm[4]) NewTone(buzzerPin, 0.1); // descenso
avgPrevAltitude = avgAltitude;
prevPrexMillis = currPrexMillis;
PrexTotal=0; PrexCounter=0;
if (isDebug) { Serial.print("Vario="); Serial.println(PrexVario); }
}
}
void readDIPswitch() {
int s=0;
for (n=1; n<9; n++) {
dips="0000"+String(n-1, BIN);
dips=dips.substring(dips.length()-3,dips.length());
digitalWrite(muxbit0, dips.substring(2,3)=="0"?LOW:HIGH);
digitalWrite(muxbit1, dips.substring(1,2)=="0"?LOW:HIGH);
digitalWrite(muxbit2, dips.substring(0,1)=="0"?LOW:HIGH);
dipswitch[n] = (analogRead(muxIOpin) > 512) ? false : true;
if (isDebug) Serial.print(dipswitch[n]?"1":"0");
}
if (isDebug) Serial.println();
s=0; if (dipswitch[7]) s+=2; if (dipswitch[8]) s+=1; sensibility[4]=sensibility[s];
if (isDebug) { Serial.print("Sensibility="); Serial.println(sensibility[4]); }
s=0; if (dipswitch[5]) s+=2; if (dipswitch[6]) s+=1; frequency[4]=frequency[s];
if (isDebug) { Serial.print("Frequency="); Serial.println(frequency[4]); }
s=0; if (dipswitch[3]) s+=2; if (dipswitch[4]) s+=1; sinkalarm[4]=sinkalarm[s];
if (isDebug) { Serial.print("SinkAlarm="); Serial.println(sinkalarm[4]); }
}
void checkBATT() {
n1 = analogRead(vbattPin);
n2 = ((6.60 * n1) / 1023.00);
SensorVBatt = n2 + ((n2 * 0.0) /100);
if (SensorVBatt <= 3.4) NewTone(buzzerPin,6,1000);
if (isDebug) { Serial.print("VBatt="); Serial.println(SensorVBatt); }
}
Piezas personalizadas y envolventes
Esquemáticos
Archivo Fritzing: vario_R1XzPifiX4.fzz
Proceso de manufactura
- Barómetro Aneroide: Diseño, Historia y Futuro de la Medición de Presión
- Detector de voltaje sensible: construye un detector de señal de audio de alta sensibilidad
- Técnica Avanzada de Detección Identifica Defectos en Transistores con Sensibilidad Sin Precedentes
- Sensores de tensión ultra-delgados MXene revolucionarios mejoran precisión y seguridad de brazos robóticos
- Receptores Ópticos Avanzados para Comunicaciones Espaciales
- Almacene y gestione datos sensibles de forma segura con Google Cloud Secret Manager
- Amstrong® Ultra 650MC – Acero de Alta Resistencia y Bajo Carbono para una Soldabilidad Superior
- Amstrong® Ultra 650MCT – Acero de Alta Resistencia y Bajo Carbono para una Soldabilidad Superior
- Amstrong® Ultra 700MC – Acero de Grano Fino de Alta Resistencia para Soldadura Superior
- Amstrong® Ultra 700MCT – Acero de Ultra Alto Límite Elástico, Bajo Carbono y Grano Fino para Soldabilidad Excepcional
- Cromo de Ultra Alta Pureza (UHP Cr) – Calidad 99,95%+ para Aplicaciones Críticas