« SE4Binome2025-4 » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| (23 versions intermédiaires par 2 utilisateurs non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
'''<big>Carte Son</big>''' pour un pico ordinateur | '''<big>Carte Son</big>''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git] | ||
<big>'''Présentation projet'''</big> | |||
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''' == | ||
=== <small>Réalisation du shield arduino</small> === | |||
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. | |||
==== <small>Schématique - Routage et vue 3D</small> ==== | |||
{| class="wikitable mw-collapsible" | |||
|+ | |||
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]] | |||
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]] | |||
|- | |||
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]] | |||
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|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. | ||
[[Fichier:SoundCard pcb se4 pico 4 2025.png| | |||
< | 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''<syntaxhighlight lang="c"> | |||
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; | |||
</syntaxhighlight> | |||
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.<syntaxhighlight lang="c"> | |||
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(); | |||
} | |||
</syntaxhighlight> | |||
Ici, il est question d'enregistrer une nouvelle tâches, en mettant son code, sa période, son ID, etc....<syntaxhighlight lang="c"> | |||
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 | |||
} | |||
</syntaxhighlight> | |||
=='''Carte Son'''== | |||
=== <small>Description</small> === | |||
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 | |||
* d'un haut-parleur pour jouer le son, | |||
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur . | |||
=== <small>Schématique - routage et vue 3D</small> === | |||
{| class="wikitable mw-collapsible" | |||
|+ | |||
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]] | |||
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]] | |||
|- | |||
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]] | |||
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]] | |||
|} | |||
<blockquote></blockquote> | |||
Version actuelle datée du 15 décembre 2025 à 13:59
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
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
- d'un haut-parleur pour jouer le son,
- d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .
Schématique - routage et vue 3D