SE3Binome2023-10

De projets-se.plil.fr
Aller à la navigation Aller à la recherche

Bienvenue sur notre Wiki PSE ! Ce wiki est organisé de manière chronologique, et l'avancement est mis à jour à chaque séance.

Le GIT du projet contenant les fichiers Kicad et le code est ICI

5 Mars 2024, Introduction

Nous avons choisi de concevoir un capteur de température sans fil.

Le capteur sera alimenté par une batterie, il faut donc qu'il consomme le moins possible pour maximiser l'autonomie (utilisation de sleep() d'où le nom tired-sensor pour notre projet).

Les données seront envoyées via RF (NRF24L01) à un intervalle prédéfini à un récepteur USB.

Un bouton sur le capteur permettra d'envoyer la temperature instantanément (Wake-up)

12 Mars 2024, Schema

Création d'un git pour le projet : GIT du projet

Nous allons utiliser le capteur de température MCP9700 (pas très précis mais disponible en E306).

Nous utilisons le projet exemple Radio fourni mais nous remplaçons l'atmega16u2 par un atmega16u4 pour pouvoir utiliser une thermistance pour obtenir la température (plus simple que de dialoguer avec un capteur plus complexe).

L'utilisation de l'atMega16u4 nous permettra également de lire le voltage de la batterie pour estimer son niveau de charge.

Schéma mis à jour avec l'atmega16u4

19 Mars 2024, Schema

Nous ajoutons la partie batterie, le chargeur et le capteur de température à notre schéma.

Pour le chargement de la batterie, il faut pouvoir déconnecter totalement la partie batterie du microcontrôleur (jumpers) et utiliser une prise USB séparée

Schéma mis à jour

26 Mars 2024, Schema

Finalement nous choisissons de changer le capteur de température et optons pour un TMP112 (disponible en E302) et plus précis que le MCP9700.

Nous l'ajoutons sur le schéma ainsi que des boutons Reset, HWB (DFU) et un bouton qui permettra de sortir le microcontrôleur de veille, chacun avec un pull up ou down adapté.

Schéma mis à jour

Nous commençons le routage du PCB

2 Avril 2024, Routage

Premier routage (incomplet) :

Premier routage

9 Avril 2024, Routage

Nous modifions le schéma légèrement afin de faciliter le routage, suppression de la prise série et d'une LED qui ne seront pas utilisées.

Nous ajoutons aussi un connecteur pour exposer deux pins supplémentaires de l'atmega (PF0 et PF1), ces deux pins (utilisés comme CE et CSN) en complément du port ISP permettront de relier un module NRF24L01 à notre PCB pour effectuer des tests avant de souder notre NRF24L01 directement sur le PCB (ou en cas de problème sur le NRF24L01 intégré il sera possible d'en utiliser un externe).

Le Schéma mis à jour et le routage final:

Schema final
Routage final

PCB v1 avant
PCB v1 arrière

Nous avons choisi de placer la partie charge et gestion de la batterie sur l'arrière du PCB pour miniaturiser le PCB.

16 Avril 2024, Routage

Suite aux remarques de Monsieur Boé, nous modifions le PCB. L'interrupteur est remplacé par un jumper, nous ajoutons un condensateur de découplage pour le 3.3v du microP et modifions le connecteur de la batterie (3 pins au lieu de 2). De plus, des légendes sont ajoutées sur les jumpers qui permettent de contrôler la charge de la batterie

Les erreurs de DRC sont corrigées (les restantes concernent le silkscreen et sont à ignorer).

PCB v1.1

Fichier Gerber : Fichier:SE3-tired-sensor-GERBER.zip

Nous entamons la phase de programmation avec deux Arduinos et des modules NRF24L01 en attendant d'avoir notre PCB opérationnel.

7 Mai 2024, Soudure

Notre magnifique PCB
Notre carte partiellement soudée en cours de tentative de prog ISP

Les PCB sont arrivés nous commençons la soudure des composants lors de cette séance.

Les composants minimum sont soudés, la carte n'apparait pas en USB sur l'ordinateur. Peut être que le problème est le même que pour la manette (voir wiki Louis BONNINGRE) et qu'il faut installer le bootloader et changer les fuses sur l'atmega. Nous n'arrivons pas à programmer le bootloader sur la carte, celle ci n'apparait pas. Lors de la prochaine séance nous essayerons de ressouder le Quartz à l'air chaud.

14 Mai 2024, Soudure et DFU

Après le ressoudage du quartz à l'air chaud nous arrivons à modifier les fuses et flasher le bootloader sur l'AtMega avec les commandes suivantes:

avrdude -c stk500v1 -p atmega16u4 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xFF:m -U efuse:w:0xF7:m

avrdude -c stk500v1 -p atmega16u4 -P /dev/ttyACM0 -b 19200 -U flash:w:ATMega16U4-usbdevice_dfu-1_0_1.hex

Malheureusement notre carte n'est toujours pas détectée en USB. Le problème vient encore une fois du quartz, en effet comme nous alimentons notre Atmega en 3.3v (régulateur de l'autre coté de la carte) il faut utiliser un quartz de 8Mhz maximum pour pouvoir utiliser la partie USB. Après avoir échangé notre quartz 16Mhz avec un 8Mhz notre carte est bien reconnue en USB.

Programmation en USB

Nous flashons un programme blink avec dfu-programmer et la led reliée à PB4 clignote bien. Nous soudons ensuite les boutons reset et HWB, le capteur de temperature ainsi que les resistances et condensateurs nécessaires.

La led clignote bien

21 Mai 2024, Soudure et Code

Les composants soudés à l'arrière de la carte
La carte charge

Nous avons soudé le MAX1811 et les autres composants qui permettent d'utiliser la batterie.

En configurant les jumpers SELI et SELV pour notre batterie nous pouvons tester le chargement de la batterie, la led de chargement s'allume bien.

Il suffit donc de placer un jumper sur les pins 'Alimentation' et la carte est alimentée par la batterie.

La carte est alimentée par la batterie

Avant de souder le NRF24l01 et ses composants nous allons tester le code en utilisant un module NRF24l01 externe connecté au pins que nous avons prévu, le récepteur est une Arduino avec un autre module NRF24l01

L'Arduino récepteur et le module NRF24l01 connecté à notre carte

Nous utilisons l'IDE Arduino pour pouvoir facilement utiliser les librairies NRFLite et Wire pour le module radio et la communication I2C avec le capteur de température. Pour compiler le code pour notre carte (Atmega16U4 à 8Mhz) il faut modifier le fichier device.txt de l'IDE Arduino pour créer une nouvelle board en utilisant l'Arduino Leonardo (32U4 16Mhz) comme base. Il suffit ensuite de compiler en sélectionnant "Export compiled binary" et utiliser dfu-programmer pour programmer la carte.

Le code est sur le GIT du projet

L'Arduino UNO récepteur attend le message du (ou des) capteur(s) et affiche dans le moniteur série les informations reçues. Le capteur envoi toutes les 3 secondes sont ID, la temperature et le voltage de la batterie.

Pour l'instant la température et le voltage de batterie ne sont pas correct. En effet la communication en I2C avec le TMP112 n'est pas encore fonctionnelle (en utilisant un scanner I2C aucun périphérique n'est reconnu), nous tenterons de ressouder le capteur lors de la prochaine séance.

Le voltage de la batterie ne peux pas être récupéré car nous avons relié le signal sur le pin PB7 qui est un pin digital alors qu'il fallait le connecter au pin PF7 (pin analogique), si nous avons du temps nous essayerons de couper la piste et de souder un fil vers un des pins analogique disponible.

Extrait de la datasheet du TMP112

Autre piste de résolution du problème de detection du TMP112 : Après relecture de la datasheet il s'avère que l'adresse I2C du TMP112 est sélectionnée en connectant le pin ADD0 sur GND, VCC, SDA ou SDL or nous ne l'avons pas connecté. Nous allons donc essayer de connecter le pin ADD0 à GND (en soudant un petit fil sur le plan de masse du PCB). Nous avons soudé un TMP112A sur notre PCB.

28 Mai 2024, Résolution problèmes PCB

Les deux pins sont bridgés

Finalement nous avons soudé le pin ADD0 avec le pin 3.3v (plus simple que de souder sur le plan de masse), le capteur est donc à l'adresse 49. En modifiant le code il est bien reconnu et on obtient une mesure de température précise au demi degrés.

Nous avons également soudé un fil pour relier la batterie à PF7 et lire son voltage, malheureusement on obtient pas de valeur cohérente. En effet la batterie a un voltage de 3.7v or notre Atmega (et donc ses convertisseurs analogique/digital) sont alimentés en 3.3v. On ne peut donc pas obtenir de lecture de voltage supérieur à 3.3v, nous enlevons donc cette fonctionnalité du projet.

Les fichiers Kicad du PCB ont été mis à jour (même si peu utile)

Fin du projet

Les mesures reçues par le récepteur

Le code est terminé, le récepteur affiche donc dans le moniteur série Arduino les données reçues par le capteur. Le capteur envoie son ID, la température et l'origine de l'interruption qui déclenche l'envoi de la mesure. La mesure est envoyée automatiquement toutes les 30 secondes environ grâce au timer watchdog qui déclenche une interruption. Comme la durée maximale du watchdog est de 8 secondes, nous multiplions par 4 en n'envoyant la mesure qu'une fois sur 4 (simple boucle). Le reste du temps, le microcontrôleur est mis en mode veille pour économiser au maximum l'énergie.

L'envoi de la mesure peut aussi être déclenché par le bouton WakeUp sur le PCB. En effet, lors de la conception du PCB, nous avons fait attention à placer ce bouton sur une broche capable d'être utilisée pour une interruption externe (dans notre cas, la broche 1 de l'atmega16u4 qui correspond à PE6 et à l'interrupt INT6). Une pression sur ce bouton déclenche donc une interruption qui va réveiller l'Atmega et envoyer la mesure de température instantanément.

Dans l'exemple visible à droite de l'écran, on voit que les mesures ont été envoyées automatiquement par le watchdog, sauf une qui a été déclenchée manuellement.

Implementation de l'interrupt sur le pin PE6 (INT6):

  //set up INT6, page 89 Datasheet Atmega16u4
  EICRB &= ~(1 << ISC60);  
  EICRB &= ~(1 << ISC61); 
  EIMSK |= (1 << INT6);

Implémentation du watchdog:

                              
  MCUSR = 0;                                         // Reset des flags
  WDTCSR |= (1 << WDCE) | (1 << WDE);                // On active le watchdog
  WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0);  // On active l'interrupt avec WDIE, et on selectionne 8s avec WDP3 et WDP1 (datasheet atmega16u4 page 61)

Pour économiser encore plus d'énergie, il faut éteindre le NRF24l01 lorsqu'on n'envoie pas de données. Pour cela, on utilise la fonction powerDown() de la bibliothèque NRFLite. Le module est réactivé automatiquement à l'envoi de données.

Le code complet est bien sur dans le GIT de notre projet

Mesure consommation

Courant utilisé en veille

En revenant à l'ancienne version de notre code qui utilise juste la fonction delay() entre deux envois de données, on mesure une consommation de 15 mA en continu (multimètre entre la batterie et la carte). Avec la batterie de 300mAh, on a donc une autonomie théorique de 20 heures.

Avec la version optimisée de notre code, on mesure une consommation de 0,18 mA (Atmega en sommeil et NRF24l01 éteint). Toutes les 8 secondes, la consommation passe à 7 mA très brièvement (Atmega réveillé par le watchdog mais NRF24l01 éteint car pas d'envoi de données) et lors de l'envoi de données la consommation passe à environ 12 mA pour une demi-seconde. Pour calculer la consommation moyenne et l'autonomie, on admet que sur une minute, l'Atmega passe 1 seconde à exécuter le compteur du watchdog, 1 seconde à envoyer des données et 58 secondes en veille. La consommation moyenne est donc de 0,5 mA. Avec une batterie de 300 mAh, on a une autonomie théorique de 600 heures.

Soudure NRF24l01

Notre carte terminée

Pour terminer ce projet je décide d'essayer de souder la partie radio directement sur notre PCB, pour cela je transfère les composants d'un module NRF24l01 sur notre PCB (les valeurs des composants étant identiques), n'ayant pas de crystal 16Mhz adapté à la footprint que nous avons choisie sur notre PCB je soude un crystal THT en pliant les pates. Il ne reste qu'à modifier le code pour adapter les pin CE, CNS et IRQ (non utilisé dans notre cas).

C'est un succès la carte fonctionne et envoie bien les données au récepteur, la consommation est toujours la même qu'avec le module externe (logique il s'agit d'exactement les mêmes composants)

Conclusion

Le projet est terminé, notre capteur de température fonctionne comme prévu. Nous n'avons pas testé l'autonomie complète mais en laissant le capteur faire des mesures plus de 24h la batterie était toujours à plus de 3.7V, l'utilisation du mode sleep et les autres astuces d’économie d'énergie que nous avons utilisé fonctionnent donc parfaitement.

Vidéo qui montre le fonctionnement du capteur, les mesures déclenchées par le timer watchdog arrivent automatiquement et lors d'un appui sur le bouton WakeUp le capteur se reveille et envoie une mesure (indiquée interrupt manuel). Le léger délais entre l'appuie du bouton et l'envoie de la mesure (allumage de la led) est dû au temps nécessaire pour aller récupérer la temperature en I2C dans le capteur TMP112.

En conclusion nous sommes très satisfait de notre projet, malgré quelques difficultés et erreurs nous avons obtenu un capteur fonctionnel et économe en énergie

Quelques pistes d'amélioration possibles (dans le cas d'une V2) :

  • Correction du PCB (déjà fait)
  • Trouver un moyen de lire le niveau de batterie
  • Relier le pin IRQ du NRF24l01 à un pin compatible sur l'atmega pour réveiller le capteur depuis le récepteur avec un autre interrupt
  • Créer un récepteur avec un écran (7 segments par exemple)