« I2L 2023 Groupe6 » : différence entre les versions
Aller à la navigation
Aller à la recherche
(→Code) |
(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:
- 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
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.
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