« I2L 2023 Groupe6 » : différence entre les versions
(→Carte) |
|||
Ligne 41 : | Ligne 41 : | ||
Tout d'abord il est possible de faire fonctionner la démonstration <code>AudioOutput</code> dans un mode dégradé. En effet la différence entre un ATMega16u2 et un ATMega32u4 concernant la démonstration est que le premier ne permet que des points d'accès de taille 64 octets aux maximum alors que le second permet de monter à 256 octets. Par ailleurs pour les points d'accès isochrones de a démonstration il semble que le mode "ping-pong" soit nécessaire. Ce mode consiste à utiliser deux tampons pour les transferts USB afin de les accélérer. Le mode "ping-pong" est disponible pour le point d'accès 1 sur les ATMega32u4 et sur les points d'accès 3 et 4 sur les ATMega16u2. | Tout d'abord il est possible de faire fonctionner la démonstration <code>AudioOutput</code> dans un mode dégradé. En effet la différence entre un ATMega16u2 et un ATMega32u4 concernant la démonstration est que le premier ne permet que des points d'accès de taille 64 octets aux maximum alors que le second permet de monter à 256 octets. Par ailleurs pour les points d'accès isochrones de a démonstration il semble que le mode "ping-pong" soit nécessaire. Ce mode consiste à utiliser deux tampons pour les transferts USB afin de les accélérer. Le mode "ping-pong" est disponible pour le point d'accès 1 sur les ATMega32u4 et sur les points d'accès 3 et 4 sur les ATMega16u2. | ||
Une première solution consiste donc à modifier la démonstration pour tourner avec un point d'accès 3 et une taille de 64 octets : [[ | Une première solution consiste donc à modifier la démonstration pour tourner avec un point d'accès 3 et une taille de 64 octets : [[Média:LUFA_AudioOutput_ATMega16u2.zip]]. Malheureusement avec des points d'accès de 64 octets il n'est pas possible de dépasser une fréquence d'échantillons de 11025Hz pour un fichier audio avec deux canaux et 16 bits par échantillon (la configuration la plus courante). Il est donc possible que le logiciel de lecture des livres audio refuse de coopérer. Voyez ce que vous pouvez faire de ce coté. | ||
Une seconde solution consiste à abandonner la création d'une carte son USB standard et de créer un périphérique USB spécifique. C'est ce qui a été fait, à base de la démonstration du clavier, dans la démonstration [[ | Une seconde solution consiste à abandonner la création d'une carte son USB standard et de créer un périphérique USB spécifique. C'est ce qui a été fait, à base de la démonstration du clavier, dans la démonstration [[Média:LUFA_KeyboardAudioSpecific_ATMega16u2.zip]]. Dans cette configuration le périphérique n'est plus reconnu par le noyau comme une carte son. Il faut écrire un programme spécifique pour l'utiliser. | ||
Il est tentant d'écrire un programme lisant un fichier WAV et l'envoyant sur la carte son spécifique. C'est ce qui est réalisé dans le programme du sous-répertoire <code>PC</code> de la précédente démonstration lorsqu'il est compilé avec la constante <code>FROM_WAVFILE</code> définie. Cela fonctionne mais c'est difficile à utiliser dans votre projet : il faudrait inclure ce code dans celui du lecteur de livres audio. | Il est tentant d'écrire un programme lisant un fichier WAV et l'envoyant sur la carte son spécifique. C'est ce qui est réalisé dans le programme du sous-répertoire <code>PC</code> de la précédente démonstration lorsqu'il est compilé avec la constante <code>FROM_WAVFILE</code> définie. Cela fonctionne mais c'est difficile à utiliser dans votre projet : il faudrait inclure ce code dans celui du lecteur de livres audio. | ||
Ligne 52 : | Ligne 52 : | ||
= Proposition définitive = | = Proposition définitive = | ||
Nous avons choisi la premier solution. | |||
Après avoir téléchargé le fichier "media:LUFA_AudioOutput_ATMega16u2.zip" et l'avoir modifié pour générer du son, nous avons utilisé le logiciel "Audacieux" dans Linux pour rediriger la sortie audio vers la carte que nous avons développée. Maintenant, nous cherchons à intégrer la fonctionnalité du clavier dans notre code. | |||
Liste des tâches : | |||
1. Téléchargez et extrayez le code du clavier depuis "LUFA". | |||
2. Incluez les fichiers du clavier (source et en-tête) dans Notre projet. | |||
3. Intégrez les fonctions et appels du clavier dans notre code audio. | |||
= Répartition du travail = | = Répartition du travail = |
Version du 19 octobre 2023 à 07:23
Proposition de système
Objectif:
Créez un petit dispositif portable capable de lire des livres audio sur l'ordinateur. L'utilisateur peut naviguer à travers les livres audio à l'aide des touches et écouter le contenu via le haut-parleur intégré, il aura également 3 LED : une verte qui signifie que l’audio est en mode marche (play), une bleu qui sera allumée quand l’audio est en mode pause (pause) et une rouge indiquant qu'il y a un souci particulier.
Matériels :
- Microcontrôleur ;
- LED ;
- Touches ;
- Haut-parleur.
Composants nécessaires:
- Microcontrôleur ;
- Haut-parleur : Intégrer un haut-parleur ou un transducteur piézoélectrique pour la sortie audio ;
- Boutons de contrôle : Ajouter des boutons pour la navigation, la lecture/pause.
- LED : couleur rouge s’il a un problème , couleur verte si c’est en mode marche (play) et couleur bleu si c’est en mode pause.
Fonctionnalités:
- Lecture de livres audio ;
- Navigation dans la liste des livres audio et des chapitres ;
- Possibilité de mettre en pause, de reprendre la lecture.
Fonctionnalités Supplémentaires :
- Réglage du volume et contrôle de la lecture.
Contre-proposition
Votre carte doit se comporter comme un périphérique USB composite, à savoir un périphérique HID clavier et une carte son.
Pour la programmation du périphèrique USB vous utilisez, comme base, les démonstration LUFA :
Demos/Device/LowLevel/AudioOutput
;- et
Demos/Device/LowLevel/Keyboard
.
Vous n'avez pas à écrire de programme PC avec la bibliothèque libusb
.
Durant les séances des 28 et 29 septembre, il n'a pas été possible de faire fonctionner la démonstration AudioOutput
de la bibliothèque LUFA. Après un examen des sources cet exemple n'est utilisable que sur les AVR avec USB matériel de série 4 et supérieur (un ATMega16u2 appartient à la série 2, pour faire fonctionner directement l'exemple un ATMega32u4, au minimu, était nécessaire). La modification de la carte n'étant pas possible dans les délais impartis, d'autres pistes sont suggérées.
Tout d'abord il est possible de faire fonctionner la démonstration AudioOutput
dans un mode dégradé. En effet la différence entre un ATMega16u2 et un ATMega32u4 concernant la démonstration est que le premier ne permet que des points d'accès de taille 64 octets aux maximum alors que le second permet de monter à 256 octets. Par ailleurs pour les points d'accès isochrones de a démonstration il semble que le mode "ping-pong" soit nécessaire. Ce mode consiste à utiliser deux tampons pour les transferts USB afin de les accélérer. Le mode "ping-pong" est disponible pour le point d'accès 1 sur les ATMega32u4 et sur les points d'accès 3 et 4 sur les ATMega16u2.
Une première solution consiste donc à modifier la démonstration pour tourner avec un point d'accès 3 et une taille de 64 octets : Média:LUFA_AudioOutput_ATMega16u2.zip. Malheureusement avec des points d'accès de 64 octets il n'est pas possible de dépasser une fréquence d'échantillons de 11025Hz pour un fichier audio avec deux canaux et 16 bits par échantillon (la configuration la plus courante). Il est donc possible que le logiciel de lecture des livres audio refuse de coopérer. Voyez ce que vous pouvez faire de ce coté.
Une seconde solution consiste à abandonner la création d'une carte son USB standard et de créer un périphérique USB spécifique. C'est ce qui a été fait, à base de la démonstration du clavier, dans la démonstration Média:LUFA_KeyboardAudioSpecific_ATMega16u2.zip. Dans cette configuration le périphérique n'est plus reconnu par le noyau comme une carte son. Il faut écrire un programme spécifique pour l'utiliser.
Il est tentant d'écrire un programme lisant un fichier WAV et l'envoyant sur la carte son spécifique. C'est ce qui est réalisé dans le programme du sous-répertoire PC
de la précédente démonstration lorsqu'il est compilé avec la constante FROM_WAVFILE
définie. Cela fonctionne mais c'est difficile à utiliser dans votre projet : il faudrait inclure ce code dans celui du lecteur de livres audio.
L'autre solution est d'utiliser le module "loopback" du système son ALSA du noyau Linux. Après insertion du module snd_aloop
dans le noyau, deux nouvelles cartes sont disponibles. La première est un puits vers lequel il est possible d'envoyer un flux audio. Le flux peut être récupéré sur la seconde carte son par l'API classique d'ALSA. Il est donc possible d'écrire un programme qui fait le lien entre cette carte son virtuelle et le périphérique USB spécifique. C'est ce qui est réalisé dans le programme du sous-répertoire PC
de la précédente démonstration lorsqu'il est compilé avec la constante FROM_ALSA
définie.
Vous avez donc plusieurs solution pour réaliser votre projet avec le matériel disponible. A vous de jouer.
Proposition définitive
Nous avons choisi la premier solution.
Après avoir téléchargé le fichier "media:LUFA_AudioOutput_ATMega16u2.zip" et l'avoir modifié pour générer du son, nous avons utilisé le logiciel "Audacieux" dans Linux pour rediriger la sortie audio vers la carte que nous avons développée. Maintenant, nous cherchons à intégrer la fonctionnalité du clavier dans notre code.
Liste des tâches :
1. Téléchargez et extrayez le code du clavier depuis "LUFA".
2. Incluez les fichiers du clavier (source et en-tête) dans Notre projet.
3. Intégrez les fonctions et appels du clavier dans notre code audio.
Répartition du travail
Carte
Vous pourrez utiliser la carte du groupe 1 avec la carte clavier du groupe 2 de l'an dernier.
Code
- Dans ce code, nous avons fait deux actions, un bouton qui pour chaque appuie change de couleur et un autre bouton qui emet un son.
#include <avr/io.h>
#include <util/delay.h>
#define GREEN 0
#define RED 1
#define BLUE 2
#define BOUTON 4
#define BOUTON2 2
#define SPEAKER
void make_note_delay(int note)
{
// attente d'un demi-cycle
switch (note)
{
case 413:
_delay_us(1000000 / 413 / 2);
break;
case 440:
_delay_us(1000000 / 440 / 2);
break;
case 634:
_delay_us(1000000 / 634 / 2);
break;
case 660:
_delay_us(1000000 / 660 / 2);
break;
case 743:
_delay_us(1000000 / 743 / 2);
break;
case 792:
_delay_us(1000000 / 792 / 2);
break;
case 825:
_delay_us(1000000 / 825 / 2);
break;
case 1056:
_delay_us(1000000 / 1056 / 2);
break;
}
}
void play_note(int note, int periode)
{
for (int i = 0; i < periode; i++)
{
PORTB = 255;
make_note_delay(note);
PORTB = 0;
make_note_delay(note);
}
}
int main(void){
DDRD |= (1 << GREEN) | (1 << RED) | (1 << BLUE) ; // Set Green, Red, Blue as outputs
DDRC &= ~((1 << BOUTON) | (1 << BOUTON2)); // Set Button pins as inputs
PORTC |= (1 << BOUTON) | (1 << BOUTON2); // Enable pull-up resistors on the Buttons
CLKSEL0 = 0b00010101; // sélection de l'horloge externe
CLKSEL1 = 0b00001111; // minimum de 8Mhz
CLKPR = 0b10000000; // modification du diviseur d'horloge (CLKPCE=1)
CLKPR = 0; // 0 pour pas de diviseur (diviseur de 1)
DDRB = 255;
int currentColor = GREEN; // Start with Green
while(1){
if(!(PINC & (1 << BOUTON))) { // If the first button is pressed
//_delay_ms(10); // Debounce delay
if(!(PINC & (1 << BOUTON))) { // If the button is still pressed after debouncing
// Toggle to the next color
if(currentColor == GREEN) {
PORTD &= ~(1 << RED);
PORTD |= (1 << GREEN);
PORTD |= (1 << BLUE);
currentColor = RED;
} else if(currentColor == RED) {
PORTD &= ~(1 << BLUE);
PORTD |= (1 << GREEN);
PORTD |= (1 << RED);
currentColor = BLUE;
} else if(currentColor == BLUE) {
PORTD &= ~(1 << GREEN);
PORTD |= (1 << RED);
PORTD |= (1 << BLUE);
currentColor = GREEN;
}
}
while(!(PINC & (1 << BOUTON))); // Wait for the button to be released
}
if (!(PINC & (1 << BOUTON2))) {
play_note(792, 198);
while (!(PINC & (1 << BOUTON2))); // Wait for the button to be released
}
}
return 0;
}
Conception
Réalisation
Démonstrations
Rendus
Projet KiCAD : Fichier:I2L-2023-Carte-G6.zip
Programmes : Fichier:I2L-2022-Programmes-G6.zip