Minuteur

Après le développement de mon premier minuteur, j'ai souhaité faire évoluer le projet afin de le rendre plus pratique, plus complet et plus moderne, tout en conservant un encombrement réduit. Cette nouvelle version apporte plusieurs améliorations, tant au niveau de l'interface utilisateur que des possibilités de réglage :

  • Ajout du réglage des secondes, en complément des minutes.
  • Intégration d'une liaison Bluetooth permettant de régler le minuteur à distance.
  • Remplacement de l'afficheur précédent par un écran LCD graphique offrant davantage de possibilités pour l'affichage des informations.

Ce minuteur est principalement destiné à une utilisation en cuisine. Il doit donc être simple et rapide à régler, tout en restant suffisamment compact pour pouvoir être facilement installé ou déplacé sur un plan de travail. L'utilisation d'un écran graphique et d'une liaison Bluetooth permet également d'envisager une interface plus conviviale et plus flexible que celle de la première version.

ancien minuteur

Choix des composants

Pour le choix des composants, j'ai retenu le microcontrôleur STM32L100RC, que j'avais déjà utilisé dans plusieurs de mes projets précédents. Ce microcontrôleur présente notamment l'avantage d'avoir une faible consommation d'énergie, ce qui correspond parfaitement aux objectifs de ce projet. Son utilisation permet ainsi de limiter la consommation globale du système et de favoriser une bonne autonomie sur batterie.

Pour l'affichage, j'ai choisi le EADOGS102, qui me semble particulièrement bien adapté à cette application. Il s'agit d'un écran LCD graphique compact, dont les dimensions réduites permettent de conserver un minuteur peu encombrant tout en offrant une grande liberté pour l'affichage des informations. La maîtrise de la consommation électrique constitue également un point essentiel du projet, puisque l'objectif est d'obtenir la meilleure autonomie possible avec une pile bouton CR2450.

Dans la version précédente du minuteur, j'utilisais un switch de type joystick pour effectuer les différents réglages. Cependant, ce composant est devenu plus difficile à trouver et présente une certaine fragilité à l'utilisation. J'ai donc choisi de le remplacer par un encodeur rotatif, qui offre une commande plus intuitive pour le réglage du temps et devrait également apporter une meilleure robustesse à l'utilisation quotidienne.

 affichage lcd graphique
 encodeur incrémentale

Le schéma électronique

Le bouton poussoir intégré à l'encodeur rotatif permet d'enclencher l'alimentation du circuit. Lors de l'appui sur le bouton, le transistor Q2 est commandé afin d'alimenter le microcontrôleur. Une fois celui-ci démarré, le microcontrôleur prend le relais et maintient l'alimentation à travers le transistor Q1. Cette configuration permet ainsi de mettre en œuvre un interrupteur électronique et de couper complètement l'alimentation lorsque le minuteur est éteint.

Pour piloter le buzzer, j'ai intégré le transistor Q3 en configuration émetteur-suiveur. Cette configuration permet d'obtenir le courant nécessaire au fonctionnement du buzzer tout en utilisant le signal provenant de la sortie DAC du microcontrôleur. Le transistor joue ainsi le rôle d'interface entre la sortie du microcontrôleur et la charge.

La réduction de la consommation étant un objectif important de ce projet, j'ai également prévu la possibilité de couper complètement l'alimentation du module Bluetooth. Le transistor Q4 permet de commander cette alimentation et d'éviter que le module ne consomme de l'énergie lorsqu'il n'est pas utilisé.

Enfin, un pont diviseur résistif permet de mesurer la tension de la batterie à l'aide d'une entrée analogique du microcontrôleur. Cette mesure permet de surveiller en permanence l'état de la pile et de détecter une tension trop faible. Le minuteur peut ainsi avertir l'utilisateur lorsque la pile CR2450 doit être remplacée, avant que son niveau de tension ne devienne insuffisant pour assurer le bon fonctionnement du circuit.

 figure schéma électronique

Construction

J'ai recherché un boîtier aussi compact que possible afin de limiter l'encombrement final du dispositif. Mon choix s'est porté sur le modèle 1552C1BK de Hammond : un boîtier portable en ABS noir, aux dimensions de 50 × 70 × 22 mm, avec un indice de protection IP54.
image du boitier
id Référence Empreinte N Désignation
1 C1,C3,C5,C2,C10 C_0805_2012Metric_Pad1.18x1.45mm_HandSolder 5 100n
2R3,R2,R7,R4R_0805_2012Metric_Pad1.18x1.45mm_HandSolder410
3C7,C8C_0805_2012Metric_Pad1.18x1.45mm_HandSolder26.8p
4C18,c12,C13,C11,C9C_0805_2012Metric_Pad1.18x1.45mm_HandSolder61u
5R10R_0805_2012Metric_Pad1.20x1.40mm_HandSolder110K
6D1,D2D_MiniMELF2LL4148
7R18,R17,R16,R14,R5,R1,R11R_0805_2012Metric_Pad1.20x1.40mm_HandSolder7100K
7R9R_0805_2012Metric_Pad1.20x1.40mm_HandSolder1100
9SW1SW_Push_SPST_NO_Alps_SKRK1SW_Push
10R8R_0805_2012Metric_Pad1.20x1.40mm_HandSolder147K
11Y1Crystal_SMD_2012-2Pin_2.0x1.2mm132.768
12R6R_0805_2012Metric_Pad1.20x1.40mm_HandSolder1510
13SW2PEC11L_Encodeur1RotaryEncoder_Switch
14Q3,Q1SOT-232BC850
15C20,C19,C6C_1206_3216Metric_Pad1.33x1.80mm_HandSolder310u
16C4C_0805_2012Metric_Pad1.18x1.45mm_HandSolder11n
18Q2,Q4SOT-232BC860
19U2LQFP-64_10x10mm_P0.5mm1STM32L100RCTx
20U4EA-DOGS1021EA_DOGS102-6
21R12R_0805_2012Metric_Pad1.20x1.40mm_HandSolder115K
22J1PinHeader_2x05_P1.27mm_Vertical_SMD1Conn_02x05_Odd_Even
23BZ1EKULIT-11Buzzer
24U1ST_SPBTLE1SPBTLE-RF
25BT1Support pile CR24501Battery_Cell

Réalisation du PCB

En raison du manque d'espace disponible, il n'est malheureusement pas possible de conserver les deux broches mécaniques de l'encodeur rotatif. Celles-ci devront donc être coupées lors du montage. J'ai également pris soin de dégager la zone située sous le module Bluetooth afin d'éviter toute perturbation susceptible d'affecter la communication sans fil.
image du PCB top
image du PCB bottom
image du PCB

Pour vérifier que le montage s’intègre correctement dans son boîtier, j’ai utilisé FreeCAD afin de réaliser une simulation en 3D.

La plupart des empreintes utilisées dans KiCad disposent déjà d’un modèle 3D au format STEP. Il est ainsi possible de visualiser directement le circuit imprimé en trois dimensions et de vérifier l’emplacement des différents composants avant sa fabrication.

Le modèle 3D du circuit peut ensuite être importé dans FreeCAD afin de réaliser l’assemblage complet avec le boîtier. Cela permet de contrôler l’encombrement des différents éléments, leur positionnement et de s’assurer que l’ensemble s’intègre correctement avant de passer à la fabrication.

image en 3D de l'ensemble
image en 3D de l'ensemble

Mesure de VREFINT et estimation de VDDA

Objectif : utiliser la mesure de la référence interne VREFINT pour estimer la tension réelle d'alimentation VDDA. Cette information permet ensuite de corriger les conversions effectuées par l'ADC et ainsi d'améliorer la précision des mesures analogiques.

L'ADC utilise en effet VDDA comme tension de référence. Toute variation de cette tension se répercute donc directement sur le résultat des conversions. Par exemple, si VDDA diminue, une même tension appliquée sur une entrée analogique produira une valeur ADC plus élevée. La mesure de VREFINT permet de détecter cette variation et de calculer plus précisément la tension réellement présente sur VDDA.

Principe

Le microcontrôleur possède une référence de tension interne stable appelée VREFINT. Sa valeur nominale est d'environ 1,21 V, mais il est préférable de ne pas utiliser directement cette valeur théorique pour effectuer les calculs.

Une valeur de calibration mesurée en usine est enregistrée dans la mémoire système du microcontrôleur. Cette valeur correspond à la conversion ADC de VREFINT dans des conditions de référence définies par le constructeur.

En comparant la valeur de VREFINT mesurée par l'ADC avec cette valeur de calibration, il est possible d'estimer la tension réelle de VDDA.

Composants utilisés

Procédure

1. Activer la référence interne

Avant de pouvoir mesurer VREFINT, il faut activer la référence de tension interne du microcontrôleur.

			HAL_ADCEx_EnableVREFINT();
		
Il est également possible d'effectuer cette opération directement par les registres, selon le modèle de microcontrôleur utilisé :
SYSCFG->CFGR3 |= SYSCFG_CFGR3_EN_VREFINT;

2. Configurer l'ADC pour mesurer VREFINT

Il faut ensuite configurer l'ADC afin qu'il effectue une conversion sur le canal interne correspondant à VREFINT :


		ADC_ChannelConfTypeDef sConfig = {0};

		sConfig.Channel = ADC_CHANNEL_VREFINT;
		sConfig.Rank = ADC_REGULAR_RANK_1;
		sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;

		HAL_ADC_ConfigChannel(&hadc1, &sConfig);
	

Attention : VREFINT est une source interne présentant une impédance relativement élevée. Il est donc nécessaire d'utiliser un temps d'échantillonnage suffisamment long afin de permettre au condensateur d'échantillonnage de l'ADC de se charger correctement. Un temps trop court peut entraîner une erreur importante sur la mesure.

3. Lire la valeur ADC de VREFINT

Une conversion peut maintenant être lancée afin de récupérer la valeur numérique correspondant à VREFINT :


		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

		uint16_t adc_vrefint = HAL_ADC_GetValue(&hadc1);
		HAL_ADC_Stop(&hadc1);
	

4. Lire la valeur de calibration usine

Le microcontrôleur contient une valeur de calibration VREFINT programmée en usine. Son adresse dépend du modèle exact de STM32 utilisé et doit donc être vérifiée dans la documentation du microcontrôleur. /p>


		#define VREFINT_CAL_ADDR ((uint16_t*) (0x1FF800F8))

		uint16_t vrefint_cal = *VREFINT_CAL_ADDR;
	

Important : l'adresse ci-dessus est donnée pour le microcontôleur utilisé dans ce projet. Elle ne doit pas être recopiée sans vérification dans la documentation correspondant au STM32L1 utilisé.

Cette valeur de calibration représente la valeur de conversion ADC de VREFINT obtenue lors de la caractérisation en usine, dans les conditions de tension et de température spécifiées par le constructeur.

5. Calculer la tension réelle de VDDA

La tension VDDA peut alors être estimée à partir du rapport entre la valeur de calibration et la valeur actuellement mesurée :


		float vdda = 3.0f * ((float)vrefint_cal / (float)adc_vrefint);
	

Le principe est relativement simple : si VDDA diminue, la tension de référence interne VREFINT représente une proportion plus importante de la tension de référence de l'ADC. La valeur numérique retournée par l'ADC augmente donc.

À l'inverse, si VDDA augmente, la valeur ADC mesurée pour VREFINT diminue. La comparaison avec la valeur de calibration permet ainsi de déterminer la tension d'alimentation réelle du convertisseur.

6. Corriger les autres mesures ADC

Une fois VDDA déterminée, elle peut être utilisée pour convertir les autres résultats ADC en tension réelle :


		float tension = ((float)adc_value / 4095.0f) * vdda;
	

Pour un ADC 12 bits, la valeur maximale est 4095. La mesure obtenue tient ainsi compte des variations réelles de VDDA, contrairement à un calcul utilisant simplement une valeur fixe de 3,3 V.

Points importants

Exemple de calcul en C


		#define VREFINT_CAL_ADDR ((uint16_t *)0x1FF800F8)

		uint16_t vrefint_cal = *VREFINT_CAL_ADDR;
		uint16_t adc_vrefint = 0;

		/* Mesure ADC de VREFINT */
		adc_vrefint = HAL_ADC_GetValue(&hadc);

		/* Calcul de VDDA en millivolts */
		uint32_t vdda = (3000UL * vrefint_cal) / adc_vrefint;

		
La valeur de vdda peut ensuite être utilisée pour calculer les tensions correspondant aux autres conversions ADC.

Précautions

Bonnes pratiques

Pour une application nécessitant une surveillance régulière de l'alimentation, VREFINT peut être mesurée périodiquement, par exemple toutes les 100 ms à 1 s, selon les besoins de l'application.

Il est également possible d'appliquer un filtrage logiciel, comme une moyenne glissante de plusieurs mesures, afin de réduire les fluctuations de la valeur calculée. La tension VDDA ainsi obtenue peut ensuite être conservée en mémoire et utilisée pour les conversions ADC suivantes.

Usinage

La modélisation 3D de toutes les parties du projet m'a permis de positionner avec précision l'ouverture pour l'affichage et le trou de perçage pour l'encodeur.
 figure usinage mécanique

Commentaires