Table des matières:
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Bienvenue dans mon tout premier instructable ! J'espère que vous le trouverez instructif. N'hésitez pas à laisser des commentaires qu'ils soient positifs ou négatifs.
Ce projet consiste à créer un niveau à bulle numérique basé sur arduino et MPU6050. Alors que la conception et le code finis sont les miens, le concept original et une grande partie du code sur lequel j'ai travaillé ne le sont pas. Je ne suis pas dans le plagiat, donc je suis plus qu'heureux de donner du crédit à ceux sur lesquels j'ai construit des idées. Les 2 personnes principales que je veux saluer sont Paul McWhorter de YouTuber et DroneBot Workshop. J'inclus des liens vers eux dans mon PDF de liens utiles youtube. Merci également à EEEnthusiast pour sa vidéo informative sur l'utilisation du MPU6050, y compris la configuration et la lecture du module sans bibliothèque externe (son lien est dans le même PDF).
Le projet que j'ai produit fonctionne « tel quel » et est assez précis, certainement jusqu'à 45% dans les deux sens. Vous pouvez l'utiliser exactement comme je l'ai conçu, ou vous pouvez l'adapter à vos propres goûts. Les plus astucieux remarqueront que mon projet semble presque identique à celui produit par l'atelier DroneBot, mais rassurez-vous, il existe des différences significatives, notamment en ce qui concerne le code de calcul des angles, ainsi que la possibilité de stocker les valeurs de calibrage dans Eeprom !
Quelques fonctionnalités pour vous mettre en appétit:
Angles de tangage et de roulis disponibles à 0,1 degré près.
Détection automatique de l'orientation de l'unité gyroscopique (horizontale ou verticale)
Étalonnage complet avec résultats automatiquement stockés dans l'eeprom
Indication LED de -2 à +2 degrés (modifiable en code)
Indication sonore supplémentaire du niveau (peut être activée/désactivée à la volée)
Circuit compact nécessitant un minimum de composants
Commençons.
Fournitures
Ce projet (en l'état) utilise les éléments suivants:
1 x Arduino nano (le mien est un clone)
1 x module gyroscope/accéléromètre MPU6050
1 x LCD - 16 x 2 + connexion I2C
1 x pousser pour faire le commutateur
1 x buzzer piézo
1 x LED verte
2 x LED jaunes
2 x LED rouges
5 résistances de 220 ohms
Divers câbles de démarrage
Planche à pain
Alimentation (le mien utilisait une banque d'alimentation USB 5v, lorsqu'il n'était pas connecté à mon PC, mais vous pouvez utiliser une batterie correctement connectée)
Étape 1: Le circuit
En supposant que vous ayez tous les composants, vous devrez construire votre maquette.
Je montre ma configuration à titre indicatif, mais les connexions sont les suivantes:
La broche Arduino D2 se connecte à 1 côté de l'interrupteur poussoir. L'autre côté de l'interrupteur poussoir se connecte à la terre
La broche Arduino D3 se connecte à 1 côté de la résistance de 220 ohms. L'autre côté de la résistance se connecte à l'anode de la LED rouge. La cathode de la LED rouge va à la terre.
La broche Arduino D4 se connecte à 1 côté de la résistance de 220 ohms. L'autre côté de la résistance se connecte à l'anode de la LED jaune. La cathode de la LED jaune va à la terre.
La broche Arduino D5 se connecte à 1 côté de la résistance de 220 ohms. L'autre côté de la résistance se connecte à l'anode de la LED verte. La cathode de la LED verte va à la terre.
La broche Arduino D6 se connecte à 1 côté de la résistance de 220 ohms. L'autre côté de la résistance se connecte à l'anode de la LED jaune. La cathode de la LED jaune va à la terre.
La broche Arduino D7 se connecte à 1 côté de la résistance de 220 ohms. L'autre côté de la résistance se connecte à l'anode de la LED rouge. La cathode de la LED rouge va à la terre.
La broche Arduino D8 se connecte à un côté du buzzer Piezo. L'autre côté du buzzer se connecte à la terre.
La broche Arduino A4 se connecte aux broches SDA du MPU6050 ET de l'écran LCD.
La broche Arduino A5 se connecte aux broches SCL du MPU6050 ET de l'écran LCD
L'alimentation 5v et Gnd pour MPU6050 et LCD proviennent respectivement des broches Arduino Nano 5v et GND.
Une fois terminé, cela devrait être similaire à ma configuration illustrée. J'ai mis du blu tak sous le MPU6050 pour l'empêcher de bouger et aussi sur l'écran LCD pour le garder sur le bord de la maquette.
Étape 2: le code
Le code ci-joint est le code que j'ai utilisé pour ce projet. La seule bibliothèque avec laquelle vous pouvez avoir un problème est la
Bibliothèque LiquidCrystal_I2C.h telle que je l'ai importée lorsque j'ai commencé à travailler avec des écrans LCD. Malheureusement, il existe quelques bibliothèques qui utilisent la même instruction #include, mais sont légèrement différentes. Si vous rencontrez des problèmes avec le vôtre, trouvez un autre code LCD qui vous convient et modifiez le code en conséquence. Ce n'est probablement que la configuration qui diffère. Toutes les commandes 'print' devraient fonctionner de la même manière.
Tout le code a été commenté et en supposant que je l'ai bien fait, il y aura aussi une vidéo expliquant tout, mais voici quelques points à noter:
LiquidCrystal_I2C lcd (0x27, 16, 2);
Le code ci-dessus est la configuration de mon écran LCD. Si votre bibliothèque est différente, vous devrez peut-être modifier non seulement votre bibliothèque, mais également cette ligne.
{ lcd.setCursor(0, 1); lcd.print("Horizontal !"); orientation = HORIZONTAL; //Lire les données brutes acc et gyro du MPU-6050 1000 fois pour (int cal_int = 0; cal_int < 1000; cal_int ++) { read_mpu_6050_data(); //Ajouter le décalage gyro x à la variable gyro_x_cal gyro_x_cal += gyro_x; //Ajouter le décalage gyro y à la variable gyro_y_cal gyro_y_cal += gyro_y; //Ajouter le décalage gyro z à la variable gyro_z_cal gyro_z_cal += gyro_z; //Ajouter le décalage acc x à la variable acc_x_cal acc_x_cal += acc_x; //Ajouter le décalage acc y à la variable acc_y_cal acc_y_cal += acc_y; } // Divisez tous les résultats par 1000 pour obtenir le décalage moyen gyro_x_cal /= 1000.0; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; Étalonnage horizontal = 255; adresse_eeprom = 0; EEPROM.put(eeprom_address, horizonalCalibration); eeprom_address += sizeof(int); EEPROM.put(eeprom_address, gyro_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_y_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_z_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_y_cal); eeprom_address += sizeof(float); //Notez que nous ne stockons pas de décalage pour acc_z, à cause de la gravité ! retard (500); }
Le bloc de code ci-dessus s'exécute à la routine d'étalonnage. Ce code est pour l'étalonnage horizontal. Il existe un code quasi identique pour le calibrage vertical (attention, le code sait si votre MPU6050 est monté horizontalement ou verticalement !). MPU6050, est lu 1000 fois. les valeurs appropriées sont additionnées cumulativement puis divisées par 1000 pour donner une valeur moyenne de « décalage ». Ces valeurs sont ensuite stockées dans la Nano eeprom. Toutes les valeurs d'étalonnage horizontal sont stockées à partir de l'adresse eeprom 0. Toutes les valeurs verticales sont stockées à partir de l'adresse eeprom 24. L'étalonnage DOIT être effectué sur une surface complètement plane, sinon ils ne signifient rien.
/* * Les quelques lignes suivantes traitent les données brutes pour les transformer en angles pouvant être affichés sur l'écran LCD et les LED. * La valeur de 4096, par laquelle les données d'accélération sont divisées, est tirée de la fiche technique du MPU6050 et est basée sur la fréquence d'échantillonnage. * La valeur de 9,8 est la gravité * La fonction atan2 provient du module mathématique et est utilisée pour calculer les angles à partir des données données */ thetaM =-atan2((acc_x/4096.0)/9.8, (acc_z/4096.0)/9.8) /2/3.141592656 * 360; //Données brutes phiM =-atan2((acc_y/4096.0)/9.8, (acc_z/4096.0)/9.8)/2/3.141592656 * 360; //Données brutes dt=(millis()-millisOld)/1000.; millisAncien=millis(); /* * Cette section utilise les données du gyroscope pour rendre le système plus réactif 65,5)*dt)*,96 + thetaM*,04; //Filtre passe-bas phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //Filtre passe bas
Le code ci-dessus est le truc qui calcule les angles. Espérons que les commentaires donnent un petit aperçu de son fonctionnement, mais pour une explication approfondie, consultez la vidéo de Paul McWhorters liée dans le PDF ci-joint. Ce que je dirai cependant, c'est que vous pouvez modifier la fréquence d'échantillonnage du gyroscope et de l'accéléromètre (ce qui est fait dans le sous-programme de configuration MPU6050 au bas de mon code). Si vous modifiez la fréquence d'échantillonnage, vous devez également modifier le degré de division des données brutes. Pour les données de l'accéléromètre, la valeur actuelle est de 4096. Pour le gyroscope, la valeur actuelle est de 65,5.
Reportez-vous aux fiches techniques ci-jointes et à la vidéo d'EEEntusiast (lien dans le PDF ci-joint) pour des informations plus détaillées sur la façon dont les valeurs d'échantillonnage et de décalage sont trouvées.
Étape 3: Étapes suivantes
À ce stade, j'espère avoir fait ce projet, mais que faire maintenant?
Tout d'abord, pourquoi ne pas en faire un niveau à bulle que vous pouvez utiliser. Vous pouvez acheter un niveau à bulle pas cher (assurez-vous que c'est le type de boîte) que vous pouvez adapter, ou si vous avez le kit, imprimez votre propre niveau/boîte.
Amusez-vous peut-être avec les taux d'échantillonnage du gyroscope et de l'accéléromètre pour voir s'ils fonctionnent mieux à un taux qu'à un autre.
Essayez d'affiner davantage le code. Par exemple, à l'heure actuelle, au-delà de 45 degrés, l'angle indiqué est pour le moins grossier. Y a-t-il un moyen de contourner cela?
Si vous avez des questions, aussi simples soient-elles, n'hésitez pas. Si je peux aider, je le ferai.
Si vous aimez cette instructable, veuillez lui donner un like, afin que je sache.
Si vous faites cela, veuillez me le montrer (surtout si c'est dans un cas de travail).
MERCI