I2L 2024 Groupe6

De wiki-se.plil.fr
Révision datée du 23 avril 2025 à 17:39 par Bhembert (discussion | contributions) (Correction de fautes)
Aller à la navigation Aller à la recherche

Proposition de système

Un clavier midi constitué de 12 touches permettant de produire du son, 2 touches permettant d'augmenter ou diminuer d'une octave, et un bouton permettant de gérer le volume. Un écran affiche l'octave (de 0 à 7) et le volume (de 0 à 100).

Contre-proposition

OK pour la proposition mais il est demandé impérativement d'implanter un périphérique USB de classe MIDI.

Pour la gestion des touches en matrice voyez le projet [1].

Pour la gestion de l'écran LCD vous pouvez vous inspirer du code des groupes 3 et 4 I2L en 2023/2024.

La démonstration MIDI de la bibliothèque LUFA semble être adaptée au projet. Vous pourriez d'ailleurs ajouter une fonctionnalité de cette démonstration consistant en le changement d'instrument. Pour cela vous pouvez utiliser une combinaison de touches comme appuyer simultanément sur un bouton de changment d'octave et sur une touche du clavier.

Si vous avez accès à un imprimante 3D vous pouvez tenter la fabrication de capuchons de touche à mettre sur les boutons poussoirs KAILH, regardez par exemple [2].

Proposition définitive

Clavier MIDI :

4x4 boutons en matrice dont

  • 12 boutons de touches de piano
  • 2 boutons pour changer d'octave
  • un potentiometre pour régler le son

Un écran LCD pour afficher l'octave sur laquelle on est actuellement.

Le code doit utiliser une bibliothèque permettant de bancher le clavier en MIDI et de le passer en USB pour le lire sur une application adaptée.

Répartition du travail

Carte

Schéma initial

I2L-2024-Carte-G6a.png

Carte routée

Schéma de la carte
vue de la carte

Composants

  • ATmega32u4 : disponible
  • quartz GND24 : disponible
  • perle ferrite MH2029-300Y : commandée
  • potentiomètre écran : disponible
  • potentiomètre volume : disponible
  • connecteur femelle 16 contacts : commandé
  • écran LCD 2 lignes : commandé
  • touches KAILH BOX-BLACK : disponibles

Carte au 23/02/2025

Première réalisation

Carte au 27/02/2025

Carte avec la quasi totalité des composants insérés

Non encore réalisé :

  • ajouter la perle de ferrite.

Carte au 07/03/2025

Fontionnement

La carte est un clavier MIDI, cela permet d'émuler un instrument sur un logiciel de MAO (Musique assistée par Ordinateur).

La carte possède :

  • 18 touches de piano
  • Un potentiomètre, qui peut être affecté à n'importe qu'elle fonction dans le logiciel (volume, effets...)
  • Deux touches + et - permettant d'augmenter ou de diminuer l'octave (de 1 à 7). En appuyant simultanément sur les touches, le clavier bascule en mode sélection d'instrument, et les 2 boutons permettent de cycler entre les instruments.
  • Un écran LCD permettant de visualiser l'instrument, le volume actuel, l'octave actuelle.


Les instruments disponibles sont :

  • Piano
  • Pad (Famille de son d'un synthétiseur)
  • Trompette
  • Violon
  • Basse
  • Guitare
  • Percussion
  • Drums (Batterie)


Au niveau du clavier, l'oublie de diodes sur la matrice de boutons fait que nous ne pouvons appuyer que sur 2 boutons simultanément au maximum, sinon nous avons des boutons fantômes.

Code

  • pin_t représente une broche E/S :
    typedef struct {
    	volatile unsigned char *dir;
    	volatile unsigned char *port;
    	volatile unsigned char *pin;
    	unsigned char bit;
    } pin_t;
    
  • Analyse le clavier matriciel pour détecter les pressions et les relâchements de touches. Définit les variables isPressed, isReleased et toProcess en conséquence.
    void scanKeyboard(void) {
    	for(uint8_t l = 0; l < NB_LINES ; l++) {
    
    		*lines[l].port &= ~(1 << lines[l].bit);
    
    		for(uint8_t c = 0; c < NB_COLS; c++) {
    
    			int t = l * NB_COLS + c;
    
    			if(!(*cols[c].pin & (1 << cols[c].bit))) {
    				if(!buttonPressed[t]){
    					buttonPressed[t] = true;
    					isPressed = t;
    					isReleased = -1;
    					toProcess = true;
    				}
    			} else {
    				if(buttonPressed[t]){
    					buttonPressed[t] = false;
    					isReleased = t;
    					isPressed = -1;
    					toProcess = true;
    				} 			
    			}	
    		}
    
    		*lines[l].port |= (1 << lines[l].bit);
    	}
    }
    
    Avec notre système de matrice de boutons, nous pouvons détecter jusqu'à deux touches appuyées simultanément. Au-delà, des touches "fantômes" sont détectées comme étant appuyées.
  • Nous avons créé une structure de données pour lier un bouton à une note MIDI.
    // 60 to 71 => Octave 3 in order C, C#, D, D#, E, F, F#, G, G#, A, A#, B
    // 72 TO 77 => Octave 4 up to F
    NoteMIDI notes[NB_NOTES] = { 
    	{4, 60}, {3, 61}, {1, 62}, {2, 63}, {0, 64}, {9, 65},
    	{8, 66}, {7, 67}, {6, 68}, {5, 69}, {14, 70}, {13, 71},
    	{12, 72}, {11, 73}, {10, 74}, {19, 75}, {18, 76}, {17, 77}
    };
    
    Notre clavier permet de changer d'octave, et donc la hauteur de nos notes.
  • Concernant le volume (potentiomètre) :
    unsigned int ad_capture(void){
        ADCSRA |= (1<<ADSC);                      // Start conversion
        while(bit_is_set(ADCSRA, ADSC));          // Wait for conversion to complete
        return ADCH;                              // Return 8-bit result (0-255)
    }
    
    
    uint8_t convert_volume(uint8_t volume, uint8_t maxVolume) {
    	return (volume * maxVolume) / MAX_POT; 
    }
    

Démonstrations

Rendus

Projet KiCAD : Fichier:I2L-2024-Carte-G6.zip

Programmes : Fichier:I2L-2024-Programmes-G6.zip