Exercice STM Nucleo FCU

From beeplane
Jump to navigation Jump to search

Vous trouverez sur cette page toutes les informations, exercices, et fichiers nécessaires à la prise en main et à la réalisation d'un prototype de FCU (Flight Control Unit) dans le cadre de travaux dirigés (TD) à faire en classe.

Fonctions de base Nucleo

Void HAL_GPI0_Init() : Cette fonction est utilisée pour initialiser les broches d’entrée ou de sortie pour les LEDs ou les boutons disponibles sur la carte Nucleo.

Void HAL_UART_Init() : Cette fonction est utilisée pour initialiser le module UART (communication série), qui sert à communiquer avec l’ordinateur.

Void HAL_TIM_Base_Start() : Cette fonction est utilisée pour démarrer un timer, utile par exemple pour mettre à jour périodiquement un affichage ou une mesure d’un capteur.

Void HAL_GPI0_ReadPin/WritePin() : Cette fonction permet de lire ou d’écrire l’état d’un port de la carte Nucleo.


Installation des bibliothèques STM Nucleo dans le logiciel Arduino

Carte Nucleo utilisée

La carte X-Nucleo IKS01A2 fonctionne de la même manière qu’une carte Arduino, d’ailleurs on utilise le même logiciel (Arduino) pour la faire foctionner et reccueillir des informations.

Afin de pouvoir commander cette carte par l’intermédiaire du logiciel Arduino, il est nécessaire d’installer une bibliothèque accessible via ce lien : https://www.arduinolibraries.info/libraries/stm32duino-x-nucleo-iks01-a2

Site stm32.png

Prendre la dernière version disponible. Un fichier .zip sera alors téléchargé sur votre ordinateur.

Sur Arduino, aller dans Croquis -> Inclure une bibliothèque -> Ajouter la bibliothèque .ZIP.

Sélectionner le fichier téléchargé précédemment (ne pas le décompresser).

Installation1.png

Pour inclure cette bibliothèque dans le code, aller dans Croquis -> Inclure une bibliothèque ->STM32duino-X-NUCLEO-IKS01A2, la ligne de code #include <X-NUCLEO-IKS01A2.h> doit apparaître.

Installation 2.png

Il faut maintenant installer le protocole de communication utilisé pour la carte Nucleo. Pour cela, aller dans Fichier -> Préférences, puis rentrer ce lien dans URL de gestionnaire de cartes supplémentaires : https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

Cliquer ensuite sur OK.

Installation3.png

Le protocole est maintenant téléchargé, pour l’installer, aller dans Outils -> Type de carte -> Gestionnaire de carte.

Dans la barre de recherche, taper « stm », vous devriez avoir l’écran suivant :

Installation4.png

Sélectionner la dernière version disponible (ici 2.4.0) puis Installer. Le processus prend quelques minutes. Si tout s’est bien déroulé, la mention INSTALLED doit apparaître.


Exercice 1 : Faire clignoter une LED

Etape 1 : branchements

Branchez une LED sur une broche GPIO (par exemple, la broche PA5) de la carte Nucleo en utilisant une résistance de limitation de courant (par exemple, une résistance de 220 ohms) en série avec la LED. La borne positive de la LED doit être connectée à la broche GPIO et la borne négative doit être connectée à la résistance, puis à la masse (GND) de la carte.

Etape 2 : initialisation

Il est important de commencer par disposer d’un IDE (Integrated Developement Environnement) adapté au micro-controleur STM32. Créer un nouveau projet pour la carte Nucléo en sélectionnant le type de microcontrôleur utilisé sur votre carte Nucleo (ici STM32).

Ajoutez un fichier source "main.c" à votre projet. Ajoutez le fichier d'en-tête pour le microcontrôleur utilisé dans la carte Nucleo (par exemple, stm32fxxx.h). Ce sont les headers de la bibliothèque HAL.

Exercice1 1.png

Initialisez la broche GPIO pour la sortie en écrivant un 1 dans le registre de configuration approprié (par exemple, GPIOA->MODER |= GPIO_MODER_MODE5_0).

Etape 3 : code

Bouclez indéfiniment et allumez la LED en écrivant un 1 dans le registre de sortie (par exemple, GPIOA->BSRR = GPIO_BSRR_BS5) pendant une courte période, puis éteignez la LED en écrivant un 1 dans le registre de sortie (par exemple, GPIOA->BSRR = GPIO_BSRR_BR5) pendant une autre courte période. Répétez cette séquence pour faire clignoter la LED.

Voici un exemple de code en langage C qui utilise la carte Nucleo STM32F401RE pour faire clignoter une LED connectée à la broche PA5.

Exercice1 2.png

Remarque : Les codes utilisent ici la broche PA5 pour la sortie de la LED, il faut bien sûr s'adapter à la broche sur laquelle on est branché. Ce code utilise la fonction "for" pour attendre pendant une courte période après chaque changement d'état de la LED. Le nombre de boucles peut être ajusté pour changer la vitesse de clignotement de la LED.

Aide : Voici un schéma de branchement de branchement typique pour une LED sur une carte Nucléo.

Exercice1 3.png

Dans ce schéma, R1 est la résistance de limitation de courant et GPIO est la broche GPIO de la carte Nucleo à laquelle la LED est connectée. La borne positive de la LED est connectée à la broche GPIO et la borne négative est connectée à la résistance, puis à la masse (GND) de la carte.

Notez que la valeur de la résistance R1 dépend de la tension d'alimentation de votre carte Nucleo et de la caractéristique de la LED que vous utilisez. Une valeur typique pour la résistance est de 220 ohms.


Exercice 2 : Récupérer la position d'un joystick non-analogique

Etape 1 : branchements

Branchez le joystick sur la carte Nucleo en utilisant des câbles de raccordement. Le joystick a généralement deux axes de mouvement (X et Y) et un bouton de pression. Chaque axe est relié à deux broches (par exemple, la broche A0 et la broche A1), tandis que le bouton est relié à une autre broche (par exemple, la broche D2). Assurez-vous de connecter les broches correctes du joystick aux broches correspondantes de la carte Nucleo.

Etape 2 : initialisation

Ouvrez votre IDE et créez un nouveau projet ; ajoutez ensuite un fichier source "main.c". Incluez ensuite le header pour utiliser les fonctions HAL comme dans l'exercice précédent. Dans la fonction "main.c", initialisez les broches GPIO lecture en écrivant un 0 dans le registre de configuration approprié (par exemple, GPIOA->MODER &= ~(GPIO_MODER_MODE0_Msk | GPIO_MODER_MODE1_Msk)).

Etape 3 : code

Bouclez indéfiniment et lisez les broches GPIO correspondantes pour récupérer la position du joystick. Pour cela, vous pouvez utiliser la fonction "GPIO_ReadPin" pour lire la valeur de la broche GPIO. Ensuite, vous pouvez utiliser des conditions pour déterminer la position du joystick (par exemple, si la valeur de la broche X est faible et la valeur de la broche Y est élevée, le joystick est en haut à droite).

Voici un exemple de code en langage C qui utilise la carte Nucleo STM32F401RE pour récupérer la position (non-analogique) d'un joystick connecté aux broches PA0, PA1 et PB2.

Exercice2 1.png
Exercice2 2.png

Remarque : Cet exemple utilise les broches PC0 et PC1 pour les entrées du joystick, il faut bien sûr s'adapter aux broches sur lesquelles on est branché.

Aide : Voici un schéma de branchement typique pour récupérer la position (non-analogique) d'un joystick sur une carte Nucleo.

Exercice2 3.png

Remarque : Dans ce schéma, R1, R2 et R3 sont des résistances de pull-down, qui permettent de fixer un état de référence à chaque broche du joystick. Les broches du joystick sont reliées à la carte Nucleo en utilisant des câbles de raccordement. Les broches X-Axis et Y-Axis sont reliées à deux broches GPIO de la carte Nucleo (par exemple, les broches PA0 et PA1), tandis que la broche Button est reliée à une autre broche GPIO de la carte (par exemple, la broche PB2). Les résistances R1, R2 et R3 sont connectées entre chaque broche du joystick et la masse (GND) de la carte Nucleo.

Notez que la valeur de chaque résistance dépend de la caractéristique du joystick et de la carte Nucleo que vous utilisez. Une valeur typique pour chaque résistance est de 10k ohms.


Exercice 3 : Commander un moteur

Branchez votre joystick en utilisant les broches analogiques de la carte, puis créez un nouveau projet sur votre IDE.

Ajoutez ensuite le code suivant pour initialiser les broches analogiques d'entrée branchées au joystick.

Exercice3 1.png

Créez une fonction pour lire les valeurs analogiques du joystick avec le code suivant.

Exercice3 2.png

Utilisez les valeurs des coordonnées pour contrôler les moteurs avec le code suivant.

Exercice3 3.png

Dans le programme principal (boucle "loop"), appelez les fonctions créées précédemment.

Exercice3 4.png

Une fois compilé et téléversé sur la carte, les mouvements du joystick contrôleront les moteurs dans les directions souhaitées avec une précision due au fonctionnement analogique (un mouvement plus appuyé entrainera plus de mouvement du moteur associé).

Ces exercices simples correspondent aux fonctions qui pourraient être utiles pour une utilisation basique de la carte Nucleo.


Exercice 4 : Récupérer la position d'un potentiomètre

En guise de dernier exercice, nous avons pensé à une application également très concrète pour le Mini-Bee : il s'agit de la gestion par la carte Nucleo d'un potentiomètre. En effet, un drone doit pouvoir monter ou descendre verticalement, impliquant une montée ou une baisse de régime simultanée de l'ensemble des rotors. Ainsi, un potentiomètre analogique permettrait de contrôler finement l'appareil sur l'axe vertical.

Pour faire fonctionner un potentiomètre avec une carte Nucleo, voici les étapes à suivre :

Pour commencer, il faut brancher le potentiomètre sur un port GPIO de la carte (qu'il ne faut bien entendu pas oublier d'initialiser). Ensuite, on branche plusieurs LEDs à d’autres broches GPIO, sans oublier de brancher également en série des résistances de protection. Ces LEDs serviront donc à donner un indice visuel sur le niveau d'enfoncement du potentiomètre : plus le potentiomètre émet un signal analogique élevé, plus il y a de LEDs allumées.

Voici donc un exemple de code qui permettrait de récupérer la position analogique d'un potentiomètre et de l'afficher à l'aide de 3 LEDs.

#include"mbed.h"
	 
AnalogIn enfoncement_potentiometre(A0);
	 
DigitalOut led_1(D2);
DigitalOut led_2(D3);
DigitalOut led_3(D4);
	
int main() {
 while(1) {      
  uint16_t valeur = enfoncement_potentiometre.read_u16(); 
  if (valeur < 50) {
   led_1 = 0;  
   led_2 = 0;  
   led_3 = 0;  
  }
  else if ((valeur >= 50) && (valeur < 2000)) { 
   led_1 = 1;  
   led_2 = 0;  
   led_3 = 0;  
  }
  else if ((valeur >= 2000) && (valeur < 4000)) {
   led_1 = 1; 
   led_2 = 1; 
   led_3 = 0;  
  }
  else if (valeur >= 4000) {
   led_1 = 1;  
   led_2 = 1;  
   led_3 = 1;  
  }   
 }
}