SE4Binome2025-4

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

Carte Son pour un pico ordinateur : lien git SE4-PICO-B4.git


Présentation projet

Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur

Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.

Shield

Réalisation du shield arduino

Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.

Schématique - Routage et vue 3D

PicoShield - schema électrique SE4-2025
PicoShield - schema vue3D SE4-2025 G4
PicoShield - schema routage SE4-2025 G4
PicoShield - schema vue3D SE4-2025 G4
PicoShield - schema vue3D SE4-2025 G4




Ordonnanceur / Système d'exploitation

Le code implémente un mini ordonnanceur préemptif sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.

Chaque tâche a sa propre pile et son contexte CPU.

Code de l'ordonnanceur

Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.


ici on definit la structure d'une tâche, qu'elle fonction elle doit exécuter, quand elle doit etre exécuter, la derniere fois qu'elle été exécuté, sa priorité et son ID

typedef struct {
    void (*pFunction)(void); // Pointeur vers la fonction de la tâche
    uint32_t Period_ms;      // Période d'exécution souhaitée (en ms)
    uint32_t Last_Run_Time;  // Timestamp de la dernière exécution
    uint8_t  Priority;       // Priorité (0: la plus faible)
    uint8_t  ID;             // ID de la tâche
} Task_t;

ici, configure le Timer1 pour générer une interruption toutes les 20 ms. Cette interruption sert de tick système pour que le scheduler exécute les tâches périodiques.

void SCHEDULER_Init(void) {
    TaskCount = 0;
    GlobalTick = 0;

    // 1. Mise à zéro des Registres
    TCCR1A = 0; // Réinitialise TCCR1A
    TCCR1B = 0; // Réinitialise TCCR1B
    TCNT1  = 0; // Initialise le compteur à zéro

    // 2. Mode CTC (Clear Timer on Compare Match)
    // WGM12 = 1 dans TCCR1B pour le mode CTC
    TCCR1B |= (1 << WGM12); 

    OCR1A = 5000; 

    // 3. Définir le Prescaler à 1024 (CS12=1, CS10=1 dans TCCR1B)
    TCCR1B |= (1 << CS12) | (1 << CS10); 

    // 4. Autoriser l'interruption Timer1 Compare Match A (OCIE1A dans TIMSK1)
    TIMSK1 |= (1 << OCIE1A); 

    // 5. Activer les interruptions globales
    sei();

}

Ici, il est question d'enregistrer une nouvelle tâches, en mettant son code, sa période, son ID, etc....

int8_t SCHEDULER_AddTask(void (*pFunction)(void), uint32_t Period_ms, uint8_t Priority) {
    if (TaskCount < MAX_TASKS) {
        TaskList[TaskCount].pFunction = pFunction;
        TaskList[TaskCount].Period_ms = Period_ms;
        TaskList[TaskCount].Last_Run_Time = GlobalTick; // Exécution immédiate
        TaskList[TaskCount].Priority = Priority;
        TaskList[TaskCount].ID = TaskCount + 1;
        TaskCount++;
        //return TaskCount;
	return TaskList[TaskCount - 1].ID;
    }
    return 0; // en cas d'echec
}


Carte Son

Description

Notre carte fille son sera alimentée par la carte mère.

Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.

Pour fonctionner, elle a besoin d'un microphone permettant d'ecouter le bruit, d'un haut-parleur pour jouer le son, un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .

Schématique - routage et vue 3D

PicoShield - schema électrique SE4-2025
Carte son - schema electrique SE4-2025 G4
Carte son - schema routage SE4-2025 G4
Carte son - schema routage SE4-2025 G4
Carte son - schema vue3D recto SE4-2025 G4
Carte son - schema vue3D recto SE4-2025 G4
Carte son - schema vue3D verso SE4-2025 G4
Carte son - schema vue3D verso SE4-2025 G4