Skip to content

Developed by me and my colleague Bilal MARECAR, during our last year of our studies at engineering school

Notifications You must be signed in to change notification settings

Aminekachkach/Drone_Lumineux

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Contributors LinkedIn LinkedIn2


Logo

Drone Lumineux

A magic drone

Table des matières
  1. Introduction
  2. Build with
  3. Test Unitaire

Introduction

Le projet Drone Lumineux vise à concevoir un drone équipé d'un jeu de lumières. L'objectif est de créer une expérience visuelle unique en combinant les fonctionnalités d'un drone avec des effets lumineux spectaculaires.

Pour cela, nous avons établi notre projet en utilisant une approche agile avec Scrum et les concepts d'épique (epic), de fonctionnalité (feature) et d'histoire utilisateur (user story).

Built With

  • C
  • Cube

Organigramme des tâches du projet

EPIC

FEATURES

User_story

En utilisant le modèle, nous avons identifié et défini les tâches qui correspondent aux histoires utilisateurs. L'objectif est de fournir rapidement de la valeur à notre produit en travaillant sur ces tâches de manière itérative.

Architecture générale

Après avoir effectué la sélection des composants et défini l'architecture générale de notre PCB , nous avons choisi d'utiliser deux contrôleurs différents : le microcontrôleur Nucleo STM32L412KB et le SoC QuickLogic Quick Feather EOS S3. L'objectif était de déterminer le contrôleur qui serait le plus adapté à notre configuration spécifique. Cependant, lors du processus de développement, une mauvaise manipulation a entraîné un dysfonctionnement du bootloader du SoC, le rendant inutilisable (brické). Cette situation a nécessité d'abandonner l'utilisation du SoC Quick Feather EOS S3 pour notre projet.

Drone_board_STM32_PCB

Test Unitaire

Dans notre projet, nous utilisons des tests unitaires pour vérifier le bon fonctionnement de chaque composant, module et fonctionnalité du code. Les principaux éléments soumis à ces tests sont le driver ESC, le Nopixel et le MPU6050, ainsi que des fonctionnalités spécifiques telles que la configuration des broches PWM et la lecture des données du gyromètre.

ESC

Code Moteur

Le driver ESC est spécifiquement conçu pour contrôler les moteurs brushless à courant continu (BLDC). Il reçoit en entrée un signal de modulation de largeur d'impulsion (PWM) qui permet de commander les phases du moteur. Dans notre application, nous utilisons des kits ESC+Moteurs fournis par miniplanes.

Sur le microcontrôleur Nucleo-STM32L412KB, nous allouons 4 broches qui sont connectées à la même chaîne PWM1 afin d'assurer la synchronisation.

PA8 -> Broche PWM1-1

PA9 -> Broche PWM1-2

PA10 -> Broche PWM1-3

PA11 -> Broche PWM1-4

Le driver fonctionne en configurant un signal PWM avec une période de 20 ms. Le rapport cyclique est ajusté pour envoyer des signaux de 1 ms pour l'initialisation, 1,5 ms pour une vitesse moyenne et 2 ms pour la vitesse maximale. Cela signifie qu'une variation de 1 ms à 2 ms fera tourner les moteurs de la vitesse minimale à la vitesse maximale.

Dans notre code, nous générons les signaux PWM pour les 4 sorties, nous définissons trois constantes de vitesse : Rapport_cyclique_Min, Rapport_cyclique_securite et Rapport_cyclique_Max. À l'aide d'une boucle for, nous faisons varier la vitesse en utilisant les constantes Rapport_cyclique_Min et Rapport_cyclique_securite pour augmenter progressivement la vitesse des moteurs jusqu'à une vitesse raisonnable.

MPU6050

Code MPU

Le MPU6050 est un composant qui combine un gyroscope et un accéléromètre à trois axes. Il est utilisé pour mesurer l'orientation, la rotation et l'accélération. Il utilise une communication I2C pour interagir avec notre microcontroleur STM32, nous allouons deux broches spécifiques pour établir la communication I2C avec les broches suivantes :

PA7 -> Broche SCL

PB5 -> Broche SDA

Au niveau du code, il existe une subtilité importante qui consiste à définir l'adresse du composant shiftée de 1 (0x68 << 1). Cela est nécessaire pour assurer une communication réussie entre le module et le microcontrôleur.

Avant de commencer la configuration, nous effectuons une vérification en interrogeant le registre "Who_am_i" à l'adresse 0x75. Cette étape nous permet de nous assurer que le module communique correctement avec le microcontrôleur. Si la communication est établie, le registre renverra la valeur 0x68.

Ensuite, nous procédons à la configuration de l'horloge interne à 8 MHz en utilisant le registre "Power management" situé à l'adresse 0x6B. Nous lui attribuons la valeur 0x00 pour sélectionner notre horloge souhaitée.

Nous appliquons également un filtre passe-bas avec une fréquence de coupure de 1 kHz afin d'éliminer les bruits qui pourraient perturber le fonctionnement du composant. Ce filtre est configuré en utilisant le registre situé à l'adresse 0x1A. Nous lui attribuons la valeur 0x05, ce qui correspond à une bande passante de 10 Hz.

Passons maintenant à la configuration du gyromètre en manipulant le registre "Gyro_Config" du MPU6050, situé à l'adresse 0x1B. Ce registre joue un rôle crucial dans la définition de la plage de mesure du gyromètre, qui est fixée à ± 500 °/s. Cette valeur détermine la projection maximale des mesures sur la plage d'acquisition du convertisseur analogique-numérique (ADC).

En ce qui concerne l'acquisition de données, il faut prendre en compte la sensibilité du gyromètre, exprimée en LSB (Least Significant Bit) par degré par seconde (°/s). Pour notre plage de mesure de ± 500 °/s, la sensibilité est de 65.5 LSB/°/s comme indiqué sur la figure suivante :

Pour acquérir les données du gyromètre sur les trois axes X, Y et Z, nous devons effectuer une lecture de 6 octets consécutifs, commençant à l'adresse 0x43 et se terminant à l'adresse 0x48. Chaque axe nécessite 2 octets, donc en lisant les 6 octets, nous obtenons les mesures pour les trois axes. La raison pour laquelle nous lisons ces 6 octets est que les données du gyromètre sont stockées dans des registres consécutifs, un registre pour chaque axe (X, Y et Z). Chaque registre contient 2 octets, qui représentent la valeur de mesure pour cet axe spécifique.

Une fois les données du gyromètre acquises, nous devons les ajuster en les divisant par la sensibilité mentionnée précédemment (65.5). Cette étape de correction permet d'obtenir des mesures précises en degrés par seconde, en prenant en considération la sensibilité spécifique du gyromètre.

Neopixel

Code Neopixel

Les LED WS2812 utilisent un protocole de modulation de largeur d'impulsion (Pulse Width Modulation - PWM) pour transmettre les informations de couleur et de luminosité. Dans ce protocole, la valeur d'un bit est déterminée par la durée d'une impulsion.

Pour les deux types de LED, les niveaux de timing à respecter pour encoder un "0" ou un "1" sont généralement les suivants :

Pour un "0" logique :

La durée de l'impulsion haute (HIGH) est généralement d'environ 0,35 μs. La durée de l'impulsion basse (LOW) est généralement d'environ 0,8 μs. Pour un "1" logique :

La durée de l'impulsion haute (HIGH) est généralement d'environ 0,7 μs. La durée de l'impulsion basse (LOW) est généralement d'environ 0,6 μs.

Pour piloter, le Neopixel, nous avons utiliser un timer et DMA pour faire des déplecements de buffers. Le code source provient d'un driver existant.

About

Developed by me and my colleague Bilal MARECAR, during our last year of our studies at engineering school

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages