SE3Groupe2024-4

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

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

Chargeur LiPo, Microphone, Ecran et Mode d'Alimentation
schéma partie 2
suite 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.

Extrait de la datasheet du régulateur

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 :

Image globale du routage sur kicad
Image zoomée sur le microcontrôleur
Plan 3D de la carte

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.

LEDS

Pour tester les leds, on les fait clignoter avec le programme suivant :

#include <avr/io.h>
#include <util/delay.h>

int main() {
    DDRB |= 1<<PB6 | 1<<PB7;

    while(1) {
    PORTB ^= 1<<PB6 ^ 1<<PB7;
    _delay_ms(10);
    }   
}

On remarque que seul la LED sur PB7 fonctionne.

Pour la suite, nous nous sommes concentré sur la programmation du micro et de l'écran et avons donc mis le NRF et la batterie de coté. La LED sur PB6 ne nous intéresse donc pas

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

SE3 2024 G4 prog schema.pdf
SE3 2024 G4 prog PCB.png

Projet KiCAd programmateur AVR : Fichier:2024-PSE-G4-Prog.zip