« SE3Binome2023-10 » : différence entre les versions

De projets-se.plil.fr
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Ligne 167 : Ligne 167 :
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0);
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0);
wdt_reset();
wdt_reset();
</ code>
</code>
Activation de l'interrupt externe sur le pin PE6 (interrupt INT6)
Activation de l'interrupt externe sur le pin PE6 (interrupt INT6)
<code>   
<code>   
EICRB &= ~(1 << ISC60);   
EICRB &= ~(1 << ISC60);   
EIMSK |= (1 << INT6);
EIMSK |= (1 << INT6);
</ code>
</code>




//TODO mesure de la conso avant et apres implementation du sleep
//TODO mesure de la conso avant et apres implementation du sleep

Version du 5 juin 2024 à 13:36

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

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:

Schema final

Le routage est terminé:

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

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 code.

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). Une pression sur ce bouton déclenche donc une interruption qui va 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.

Implémentation du watchdog : MCUSR = 0; WDTCSR |= (1 << WDCE) | (1 << WDE); WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0); wdt_reset(); Activation de l'interrupt externe sur le pin PE6 (interrupt INT6) EICRB &= ~(1 << ISC60); EIMSK |= (1 << INT6);


//TODO mesure de la conso avant et apres implementation du sleep