« SE3Groupe2024-4 » : différence entre les versions
Ligne 71 : | Ligne 71 : | ||
Pour se faire nous avons utiliser la LUFA et plus précisément la demo VirtualSerial que nous avons modifié pour renvoyer la valeur de PF0. | Pour se faire nous avons utiliser la LUFA et plus précisément la demo VirtualSerial que nous avons modifié pour renvoyer la valeur de PF0. | ||
Dans la fonction SetupHardware nous avons ajouté : <syntaxhighlight lang="c"> | |||
// Sélectionner la référence de tension pour l'ADC (AVCC) | |||
ADMUX = (1 << REFS0); | |||
// Activer l'ADC et définir le facteur de division d'horloge | |||
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); | |||
Nous nous somme donc rendu compte d'un problème : la valeur semble constante (environ 980) | </syntaxhighlight>et dans la fonction CDC_Task : <syntaxhighlight lang="c"> | ||
// Sélection du canal ADC0 | |||
ADMUX = (1 << REFS0) | (0 & 0x07); | |||
// Démarrer la conversion ADC | |||
ADCSRA |= (1 << ADSC); | |||
// Attendre la fin de la conversion | |||
while (ADCSRA & (1 << ADSC)); | |||
if(ADC>0) { | |||
itoa(ADC, ReportString, 10); | |||
//ReportString = "test\r\n"; | |||
} | |||
else ActionSent = false; | |||
</syntaxhighlight> | |||
Malheureusement, minicom n'affichant rien, nous avons opté pour une seconde possibilité faire clignoter une LED lorsque lorsque nous dépassons une certaine valeur<syntaxhighlight lang="c"> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#include <stdio.h> | |||
void ADC_Init() { | |||
ADMUX = (1 << REFS0); | |||
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); | |||
} | |||
uint16_t ADC_Read(uint8_t channel) { | |||
ADMUX = (1 << REFS0) | (channel & 0x07); | |||
ADCSRA |= (1 << ADSC); | |||
while (ADCSRA & (1 << ADSC)); | |||
return ADC; | |||
} | |||
int main(void) { | |||
ADC_Init(); | |||
DDRB |= 1<<PB7; | |||
while (1) { | |||
uint16_t sensorValue = ADC_Read(0); | |||
if(sensorValue > 980) PORTB ^= 1<<PB7; | |||
_delay_ms(10); | |||
} | |||
} | |||
</syntaxhighlight>Nous nous somme donc rendu compte d'un problème : la valeur semble constante (environ 980) | |||
==Ecran== | ==Ecran== |
Version du 14 juin 2025 à 21:16
Description
Objectif
Concevoir un petit objet affichant le volume sonore en décibels et enregistrant les voix environnantes.
Cahier des charges
Notre système devra :
- afficher le volume en décibels
- Si un certaine valeur est atteinte
- faire clignoter une LED
- l'audio est enregisté puis transmis au PC
- allumer une LED en cas de batterie faible
Spécification techniques
- Notre système sera alimenté par batterie et rechargeable/programmable par USB.
- Un écran LCD nous servira à afficher le volume en décibels.
- LED :
- Pour la batterie
- Pour l'enregistrement
- Une puce NRF24L01 permettra la reception des données par communication radio.
- Un capteur de son ou microphone servira à récupérer le volume et l'enregistrement.
- Nous utilisons un ATmega32u4 pour la transmission, par un USB de type carte son, des données vers un PC
ReX : rien sur la connexion USB ?!
Lien vers le Gitea du Projet
Carte électronique
Schématique
La schématique des éléments de notre carte pour le projet.
Nous travaillons donc avec un atmega32u4.
Le câblage a été réalisé selon les différentes datasheets.
Pour le régulateur, nous nous sommes basés sur la datasheet du LTC5351ES6-3.3 pour le schéma.
Pour le microphone, nous avons décidé d'utiliser un montage constitué d'un transistor pour des raisons d'économie et de praticité.
Quant à l'écran, la documentation que nous avons pu lire dessus nous a montré qu'il pouvait fonctionner avec seulement 4 pins connectés au lieu des 8 pour les différents bits. La seule condition était de brancher les pins sur une sortie analogique de l'atmega.
Routage
Le routage nous donne la carte ici présente :
On obtient une carte occupée en majeure partie par l'écran.
Autour de l'antenne, nous avons modifié le ground, car selon la datasheet, l'antenne ne doit pas être sur la même base de masse que les autres composant afin d'éviter les interférences.
Réalisation
Lors du routage, nous nous sommes rendu compte d'une erreur lors du choix de l'inductance du régulateur, nous avons donc choisit d’alimenter notre carte en 5V, car les deux composant principaux de notre carte (le micro et l'écran) sont supposé fonctionner en 5V selon leur datasheet.
Nous nous sommes concentré sur la programmation du micro et de l'écran et avons donc mis le NRF et la batterie de coté.
Micro
Pour vérifié le bon fonctionnement du micro, nous avons essayé d'afficher la valeur d'entrée du port analogique PF0 (ADC0)
Pour se faire nous avons utiliser la LUFA et plus précisément la demo VirtualSerial que nous avons modifié pour renvoyer la valeur de PF0.
Dans la fonction SetupHardware nous avons ajouté :
// Sélectionner la référence de tension pour l'ADC (AVCC)
ADMUX = (1 << REFS0);
// Activer l'ADC et définir le facteur de division d'horloge
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
et dans la fonction CDC_Task :
// Sélection du canal ADC0
ADMUX = (1 << REFS0) | (0 & 0x07);
// Démarrer la conversion ADC
ADCSRA |= (1 << ADSC);
// Attendre la fin de la conversion
while (ADCSRA & (1 << ADSC));
if(ADC>0) {
itoa(ADC, ReportString, 10);
//ReportString = "test\r\n";
}
else ActionSent = false;
Malheureusement, minicom n'affichant rien, nous avons opté pour une seconde possibilité faire clignoter une LED lorsque lorsque nous dépassons une certaine valeur
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
void ADC_Init() {
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
uint16_t ADC_Read(uint8_t channel) {
ADMUX = (1 << REFS0) | (channel & 0x07);
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADC;
}
int main(void) {
ADC_Init();
DDRB |= 1<<PB7;
while (1) {
uint16_t sensorValue = ADC_Read(0);
if(sensorValue > 980) PORTB ^= 1<<PB7;
_delay_ms(10);
}
}
Nous nous somme donc rendu compte d'un problème : la valeur semble constante (environ 980)
Ecran
Programmation
Programmation AVR
Au cours du module de programmation de système embarqué, nous avons donc schématisé, soudé et programmé un AVR ATMega8u2.
cf images carte soudée
Cette carte est composée notamment de 2 Led et d'un interrupteur afin d'effectuer les tests de programmation.
Nous avons donc réussi à faire clignoter les LED D1 et D2.
cf code clignotement + vidéo
La connexion Lufa a été effectuer, et grâce à cela, en pressant le bouton de notre carte, on pouvait afficher dans le minicom que le bouton était bel et bien pressé. Note : nous n'avons cependant pas réussi à empêcher l'interruption, de ce fait le message "button pressed" s'envoyait en boucle sur le terminal)
cf. image du terminal minicom et du bouton étant pressé.
Tests
Rendus
Archive GIT
lien du git: https://gitea.plil.fr/tdelobel/SE3_2024_B4.git
Autres rendus
Projet KiCAd programmateur AVR : Fichier:2024-PSE-G4-Prog.zip