Ligne 1 : |
Ligne 1 : |
| Afin de vous aider à mieux comprendre la façon dont nous avons réalisé notre projet, nous avons rédigé ce document tutoriel. Cela devrait vous permettre de réussir à reprendre les différentes étapes du projet si nécessaire. | | Afin de vous aider à mieux comprendre la façon dont nous avons réalisé notre projet, nous avons rédigé ce document tutoriel. Cela devrait vous permettre de réussir à reprendre les différentes étapes du projet si nécessaire. |
− | TUTO EN COURS DE REDACTION
| |
| | | |
| =Projet 1 : Carte d'alimentation= | | =Projet 1 : Carte d'alimentation= |
Ligne 33 : |
Ligne 32 : |
| | | |
| ===Comprendre et/ou modifier le code de l'application=== | | ===Comprendre et/ou modifier le code de l'application=== |
− | Voici les différents Screen crées :
| + | Si vous souhaitez modifier l'application, vous devez : |
| + | *Télécharger le fichier .aia au lien suivant : [https://drive.google.com/file/d/1XvCx8m_984NGFHAy1XcAURyGfx47GXMH/view?usp=sharing Application .aia] |
| + | *Ouvrir la page web MIT App inventor et y charger le fichier .aia |
| + | *Vous aurez ainsi accès à toutes les composantes de l'application Polybot |
| + | |
| + | '''ATTENTION''' vous ne pouvez pas modifier le code de la STM32 sans modifier le code Scratch de l'application (dans certains cas) ! |
| + | |
| + | |
| + | <br> |
| + | Rappels des différents Screen crées : |
| * Screen 1 : Page de lancement avec logo Polybot | | * Screen 1 : Page de lancement avec logo Polybot |
| * Screen 2 : Choix des valeurs à afficher et choix de stocker ou non les données affichées | | * Screen 2 : Choix des valeurs à afficher et choix de stocker ou non les données affichées |
Ligne 42 : |
Ligne 50 : |
| [[Fichier:Appli2.png|150px|vignette|centré|Screen 3 de l'application]] | | [[Fichier:Appli2.png|150px|vignette|centré|Screen 3 de l'application]] |
| | | |
− | Si vous souhaitez modifier l'application, vous devez :
| |
− | *Télécharger le fichier .aia au lien suivant : [https://drive.google.com/file/d/1XvCx8m_984NGFHAy1XcAURyGfx47GXMH/view?usp=sharing Application .aia]
| |
− | *Ouvrir la page web MIT App inventor et y charger le fichier .aia
| |
− | *Vous aurez ainsi accès à toutes les composantes de l'application Polybot
| |
− |
| |
− | ATTENTION vous ne pouvez pas modifier le code de la STM32 sans modifier le code Scratch de l'application (dans certains cas) !
| |
| <br> | | <br> |
| Étant donné que nous avons utilisé App Inventor pour réaliser notre application, nous avons uniquement pu utiliser du Scratch pour coder le fonctionnement de l'appli. Malheureusement ce langage de programmation sous forme de blocs entraine souvent de grosses suites de blocs pas toujours très lisibles. Nous allons donc essayer de vous expliquer clairement et simplement ce que nous avons réalisé pour chaque Screen. | | Étant donné que nous avons utilisé App Inventor pour réaliser notre application, nous avons uniquement pu utiliser du Scratch pour coder le fonctionnement de l'appli. Malheureusement ce langage de programmation sous forme de blocs entraine souvent de grosses suites de blocs pas toujours très lisibles. Nous allons donc essayer de vous expliquer clairement et simplement ce que nous avons réalisé pour chaque Screen. |
| | | |
− | *Screen 1 : on affiche simplement le logo de Polybot pendant 4 secondes puis on ouvre le Screen suivant. | + | *Screen 1 : on affiche simplement le logo de Polybot pendant 4 secondes puis on ouvre le Screen suivant. La fonction "when clock1.timer" va permettre de synchroniser des actions (lance une sorte de chrono). Dans la partie interface, on peut choisir la fréquence de la Clock (par exemple 1s ou 200ms). |
| [[Fichier:Code1.png|vignette|centré|Code pour le Screen 1 ]] | | [[Fichier:Code1.png|vignette|centré|Code pour le Screen 1 ]] |
| *Screen 2 : on initialise les variables globales qui nous indiqueront si les valeurs ont été cochées (1) ou décochées (0), c'est à dire si on souhaite les afficher par la suite ou non. On aura donc une variables globale pour chaque donnée à afficher (distance parcourue, tension, vitesse, position...). | | *Screen 2 : on initialise les variables globales qui nous indiqueront si les valeurs ont été cochées (1) ou décochées (0), c'est à dire si on souhaite les afficher par la suite ou non. On aura donc une variables globale pour chaque donnée à afficher (distance parcourue, tension, vitesse, position...). |
Ligne 61 : |
Ligne 63 : |
| | | |
| [[Fichier:Code2 2.png|vignette|centré|Stockage des variables]] | | [[Fichier:Code2 2.png|vignette|centré|Stockage des variables]] |
− | *Screen 3 : à l'ouverture du Screen on va récupérer les valeurs des variables globales dans la base de donnée. En fonction de leur valeur (0 ou 1) on rendra visible ou non les données correspondantes. Par exemple, si la variable box_tension vaut 1 alors les valeurs de la tension seront rendues invisibles sur l'écran. | + | *Screen 3 : à l'ouverture du Screen on va récupérer les valeurs des variables globales dans la base de donnée. En fonction de leur valeur (0 ou 1) on rendra visible ou non les données correspondantes. Par exemple, si la variable box_tension vaut 1 alors les valeurs de la tension seront rendues invisibles sur l'écran. On met donc toutes ces fonctions dans le bloc "when Screen3.initialize", c'est à dire qu'on passera une fois dans ce bloc lors du lancement du screen. |
| | | |
| [[Fichier:Code3 1.png|vignette|centré|Récupération des variables globales]] | | [[Fichier:Code3 1.png|vignette|centré|Récupération des variables globales]] |
| + | [[Fichier:Visible.png|vignette|centré|Visibilité de chaque valeur]] |
| On configure ensuite le bouton qui nous permet d'aller nous connecter au périphérique souhaité (ici notre module HC-06). Il affiche la liste des périphériques Bluetooth connecté, après en avoir sélectionné un on affiche "Périphérique Connecté". | | On configure ensuite le bouton qui nous permet d'aller nous connecter au périphérique souhaité (ici notre module HC-06). Il affiche la liste des périphériques Bluetooth connecté, après en avoir sélectionné un on affiche "Périphérique Connecté". |
| | | |
Ligne 72 : |
Ligne 75 : |
| [[Fichier:Code3 3.png|vignette|700px|centré|Réception et affichage des données]] | | [[Fichier:Code3 3.png|vignette|700px|centré|Réception et affichage des données]] |
| | | |
− | Enfin, nous avons créé plusieurs fonctions permettant le stockage des données affichées si l'utilisateur le souhaite. Nous avons par exemple créé la fonction nettoyer_fichier qui vide le fichier à chaque nouveau lancement de l'application, et la fonction stockage_data qui va ajouter les données dans le fichier de stockage. En amont, il faudra ajouter un fichier .csv dans le téléphone. Pour avoir plus d'informations sur la façon dont nous avons géré le stockage, nous vous invitons à aller voir notre page de tuto :
| + | ====Stockage des données==== |
| + | Le reste des fonctions créés sont utiles pour le stockage. |
| + | *On commence par initialiser la variable texte "fichier" qui correspond au chemin d'accès au fichier de stockage : "stockage_data_robot.csv". Si la variable globale "stockage" vaut 1 (c'est à dire si l'utilisateur à coché la case stockage) alors on va aller lire ce fichier grâce à la fonction ci-dessous. |
| + | [[Fichier:Stockage2.png|vignette|1000px|centré|Indication du chemin d'accès au fichier]] |
| + | [[Fichier:Stockage1.png|vignette|centré|Lecture du fichier "stockage_data_robot.csv"]] |
| | | |
− | ====Stockage des données==== | + | *Une fois que le fichier a été lu (Fichier.GotText = 1) alors on lance la fonction "nettoyer_fichier". |
| + | [[Fichier:Stockage3.png|vignette|centré|1000px|Appel à la fonction "nettoyer_fichier"]] |
| + | |
| + | Cette fonction détaillée ci-dessous permet de nettoyer le fichier .csv à chaque nouveau lancement de l'application. En effet, à chaque nouveau lancement on va aller supprimer les données stockées précédentes. Si on veut stocker les données précédents il faudra alors faire des screen ou alors copier les données avant que celles-ci soient supprimées. |
| + | [[Fichier:Stockage4.png|vignette|centré|1000px|Fonction "nettoyer_fichier"]] |
| + | |
| + | Dans cette fonction "nettoyer_fichier", on commence par remplacer le fichier .csv par une liste vide puis on ajoute ensuite une ligne contenant les noms des valeurs (tensions, vitesse..etc). Enfin, on sauvegarde la nouvelle ligne. |
| + | |
| + | *On a ensuite créé la fonction "stockage_data" que l'on appelle à chaque début d'une nouvelle boucle d'envoi de données (c'est à dire juste après le flag qui signifie qu'on se trouve au début de la boucle). On va ainsi pouvoir ajouter les données dans le fichier stockage à chaque nouveau cycle d'envoi de données. |
| + | [[Fichier:Stockage6.png|vignette|centré|1000px|Appel à la fonction "stockage_data"]] |
| + | |
| + | Voici comment est composé la fonction "stockage_data" : |
| + | [[Fichier:Stockage5.png|vignette|centré|1000px|Fonction "stockage_data"]] |
| + | Dans cette fonction, on créé une ligne qui va contenir toutes les nouvelles données mises à jour puis on sauvegarde la ligne dans le fichier de stockage. |
| | | |
| ==Explication du code et lien vers le Git== | | ==Explication du code et lien vers le Git== |
− | ===Code STMCubeIDE=== | + | ===Explication du Code STMCubeIDE=== |
− | Pour réaliser la communication UART entre la STM32 et notre module Bluetooth, on commence par brancher les câbles comme mentionnées un peu plus haut. On doit ensuite configurer notre projet sur STMCubeIDE. Pour cela il suffit de sélectionner l'UART, de l'activer puis de régler certains paramètres.
| + | Comme nous l'avons expliqué dans le rapport nous avons utilisé les fonctions suivantes dans notre code sur STMCubeIDE ; |
− | On pourra ainsi modifier le baudrate, la structure de la trame (nombre de bit de stop, nombre de bits de données...), activer ou non les interruptions... Dans notre cas, on choisira le mode Asynchrone pour l'UART, un baudrate de 9600 et on activera les interruptions.
| |
− | | |
− | Une fois ces réglages réalisés, notre communication est opérationnelle. On pourra ainsi utiliser différentes fonctions dans le code de la STM32 pour envoyer les données sur les pins de l'UART4.
| |
− | On utilisera par exemple les fonctions :
| |
| '''HAL_UART_Transmit_IT'''(&huart4, (uint8_t*) txt_a_envoyer,sizeof(txt_a_envoyer)); | | '''HAL_UART_Transmit_IT'''(&huart4, (uint8_t*) txt_a_envoyer,sizeof(txt_a_envoyer)); |
| '''HAL_Delay'''(temps) qu'on remplacera par osDelay(temps) avec l'utilisation de FreeRTOS | | '''HAL_Delay'''(temps) qu'on remplacera par osDelay(temps) avec l'utilisation de FreeRTOS |
Ligne 93 : |
Ligne 109 : |
| [[Fichier:Terminal text.png|200px|vignette|centré|Réception des données ]] | | [[Fichier:Terminal text.png|200px|vignette|centré|Réception des données ]] |
| | | |
− | '''Choix des valeurs à afficher'''<br>
| + | Pour rappel, nous avons affichés à l'écran les données suivantes : |
− | Nous avons discuté avec les autres groupes travaillant sur le robot pour savoir quels types d'informations ils aimeraient que l'on affiche sur notre écran.
| |
− | Nous allons donc afficher les données suivantes :
| |
| *Tension de la batterie | | *Tension de la batterie |
| *Distance parcourue | | *Distance parcourue |
| *Vitesse du robot | | *Vitesse du robot |
− | *Coordonnées du robot (position) | + | *Coordonnées du robot (position x et y) |
− | *Trajectoire (peut-être), le but serait qu'à la fin du parcours on affiche graphiquement la trajectoire qu'a emprunté le robot. Mais à voir si cela est possible et utile surtout
| |
− | | |
− | Nous aimerions également pouvoir stocker les données recueillies pendant le parcours du robot. Toutes ces informations pourraient nous permettre pendant le parcours de vérifier le bon fonctionnement du robot. En cas d'erreur/problème/bug on pourra étudier les données stockées pour tentant de trouver l'origine du problème.
| |
− | | |
− | On pense également qu'il pourrait être intéressant de rajouter une option sur l'écran de contrôle permettant l'arrêt d'urgence du robot en cas de problème détecté. Pour cela, nous avons travaillé avec Florian et Flavien qui travaillent sur la carte de puissance pour qu'ils intègrent cela à leur système.
| |
| | | |
| <br> | | <br> |
− | '''Affichage des valeurs souhaitées'''<br>
| |
| Pour transmettre les différentes valeurs souhaitées, nous avons ajouté dans le code de la STM les fonctions mentionnées plus haut. | | Pour transmettre les différentes valeurs souhaitées, nous avons ajouté dans le code de la STM les fonctions mentionnées plus haut. |
| On envoie ensuite les données dans un ordre précis : on commence par envoyer le flag qui va nous permettre de marquer le début de chaque nouveau while, nous avons choisi de lui donner la valeur -9999 car cette valeur ne peut être atteinte par aucune autre données que nous affichons. Il n'y a donc pas de problème possible de ce côté là. Ce flag nous sera utile pour la suite car cela signalera à l'application qui réceptionne les données quand nous serons au début de la boucle while du code. Cela permet donc de synchroniser l'envoi des données. | | On envoie ensuite les données dans un ordre précis : on commence par envoyer le flag qui va nous permettre de marquer le début de chaque nouveau while, nous avons choisi de lui donner la valeur -9999 car cette valeur ne peut être atteinte par aucune autre données que nous affichons. Il n'y a donc pas de problème possible de ce côté là. Ce flag nous sera utile pour la suite car cela signalera à l'application qui réceptionne les données quand nous serons au début de la boucle while du code. Cela permet donc de synchroniser l'envoi des données. |
Ligne 161 : |
Ligne 169 : |
| HAL_UART_Transmit_IT(&huart3, (uint8_t*) buff_posy,sizeof(buff_posy)); // position y | | HAL_UART_Transmit_IT(&huart3, (uint8_t*) buff_posy,sizeof(buff_posy)); // position y |
| osDelay(400); | | osDelay(400); |
− | *Notre code est maintenant prêt à être implémenté sur le robot.
| |
− |
| |
− | Par exemple l'image ci-dessous avec des valeurs fictives (compteurs qui s'incrémentent) :
| |
− |
| |
− | [[Fichier:Terminal.png|200px|vignette|centré|Réception de données]]
| |
− |
| |
− | '''Système d'exploitation Temps Réel''' <br>
| |
− | [[Fichier:Logo freertos.jpg|vignette|droite]]
| |
| | | |
− | Afin de coordonner toutes les tâches que le robot a à effectuer, on utilise conjointement avec l'équipe de projet de 4A un OS (système d'exploitation) temps réel. Il s'agit de FreeRTOS. Celui-ci est intégrable directement depuis l'outil STMCubeIDE et il est même possible de prédéfinir nos différentes tâches et une multitude de paramètres (les priorités des tâches par exemple). Un OS temps réel permet aussi de gérer la préemptivité (ou la priorité) de chaque tâche, une tâche de haute priorité ayant toujours la priorité sur une tâche de basse priorité. Il va de soit que notre tâche prendra une priorité faible par rapport aux autres tâches puisque le plus important pour le robot est qu'il puisse se diriger et manœuvrer et que notre tache consiste juste à afficher des données. Pour suivre le schéma de code utilisé par les autres groupes, nous avons dû créer une nouvelle tâche avec FreeRTOS : dataDisplayTask. Tout notre code se trouve donc à l'intérieur de cette tâche. FreeRTOS se chargera ensuite d'alterner entre toutes les tâches du programme du robot en fonction de leur priorité. On pourra par contre revoir cette priorité dans le cas où l'on ajoute un bouton d'arrêt d'urgence sur notre application ou même créer une autre tâche spécialement pour ce bouton avec une forte priorité. Une fois la ou les tâche(s) et les paramètres définis, il nous suffit de générer le code et de remplir notre tâche.
| + | ===Récupérer le code général=== |
− | [[Fichier:Capture menu FreeRTOS.png|centré|vignette|Paramétrage de FreeRTOS]]
| |
− | | |
− | ===Récupérer du code général=== | |
| Pour pouvoir accéder au code général du robot vous devez : | | Pour pouvoir accéder au code général du robot vous devez : |
| *Créer un compte GitLab | | *Créer un compte GitLab |
− | *Contacter le responsable de Polybot pour qu'il vous donne l'accès aux Git de polybot | + | *Contacter le responsable de Polybot (Errikos Messara) pour qu'il vous donne l'accès aux Git de Polybot |
| *Accéder au dossier concerné | | *Accéder au dossier concerné |
| *Télécharger le master | | *Télécharger le master |
Ligne 182 : |
Ligne 179 : |
| | | |
| <br> | | <br> |
− | Si vous souhaitez uniquement regarder la tâche relative à notre partie du projet, vous pourrez la trouver sous format .txt au lien suivant : METTRE LE LIEN DE NOTRE CODE | + | Si vous souhaitez uniquement regarder la tâche relative à notre partie du projet, vous pourrez la trouver sous format .txt au lien suivant : [https://drive.google.com/file/d/1vw60jSFCPwRbrCF2yBndYtXRUh3kE4vX/view?usp=sharing Code .txt] |
| | | |
| ==Utilisation des modules Bluetooth HC-06== | | ==Utilisation des modules Bluetooth HC-06== |
Ligne 219 : |
Ligne 216 : |
| *Cliquez ensuite sur le fichier "stockage_data_robot.csv" pour lire les données enregistrées au format .csv | | *Cliquez ensuite sur le fichier "stockage_data_robot.csv" pour lire les données enregistrées au format .csv |
| | | |
− | Pour traiter ces données et les afficher dans un tableau : | + | Pour traiter ces données et les afficher dans un tableau par exemple : |
| *Branchez vous téléphone sur un PC | | *Branchez vous téléphone sur un PC |
| *Ouvrez sur le PC le fichier "stockage_data_robot.csv" qui se trouve dans le dossier AppInventor/asset de votre téléphone | | *Ouvrez sur le PC le fichier "stockage_data_robot.csv" qui se trouve dans le dossier AppInventor/asset de votre téléphone |
| *Sélectionner le tableau de données en entier | | *Sélectionner le tableau de données en entier |
| *Cliquer sur "Données" puis cliquer sur "Convertir" et choisir : délimité, virgule, identif de texte ", standard puis TERMINER | | *Cliquer sur "Données" puis cliquer sur "Convertir" et choisir : délimité, virgule, identif de texte ", standard puis TERMINER |
− | METTRE UN SCREEN DES REGLAGES
| |
| *Sélectionnez les colonnes de pos x et pos y | | *Sélectionnez les colonnes de pos x et pos y |
| *Cliquez sur "Insertion nuage de point" et vous obtiendrez le tracé de votre trajectoire | | *Cliquez sur "Insertion nuage de point" et vous obtiendrez le tracé de votre trajectoire |
Ligne 232 : |
Ligne 228 : |
| *A chaque nouveau lancement de l'application, les données précédentes sont supprimées. Si vous souhaitez les conserver pensez donc à copier-coller le fichier quelque part. | | *A chaque nouveau lancement de l'application, les données précédentes sont supprimées. Si vous souhaitez les conserver pensez donc à copier-coller le fichier quelque part. |
| *En cas de problème, vérifiez bien que vous cocher bien bouton "Stockage" lors du lancement de l'application. | | *En cas de problème, vérifiez bien que vous cocher bien bouton "Stockage" lors du lancement de l'application. |
| + | |
| + | ===Idée : communication entre 2 modules (1 sur chaque robot)=== |
| + | Une idée intéressante serait de fixer un module sur chaque robot pour les faire communiquer entre eux pendant la compétition. |
| + | Nous avons donc réfléchi à cela est voici les contraintes que nous avons trouvées: |
| + | *Un module Bluetooth peut être connecté à un seul périphérique à la fois. Donc si on veut faire communiquer les robots entre eux + recevoir les données sur l'application, il faudrait installer 2 modules Bluetooth sur chaque robot (1 pour la communication avec l'autre robot et 1 pour la communication avec l'application). |
| + | *Le module Bluetooth HC-06 ne fonctionne que comme un esclave (il ne peut pas être pas être maître) il ne pourra donc pas envoyer d'ordre à un autre module. Dans ce cas, il faudra que les modules utilisés pour faire communiquer les 2 robots entre eux soit des modèles HC-05; qui fonctionnent en maître/esclave (contrairement au HC-06). |
| + | *Une fois ces conditions réunies il devrait être tout a fait possible de réaliser une communications entre les 2 robots. |