Lien copié dans le presse-papiers !

Comment démarrer avec l’écran embarqué Riverdi STM32-U5 – tutoriel par Controllerstech

Ce tutoriel présente en détail la mise en œuvre de l’écran embarqué STM32-U5 de Riverdi dans un projet, mettant en avant un écran LCD TFT de 5 pouces issu de la nouvelle gamme de Riverdi, qui est construite autour du MCU de la série STM32U5, réputé pour ses microcontrôleurs avancés à faible consommation d’énergie.

Tutoriel – Création de visuels pour un potentiomètre ADC avec Riverdi STM32 Embedded Display

En incorporant une interface utilisateur tactile capacitive développée par TouchGFX, le tutoriel décrit comment visualiser les variations d’un signal analogique (provenant d’un potentiomètre) sur l’interface utilisateur graphique (GUI), en configurant le périphérique ADC, en codant et en intégrant la gestion des tâches et des files d’attente avec FreeRTOS dans l’environnement STM32CubeIDE. Détaillant chaque étape, depuis la configuration du MCU avec cubeMX, le codage de la tâche ADC, l’interfaçage et la mise à jour de l’interface graphique, jusqu’au flashage final du projet, le tutoriel met en évidence un processus de développement rationalisé qui régénère directement les projets en utilisant cubeMX, en surmontant les problèmes rencontrés avec les précédents écrans embarqués Riverdi STM32-H7, et en produisant finalement un affichage réactif de la jauge et de la tension dans l’interface graphique qui s’adapte aux ajustements du potentiomètre.

Ce tutoriel a été réalisé par Controllerstech – Robotics Simplified, une société de développement de logiciels basée en Inde. Leur objectif est de fournir des connaissances logicielles pour les microcontrôleurs basés sur le STM32. Nous présentons ci-dessous le guide publié à l’origine ici : https://controllerstech.com/riverdi-stm32-u5-embedded-display/

Voir le tutoriel vidéo :

Afficheur embarqué Riverdi STM32-U5

Voici un nouveau tutoriel sur l’écran embarqué STM32 de Riverdi, et aujourd’hui nous avons un écran LCD TFT de 5 pouces de leur nouvelle gamme. Riverdi est spécialisé dans la fabrication de différents types d’écrans, dont les écrans basés sur le STM32 qui prennent en charge le TouchGFX. L’écran peut être acheté sur le site https://riverdi.com/product-category/stm32-embedded-displays

Cet écran est construit autour du MCU de la série STM32U5, qui offre des microcontrôleurs avancés à faible consommation d’énergie, basés sur Arm® Cortex®-M33 pour répondre aux exigences les plus strictes en matière de consommation d’énergie et de performances. Offrant jusqu’à 4 Mbytes de mémoire flash et 2514 Kbytes de SRAM, la série de microcontrôleurs STM32U5 fait passer les performances au niveau supérieur.

J’ai déjà couvert quelques tutoriels sur les écrans embarqués Riverdi STM32-H7, où j’ai montré comment nous devons copier le projet préconstruit vers un nouvel emplacement, puis modifier le projet à partir de cubeMX et seulement copier les fichiers nécessaires dans le projet original. Ce processus fonctionne, mais il est très compliqué de régénérer le projet à partir de cubeMX.

MAIS avec cette nouvelle gamme d’écrans embarqués STM32-U5, nous pouvons directement régénérer le projet en utilisant cubeMX. Nous pouvons même flasher le projet à l’aide de cubeIDE.

Dans ce tutoriel, nous lirons le potentiomètre à l’aide de l’ADC, nous afficherons sa variation sur la jauge et nous afficherons également la tension de l’ADC dans une zone de texte. Pour ce faire, nous allons construire l’interface graphique en utilisant TouchGFX, puis régénérer le projet en utilisant cubeMX pour configurer le périphérique ADC, écrire le code et flasher le projet en utilisant cubeIDE.

Conception de l’interface utilisateur sur TouchGFX

Créer le projet à l’aide de TouchGFX

  1. Cliquez sur créer pour créer un nouveau projet
  2. Recherchez le Riverdi pour voir les tableaux disponibles.
  3. Choisissez l’écran dont vous disposez. J’ai le STM32U5 de 5 pouces.
  4. Donner un nom au projet
  5. Cliquez sur créer pour créer le projet.

Ajouter les éléments requis à l’interface utilisateur

L’image ci-dessous montre la conception finale de l’interface utilisateur.

  • J’ai ajouté une jauge, dont les valeurs peuvent aller de 0 à 100.
  • TextArea1, qui affichera la valeur sur la jauge.
  • TextArea2, qui sera utilisé pour afficher la tension ADC.

Les deux zones de texte utilisent les caractères génériques, de sorte que nous pouvons mettre à jour les valeurs directement à partir du code.

Après avoir conçu l’interface utilisateur, générez le projet et ouvrez-le dans le cubeIDE.

Configurer le projet dans cubeMX

L’image ci-dessous montre le brochage du connecteur d’extension et la façon dont le potentiomètre y est connecté.

Nous utiliserons le canal 11/12 de l’ADC1, qui est connecté à la broche PA7 (broche 20). Par défaut, l’ADC est configuré en mode différentiel, mais pour que le potentiomètre fonctionne, nous devons le configurer en mode asymétrique.

Vous trouverez ci-dessous la configuration du cubeMX.

J’ai reconfiguré le canal 12 de l’ADC1 en mode asymétrique. La résolution ADC est réglée sur 12 bits.

Nous devons également créer une tâche et une file d’attente pour envoyer les données ADC à l’interface graphique. L’image ci-dessous montre la configuration de la tâche ADC.

La tâche ADC est configurée avec une priorité normale. Elle sera utilisée pour lire la valeur de l’ADC et l’envoyer dans la file d’attente.

Nous devons également configurer la file d’attente pour qu’elle envoie les données à l’interface graphique. L’image ci-dessous montre la configuration de la file d’attente.

La file d’attente ADC est configurée avec 5 éléments de taille entière. Nous enverrons des valeurs comprises entre 0 et 100, la taille d’un entier est donc suffisante.

C’est toute la configuration dont nous avons besoin, générez le projet maintenant.

Écrivons le code

La tâche ADC que nous avons définie se trouve dans le fichier app_freertos.c.

void StartADCTask(void *argument)
{
pour(; 😉
{
HAL_ADC_Start(&hadc1) ;
HAL_ADC_PollForConversion(&hadc1, 100) ;
uint16_t ADC_VALUE = HAL_ADC_GetValue(&hadc1) ;
HAL_ADC_Stop(&hadc1);converted_value = map(ADC_VALUE, 0, 4095, 0, 100) ;
if (osMessageQueueGetSpace(ADCQueueHandle) > 0)
{
osMessageQueuePut(ADCQueueHandle, &converted_value, 0, 0) ;
}
osDelay(100) ;
}

}

Dans la tâche ADC, nous lisons la valeur ADC et l’envoyons à l’interface graphique à l’aide de la file d’attente ADC.

  • J’utilise le mode de blocage pour lire la valeur de l’ADC et la stocker dans la variable ADC_VAL.
  • La résolution de l’ADC est réglée sur 12 bits, les valeurs sont donc comprises entre 0 et 4095.
  • Nous allons ensuite cartographier ces valeurs dans l’intervalle de 0 à 100. Les valeurs converties seront alors stockées dans la variable converted_val.
  • Nous vérifierons ensuite si la file d’attente contient de la place. S’il y a de la place dans la file d’attente, la valeur est envoyée à la file d’attente.
  • Cette tâche sera exécutée toutes les 100 ms. Nous ne faisons que lire le timing d un potentiomètre et la vitesse d horloge n est pas vraiment la priorité.

Ces valeurs seront reçues dans le modèle GUI. Le code ci-dessous montre la mise en œuvre du modèle.

void Model::tick()
{
if (osMessageQueueGetCount(ADCQueueHandle) > 0)
{
osMessageQueueGet(ADCQueueHandle, &ADC_VAL, 0, 0) ;
}
modelListener->setADC (ADC_VAL) ;
}

Dans le modèle, la fonction tick est appelée à chaque rafraîchissement de l’image. Nous vérifierons la présence de données dans la file d’attente à l’intérieur de cette fonction.

  • Si la file d’attente contient des données, nous les lisons et les stockons dans la variable ADC_VAL.
  • Cette variable est définie dans le fichier Model.hpp.
  • Nous appellerons ensuite la fonction setADC dans le modelListener.

La fonction setADC est définie dans le fichier modelListener.hpp mais son implémentation devrait être une fonction vide. Ceci est illustré ci-dessous.

virtual void setADC (int val) {}

Cette implémentation vide oblige l’interface graphique à rechercher la fonction dans le fichier du présentateur. C’est ici que nous allons définir la fonction.

void Screen1Presenter: : setADC (int val)
{
view.setADC (val) ;
}

Dans le présentateur, nous appellerons la même fonction dans la vue.

La vue est l’endroit où la fonction est réellement écrite. Voici la définition de la fonction setADC

void Screen1View::setADC (int val)
{
Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE, « %d », val) ;
textArea1.invalidate();adc_voltage = (float)(val*3.3)/100.0 ;
Unicode::snprintfFloat(textArea2Buffer, TEXTAREA2_SIZE, « %.2f », adc_voltage) ;
textArea2.invalidate() ;

gauge1.setValue(val) ;
gauge1.invalidate() ;
}

  • Ici, nous allons d’abord convertir la valeur au format caractère à l’aide de snprintf, puis la copier dans le tampon textArea1.
  • textArea1 est défini au-dessus de la jauge, de sorte qu’il affiche les valeurs comprises entre 0 et 100.
  • Ensuite, nous convertissons les valeurs dans la plage flottante de 0 à 3,3, qui sera utilisée pour afficher la tension sur la broche de l’ADC.
  • La valeur flottante est ensuite convertie au format caractère à l’aide de la fonction snprintfFloat et copiée dans la mémoire tampon textArea2.
  • textArea2 est défini sous la jauge et affichera les valeurs comprises entre 0 et 3,3.
  • Enfin, nous définirons la valeur de la jauge.

ceci complète notre partie de code. Nous allons maintenant flasher le projet à partir du cubeIDE lui-même.

Flash le projet

Nous devons modifier légèrement la configuration de débogage avant de procéder au flashage. Le projet généré à partir de TouchGFX ne génère pas le fichier de chargement externe, nous devons donc fournir son chemin relatif à notre système de fichiers.

Ouvrez la configuration de débogage, cliquez sur l’onglet débogage, faites défiler vers le bas jusqu’aux chargeurs externes.

Cliquez sur le chargeur et cliquez sur modifier.

Cliquez ensuite sur Système de fichiers.

Localisez maintenant le chargeur dans le répertoire STM32cubeProgrammer. Dans mon cas, il est situé dans Program Files -> STMicroElectronics -> STM32CubeProgrammer ->bin -> ExternalLoaders.

Une fois que le chargeur a été localisé, cliquez sur Apply pour enregistrer la configuration, et cliquez sur RUN pour faire clignoter le projet sur la carte.

Résultat

Vous trouverez ci-dessous le gif montrant l’affichage.

Comme vous pouvez le constater, la jauge réagit assez bien à la rotation du potentiomètre. La zone de texte de la jauge affiche la valeur actuelle de la jauge.

La zone de texte ci-dessous indique la tension actuelle sur la broche ADC, qui peut varier de 0 à 3,3V.

Télécharger le code

Vous pouvez télécharger ici le code partagé par Controllertech : Potentiomètre

Riverdi – le fabricant européen de présentoirs de la plus haute qualité

Pourquoi devriez-vous nous faire confiance et faire confiance à nos produits ? Riverdi est le fabricant européen de présentoirs de la plus haute qualité. Nous produisons des écrans LCD TFT depuis plus de 10 ans et nous livrons régulièrement des écrans à de nombreux clients dans le monde entier.

Sur notre site web, vous trouverez de nombreuses séries d’écrans différents, mais ce que nous livrons, ce n’est pas seulement des écrans de la plus haute qualité, mais aussi une documentation parfaite. Sur le site web, vous trouverez également des modèles 3D de chaque écran. La plupart d’entre eux sont accompagnés d’un rapport EMI, qui vous permet de connaître le niveau d’émissions. Le processus de commande est convivial. Si vous souhaitez commander un échantillon, vous pouvez l’acheter dans notre boutique en ligne. Il suffit de se rendre sur le site https://riverdi.com/product-category/stm32-embedded-displays/.

Vous pouvez également contacter l’un de nos distributeurs. Riverdi dispose d’un vaste réseau de distribution comprenant de nombreux partenaires américains qui peuvent vous livrer le présentoir en une seule fois.

N’oubliez pas de vous ABONNER à notre chaîne YouTube et de remplir le FORMULAIRE D’ADHÉSION,
pour rester informé de notre matériel de l’Université Riverdi et des événements en direct !

window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag("consent", "default", { ad_storage: "denied", ad_user_data: "denied", ad_personalization: "denied", analytics_storage: "denied", functionality_storage: "denied", personalization_storage: "denied", security_storage: "granted", wait_for_update: 2000, }); gtag("set", "ads_data_redaction", true); gtag("set", "url_passthrough", true);