Difference between revisions of "STM32 premier pas et prise en main logiciel"

From beeplane
Jump to navigation Jump to search
(Created page with "{{DISPLAYTITLE:STM32 — Premiers pas et prise en main logicielle}} <div style="background:#f5f9fb; border-left:6px solid #0b4f6c; padding:18px 22px; margin-bottom:24px;"> <h...")
 
Line 3: Line 3:
 
<div style="background:#f5f9fb; border-left:6px solid #0b4f6c; padding:18px 22px; margin-bottom:24px;">
 
<div style="background:#f5f9fb; border-left:6px solid #0b4f6c; padding:18px 22px; margin-bottom:24px;">
 
<h1 style="margin-top:0;">STM32 — Premiers pas et prise en main logicielle</h1>
 
<h1 style="margin-top:0;">STM32 — Premiers pas et prise en main logicielle</h1>
<p style="font-size:1.08em;">
 
Cette page présente une prise en main progressive de l’environnement STM32 utilisé pour le projet Mini-Bee.
 
Elle explique comment installer l’environnement logiciel, réaliser les premiers exercices Arduino/STM32,
 
puis comprendre le rôle de la carte Nucleo, des BluePills, du bus CAN et des modules de puissance L298N dans l’architecture FCU.
 
</p>
 
 
<p>
 
<p>
L’objectif n’est pas de tout documenter, mais de donner une base claire, lisible et directement réutilisable par les futurs contributeurs du projet.
+
Cette page présente les bases logicielles STM32 utilisées pour la maquette Mini-Bee.
 +
Elle sert de guide rapide pour installer l’environnement, réaliser les premiers tests et comprendre le lien entre la carte Nucleo, le bus CAN, les BluePills et les modules L298N.
 
</p>
 
</p>
 
</div>
 
</div>
Line 15: Line 11:
 
__TOC__
 
__TOC__
  
== 1. Objectif de la page ==
+
== Objectif ==
  
Cette page sert de point d’entrée pour les étudiants, ingénieurs ou contributeurs qui découvrent la partie logicielle STM32 du projet Mini-Bee.
+
L’objectif est de permettre à un nouveau contributeur de démarrer rapidement avec la carte STM32 Nucleo F446RE.
  
Elle permet de comprendre :
+
À la fin de cette prise en main, il doit savoir :
  
* comment préparer l’environnement de développement ;
+
* installer l’environnement STM32 dans Arduino IDE ;
* comment programmer une carte STM32 Nucleo avec l’IDE Arduino ;
+
* téléverser un premier programme ;
* comment tester les entrées/sorties de base ;
+
* tester une sortie numérique ;
* comment lire un joystick analogique ou numérique ;
+
* lire un joystick ou un potentiomètre ;
* comment piloter un moteur à courant continu via un pont en H ;
+
* piloter un moteur DC ;
* comment utiliser un bus CAN pour connecter la carte principale aux modules moteurs ;
+
* comprendre le rôle du bus CAN dans l’architecture Mini-Bee.
* comment cette prise en main s’intègre dans le Flight Control Unit du Mini-Bee.
 
  
<div style="background:#eef6f9; border:1px solid #c8dde6; border-radius:10px; padding:16px; margin:20px 0;">
+
== Contexte Mini-Bee ==
'''Idée clé :''' la STM32 Nucleo joue le rôle de contrôleur principal. 
 
Elle lit les consignes pilote, traite les informations capteurs et envoie des ordres aux modules moteurs.
 
</div>
 
  
== 2. Contexte Mini-Bee et Flight Control Unit ==
+
Dans le projet Mini-Bee, la STM32 Nucleo joue le rôle de contrôleur principal du Flight Control Unit.
  
Le Mini-Bee est un multicoptère hybride VTOL développé comme plateforme collaborative de recherche et de prototypage.
+
Elle reçoit les consignes pilote, lit les données capteurs et transmet les ordres aux modules moteurs.
  
Dans l’architecture FCU étudiée, la carte STM32 Nucleo agit comme le cerveau de commande. 
+
[[Fichier:STM32_wiki_09_20260511_FCU_MINIBEE_image36.png|center|800px|thumb|Vue Mini-Bee utilisée pour présenter le contexte du Flight Control Unit.]]
Elle reçoit les consignes de pilotage, prépare les ordres moteurs et coordonne les modules déportés.
 
  
Le projet vise à rendre le Mini-Bee contrôlable et stabilisable sur les trois axes principaux :
+
L’architecture étudiée vise à rendre le Mini-Bee contrôlable sur trois axes :
  
 
* '''Roll''' : roulis ;
 
* '''Roll''' : roulis ;
Line 47: Line 38:
 
* '''Yaw''' : lacet.
 
* '''Yaw''' : lacet.
  
La soutenance ESTACA rappelle que l’objectif final du FCU Mini-Bee est de rendre le prototype contrôlable et stabilisable en trois axes grâce à une nouvelle architecture de contrôle distribuée.
+
== Matériel utilisé ==
 
 
[[Fichier:STM32_FCU_MiniBee_architecture_generale.png|center|900px|thumb|Architecture générale du Flight Control Unit Mini-Bee : une carte maître STM32 coordonne les modules moteurs.]]
 
 
 
== 3. Matériel principal utilisé ==
 
  
 
{| class="wikitable" style="width:100%;"
 
{| class="wikitable" style="width:100%;"
 
! Élément
 
! Élément
! Rôle dans la maquette
+
! Rôle
! Point important
 
 
|-
 
|-
| '''STM32 Nucleo F446RE'''
+
| STM32 Nucleo F446RE
 
| Carte maître du système
 
| Carte maître du système
| Lit les consignes, prépare les ordres et pilote la communication
 
 
|-
 
|-
| '''BluePill STM32F103C8T6'''
+
| BluePill STM32F103
| Carte esclave locale
+
| Carte esclave locale pour le pilotage moteur
| Reçoit les ordres et génère les signaux moteur localement
 
 
|-
 
|-
| '''SN65HVD230'''
+
| SN65HVD230
| Transceiver CAN
+
| Transceiver de communication CAN
| Permet la communication différentielle CAN en 3,3 V
 
 
|-
 
|-
| '''L298N'''
+
| L298N
| Pont en H de puissance
+
| Pont en H pour piloter les moteurs DC
| Alimente et contrôle le sens de rotation des moteurs DC
 
 
|-
 
|-
| '''Moteurs DC'''
+
| Joystick / potentiomètre
| Actionneurs de la maquette
+
| Entrée de commande
| Permettent de visualiser les commandes moteurs
 
 
|-
 
|-
| '''Joystick / potentiomètre'''
+
| Moteurs DC
| Interface de commande
+
| Actionneurs de test de la maquette
| Sert à générer des consignes pilote simples
 
 
|}
 
|}
  
[[Fichier:STM32_Nucleo_F446RE_MiniBee.jpg|center|650px|thumb|Carte STM32 Nucleo F446RE utilisée comme contrôleur principal de la maquette.]]
+
[[Fichier:STM32_wiki_11_20260511_FCU_MINIBEE_image50.png|center|600px|thumb|Carte STM32 Nucleo F446RE utilisée comme contrôleur principal.]]
  
== 4. Installation de l’environnement logiciel ==
+
== Installation logicielle ==
  
La première étape consiste à préparer l’IDE Arduino pour programmer la carte STM32.
+
La carte STM32 peut être programmée avec Arduino IDE.
  
=== 4.1 Installer les bibliothèques STM32 ===
+
Étapes principales :
  
La carte d’extension X-NUCLEO-IKS01A2 est compatible avec l’écosystème Arduino.
+
# Installer Arduino IDE.
Une bibliothèque dédiée permet d’utiliser les capteurs et les fonctions associées dans l’IDE.
+
# Ajouter le gestionnaire de cartes STM32duino.
 +
# Installer le support STM32 depuis le gestionnaire de cartes.
 +
# Importer la bibliothèque STM32duino X-NUCLEO-IKS01A2 au format ZIP.
 +
# Sélectionner la carte '''Nucleo-64'''.
 +
# Sélectionner le modèle '''Nucleo F446RE'''.
 +
# Choisir le port série de la carte.
  
Étapes recommandées :
+
[[Fichier:STM32_wiki_01_Maquette_et_code_fin_image1.png|center|800px|thumb|Bibliothèque STM32duino X-NUCLEO-IKS01A2 utilisée dans Arduino IDE.]]
 
 
# Télécharger la bibliothèque STM32duino X-NUCLEO-IKS01A2 au format ZIP.
 
# Ouvrir l’IDE Arduino.
 
# Aller dans '''Croquis > Inclure une bibliothèque > Ajouter la bibliothèque .ZIP'''.
 
# Sélectionner directement le fichier ZIP sans le décompresser.
 
# Vérifier que la bibliothèque apparaît bien dans la liste des bibliothèques disponibles.
 
  
 
<div style="background:#fff8e5; border:1px solid #e4c46a; border-radius:10px; padding:14px; margin:18px 0;">
 
<div style="background:#fff8e5; border:1px solid #e4c46a; border-radius:10px; padding:14px; margin:18px 0;">
'''Attention :''' ne pas décompresser le fichier ZIP avant import dans Arduino IDE. 
+
'''Point de vigilance :''' importer la bibliothèque directement en fichier ZIP, sans la décompresser.
L’IDE attend l’archive complète.
 
 
</div>
 
</div>
  
[[Fichier:STM32duino_X_NUCLEO_IKS01A2_installation.png|center|850px|thumb|Installation de la bibliothèque STM32duino X-NUCLEO-IKS01A2 dans l’IDE Arduino.]]
+
== Premier test : clignotement LED ==
 
 
=== 4.2 Ajouter le gestionnaire de cartes STM32 ===
 
  
Dans les préférences Arduino, ajouter l’URL du gestionnaire de cartes STM32duino. 
+
Le premier exercice consiste à faire clignoter une LED sur la broche D13 / PA5.
Puis ouvrir le gestionnaire de cartes et installer les paquets STM32.
 
  
Ensuite, configurer la carte :
+
Il valide :
  
{| class="wikitable" style="width:100%;"
+
* le câblage ;
! Paramètre Arduino IDE
+
* la reconnaissance de la carte ;
! Valeur à sélectionner
+
* le téléversement du programme ;
|-
+
* la commande d’une sortie numérique.
| Board
 
| Nucleo-64
 
|-
 
| Board part number
 
| Nucleo F446RE
 
|-
 
| Port
 
| Port série correspondant à la carte branchée
 
|-
 
| Upload method
 
| Valeur par défaut adaptée à la Nucleo
 
|}
 
  
[[Fichier:Arduino_IDE_Nucleo64_F446RE_configuration.png|center|750px|thumb|Configuration de la carte Nucleo-64 / Nucleo F446RE dans l’IDE Arduino.]]
+
[[Fichier:STM32_wiki_02_Maquette_et_code_fin_image3.png|center|650px|thumb|Montage de test LED avec breadboard et carte STM32 Nucleo.]]
 
 
== 5. Premier exercice : clignotement d’une LED ==
 
 
 
Le clignotement d’une LED est l’exercice de base pour valider :
 
 
 
* le branchement ;
 
* le téléversement du code ;
 
* la configuration d’une sortie numérique ;
 
* le retour d’information dans le moniteur série.
 
 
 
=== 5.1 Câblage ===
 
 
 
Connecter une LED sur la broche '''D13 / PA5''' de la Nucleo.
 
 
 
Prévoir :
 
 
 
* une LED ;
 
* une résistance de 220 Ω ;
 
* une connexion vers GND ;
 
* un fil entre D13 / PA5 et l’anode de la LED.
 
 
 
[[Fichier:STM32_LED_breadboard_Nucleo.png|center|700px|thumb|Premier montage LED sur breadboard avec la carte STM32 Nucleo.]]
 
 
 
=== 5.2 Code de test ===
 
  
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
Line 166: Line 105:
 
   Serial.begin(115200);
 
   Serial.begin(115200);
 
   pinMode(LED_PIN, OUTPUT);
 
   pinMode(LED_PIN, OUTPUT);
  Serial.println("LED blink test started");
 
 
}
 
}
  
 
void loop() {
 
void loop() {
 
   digitalWrite(LED_PIN, HIGH);
 
   digitalWrite(LED_PIN, HIGH);
  Serial.println("LED: ON");
 
 
   delay(BLINK_DELAY);
 
   delay(BLINK_DELAY);
 
 
   digitalWrite(LED_PIN, LOW);
 
   digitalWrite(LED_PIN, LOW);
  Serial.println("LED: OFF");
 
 
   delay(BLINK_DELAY);
 
   delay(BLINK_DELAY);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== 5.3 Résultat attendu ===
+
== Lecture d’un joystick ==
 
 
La LED doit s’allumer et s’éteindre toutes les 500 ms. 
 
Le moniteur série doit afficher alternativement :
 
 
 
<syntaxhighlight lang="text">
 
LED: ON
 
LED: OFF
 
</syntaxhighlight>
 
 
 
Ce test valide que la carte est reconnue, que le programme est chargé correctement et que la sortie numérique fonctionne.
 
  
== 6. Lecture d’un joystick numérique ==
+
Le joystick permet de transformer une action pilote en signal électrique.
  
Le joystick numérique est utilisé comme une série d’interrupteurs logiques.
+
Deux cas sont possibles :
  
Il permet de détecter des états simples :
+
* joystick numérique : lecture ON / OFF ;
 +
* joystick analogique : lecture proportionnelle sur les axes X et Y.
  
* direction activée ;
+
Le joystick analogique est le plus intéressant pour le Mini-Bee, car il permet de générer une consigne progressive.
* bouton pressé ;
 
* position de repos.
 
  
=== 6.1 Broches utilisées ===
+
[[Fichier:STM32_wiki_03_Maquette_et_code_fin_image6.png|center|600px|thumb|Exemple de montage joystick pour lecture de consigne pilote.]]
 
 
{| class="wikitable" style="width:100%;"
 
! Fonction
 
! Broche STM32
 
! Remarque
 
|-
 
| Axe X
 
| PA0
 
| Entrée numérique
 
|-
 
| Axe Y
 
| PA1
 
| Entrée numérique
 
|-
 
| Bouton
 
| PB2
 
| Entrée numérique avec pull-up
 
|-
 
| VCC
 
| 3.3 V
 
| Alimentation logique
 
|-
 
| GND
 
| GND
 
| Masse commune
 
|}
 
 
 
<syntaxhighlight lang="cpp">
 
#define PIN_X PA0
 
#define PIN_Y PA1
 
#define PIN_BTN PB2
 
 
 
void setup() {
 
  Serial.begin(115200);
 
  pinMode(PIN_X, INPUT_PULLUP);
 
  pinMode(PIN_Y, INPUT_PULLUP);
 
  pinMode(PIN_BTN, INPUT_PULLUP);
 
  Serial.println("Digital joystick test ready");
 
}
 
 
 
void loop() {
 
  int stateX = digitalRead(PIN_X);
 
  int stateY = digitalRead(PIN_Y);
 
  int stateBtn = digitalRead(PIN_BTN);
 
 
 
  if (stateX == LOW && stateY == HIGH) {
 
    Serial.println("Position detected: upper right");
 
  }
 
 
 
  if (stateBtn == LOW) {
 
    Serial.println("Button pressed");
 
  }
 
 
 
  delay(200);
 
}
 
</syntaxhighlight>
 
 
 
[[Fichier:STM32_joystick_numerique_montage.png|center|650px|thumb|Montage d’un joystick sur la carte Nucleo pour lire des états numériques.]]
 
 
 
== 7. Lecture d’un joystick analogique ==
 
 
 
Le joystick analogique est plus adapté au pilotage progressif du Mini-Bee.
 
 
 
Contrairement au joystick numérique, il ne donne pas seulement un état ON/OFF. 
 
Il fournit une valeur proportionnelle à l’inclinaison.
 
 
 
=== 7.1 Principe ===
 
 
 
Les axes X et Y sont lus par les entrées analogiques de la STM32.
 
 
 
Sur STM32, la lecture analogique peut être effectuée sur une résolution élevée. 
 
Dans les exercices, les valeurs sont exploitées pour détecter des zones :
 
 
 
* centre ;
 
* gauche / droite ;
 
* haut / bas.
 
 
 
=== 7.2 Exemple de code ===
 
  
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
Line 290: Line 136:
 
   pinMode(JOYSTICK_X_PIN, INPUT);
 
   pinMode(JOYSTICK_X_PIN, INPUT);
 
   pinMode(JOYSTICK_Y_PIN, INPUT);
 
   pinMode(JOYSTICK_Y_PIN, INPUT);
  Serial.println("Analog joystick ready");
 
 
}
 
}
  
Line 301: Line 146:
 
   Serial.print(" | Y: ");
 
   Serial.print(" | Y: ");
 
   Serial.println(y);
 
   Serial.println(y);
 
  if (x > 600) {
 
    Serial.println("Action: right");
 
  } else if (x < 400) {
 
    Serial.println("Action: left");
 
  }
 
 
  if (y > 600) {
 
    Serial.println("Action: up");
 
  } else if (y < 400) {
 
    Serial.println("Action: down");
 
  }
 
  
 
   delay(200);
 
   delay(200);
Line 318: Line 151:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
<div style="background:#eef6f9; border:1px solid #c8dde6; border-radius:10px; padding:14px; margin:18px 0;">
+
== Pilotage moteur avec L298N ==
'''Lien avec le Mini-Bee :''' le joystick analogique est indispensable pour générer une consigne proportionnelle.
 
Il permet de piloter progressivement la poussée, l’orientation ou la vitesse angulaire.
 
</div>
 
 
 
== 8. Pilotage de moteurs avec un pont en H ==
 
 
 
La carte STM32 ne peut pas alimenter directement les moteurs. 
 
Il faut utiliser un composant de puissance.
 
  
Dans les exercices, deux approches apparaissent :
+
La STM32 ne doit pas alimenter directement un moteur.
  
* L293D pour les premiers tests pédagogiques ;
+
Le module L298N sert d’étage de puissance. 
* L298N pour la maquette Mini-Bee.
+
Il reçoit des signaux logiques et alimente le moteur avec une source adaptée.
  
Le principe reste le même : le pont en H permet d’inverser la polarité appliquée au moteur, donc de changer son sens de rotation.
+
[[Fichier:STM32_wiki_14_20260511_FCU_MINIBEE_image61.png|center|550px|thumb|Module L298N utilisé comme pont en H pour piloter les moteurs DC.]]
  
=== 8.1 Logique de commande ===
+
Principe de commande :
  
 
{| class="wikitable" style="width:100%;"
 
{| class="wikitable" style="width:100%;"
 
! IN1
 
! IN1
 
! IN2
 
! IN2
! Résultat moteur
+
! Effet
 
|-
 
|-
 
| HIGH
 
| HIGH
Line 353: Line 178:
 
| LOW
 
| LOW
 
| Arrêt
 
| Arrêt
|-
 
| HIGH
 
| HIGH
 
| Arrêt / freinage selon montage
 
|}
 
 
=== 8.2 Exemple simple ===
 
 
<syntaxhighlight lang="cpp">
 
const int motorPin1 = 5;
 
const int motorPin2 = 6;
 
const int motorPin3 = 10;
 
const int motorPin4 = 9;
 
 
void setup() {
 
  pinMode(motorPin1, OUTPUT);
 
  pinMode(motorPin2, OUTPUT);
 
  pinMode(motorPin3, OUTPUT);
 
  pinMode(motorPin4, OUTPUT);
 
}
 
 
void loop() {
 
  digitalWrite(motorPin1, HIGH);
 
  digitalWrite(motorPin2, LOW);
 
  digitalWrite(motorPin3, LOW);
 
  digitalWrite(motorPin4, LOW);
 
  delay(2000);
 
 
  digitalWrite(motorPin1, LOW);
 
  digitalWrite(motorPin2, HIGH);
 
  delay(2000);
 
 
  digitalWrite(motorPin1, LOW);
 
  digitalWrite(motorPin2, LOW);
 
  digitalWrite(motorPin3, HIGH);
 
  digitalWrite(motorPin4, LOW);
 
  delay(2000);
 
 
  digitalWrite(motorPin3, LOW);
 
  digitalWrite(motorPin4, HIGH);
 
  delay(2000);
 
 
  digitalWrite(motorPin1, LOW);
 
  digitalWrite(motorPin2, LOW);
 
  digitalWrite(motorPin3, LOW);
 
  digitalWrite(motorPin4, LOW);
 
}
 
</syntaxhighlight>
 
 
[[Fichier:STM32_L298N_moteur_DC_montage.png|center|700px|thumb|Montage de test moteur avec module de puissance et carte STM32.]]
 
 
== 9. Potentiomètre et jauge de poussée ==
 
 
Le potentiomètre permet de simuler une commande de puissance.
 
 
Dans le rapport d’exercices, il est utilisé pour allumer progressivement une, deux puis trois LED. 
 
Ce montage représente une jauge simplifiée de régime moteur.
 
 
=== 9.1 Principe ===
 
 
* Potentiomètre faible : aucune LED allumée.
 
* Potentiomètre moyen : une ou deux LED allumées.
 
* Potentiomètre maximum : trois LED allumées.
 
 
=== 9.2 Exemple de code ===
 
 
<syntaxhighlight lang="cpp">
 
#define POT_PIN A0
 
#define LED1 D2
 
#define LED2 D3
 
#define LED3 D4
 
 
void setup() {
 
  Serial.begin(115200);
 
  pinMode(LED1, OUTPUT);
 
  pinMode(LED2, OUTPUT);
 
  pinMode(LED3, OUTPUT);
 
  Serial.println("Throttle gauge ready");
 
}
 
 
void loop() {
 
  int value = analogRead(POT_PIN);
 
 
  if (value < 50) {
 
    digitalWrite(LED1, LOW);
 
    digitalWrite(LED2, LOW);
 
    digitalWrite(LED3, LOW);
 
  } else if (value < 2000) {
 
    digitalWrite(LED1, HIGH);
 
    digitalWrite(LED2, LOW);
 
    digitalWrite(LED3, LOW);
 
  } else if (value < 4000) {
 
    digitalWrite(LED1, HIGH);
 
    digitalWrite(LED2, HIGH);
 
    digitalWrite(LED3, LOW);
 
  } else {
 
    digitalWrite(LED1, HIGH);
 
    digitalWrite(LED2, HIGH);
 
    digitalWrite(LED3, HIGH);
 
  }
 
 
  Serial.print("Potentiometer value: ");
 
  Serial.println(value);
 
  delay(100);
 
}
 
</syntaxhighlight>
 
 
== 10. Bus CAN : pourquoi l’utiliser ? ==
 
 
Le bus CAN est utilisé pour faire communiquer la carte principale STM32 Nucleo avec les modules moteurs.
 
 
Il présente plusieurs avantages pour la maquette :
 
 
* réduction du câblage ;
 
* meilleure robustesse face aux parasites ;
 
* communication différentielle sur CAN_H et CAN_L ;
 
* architecture multipoint ;
 
* possibilité d’ajouter des modules sans refaire toute l’architecture ;
 
* priorité des messages grâce aux identifiants CAN.
 
 
<div style="background:#f5f9fb; border-left:6px solid #0b4f6c; padding:16px; margin:20px 0;">
 
'''Pourquoi le CAN est important :''' les moteurs et les modules de puissance génèrent des perturbations électriques.
 
Le bus CAN est mieux adapté qu’une liaison simple ou qu’un câblage en étoile pour une maquette distribuée.
 
</div>
 
 
[[Fichier:SN65HVD230_CAN_transceiver.png|center|500px|thumb|Transceiver CAN SN65HVD230 utilisé pour la communication entre STM32 et modules déportés.]]
 
 
== 11. Test CAN en mode loopback ==
 
 
Le mode loopback permet de vérifier que le contrôleur CAN fonctionne sans dépendre immédiatement d’un autre module.
 
 
Le test consiste à :
 
 
# configurer les broches D14 / D15 ;
 
# initialiser le CAN à 500 kbps ;
 
# envoyer une trame ;
 
# recevoir la même trame en retour ;
 
# afficher le résultat dans le moniteur série.
 
 
=== 11.1 Paramètres principaux ===
 
 
{| class="wikitable" style="width:100%;"
 
! Paramètre
 
! Valeur utilisée
 
|-
 
| TX
 
| D14 / PB9
 
|-
 
| RX
 
| D15 / PB8
 
|-
 
| Débit
 
| 500 kbps
 
|-
 
| Mode
 
| Loopback
 
|-
 
| Identifiant de test
 
| 0x123
 
 
|}
 
|}
  
=== 11.2 Résultat attendu ===
+
== Bus CAN ==
  
Le moniteur série doit afficher une réception de données.
+
Le bus CAN permet de connecter la STM32 Nucleo aux modules moteurs sans multiplier les câbles.
  
Exemple :
+
Il est adapté au Mini-Bee car il offre :
  
<syntaxhighlight lang="text">
+
* une communication robuste ;
SUCCESS: CAN uses D14/D15
+
* une transmission différentielle sur CAN_H et CAN_L ;
Sending...
+
* une meilleure résistance aux parasites ;
RECEIVED! Data: 1 2 3 4
+
* une architecture multipoint ;
</syntaxhighlight>
+
* une extension plus simple vers plusieurs moteurs.
  
== 12. Architecture distribuée de la maquette ==
+
[[Fichier:STM32_wiki_13_20260511_FCU_MINIBEE_image60.png|center|500px|thumb|Transceiver CAN SN65HVD230 utilisé pour la communication entre les modules.]]
  
L’architecture retenue sépare la commande et la puissance.
+
== Architecture de commande ==
  
La STM32 Nucleo ne pilote pas directement tous les moteurs. 
+
L’architecture Mini-Bee sépare la commande et la puissance.
Elle envoie des ordres à des BluePills, qui pilotent localement les modules L298N.
 
  
=== 12.1 Chaîne fonctionnelle ===
+
La STM32 décide. 
 +
La BluePill exécute localement. 
 +
Le L298N fournit la puissance aux moteurs.
  
<div style="text-align:center; margin:24px 0;">
+
<pre style="background:#f5f9fb; border:1px solid #c8dde6; border-radius:10px; padding:16px;">
<pre style="display:inline-block; text-align:left; background:#f5f9fb; border:1px solid #c8dde6; border-radius:10px; padding:16px;">
 
 
Joystick / capteurs
 
Joystick / capteurs
 
         ↓
 
         ↓
Line 549: Line 215:
 
Moteurs DC
 
Moteurs DC
 
</pre>
 
</pre>
</div>
 
  
=== 12.2 Rôle de chaque niveau ===
+
[[Fichier:STM32_wiki_08_Maquette_et_code_fin_image14.png|center|850px|thumb|Schéma de principe de l’architecture STM32, CAN, BluePill et L298N.]]
  
{| class="wikitable" style="width:100%;"
+
== Montage maquette ==
! Niveau
 
! Fonction
 
|-
 
| STM32 Nucleo
 
| Décision, consigne, stratégie de vol, coordination
 
|-
 
| Bus CAN
 
| Transport fiable des messages vers les modules
 
|-
 
| BluePill
 
| Exécution locale, génération PWM, pilotage moteur
 
|-
 
| L298N
 
| Amplification de puissance et inversion de sens
 
|-
 
| Moteurs
 
| Action physique observable sur la maquette
 
|}
 
 
 
[[Fichier:MiniBee_schema_branchement_STM32_CAN_Bluepill_L298N.png|center|900px|thumb|Schéma de principe de l’architecture STM32, CAN, BluePill et L298N.]]
 
  
== 13. Exemple de branchements maquette ==
+
Le montage final reprend cette logique sur plusieurs branches moteurs.
  
Les documents de référence indiquent une organisation répétable par branche moteur.
+
Chaque branche comprend :
  
=== 13.1 STM32 vers CAN principal ===
+
* un module CAN ;
 +
* une BluePill ;
 +
* un L298N ;
 +
* un ou deux moteurs DC.
  
* TX / D1 de la STM32 vers TX du CAN principal.
+
[[Fichier:STM32_wiki_07_Maquette_et_code_fin_image12.jpeg|center|700px|thumb|Montage physique de la maquette avec STM32, modules CAN, L298N et moteurs.]]
* RX / D0 de la STM32 vers RX du CAN principal.
 
* GND de la STM32 vers GND du CAN principal.
 
* 3.3 V de la STM32 vers 3.3 V du CAN principal.
 
  
=== 13.2 CAN principal vers modules CAN ===
+
== Bonnes pratiques ==
  
Pour chaque branche :
+
Avant chaque test :
  
* CANH vers CANH ;
+
* vérifier les masses communes ;
* CANL vers CANL.
+
* tester sans hélice ;
 
+
* limiter la vitesse moteur ;
=== 13.3 CAN vers BluePill ===
 
 
 
* CANTX vers A7 de la BluePill.
 
* CANRX vers B1 de la BluePill.
 
 
 
=== 13.4 BluePill vers L298N ===
 
 
 
* B8 vers ENA.
 
* B7 vers IN1.
 
* B6 vers IN2.
 
* B5 vers IN3.
 
* B4 vers IN4.
 
* B3 vers ENB.
 
 
 
=== 13.5 L298N vers moteurs ===
 
 
 
* OUT1 / OUT2 vers le premier moteur DC.
 
* OUT3 / OUT4 vers le second moteur DC.
 
 
 
[[Fichier:MiniBee_montage_maquette_STM32_CAN_L298N.jpg|center|750px|thumb|Montage physique de la maquette avec STM32, CAN, BluePill, L298N et moteurs DC.]]
 
 
 
== 14. Exemple de code maître STM32 ==
 
 
 
Ce code illustre le principe : la STM32 envoie une consigne de vitesse à plusieurs BluePills via le bus CAN.
 
 
 
<syntaxhighlight lang="cpp">
 
#define HAL_CAN_MODULE_ENABLED
 
#include <STM32_CAN.h>
 
 
 
STM32_CAN Can1(CAN1, ALT);
 
 
 
void setup() {
 
  Serial.begin(115200);
 
  Can1.begin();
 
  Can1.setBaudRate(500000);
 
  Serial.println("Mini-Bee master ready");
 
}
 
 
 
void loop() {
 
  static uint8_t speed = 0;
 
  static bool increasing = true;
 
 
 
  for (int id = 0x101; id <= 0x104; id++) {
 
    CAN_message_t msg;
 
    msg.id = id;
 
    msg.len = 2;
 
    msg.buf[0] = speed;
 
    msg.buf[1] = speed;
 
    Can1.write(msg);
 
  }
 
 
 
  if (increasing) {
 
    speed += 5;
 
  } else {
 
    speed -= 5;
 
  }
 
 
 
  if (speed >= 250 || speed <= 0) {
 
    increasing = !increasing;
 
  }
 
 
 
  delay(50);
 
}
 
</syntaxhighlight>
 
 
 
== 15. Exemple de code BluePill esclave ==
 
 
 
Chaque BluePill possède un identifiant unique. 
 
Elle ne traite que les messages CAN qui lui sont destinés.
 
 
 
<syntaxhighlight lang="cpp">
 
#include <STM32_CAN.h>
 
 
 
#define NODE_ID 0x101
 
 
 
#define ENA_PIN PB8
 
#define IN1_PIN PB7
 
#define IN2_PIN PB6
 
#define IN3_PIN PB5
 
#define IN4_PIN PB4
 
#define ENB_PIN PB3
 
 
 
STM32_CAN Can1(CAN1, DEF);
 
 
 
void setup() {
 
  pinMode(ENA_PIN, OUTPUT);
 
  pinMode(IN1_PIN, OUTPUT);
 
  pinMode(IN2_PIN, OUTPUT);
 
  pinMode(ENB_PIN, OUTPUT);
 
  pinMode(IN3_PIN, OUTPUT);
 
  pinMode(IN4_PIN, OUTPUT);
 
 
 
  Can1.begin();
 
  Can1.setBaudRate(500000);
 
  Can1.setFilter(0, NODE_ID, 0x7FF);
 
}
 
 
 
void driveMotors(uint8_t spd1, uint8_t spd2) {
 
  analogWrite(ENA_PIN, spd1);
 
  digitalWrite(IN1_PIN, HIGH);
 
  digitalWrite(IN2_PIN, LOW);
 
 
 
  analogWrite(ENB_PIN, spd2);
 
  digitalWrite(IN3_PIN, HIGH);
 
  digitalWrite(IN4_PIN, LOW);
 
}
 
 
 
void loop() {
 
  CAN_message_t msg_rx;
 
 
 
  if (Can1.read(msg_rx)) {
 
    if (msg_rx.id == NODE_ID) {
 
      driveMotors(msg_rx.buf[0], msg_rx.buf[1]);
 
    }
 
  }
 
}
 
</syntaxhighlight>
 
 
 
== 16. Lien avec les futures lois de commande ==
 
 
 
Ces exercices ne sont pas seulement pédagogiques. 
 
Ils préparent directement la logique du Flight Control Unit.
 
 
 
{| class="wikitable" style="width:100%;"
 
! Exercice
 
! Compétence acquise
 
! Application FCU
 
|-
 
| LED
 
| Sortie numérique
 
| Signal d’état, diagnostic, alerte
 
|-
 
| Joystick numérique
 
| Lecture d’ordre simple
 
| Boutons, modes, commandes discrètes
 
|-
 
| Joystick analogique
 
| Lecture proportionnelle
 
| Consigne pilote progressive
 
|-
 
| Potentiomètre
 
| Lecture ADC
 
| Simulation de throttle ou jauge de poussée
 
|-
 
| Pont en H
 
| Commande moteur
 
| Sens, vitesse, arrêt moteur
 
|-
 
| CAN loopback
 
| Communication robuste
 
| Validation du bus de commande
 
|-
 
| CAN + L298N
 
| Ordre numérique vers action moteur
 
| Architecture distribuée Mini-Bee
 
|}
 
 
 
== 17. Bonnes pratiques de démarrage ==
 
 
 
Avant de lancer un test moteur :
 
 
 
* vérifier le câblage GND commun ;
 
* vérifier les alimentations 3.3 V, 5 V et puissance moteur ;
 
* tester d’abord sans hélice ;
 
* limiter la vitesse au début ;
 
* utiliser le moniteur série ;
 
* documenter chaque branche moteur ;
 
 
* numéroter les BluePills ;
 
* numéroter les BluePills ;
 
* noter les identifiants CAN ;
 
* noter les identifiants CAN ;
* conserver une version du code stable avant modification.
+
* conserver une version stable du code ;
 +
* documenter chaque modification.
  
<div style="background:#fff1f1; border:1px solid #d99; border-radius:10px; padding:16px; margin:20px 0;">
+
<div style="background:#fff1f1; border:1px solid #d99; border-radius:10px; padding:14px; margin:18px 0;">
'''Sécurité :''' les tests moteurs doivent être réalisés sans hélices lors des premières validations.
+
'''Sécurité :''' ne jamais faire un premier test moteur avec hélices montées.
Une erreur de code, de sens moteur ou de câblage peut déclencher un mouvement imprévu.
 
 
</div>
 
</div>
  
== 18. Perspectives pour la suite ==
+
== Conclusion ==
  
La prise en main logicielle STM32 ouvre la voie aux travaux suivants :
+
La prise en main STM32 constitue la première étape du Flight Control Unit Mini-Bee.
 +
 
 +
Les exercices simples — LED, joystick, potentiomètre, moteur, CAN — permettent de construire progressivement une architecture distribuée.
 +
 
 +
Cette base prépare les prochaines étapes :
  
* intégration complète du bus CAN sur toutes les branches ;
 
* validation de la commande moteur distribuée ;
 
 
* synchronisation des moteurs ;
 
* synchronisation des moteurs ;
* lecture des capteurs inertiels ;
+
* intégration des capteurs ;
* intégration d’un correcteur PID ;
 
 
* stabilisation roll / pitch / yaw ;
 
* stabilisation roll / pitch / yaw ;
* test des cas de vol : décollage, stationnaire, montée, descente, virage et arrêt d’urgence.
+
* ajout du correcteur PID ;
 
+
* validation des cas de vol sur la maquette.
Le travail réalisé constitue donc une base de reprise pour les futurs groupes. 
 
Il permet de passer d’exercices simples à une architecture de contrôle réellement exploitable sur la maquette Mini-Bee.
 
 
 
== 19. Visuels recommandés pour cette page ==
 
 
 
{| class="wikitable" style="width:100%;"
 
! Visuel
 
! Source recommandée
 
! Utilisation dans la page
 
|-
 
| Capture installation bibliothèque STM32duino
 
| Rapport codes et exercices, page installation
 
| Section 4
 
|-
 
| Configuration Nucleo-64 / F446RE dans Arduino IDE
 
| Rapport codes et exercices, page configuration
 
| Section 4.2
 
|-
 
| Montage LED + breadboard
 
| Rapport codes et exercices, exercice LED
 
| Section 5
 
|-
 
| Montage joystick
 
| Rapport codes et exercices, exercice joystick
 
| Section 6
 
|-
 
| Transceiver CAN SN65HVD230
 
| Rapport codes et exercices, section bus CAN
 
| Section 10
 
|-
 
| BluePill
 
| Rapport codes et exercices, section BluePill
 
| Section 12
 
|-
 
| L298N
 
| Rapport codes et exercices, section L298N
 
| Section 8 ou 12
 
|-
 
| Schéma de branchement maquette
 
| Rapport codes et exercices, montage maquette
 
| Section 13
 
|-
 
| Architecture FCU
 
| Soutenance FCU Mini-Bee
 
| Section 2 ou 12
 
|}
 
 
 
== 20. Conclusion ==
 
 
 
La STM32 est le point d’entrée logiciel du Flight Control Unit Mini-Bee.
 
 
 
En partant d’exercices simples — LED, joystick, potentiomètre, moteur — on construit progressivement les briques nécessaires à une architecture de vol distribuée :
 
 
 
* acquisition des consignes ;
 
* traitement logiciel ;
 
* communication CAN ;
 
* délégation locale aux BluePills ;
 
* pilotage de puissance par L298N ;
 
* commande synchronisée des moteurs.
 
 
 
Cette progression rend le système compréhensible, testable et améliorable. 
 
Elle facilite la reprise du projet par de nouveaux contributeurs et prépare les prochaines étapes de stabilisation du Mini-Bee.
 

Revision as of 16:55, 22 May 2026


STM32 — Premiers pas et prise en main logicielle

Cette page présente les bases logicielles STM32 utilisées pour la maquette Mini-Bee. Elle sert de guide rapide pour installer l’environnement, réaliser les premiers tests et comprendre le lien entre la carte Nucleo, le bus CAN, les BluePills et les modules L298N.

Objectif

L’objectif est de permettre à un nouveau contributeur de démarrer rapidement avec la carte STM32 Nucleo F446RE.

À la fin de cette prise en main, il doit savoir :

  • installer l’environnement STM32 dans Arduino IDE ;
  • téléverser un premier programme ;
  • tester une sortie numérique ;
  • lire un joystick ou un potentiomètre ;
  • piloter un moteur DC ;
  • comprendre le rôle du bus CAN dans l’architecture Mini-Bee.

Contexte Mini-Bee

Dans le projet Mini-Bee, la STM32 Nucleo joue le rôle de contrôleur principal du Flight Control Unit.

Elle reçoit les consignes pilote, lit les données capteurs et transmet les ordres aux modules moteurs.

center|800px|thumb|Vue Mini-Bee utilisée pour présenter le contexte du Flight Control Unit.

L’architecture étudiée vise à rendre le Mini-Bee contrôlable sur trois axes :

  • Roll : roulis ;
  • Pitch : tangage ;
  • Yaw : lacet.

Matériel utilisé

Élément Rôle
STM32 Nucleo F446RE Carte maître du système
BluePill STM32F103 Carte esclave locale pour le pilotage moteur
SN65HVD230 Transceiver de communication CAN
L298N Pont en H pour piloter les moteurs DC
Joystick / potentiomètre Entrée de commande
Moteurs DC Actionneurs de test de la maquette

center|600px|thumb|Carte STM32 Nucleo F446RE utilisée comme contrôleur principal.

Installation logicielle

La carte STM32 peut être programmée avec Arduino IDE.

Étapes principales :

  1. Installer Arduino IDE.
  2. Ajouter le gestionnaire de cartes STM32duino.
  3. Installer le support STM32 depuis le gestionnaire de cartes.
  4. Importer la bibliothèque STM32duino X-NUCLEO-IKS01A2 au format ZIP.
  5. Sélectionner la carte Nucleo-64.
  6. Sélectionner le modèle Nucleo F446RE.
  7. Choisir le port série de la carte.

center|800px|thumb|Bibliothèque STM32duino X-NUCLEO-IKS01A2 utilisée dans Arduino IDE.

Point de vigilance : importer la bibliothèque directement en fichier ZIP, sans la décompresser.

Premier test : clignotement LED

Le premier exercice consiste à faire clignoter une LED sur la broche D13 / PA5.

Il valide :

  • le câblage ;
  • la reconnaissance de la carte ;
  • le téléversement du programme ;
  • la commande d’une sortie numérique.

center|650px|thumb|Montage de test LED avec breadboard et carte STM32 Nucleo.

<syntaxhighlight lang="cpp">

  1. define LED_PIN PA5
  2. define BLINK_DELAY 500

void setup() {

 Serial.begin(115200);
 pinMode(LED_PIN, OUTPUT);

}

void loop() {

 digitalWrite(LED_PIN, HIGH);
 delay(BLINK_DELAY);
 digitalWrite(LED_PIN, LOW);
 delay(BLINK_DELAY);

} </syntaxhighlight>

Lecture d’un joystick

Le joystick permet de transformer une action pilote en signal électrique.

Deux cas sont possibles :

  • joystick numérique : lecture ON / OFF ;
  • joystick analogique : lecture proportionnelle sur les axes X et Y.

Le joystick analogique est le plus intéressant pour le Mini-Bee, car il permet de générer une consigne progressive.

center|600px|thumb|Exemple de montage joystick pour lecture de consigne pilote.

<syntaxhighlight lang="cpp">

  1. define JOYSTICK_X_PIN PA0
  2. define JOYSTICK_Y_PIN PA1

void setup() {

 Serial.begin(115200);
 pinMode(JOYSTICK_X_PIN, INPUT);
 pinMode(JOYSTICK_Y_PIN, INPUT);

}

void loop() {

 int x = analogRead(JOYSTICK_X_PIN);
 int y = analogRead(JOYSTICK_Y_PIN);
 Serial.print("X: ");
 Serial.print(x);
 Serial.print(" | Y: ");
 Serial.println(y);
 delay(200);

} </syntaxhighlight>

Pilotage moteur avec L298N

La STM32 ne doit pas alimenter directement un moteur.

Le module L298N sert d’étage de puissance. Il reçoit des signaux logiques et alimente le moteur avec une source adaptée.

center|550px|thumb|Module L298N utilisé comme pont en H pour piloter les moteurs DC.

Principe de commande :

IN1 IN2 Effet
HIGH LOW Rotation sens A
LOW HIGH Rotation sens B
LOW LOW Arrêt

Bus CAN

Le bus CAN permet de connecter la STM32 Nucleo aux modules moteurs sans multiplier les câbles.

Il est adapté au Mini-Bee car il offre :

  • une communication robuste ;
  • une transmission différentielle sur CAN_H et CAN_L ;
  • une meilleure résistance aux parasites ;
  • une architecture multipoint ;
  • une extension plus simple vers plusieurs moteurs.

center|500px|thumb|Transceiver CAN SN65HVD230 utilisé pour la communication entre les modules.

Architecture de commande

L’architecture Mini-Bee sépare la commande et la puissance.

La STM32 décide. La BluePill exécute localement. Le L298N fournit la puissance aux moteurs.

Joystick / capteurs
        ↓
STM32 Nucleo F446RE
        ↓ Bus CAN
SN65HVD230
        ↓
BluePill STM32F103
        ↓ PWM + direction
L298N
        ↓
Moteurs DC

center|850px|thumb|Schéma de principe de l’architecture STM32, CAN, BluePill et L298N.

Montage maquette

Le montage final reprend cette logique sur plusieurs branches moteurs.

Chaque branche comprend :

  • un module CAN ;
  • une BluePill ;
  • un L298N ;
  • un ou deux moteurs DC.

center|700px|thumb|Montage physique de la maquette avec STM32, modules CAN, L298N et moteurs.

Bonnes pratiques

Avant chaque test :

  • vérifier les masses communes ;
  • tester sans hélice ;
  • limiter la vitesse moteur ;
  • numéroter les BluePills ;
  • noter les identifiants CAN ;
  • conserver une version stable du code ;
  • documenter chaque modification.

Sécurité : ne jamais faire un premier test moteur avec hélices montées.

Conclusion

La prise en main STM32 constitue la première étape du Flight Control Unit Mini-Bee.

Les exercices simples — LED, joystick, potentiomètre, moteur, CAN — permettent de construire progressivement une architecture distribuée.

Cette base prépare les prochaines étapes :

  • synchronisation des moteurs ;
  • intégration des capteurs ;
  • stabilisation roll / pitch / yaw ;
  • ajout du correcteur PID ;
  • validation des cas de vol sur la maquette.