Table des matières:

Mètre à ruban atmosphérique Arduino / Démonstration MS5611 GY63 GY86 : 4 étapes (avec photos)
Mètre à ruban atmosphérique Arduino / Démonstration MS5611 GY63 GY86 : 4 étapes (avec photos)

Vidéo: Mètre à ruban atmosphérique Arduino / Démonstration MS5611 GY63 GY86 : 4 étapes (avec photos)

Vidéo: Mètre à ruban atmosphérique Arduino / Démonstration MS5611 GY63 GY86 : 4 étapes (avec photos)
Vidéo: PROGRAMMER des BANDEAUX LED en 10min !! (Projet Exemple BONUS avec Arduino) 2024, Juillet
Anonim
Mètre à ruban atmosphérique Arduino / Démonstration MS5611 GY63 GY86
Mètre à ruban atmosphérique Arduino / Démonstration MS5611 GY63 GY86

C'est vraiment un baromètre/altimètre mais vous verrez la raison du titre en regardant la vidéo.

Le capteur de pression MS5611, présent sur les cartes de dérivation Arduino GY63 et GY86, offre des performances étonnantes. Par temps calme, il mesurera votre taille à moins de 0,2 m. Il s'agit de mesurer efficacement la distance entre votre tête et l'espace extra-atmosphérique et de la soustraire de la distance de vos pieds à l'espace extra-atmosphérique (en mesurant la pression, c'est-à-dire le poids de l'air au-dessus). Cet appareil spectaculaire a une portée qui mesurera confortablement la hauteur de l'Everest - et peut également mesurer jusqu'à quelques centimètres.

Ce projet visait comme: un projet d'écoles, un exemple de modification de code Arduino et un bon point de départ pour explorer à l'aide du capteur MS5611. Il y a beaucoup de questions sur le forum de ceux qui ont des difficultés avec ce capteur. L'approche ici rend son utilisation très simple. Après avoir réalisé ce projet, vous serez bien équipé pour développer d'autres applications liées à la pression.

Chaque capteur a ses propres constantes d'étalonnage qui doivent être lues et utilisées pour corriger les données. Une bibliothèque est disponible pour vous aider à les piloter. Le code montré ici utilise la bibliothèque pour prendre des lectures, puis les convertit en hauteur et les affiche sur un écran LCD.

Nous enverrons d'abord les données au moniteur série sur le PC/l'ordinateur portable pour les tests initiaux. Ceux-ci montrent du bruit et nous ajoutons donc un filtre pour les lisser. Ensuite, nous ajouterons un écran LCD afin que l'unité puisse fonctionner indépendamment et que vous puissiez essayer de mesurer votre taille - ou toute autre chose.

Notez que la carte GY63 n'a que le capteur de pression MS5611. Le GY86 s'appelle une carte à 10 degrés de liberté et comprend également un accéléromètre à 3 axes, un gyroscope à 3 axes et un magnétomètre à 3 axes pour seulement quelques $ de plus.

Tu auras besoin de:

1. Arduino UNO (ou autre avec brochage standard) et son câble USB

2. Carte de dérivation GY63 ou GY86

3. 4 fils Dupont mâle-femelle - ou fil de connexion

4. Blindage du clavier LCD Arduino

5. batterie 9v et plomb

6. Prise multiprise de 2,54 mm (facultatif mais recommandé)

Préparation

Téléchargez l'IDE Arduino (environnement de développement intégré) à partir de:

Quelques éléments techniques pour l'intérêt

Le MS5611 offre ses excellentes performances en faisant la moyenne d'un grand nombre de mesures. Il peut effectuer 4096 mesures analogiques de 3 octets (24 bits) en seulement 8 ms et donner la valeur moyenne. Il doit mesurer à la fois la pression et la température afin que les données de pression puissent être corrigées pour la température interne. Par conséquent, il peut fournir environ 60 paires de lectures de pression et de température par seconde.

La fiche technique est disponible sur:

Les communications se font via I2C. Ainsi d'autres capteurs I2C peuvent partager le bus (comme c'est le cas sur la carte GY86 10DOF où toutes les puces sont sur I2C).

Étape 1: obtenez une bibliothèque MS5611

De nombreux capteurs Arduino utilisent une bibliothèque standard incluse avec l'IDE Arduino ou sont fournis avec un fichier zip avec une bibliothèque qui peut être facilement installée. Cela tend à ne pas être le cas pour les capteurs MS5611. Cependant, une recherche a trouvé: https://github.com/gronat/MS5611 qui possède une bibliothèque pour le MS5611, notamment en effectuant la correction de température.

Option 1

Accédez au site Web ci-dessus, cliquez sur « Cloner ou télécharger » et sélectionnez « Télécharger ZIP ». Cela devrait fournir MS5611-master.zip dans votre répertoire de téléchargements. Maintenant, si vous le souhaitez, déplacez-le dans un dossier où vous pourrez le retrouver à l'avenir. J'utilise un répertoire appelé "data" ajouté à mes dossiers Arduino.

Malheureusement, le fichier.zip téléchargé n'inclut aucun exemple de croquis et ce serait bien d'ajouter la bibliothèque et les exemples à l'IDE Arduino. Il y a un exemple minimum dans le fichier README.md qui peut être copié et collé dans une esquisse et enregistré. C'est une façon d'aller de l'avant.

Option 2

Pour faciliter l'exécution du code dans cette instructable, j'ai ajouté l'exemple minimum ci-dessus et les exemples montrés ici à la bibliothèque et j'ai joint un fichier.zip ci-dessous qui s'installera dans l'IDE Arduino.

Téléchargez le fichier zip ci-dessous. Déplacez-le dans un meilleur dossier si vous le souhaitez.

Démarrez l'IDE Arduino. Cliquez sur Esquisse>Inclure la bibliothèque>Ajouter un fichier zip et sélectionnez le fichier. Redémarrez l'IDE. L'IDE aura maintenant à la fois la bibliothèque installée et tous les exemples montrés ici. Vérifiez en cliquant sur Fichier>exemples>>MS5611-master. Trois croquis doivent être répertoriés.

Étape 2: connectez le capteur à l'Arduino et testez

Connectez le capteur à l'Arduino et testez
Connectez le capteur à l'Arduino et testez
Connectez le capteur à l'Arduino et testez
Connectez le capteur à l'Arduino et testez

Les cartes GY63/GY86 sont généralement livrées avec des en-têtes mais pas soudées. Vous avez donc le choix de souder les en-têtes en place et d'utiliser des fils Dupont mâle-femelle, ou (comme j'ai décidé) de souder des fils directement sur la carte et d'ajouter des broches au fil à brancher sur l'Arduino. Cette dernière option est préférable si vous pensez que vous voudrez peut-être souder la carte dans un projet plus tard. Le premier est meilleur si vous souhaitez utiliser le tableau pour l'expérimentation. Dessouder des fils est beaucoup plus facile qu'un en-tête de broche.

Les connexions nécessaires sont:

Arduino GY63/GY86

VCC - 5v Power GND - GND Ground SCL - A5 I2C clock > SDA - A4 I2C data

Fixez la carte du capteur à l'Arduino comme ci-dessus et connectez l'Arduino au PC/ordinateur portable via son câble USB. Recouvrez également le capteur d'un matériau opaque/noir. Le capteur est sensible à la lumière (comme c'est le cas pour la plupart de ce type de capteur).

Démarrez l'IDE Arduino. Cliquez sur:

Fichier>exemples>>MS5611-master>MS5611data2serial.

Une nouvelle instance de l'IDE apparaîtra avec l'esquisse. Cliquez sur le bouton de téléchargement (flèche droite).

Ensuite, démarrez le traceur série - cliquez sur Outils> Traceur série et, si nécessaire, réglez le baud sur 9600. Les données envoyées sont la pression en Pascals. Après environ une seconde, il redimensionnera et élever et abaisser le capteur d'environ 0,3 m devrait apparaître comme un abaissement et une élévation de la trace (une hauteur inférieure correspond à une pression plus élevée).

Les données ont du bruit. Voir la première parcelle ci-dessus. Cela peut être lissé à l'aide d'un filtre numérique (un outil vraiment utile).

L'équation du filtre est:

valeur = valeur + K(nouvelle-valeur)

où « valeur » est les données filtrées et « nouveau » est la dernière mesure. Si K=1 il n'y a pas de filtrage. Pour des valeurs inférieures de K, les données sont lissées avec une constante de temps de T/K où T est le temps entre les échantillons. Ici, T est d'environ 17ms donc une valeur de 0,1 donne une constante de temps de 170ms soit environ 1/6s.

Le filtre peut être ajouté par:

Ajoutez une variable pour les données filtrées avant setup():

float filtré = 0;

Ajoutez ensuite l'équation du filtre après la pression = …. ligne.

filtré = filtré + 0,1* (filtré sous pression);

C'est une bonne idée d'initialiser la valeur filtrée à la première lecture. Ajoutez donc une déclaration « if » autour de la ligne ci-dessus pour que cela ressemble à:

if(filtré != 0){

filtré = filtré + 0,1* (filtré sous pression); } else { filtré = pression; // première lecture donc mise en lecture filtrée }

Le test « != » est « pas égal ». Donc, si «filtré» n'est pas égal à 0, l'équation du filtre est exécutée, mais si c'est le cas, elle est définie sur la lecture de la pression.

Enfin, nous devons remplacer « pression » par « filtré » dans l'instruction Serial.println afin que nous voyions la valeur filtrée.

Le meilleur apprentissage est obtenu en effectuant les modifications ci-dessus manuellement. Cependant, je les ai inclus dans l'exemple MS5611data2serialWfilter. Donc, s'il y a des problèmes, l'exemple peut être chargé.

Téléchargez maintenant le code sur l'Arduino et constatez l'amélioration. Voir le deuxième graphique ci-dessus et notez que l'échelle Y est agrandie x2.

Essayez une valeur inférieure pour la constante de filtre, disons 0,02 au lieu de 0,1, et voyez la différence. Les données sont plus fluides mais avec une réponse plus lente. C'est un compromis qu'il faut rechercher lors de l'utilisation de ce filtre simple. La caractéristique est la même qu'un filtre RC (résistance et capacité) largement utilisé dans les circuits électroniques.

Étape 3: Rendez-le autonome

Nous allons maintenant ajouter un écran de clavier LCD, convertir la pression en hauteur en mètres et l'afficher à l'écran. Nous ajouterons également la possibilité de mettre à zéro la valeur en appuyant sur le bouton « Select » du clavier.

Avec le shield LCD sur l'Arduino, le capteur devra être connecté au shield LCD. Malheureusement, les écrans LCD sont généralement livrés sans les prises appropriées. Donc, les options sont de faire des connexions à souder ou d'obtenir des multiprises. La bande de prise est disponible sur ebay pour pas beaucoup plus que le coût de l'affranchissement. Faites une recherche sur « 2,54 mm socket strip » et recherchez ceux qui sont similaires à ceux de l'Arduino. Ceux-ci viennent généralement en longueurs de 36 ou 40 broches. J'éviterais les broches tournées car elles ne sont pas assez profondes pour les fils Dupont standard.

La bande de douille doit être coupée à longueur et la coupe doit être faite au même endroit qu'une goupille. Donc, pour une bande à 6 broches, retirez la 7e broche avec une pince fine, puis coupez à cet endroit à l'aide d'une scie à métaux junior. Je lime les extrémités pour les rendre propres.

Assurez-vous qu'il n'y a pas de ponts de soudure lorsque vous les soudez sur la carte.

Avec la décision appropriée de connecter le capteur, branchez le blindage LCD sur l'Arduino et connectez le capteur aux mêmes broches - mais maintenant sur le blindage LCD.

Préparez également la batterie et le câble. J'ai composé mon plomb à partir de pièces dans mon bac à ferraille, mais elles sont également disponibles sur ebay - y compris une belle option qui comprend un boîtier de batterie et un interrupteur. Rechercher sur « Plomb PP3 2.1 mm ».

La consommation actuelle est d'environ 80ma. Par conséquent, si vous souhaitez fonctionner plus de quelques minutes, envisagez une batterie 9v plus grosse que la PP3.

Étape 4: Ajoutez le code pour l'altitude et l'écran LCD

Image
Image

Nous devons faire un peu plus de codage pour convertir la pression en hauteur et piloter l'affichage.

Au début de l'esquisse, ajoutez la bibliothèque d'affichage et dites-lui quelles broches sont utilisées:

#comprendre

// initialise la bibliothèque avec les numéros des broches de l'interface LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Ensuite, nous avons besoin de variables et d'une fonction pour lire les boutons du clavier. Ceux-ci sont tous connectés à l'entrée analogique A0. Chaque bouton donne une tension différente à A0. Une recherche sur le «code des boutons de bouclier lcd arduino» a trouvé un bon code à:

www.dfrobot.com/wiki/index.php/Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)#Sample_Code

Ajoutez ce code avant setup():

// définit certaines valeurs utilisées par le panneau et les boutons

int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 // lire les boutons int read_LCD_buttons() { adc_key_in = analogRead(0); // lire la valeur du capteur // mes boutons lors de la lecture sont centrés sur ces valeurs: 0, 144, 329, 504, 741 // nous ajoutons environ 50 à ces valeurs et vérifions si nous sommes proches si (adc_key_in > 1000) renvoie btnNONE; // Nous en faisons la 1ère option pour des raisons de vitesse car ce sera le résultat le plus probable si (adc_key_in < 50) return btnRIGHT; si (adc_key_in < 250) renvoie btnUP; if (adc_key_in < 450) renvoie btnDOWN; si (adc_key_in < 650) renvoie btnLEFT; if (adc_key_in < 850) renvoie btnSELECT; renvoie btnNONE; // quand tous les autres échouent, retourne ceci… }

L'altitude est généralement mise à zéro au point de départ. Nous avons donc besoin de variables pour la hauteur et la référence. Ajoutez-les avant setup() et la fonction ci-dessus:

flotteur mtr;

référence flottante = 0;

La conversion de la pression en Pascals en mètres est presque exactement une division par 12 au niveau de la mer. Cette formule convient à la plupart des mesures au sol. Il existe des formules plus précises qui sont plus appropriées pour la conversion à haute altitude. Utilisez-les si vous comptez vous en servir pour enregistrer l'altitude d'un vol en montgolfière.

La référence doit être définie sur la première lecture de pression afin que nous commencions à une hauteur nulle et lorsque le bouton SELECT est enfoncé. Ajoutez, après le code du filtre et avant l'instruction Serial.println:

si(réf == 0){

réf = filtré/12,0; } if(read_LCD_buttons() == btnSELECT) { ref = filtered/12.0; }

Après cela, ajoutez le calcul de la hauteur:

mtr = ref - filtré/12,0;

Enfin, modifiez l'instruction Serial.println pour envoyer « mtr » au lieu de « filtré », et ajoutez le code pour envoyer « mtr » à l'écran LCD:

Serial.println(mtr); // Envoi de la pression via série (UART)

lcd.setCursor(0, 1); // ligne 2 lcd.print(mtr);

Toutes les modifications ici sont incluses dans l'exemple MS5611data2lcd. Chargez-le comme à l'étape 2.

Il y a un dernier mod qui est utile. L'affichage est difficile à lire lorsqu'il est mis à jour 60 fois par seconde. Notre filtre lisse les données avec une constante de temps d'environ 0,8 s. La mise à jour de l'affichage toutes les 0,3 s semble donc suffisante.

Ajoutez donc un compteur après toutes les autres définitions de variables au début de l'esquisse (par exemple après float ref=0;):

entier je = 0;

Ajoutez ensuite du code pour incrémenter 'i' et une instruction 'if' à exécuter lorsqu'il atteint 20, puis remettez-le à zéro et déplacez les commandes Serial et lcd dans l'instruction 'if' afin qu'elles ne soient exécutées que toutes les 20 lectures:

je += 1;

if(i>=20) { Serial.println(mtr); // Envoie la pression via série (UART) lcd.setCursor(0, 1); // ligne 2 lcd.print(mtr); je = 0; }

Je n'ai pas inclus d'exemple avec cette dernière modification afin d'encourager la saisie manuelle du code qui facilite l'apprentissage.

Ce projet devrait donner un bon point de départ par exemple pour un baromètre numérique. Pour ceux qui pourraient envisager une utilisation dans les modèles RC - recherchez OpenXvario pour le code qui permet un altimètre et un variomètre pour les systèmes de télémétrie Frsky et Turnigy 9x.

Conseillé: