« I2L 2023 Groupe5 » : différence entre les versions
(→Code) |
|||
Ligne 57 : | Ligne 57 : | ||
* Création d'un programme pour manipuler les LEDs multicolores: | * Création d'un programme pour manipuler les LEDs multicolores: | ||
<syntaxhighlight> | |||
void init_LED_Drivers(int nb) { | |||
// LED drivers I/O as outputs | |||
DDR_DLED |= (1 << PIN_DLED_CLOCK) | (1 << PIN_DLED_DATA) | (1 << PIN_DLED_LATCH); | |||
// Set LATCH output low | |||
PORT_DLED &= ~(1 << PIN_DLED_LATCH); | |||
} | |||
* | void set_LED_Drivers(unsigned int pwm[], int nb) { | ||
int c, b; | |||
// Set LATCH output low | |||
PORT_DLED &= ~(1 << PIN_DLED_LATCH); | |||
// 24 channels per TLC5947 | |||
for (c = DLED_CHANNELS * nb - 1; c >= 0; c--) { | |||
// 12 bits per channel, send MSB first | |||
int v = pwm[c]; | |||
for (b = 0; b < 12; b++) { | |||
// Set CLOCK output low | |||
PORT_DLED &= ~(1 << PIN_DLED_CLOCK); | |||
// Set DATA as stated by bit #b of c | |||
if (v & 0x0800) | |||
PORT_DLED |= (1 << PIN_DLED_DATA); | |||
else | |||
PORT_DLED &= ~(1 << PIN_DLED_DATA); | |||
// Set CLOCK output HIGH | |||
PORT_DLED |= (1 << PIN_DLED_CLOCK); | |||
v <<= 1; | |||
} | |||
} | |||
// Set CLOCK output low | |||
PORT_DLED &= ~(1 << PIN_DLED_CLOCK); | |||
// Set LATCH output high | |||
PORT_DLED |= (1 << PIN_DLED_LATCH); | |||
// Set LATCH output low | |||
PORT_DLED &= ~(1 << PIN_DLED_LATCH); | |||
} | |||
</syntaxhighlight>''Problème: faible intensité lumineuse, probablement un défaut de la carte'' | |||
* Création du cœur du système de jeu: | |||
<syntaxhighlight lang="c"> | |||
couleur *random_series(int n, couleur *bank) { | |||
srand(time(NULL)); | |||
couleur *res = (couleur *) malloc(n * sizeof(couleur)); | |||
for (int i = 0; i < n; i++) | |||
res[i] = bank[rand() % MAX_COLORS]; | |||
return res; | |||
} | |||
int equals(couleur c1, couleur c2) { | |||
if ((c1.r == c2.r) && | |||
(c1.g == c2.g) && | |||
(c1.b == c2.b)) | |||
return 1; | |||
return 0; | |||
} | |||
int contains(couleur c1, couleur *series, size_t length) { | |||
for (size_t i = 0; i < length; i++) { | |||
if (equals(c1, series[i])) | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
* Création d'un programme pour permettre une connexion avec un terminal externe: | * Création d'un programme pour permettre une connexion avec un terminal externe: | ||
Version du 29 septembre 2023 à 14:31
Proposition de système
Le projet consiste en un Mastermind où un joueur doit deviner une série de 4 couleurs en proposant des séries une à une. La carte comprend deux séries de 4 LEDS multicolores, l'une pour les propositions faites par le joueur, la seconde pour valider ou non les couleurs proposées. En dessous se trouve un clavier de 6 boutons permettant de :
- proposer les couleurs (1 par couleur donc 4 en tout)
- un bouton RESET
- un bouton ENTER pour confirmer une proposition.
Enfin, un port USB permettant de jouer au jeu en mode non-autonome depuis une console texte (avec affichage d'un historique).
Contre-proposition
Il doit être aussi possible de jouer du PC quand la carte y est connectée. Pour ce faire vous utiliserez un terminal série comme minicom
ou putty
. Votre carte doit donc implanter un périphérique USB de type émulation de port série.
Pour la programmation du périphèrique USB vous utilisez, comme base, la démonstration LUFA Demos/Device/LowLevel/VirtualSerial
.
Vous n'avez pas à écrire de programme PC avec la bibliothèque libusb
.
Proposition définitive
Répartition du travail
Carte
Carte Finale:
Code
Conception
- Mise en place d'un programme simple de test qui inverse l'état de deux LED lors de l'appui sur un bouton
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)
DDRC |= (1 << 4);
DDRC |= (1 << 5);
DDRB &= ~(1 << BUT_BIT);
PORTB |= (1 << BUT_BIT);
PORTC |= (1 << 4);
while(1) {
if (!(PINB & (1 << BUT_BIT))) {
PORTC ^= (1 << 4);
PORTC ^= (1 << 5);
_delay_ms(1000);
}
}
- Création d'un programme pour manipuler les LEDs multicolores:
void init_LED_Drivers(int nb) {
// LED drivers I/O as outputs
DDR_DLED |= (1 << PIN_DLED_CLOCK) | (1 << PIN_DLED_DATA) | (1 << PIN_DLED_LATCH);
// Set LATCH output low
PORT_DLED &= ~(1 << PIN_DLED_LATCH);
}
void set_LED_Drivers(unsigned int pwm[], int nb) {
int c, b;
// Set LATCH output low
PORT_DLED &= ~(1 << PIN_DLED_LATCH);
// 24 channels per TLC5947
for (c = DLED_CHANNELS * nb - 1; c >= 0; c--) {
// 12 bits per channel, send MSB first
int v = pwm[c];
for (b = 0; b < 12; b++) {
// Set CLOCK output low
PORT_DLED &= ~(1 << PIN_DLED_CLOCK);
// Set DATA as stated by bit #b of c
if (v & 0x0800)
PORT_DLED |= (1 << PIN_DLED_DATA);
else
PORT_DLED &= ~(1 << PIN_DLED_DATA);
// Set CLOCK output HIGH
PORT_DLED |= (1 << PIN_DLED_CLOCK);
v <<= 1;
}
}
// Set CLOCK output low
PORT_DLED &= ~(1 << PIN_DLED_CLOCK);
// Set LATCH output high
PORT_DLED |= (1 << PIN_DLED_LATCH);
// Set LATCH output low
PORT_DLED &= ~(1 << PIN_DLED_LATCH);
}
Problème: faible intensité lumineuse, probablement un défaut de la carte
- Création du cœur du système de jeu:
couleur *random_series(int n, couleur *bank) {
srand(time(NULL));
couleur *res = (couleur *) malloc(n * sizeof(couleur));
for (int i = 0; i < n; i++)
res[i] = bank[rand() % MAX_COLORS];
return res;
}
int equals(couleur c1, couleur c2) {
if ((c1.r == c2.r) &&
(c1.g == c2.g) &&
(c1.b == c2.b))
return 1;
return 0;
}
int contains(couleur c1, couleur *series, size_t length) {
for (size_t i = 0; i < length; i++) {
if (equals(c1, series[i]))
return 1;
}
return 0;
}
- Création d'un programme pour permettre une connexion avec un terminal externe:
Réalisation
Démonstrations
Rendus
Projet KiCAD : Fichier:I2L-2023-Carte-G5.zip
Programmes : Fichier:I2L-2022-Programmes-G5.zip