« I2L 2023 Groupe6 » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
(code)
Ligne 40 : Ligne 40 :


= Code =
= Code =
<blockquote></blockquote><syntaxhighlight lang="c" line="1">
#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;
}
</syntaxhighlight>


== Conception ==
== Conception ==

Version du 28 septembre 2023 à 14:13

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:

  1. Microcontrôleur ;
  2. Haut-parleur : Intégrer un haut-parleur ou un transducteur piézoélectrique pour la sortie audio ;
  3. Boutons de contrôle : Ajouter des boutons pour la navigation, la lecture/pause.
  4. 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:

  1. Lecture de livres audio ;
  2. Navigation dans la liste des livres audio et des chapitres ;
  3. Possibilité de mettre en pause, de reprendre la lecture.

Fonctionnalités Supplémentaires :

  1. Réglage du volume et contrôle de la lecture.

Contre-proposition

Proposition définitive

Répartition du travail

Carte

Vous pourrez utiliser la carte du groupe 1 avec la carte clavier du groupe 2 de l'an dernier.

Carte de Groupe 1
Carte de groupe 2

Code

#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