Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes

Composants et Fournitures

Arduino Pro Mini 328 - 3.3V/8MHz × 1
Capteur de pression barométrique GY-63 (MS5611) 3.3V × 1
Commutateur DIP 8 positions × 1
Buzzer actif (avec oscillateur interne) × 1
Multiplexeur 8x1 4051 3.3V × 1
Batterie LiPo 1s 3.7V 350mAh + fils rouge/noir 10cm et connecteurs M/F × 1
Module élévateur de tension + chargeur USB LiPo TP5400 (AZDelivery) × 1
Quelques résistances, réseau de 8×4.7kΩ, 220Ω, 2×10kΩ, condensateurs 47µF, 470µF × 1
Fusible réarmable 0.5A × 1
Boîtier ABS noir 78×39×22 mm × 1
Interrupteur à glissière on/off × 1
Connecteur femelle 6 broches (pour FTDI) × 1
Connecteurs mâles 17 broches (assortis) × 1
Connecteur mâle 4 broches 90° (pour capteur de pression) × 1
30 cm de fil rigide gainé (pour jumpers et connexions) × 1
Cordon vert (pour fixation) × 1

À Propos de ce Projet

Introduction

Cet instrument est utilisé par les pilotes pendant le vol (planeur, parapente, deltaplane, ballon, etc.) pour localiser le cœur des ascendances thermiques et monter plus efficacement.

Description Brève

C'est un baromètre extrêmement sensible qui émet des signaux sonores lors de la montée (variomètre positif) et lors de la descente (variomètre négatif). Les sons sont de simples « bip-bip », une fois par seconde, ou deux par seconde ou plus pendant la montée (plus le taux de montée est élevé, plus la fréquence des bips augmente) : il est si sensible qu'il commence à bipper dès quelques centimètres par seconde ! Vous pouvez tester en levant lentement le bras en tenant le variomètre. En cas de taux de descente, il émet des bips longs et continus (beeeeeep) à -1 m/s ou plus.

Liste Détaillée des Composants

Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes
Schéma Fritzing complet du circuit

Le schéma Fritzing ci-dessus montre tout le nécessaire pour construire le circuit. Attention : le « condensateur céramique » marron, juste sous l'interrupteur noir, est en réalité un fusible réarmable (je n'ai pas trouvé le symbole adéquat). À la place des 8 résistances individuelles, j'ai utilisé un réseau de résistances unique (le composant noir au-dessus du DIP switch bleu, à 9 broches : une commune + 8 pour les résistances). Le fichier Fritzing est disponible en téléchargement.

Signification du Commutateur DIP

J'ai choisi le DIP switch bleu (8 micro-interrupteurs dans un boîtier unique) pour sélectionner et modifier les paramètres de fonctionnement. Voici le tableau des paramètres :

Détail des réglages :

Position 1 : inutilisée, n'affecte rien.

Position 2 (Volume) : agit électriquement : quand ON, elle court-circuite la résistance en série avec le buzzer, laissant passer plus de courant pour un volume plus élevé.

Positions 3 et 4 (Alarme de descente) : codage binaire sur 2 bits (4 réglages) : 00=0, 01=1, 10=2, 11=3. Vous pouvez régler l'alarme à -999 m/s (désactivée, ne bippera jamais) avec 3=OFF et 4=OFF (00) ; ou à -1, -2, -3 m/s respectivement avec 3=OFF/4=ON, 3=ON/4=OFF, 3=ON/4=ON. Exemple : position 2 = alarme seulement au-delà de -2 m/s. Pour tester : utilisez un ascenseur (descente de l'étage 3 au 0) ou descendez rapidement un escalier.

Positions 5 et 6 (Fréquence des bips) : même principe binaire. À même vitesse de montée, +2 Hz bippera plus vite que +1 Hz. Certains préfèrent des bips plus lents, moins « stressants ».

Positions 7 et 8 (Sensibilité) : +0.0 = sensibilité maximale, déclenche à moins de 10 cm/s ; dans cette position, l'instrument peut bipper même immobile, captant de minuscules variations de pression (ex: fermer une porte dans la pièce). Il capte aussi des « bruits » électriques mais reste assez stable et utile. À la 4ème position (+0.5 m/s), sensibilité fortement réduite : il faut « beaucoup » plus de vitesse pour obtenir les bips. Test : ascenseur de l'étage 0 au 3.

Électroniquement, les positions 1 et 3-8 sont lues en analogique via le multiplexeur 4051, le logiciel décide si ON/OFF (seuil 512). Pour sélectionner quel port lire parmi les 8, l'Arduino met 3 bits en sortie (000 à 111). Voir la fonction readDIPswitch() dans le code.

Attention à la Batterie

Les deux résistances 10kΩ avec le condensateur 47µF forment un diviseur de tension pour surveiller la batterie. Les LiPo deviennent critiques sous 3.3V : toutes les 10 secondes (BATTinterval), la fonction checkBATT() est appelée ; en cas de tension faible, le buzzer émet 6 bips courts en 1 seconde. N'attendez pas pour éteindre et recharger !

Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes
Boîtier percé pour le buzzer, la LED de charge et l'USB

TRÈS IMPORTANT : faites au moins UN TROU dans le boîtier pour laisser l'air passer vers le capteur de pression. J'en ai fait deux : un pour entendre le buzzer, un pour voir la LED de charge quand le câble micro-USB est branché. Avec les trous, le variomètre n'est plus étanche.

Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes
Montage interne du circuit
Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes
Détail du réseau de résistances et du DIP switch
Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes
Le cordon vert pour accrocher l'appareil en toute sécurité

Le Circuit Imprimé (PCB)

Un PCB simple face est utilisé, d'où la présence de quelques jumpers filaires (lignes pointillées) pour résoudre le routage. Ci-dessous, le côté composants ; les deux faces (composants et soudure, miroir) sont disponibles en téléchargement pour impression laser sur feuilles « jaunes » ou « bleues » (les bleues sont dites meilleures, mais plus chères). À l'impression : désactivez l'économie de toner, utilisez 1200 dpi pour un noir bien dense. Le transfert toner se fait au fer à repasser. Imprimer les deux faces rend le projet « professionnel ».

Une douzaine de broches Arduino sont utilisées. Souder les broches inutilisées est inutile : laissez-les libres. Placez le connecteur femelle 6 broches sur la face supérieure du Pro Mini pour permettre une future connexion FTDI pour mises à jour logicielles.

Le circuit d'alimentation USB step-up est placé à l'envers. Pour le fixer : deux broches mâles solides (broches Arduino sans le support plastique) de chaque côté du connecteur USB où est marqué « Power USB » : soudez le tout ensemble (deux broches + connecteur USB). 3 fils relient GND-, BATT+ et OUT+ à ce circuit.

Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes
Faces composants et soudure du PCB

Le Capteur Barométrique

Le GY-63 (MS5611), nommé P-Sensor sur le PCB, est monté sur un petit circuit et communique avec l'Arduino via bus I2C. Son utilisation est simple ; il intègre aussi un capteur de température non utilisé ici.

Le programme appelle la fonction readPSensor(), cœur du logiciel. Ce qu'il nous faut, c'est la variation relative d'altitude : la fonction lit plusieurs fois par seconde et accumule dans PrexTotal ; toutes les demi-secondes (PrexInterval), elle calcule la variation moyenne d'altitude et déclenche les bips (ou bip long) selon les réglages du DIP switch. Cette méthode simple de filtrage suffit ; j'ai testé le filtre de Kalman, ainsi que les algorithmes complexes de Madgwick et Mahony, sans bénéfice significatif pour ce projet.

Mises à Jour / Astuces

C'est tout. J'ai vraiment pris du plaisir sur ce projet ! Faites-le vous aussi ! :-)

Marco Zonca

Code

Code du Variomètre Acoustique Arduino

/* Variomètre pour parapente, Marco Zonca 2020
   Arduino MiniPro 3.3V, GY-63 (MS5611), DIP switch 8, buzzer, Mux 4051,
   LiPo 1s 3.7V 350mA, step-up 3.7V->5V + chargeur USB
   DIP Switch: 1= inutilisé 2= volume buzzer HW bas/haut
   3= \ alarme descente: OFF -1.0 -2.0 -3.0 m/s 4= /
   5= \ fréquence bips: +1.0 +1.5 +2.0 +3.0 Hz 6= /
   7= \ sensibilité: +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.0 / PrexInterval); // vario m/s

    if ((PrexVario <= sensibility[4]) && (PrexVario >= sinkalarm[4])) noNewTone();
    if (PrexVario > sensibility[4]) NewTone(buzzerPin, (int)(PrexVario + frequency[4])); // montée
    if (PrexVario < sinkalarm[4]) NewTone(buzzerPin, 0.1); // descente

    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);
    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); // correction arbitraire (inactive = 0%)
  if (SensorVBatt <= 3.4) NewTone(buzzerPin, 6, 1000);
  if (isDebug) { Serial.print("VBatt="); Serial.println(SensorVBatt); }
}

Pièces Personnalisées et Boîtiers

Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes Variomètre Acoustique Ultra-Sensible : Baromètre de Précision pour Pilotes

Schémas

Fichier Fritzing : vario_R1XzPifiX4.fzz

Processus de fabrication

  1. Stocker et Gérer Sécurément les Données Sensibles avec Google Cloud Secret Manager
  2. Baromètre anéroïde : conception, histoire et avenir de la mesure de pression
  3. Capteurs de contrainte MXene ultra-minces révolutionnaires améliorent la précision et la sécurité des bras robotiques
  4. Récepteurs optiques avancés pour communications spatiales
  5. Amstrong® Ultra 650MC – Acier haute résistance, faible teneur en carbone pour une soudabilité supérieure
  6. Amstrong® Ultra 650MCT – Acier haute résistance, faible teneur en carbone pour une soudabilité supérieure
  7. Amstrong® Ultra 700MC – Acier haute résistance à grain fin pour soudabilité supérieure
  8. Amstrong® Ultra 700MCT – Acier ultra haute résistance à grain fin et bas carbone pour soudabilité supérieure
  9. Chrome ultra-pur (UHP Cr) – Pureté 99,95 %+ pour applications critiques