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...")
 
 
(15 intermediate revisions by the same user not shown)
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 permet de démarrer rapidement avec la carte STM32 Nucleo F446RE, Arduino IDE, le bus CAN, les BluePills et les modules de puissance 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 donner une base claire pour reprendre la partie logicielle STM32 du Flight Control Unit Mini-Bee.
  
Elle permet de comprendre :
+
À la fin de cette prise en main, un contributeur 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.
+
[[File:ChatGPT Image 22 mai 2026, 10 58 59.png|center|800px|thumb|Contexte Mini-Bee et 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.]]
+
[[File: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 ==
 
  
La première étape consiste à préparer l’IDE Arduino pour programmer la carte STM32.
+
== Installation logicielle ==
  
=== 4.1 Installer les bibliothèques STM32 ===
+
La carte STM32 peut être programmée avec Arduino IDE.
  
La carte d’extension X-NUCLEO-IKS01A2 est compatible avec l’écosystème Arduino. 
+
Étapes principales :
Une bibliothèque dédiée permet d’utiliser les capteurs et les fonctions associées dans l’IDE.
 
  
Étapes recommandées :
+
# Installer Arduino 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.
  
# 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 ===
+
Le premier exercice consiste à faire clignoter une LED sur la broche D13 / PA5.
  
Dans les préférences Arduino, ajouter l’URL du gestionnaire de cartes STM32duino. 
+
Il valide :
Puis ouvrir le gestionnaire de cartes et installer les paquets STM32.
 
  
Ensuite, configurer la carte :
+
* le câblage ;
 +
* la reconnaissance de la carte ;
 +
* le téléversement du programme ;
 +
* la commande d’une sortie numérique.
  
{| class="wikitable" style="width:100%;"
+
[[File:STM32 wiki 02 Maquette et code fin image3.png|center|650px|thumb|Montage de test LED avec breadboard et carte STM32 Nucleo.]]
! Paramètre Arduino IDE
 
! Valeur à sélectionner
 
|-
 
| 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.]]
 
 
 
== 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 104:
 
   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 numérique est utilisé comme une série d’interrupteurs logiques.
 
 
 
Il permet de détecter des états simples :
 
 
 
* direction activée ;
 
* bouton pressé ;
 
* position de repos.
 
 
 
=== 6.1 Broches utilisées ===
 
 
 
{| 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 permet de transformer une action pilote en signal électrique.
  
Le joystick analogique est plus adapté au pilotage progressif du Mini-Bee.
+
Deux cas sont possibles :
  
Contrairement au joystick numérique, il ne donne pas seulement un état ON/OFF
+
* joystick numérique : lecture ON / OFF ;
Il fournit une valeur proportionnelle à l’inclinaison.
+
* joystick analogique : lecture proportionnelle sur les axes X et Y.
  
=== 7.1 Principe ===
+
Le joystick analogique est le plus intéressant pour le Mini-Bee, car il permet de générer une consigne progressive.
  
Les axes X et Y sont lus par les entrées analogiques de la STM32.
+
[[File:STM32 wiki 03 Maquette et code fin image6.png|center|600px|thumb|Montage joystick pour lecture de consigne pilote.]]
 
 
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 STM32 ne doit pas alimenter directement un moteur.
  
La carte STM32 ne peut pas alimenter directement les moteurs.   
+
Le module L298N sert d’étage de puissance.   
Il faut utiliser un composant de puissance.
+
Il reçoit des signaux logiques et alimente le moteur avec une source adaptée.
  
Dans les exercices, deux approches apparaissent :
+
[[File:STM32 wiki 14 20260511 FCU MINIBEE image61.png
 +
|center|550px|thumb|Module L298N utilisé comme pont en H pour piloter les moteurs DC.]]
  
* L293D pour les premiers tests pédagogiques ;
+
Principe de commande :
* L298N pour la maquette Mini-Bee.
 
 
 
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.
 
 
 
=== 8.1 Logique 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 179:
 
| LOW
 
| LOW
 
| Arrêt
 
| Arrêt
|-
 
| HIGH
 
| HIGH
 
| Arrêt / freinage selon montage
 
 
|}
 
|}
  
=== 8.2 Exemple simple ===
+
== Bus CAN ==
 
 
<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);
+
Le bus CAN permet de connecter la STM32 Nucleo aux modules moteurs sans multiplier les câbles.
  digitalWrite(motorPin4, HIGH);
 
  delay(2000);
 
  
  digitalWrite(motorPin1, LOW);
+
Il est adapté au Mini-Bee car il offre :
  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.]]
+
* 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.
  
== 9. Potentiomètre et jauge de poussée ==
+
[[File:STM32 wiki 13 20260511 FCU MINIBEE image60.png|center|500px|thumb|Transceiver CAN SN65HVD230 utilisé pour la communication entre les modules.]]
  
Le potentiomètre permet de simuler une commande de puissance.
+
== Architecture de commande ==
  
Dans le rapport d’exercices, il est utilisé pour allumer progressivement une, deux puis trois LED. 
+
L’architecture Mini-Bee sépare la commande et la puissance.
Ce montage représente une jauge simplifiée de régime moteur.
 
  
=== 9.1 Principe ===
+
La STM32 décide. 
 +
La BluePill exécute localement. 
 +
Le L298N fournit la puissance aux moteurs.
  
* Potentiomètre faible : aucune LED allumée.
+
<pre style="background:#f5f9fb; border:1px solid #c8dde6; border-radius:10px; padding:16px;">
* 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 ===
 
 
 
Le moniteur série doit afficher une réception de données.
 
 
 
Exemple :
 
 
 
<syntaxhighlight lang="text">
 
SUCCESS: CAN uses D14/D15
 
Sending...
 
RECEIVED! Data: 1 2 3 4
 
</syntaxhighlight>
 
 
 
== 12. Architecture distribuée de la maquette ==
 
 
 
L’architecture retenue sépare la commande et la puissance.
 
 
 
La STM32 Nucleo ne pilote pas directement tous les moteurs. 
 
Elle envoie des ordres à des BluePills, qui pilotent localement les modules L298N.
 
 
 
=== 12.1 Chaîne fonctionnelle ===
 
 
 
<div style="text-align:center; margin:24px 0;">
 
<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 216:
 
Moteurs DC
 
Moteurs DC
 
</pre>
 
</pre>
</div>
 
  
=== 12.2 Rôle de chaque niveau ===
+
[[File:STM32 wiki 08 Maquette et code fin image14.png|center|850px|thumb|Schéma de principe 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.
 +
 
 +
[[File:STM32 wiki 07 Maquette et code fin image12 rotated left.jpeg|center|700px|thumb|Montage physique de la maquette Mini-Bee avec STM32, CAN, BluePill, L298N et moteurs.]]
 +
 
 +
== Exemple de branchement d’une branche moteur ==
  
 
{| class="wikitable" style="width:100%;"
 
{| class="wikitable" style="width:100%;"
! Niveau
+
! Liaison
! Fonction
+
! Connexion
 
|-
 
|-
| STM32 Nucleo
+
| CAN principal vers CAN branche
| Décision, consigne, stratégie de vol, coordination
+
| CANH vers CANH, CANL vers CANL
 
|-
 
|-
| Bus CAN
+
| CAN vers BluePill
| Transport fiable des messages vers les modules
+
| CANTX vers A7, CANRX vers B1
 
|-
 
|-
| BluePill
+
| BluePill vers L298N
| Exécution locale, génération PWM, pilotage moteur
+
| B8 vers ENA, B7 vers IN1, B6 vers IN2, B5 vers IN3, B4 vers IN4, B3 vers ENB
 
|-
 
|-
| L298N
+
| L298N vers moteurs
| Amplification de puissance et inversion de sens
+
| OUT1 / OUT2 vers moteur 1, OUT3 / OUT4 vers moteur 2
|-
 
| 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.]]
+
== Exemple de code maître STM32 ==
  
== 13. Exemple de branchements maquette ==
+
Ce code illustre le principe d’envoi d’une consigne de vitesse vers plusieurs BluePills via le bus CAN.
 
 
Les documents de référence indiquent une organisation répétable par branche moteur.
 
 
 
=== 13.1 STM32 vers CAN principal ===
 
 
 
* TX / D1 de la STM32 vers TX du CAN principal.
 
* 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 ===
 
 
 
Pour chaque branche :
 
 
 
* CANH vers CANH ;
 
* CANL vers CANL.
 
 
 
=== 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">
 
<syntaxhighlight lang="cpp">
Line 658: Line 295:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== 15. Exemple de code BluePill esclave ==
+
== Exemple de code BluePill esclave ==
  
 
Chaque BluePill possède un identifiant unique.   
 
Chaque BluePill possède un identifiant unique.   
Line 711: Line 348:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== 16. Lien avec les futures lois de commande ==
+
== Bonnes pratiques ==
  
Ces exercices ne sont pas seulement pédagogiques. 
+
Avant chaque test :
Ils préparent directement la logique du Flight Control Unit.
 
  
{| class="wikitable" style="width:100%;"
+
* vérifier les masses communes ;
! Exercice
+
* tester sans hélice ;
! Compétence acquise
+
* limiter la vitesse moteur ;
! 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 et 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.
 

Latest revision as of 17:47, 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 permet de démarrer rapidement avec la carte STM32 Nucleo F446RE, Arduino IDE, le bus CAN, les BluePills et les modules de puissance L298N.

Objectif

L’objectif est de donner une base claire pour reprendre la partie logicielle STM32 du Flight Control Unit Mini-Bee.

À la fin de cette prise en main, un contributeur 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.

Contexte Mini-Bee et 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
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.


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.
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.

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.

[[File:STM32 wiki 14 20260511 FCU MINIBEE image61.png |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.
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
Schéma de principe 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.
Montage physique de la maquette Mini-Bee avec STM32, CAN, BluePill, L298N et moteurs.

Exemple de branchement d’une branche moteur

Liaison Connexion
CAN principal vers CAN branche CANH vers CANH, CANL vers CANL
CAN vers BluePill CANTX vers A7, CANRX vers B1
BluePill vers L298N B8 vers ENA, B7 vers IN1, B6 vers IN2, B5 vers IN3, B4 vers IN4, B3 vers ENB
L298N vers moteurs OUT1 / OUT2 vers moteur 1, OUT3 / OUT4 vers moteur 2

Exemple de code maître STM32

Ce code illustre le principe d’envoi d’une consigne de vitesse vers plusieurs BluePills via le bus CAN.

<syntaxhighlight lang="cpp">

  1. define HAL_CAN_MODULE_ENABLED
  2. 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>

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">

  1. include <STM32_CAN.h>
  1. define NODE_ID 0x101
  1. define ENA_PIN PB8
  2. define IN1_PIN PB7
  3. define IN2_PIN PB6
  4. define IN3_PIN PB5
  5. define IN4_PIN PB4
  6. 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>

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 et 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.