Intelligence embarque IMA5 2022/2023 G2
Sommaire
Choix du projet
Nous avons décidé, d'utiliser dans la détection de problème dans le calibrage d'une machine
Contexte
De nos jours, la fabrication des engins de transports dans de nombreux domaines (e.g l'aéronautique, ferroviaire) sont réalisées par des machines. Et le calibrage de ces machines doit être précis pour fixer les éléments. Cependant, lorsque les moteurs commencent à être usés, le calibrage de ce dernier peut être imprécis. Une fluctuation de calibrage peut générer une longue erreur de production (ceci est grave pour l'entreprise de production en chaîne), il est alors nécéssaire de détecter ces erreurs de calibrage pour adopter une solution.
Idée
Le capteur sera monté sur un bras. On veut détecter la présence de trous sur des pièces afin d'y fixer des rivets. Ainsi, on peut mesurer la taille et profondeur des trous. Il y aura d'autres forme de détection : pronfondeur des trous, nombre de trous, etc
STMCubeIDE
Premier programme : Blink
Pour se familiariser avec STMCubeIDE, on essaye de faire fonctioner la carte Nucleo-F401RE, la LED utilisateur LD2 est situé sur le pin PA5 (GPIOA, GPIO_PIN_5) Pour se faire :
- On crée un nouveau projet STM
- On vérifie la configuration des GPIO et Clock
- On clique sur Device Generation Tool Code Generation
- On ouvre main.c et on ajoute ce code dans la boucle loop:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0); HAL_Delay(1000);
- On build et on run le debug
Pour plus de détail, suivre sur ce lien
Premier pas avec le capteur NUCLEO-53L5A1
On récupère le projet sur ce fichier : Fichier:Ai4industry-master.zip
On ouvre ce projet sur l'IDE, puis on configure un utilitaire port série (par exemple minicom) :
- Baud rate : 460800
- 8N-1
- Par défaut l'écoute sur /dev/ttyACM0
Le programme initial du projet nous affiche les valeurs sur un tableau 4*4, nous pouvons modifier cette variable pour avoir toute les valeurs dans un tableau 8*8 :
Profile.RangingProfile = RS_PROFILE_8x8_CONTINUOUS;
Maintenant on essaye de récupèrer les valeurs vers un fichier csv, on modifie la fonction print_result
pour afficher les valeurs séparées d'une virgule :
static void print_result(RANGING_SENSOR_Result_t *Result) { int8_t j, k, l; uint8_t zones_per_line; zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) || (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4; for (j = 0; j < Result->NumberOfZones; j += zones_per_line) { for (l = 0; l < RANGING_SENSOR_NB_TARGET_PER_ZONE; l++) { /* Print distance and status */ for (k = (zones_per_line - 1); k >= 0; k--) { if((l!=0) || (k!=(zones_per_line - 1)) || (j!=0)){ printf(","); } if (Result->ZoneResult[j+k].NumberOfTargets > 0) printf("%ld",(long)Result->ZoneResult[j+k].Distance[l]); else printf("0"); } } } printf("\r\n"); }
Puis on récupère les donénes dans un fichier csv : cat /dev/ttyACM0 >> data.csv
On récupère toutes nos datasets dans le répertoire /dataset
Liste des problèmes et résolutions
- Impossible de télécharger le firmware de la carte
- Résolution : Configurer le proxy (mettre en manuel et non native et configurer HTTP et HTTPS et tout cocher)
- Erreur lors du débug : Could not determine GDB version using command: arm-none-eabi-gdb --version
- Résolution : Lancer sur un terminal :
sudo apt-get install libncurses5:amd64
source
- Résolution : Lancer sur un terminal :
NanoEdgeAIStudio
On upload nos datasets et on fait un benchmark :
Nous avons un résultat de 96%.
Maquette
On réalise 4 pièces en bois pour simuler une pièce à fixer avec différents trous :
Nous avons fait aussi bricoler quelque chose pour simuler si la pièce est correctement percer :
Puis on réalise notre maquette, on fixe le capteur de distance sur un support vertical, on place les pièces sur un autre support à même hauteur du capteur pour simuler le fait que la pièce arrive devant le bras fixeur (ou le capteur de distance)