I2L 2023 Groupe2

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

Proposition de système

Fonctionnement

Nous proposons un appareil de détection de bruit en fonction du volume sonore. L'appareil allumera un certain nombre de LED selon plusieurs paliers pour un maximum de 7 LEDs. Si toutes les LEDs sont allumées, c'est-à-dire si le seuil maximal (en décibels) est atteint, un son est émis tant que le bruit ne redescend pas sous ce seuil.

L'appareil est basé sur 3 seuils (en décibels) enregistrés au niveau de la mémoire interne du micro-controlleur, et sont configurables via un programme sur ordinateur. Ce système doit, en outre, pouvoir fonctionner sur batterie pour une utilisation sans connexion à un ordinateur.

Les LEDs peuvent s'allumer en vert, jaune ou rouge en fonction des seuils atteints.

Matériel et pièces nécessaires

Pour fonctionner, notre appareil de détection de bruit aura besoin de :

  • 1 microcontrôleur ;
  • 1 microphone, permettant d'écouter le bruit ambiant ;
  • 1 haut-parleur, pour jouer le son d'alerte si le seuil maximal est atteint ;
  • 7 LED et résistances associées, pour afficher l'état du bruit et des seuils ;
  • 1 contrôleur USB permettant la configuration de l'appareil via une connexion à un ordinateur ;
  • 1 batterie, si possible, pour pouvoir utiliser l'appareil sans connexion à un ordinateur.

Contre-proposition

Le périphérique USB doit être de type spécifique (classe 0) et utiliser un point d'accès interruption, vous pouvez vous appuyer sur cet exemple LUFA de base : Média:LUFA_Minimal.zip.

Pour configurer les seuils sonores de la carte, vous écrirez une application avec la bibliothèque libusb.

Carte

I2L-2023-Carte3D-G2.png
I2L-2023-CarteSchema-G2.pdf

Seconde version pour améliorer l'amplification avant le haut-parleur.

I2L-2023-Carte3D-G2-v2.png
I2L-2023-CarteSchema-G2-v2.pdf

Fonctionnement

La carte lit le niveau de son ambiant, et allume un certain nombre de LEDs sur les 8 présentes en fonction de trois paliers de volumes paramétrables par l'utilisateur.

Les 8 LEDs s'activent à ces niveaux, en considérant les trois seuils A, B et C :en décibels

LED Seuil d'allumage
1
2
3
4
5
6
7
8


Code

Première approche

N'ayant pas de carte possédant un bouton physique, nous avons utilisé une carte d'un groupe de l'année précédente (cf. I2L 2022 Groupe5). Ce premier programme ayant pour but de nous familiariser avec les développement sur ce type de système embarqué, il permet simplement d'intéragir avec les LEDs en appuyant sur les boutons physiques.

#include <avr/io.h>

// Declarations
#define LED1_B_BIT 0
#define LED1_G_BIT 1
#define LED1_R_BIT 2

#define LED2_B_BIT 3
#define LED2_G_BIT 4
#define LED2_R_BIT 5

#define LED3_B_BIT 5
#define LED3_G_BIT 6
#define LED3_R_BIT 7

#define BUTTON1_BIT 2
#define BUTTON2_BIT 4

#define LED1_DDR DDRD
#define LED2_DDR DDRDun
#define LED3_DDR DDRC

#define BUTTON1_DDR DDRC
#define BUTTON2_DDR DDRC

#define BUTTON1_PORT PORTC
#define BUTTON2_PORT PORTC

#define BUTTON1_PIN PINC
#define BUTTON2_PIN PINC

/**
 * Initialisation des ports
 */
void init(void) {
    // Sortie pour la LED1
    LED1_DDR |= (1 << LED1_B_BIT);
    LED1_DDR |= (1 << LED1_G_BIT);
    LED1_DDR |= (1 << LED1_R_BIT);

    // Sortie pour la LED2
    LED2_DDR |= (1 << LED2_B_BIT);
    LED2_DDR |= (1 << LED2_G_BIT);
    LED2_DDR |= (1 << LED2_R_BIT);

    // Sortie pour la LED3
    LED3_DDR |= (1 << LED3_B_BIT);
    LED3_DDR |= (1 << LED3_G_BIT);
    LED3_DDR |= (1 << LED3_R_BIT);

    // Entrée pour le bouton 1
    BUTTON1_DDR &= ~(1 << BUTTON1_BIT);

    // Entrée pour le bouton 2
    BUTTON2_DDR &= ~(1 << BUTTON2_BIT);

    // Résistance de tirage pour le bouton 1
    BUTTON1_PORT |= (1 << BUTTON1_BIT);

    // Résistance de tirage pour le bouton 2
    BUTTON2_PORT |= (1 << BUTTON2_BIT);
}

/**
 * Main
 */
int main(void)
{
    init();

    while (1) {
        // Si le bouton 1 est appuyé
        if (BUTTON1_PIN & (1 << BUTTON1_BIT)) {
            // Allumer la LED1
            LED1_DDR &= ~(1 << LED1_B_BIT);
            LED1_DDR &= ~(1 << LED1_G_BIT);
            LED1_DDR &= ~(1 << LED1_R_BIT);

        } else {
            // Éteindre la LED1
            LED1_DDR |= (1 << LED1_B_BIT);
            LED1_DDR |= (1 << LED1_G_BIT);
            LED1_DDR |= (1 << LED1_R_BIT);
        }

        // Si le bouton 2 est appuyé
        if (BUTTON2_PIN & (1 << BUTTON2_BIT)) {
            // Allumer la LED2
            LED2_DDR &= ~(1 << LED2_B_BIT);
            LED2_DDR &= ~(1 << LED2_G_BIT);
            LED2_DDR &= ~(1 << LED2_R_BIT);

        } else {
            // Éteindre la LED2
            LED2_DDR |= (1 << LED2_B_BIT);
            LED2_DDR |= (1 << LED2_G_BIT);
            LED2_DDR |= (1 << LED2_R_BIT);
        }
    }
}

Réalisation

Démonstrations

Rendus

Projet KiCAD : Fichier:I2L-2023-Carte-G2.zip

Lien Gitlab du projet LUFA/PC : https://gitlab.com/bapt.duquenne/systeme-embarques-m2i1l

Programmes LUFA/PC : Fichier:ILL-2023-Groupe2-Programmes.zip