« SE3Binome2023-10 » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 148 : | Ligne 148 : | ||
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. | 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. | ||
<p style="clear: both;" /> | |||
=Fin du projet= | =Fin du projet= | ||
Ligne 159 : | Ligne 161 : | ||
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. | 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 | Implémentation du watchdog : | ||
<code> | <code> | ||
MCUSR = 0; | MCUSR = 0; | ||
WDTCSR |= (1 << WDCE) | (1 << WDE); | |||
WDTCSR = (1 << WDIE) | (1 << WDP3) | (1 << WDP0); | |||
wdt_reset(); | |||
</ code> | |||
Activation de l'interrupt externe sur le pin PE6 (interrupt INT6) | |||
<code> | |||
EICRB &= ~(1 << ISC60); | |||
EIMSK |= (1 << INT6); | |||
</ 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:35
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.
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
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é.
Nous commençons le routage du PCB
2 Avril 2024, Routage
Premier routage (incomplet) :
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:
Le routage est terminé:
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).
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
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.
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.
21 Mai 2024, Soudure et Code
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.
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
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.
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
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
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();
</ code>
Activation de l'interrupt externe sur le pin PE6 (interrupt INT6)
EICRB &= ~(1 << ISC60);
EIMSK |= (1 << INT6);
</ code>
//TODO mesure de la conso avant et apres implementation du sleep