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

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 150 : Ligne 150 :
==Réalisation==
==Réalisation==


=== Défilement de gauche à droite : ===
<syntaxhighlight lang="c">
/**
* Permet défiler le message de gauche à droite
* @param message
*/
void defiler_GD(char *message) {
    char temp = message[0];
    int length = strlen(message);
    for(int i = 0; i < length - 1; i++) {
        message[i] = message[i+1];
    }
    message[length-1] = temp;
}
</syntaxhighlight>


[[Fichier:Ecriture sur LCD.png|vignette|Code de l'écriture d'un message statique sur le LCD|gauche]]
=== Défilement de bas en haut : ===
<syntaxhighlight lang="c">
/**
* Permet de défiler le message de bas en haut
* @param message
*/
void defiler_BH(char *message) {
    char temp[NB_COLS + 1];
 
    strncpy(temp, message, NB_COLS);
    temp[NB_COLS] = '\0';
 
    memmove(message, message + NB_COLS, strlen(message) - NB_COLS + 1);
 
    strcat(message, temp);
}
</syntaxhighlight>[[Fichier:Ecriture sur LCD.png|vignette|Code de l'écriture d'un message statique sur le LCD|gauche]]
[[Fichier:Fct défiler.png|vignette|Fonction qui fait défiler le message de gauche à droite|centré]]
[[Fichier:Fct défiler.png|vignette|Fonction qui fait défiler le message de gauche à droite|centré]]



Version du 19 octobre 2023 à 08:16

Proposition de système

Un écran LCD à 2 lignes à contrôleur HD44780 affichera un message qui défilera de la gauche vers la droite ou du bas vers le haut.

Dans un premier temps, le message affiché sera stocké en dur dans la mémoire. Ensuite, le message pourra être entré au clavier. Enfin, un message stocké en mémoire pourra être affiché lorsque la connexion USB ne sera pas détectée.

Matériel requis :

  • Le microcontrôleur ;
  • Un écran LCD à 2 lignes à contrôleur HD44780 ;
  • 2 LED ;
  • 1 bouton (pour afficher le message de la première étape) ;
  • une batterie ;
  • 1 connecteur USB A.

Contre-proposition

Le périphérique USB doit être de type spécifique (classe 0) et utiliser un point d'accès de volume, vous pouvez vous appuyer sur cet exemple LUFA de base : Média:LUFA_Minimal.zip.

Pour télécharger le texte à faire défiler vers la carte, vous écrirez une application avec la bibliothèque libusb.

Proposition définitive

L'écran LCD affichera en premiers lieux un message statique déroulant sous deux manières:

  • Affichage de gauche à droite
  • Affichage de bas en haut


Ensuite le message souhaité sera écrit de manière dynamique sur un clavier d'ordinateur et une liaison USB se chargera de transmettre ce dernier sur l'écran LCD.

Carte

I2L-2023-Carte3D-G3.png
I2L-2023-CarteSchema-G3.pdf

Seconde version de la carte pour changer le modèle du potentiomètre.

I2L-2023-Carte3D-G3-v2.png
I2L-2023-CarteSchema-G3-v2.pdf

La position du connecteur de l'écran sur la carte n'est pas bien réfléchie. Du coup l'écran recouvre les LED et les boutons. Pour éviter le problème la carte a été rallongée avec des prolongateurs.

I2L-2023-Carte3Rallonge-G3-v2.jpg

Par ailleurs durant les journées des 28 et 29 septembre il n'avait pas été possible de faire fonctionner les écrans LCD. La carte avait été incriminée (avec le contrôle du contraste LCD). En fait c'était le code de l'étudiant SE qui était bogué. Avec un code correct, comme la photo ci-dessus le montre, l'affichage fonctionne sans problème : Média:I2L-2023-code-LCD.zip.

Code

Tests de la carte

Chenillard normal
Gestion appui de bouton


Après avoir essayé de faire fonctionner l'écran LCD, nous avons constaté que rien ne se passait. Même après vérification de votre part.

Conception

Configuration USB

Après avoir modifié le Minimal, on obtient:

Device Descriptor:

 bLength                18
 bDescriptorType         1
 bcdUSB               1.10
 bDeviceClass            0 
 bDeviceSubClass         0 
 bDeviceProtocol         0 
 bMaxPacketSize0         8
 idVendor           0x4242 USB Design by Example
 idProduct          0x0001 
 bcdDevice            0.01
 iManufacturer           1 LUFA Library
 iProduct                2 LUFA Minimal
 iSerial               220 3423031383635110A1C0
 bNumConfigurations      1
 Configuration Descriptor:
   bLength                 9
   bDescriptorType         2
   wTotalLength       0x0019
   bNumInterfaces          1
   bConfigurationValue     1
   iConfiguration          0 
   bmAttributes         0x80
     (Bus Powered)
   MaxPower              100mA
   Interface Descriptor:
     bLength                 9
     bDescriptorType         4
     bInterfaceNumber        0
     bAlternateSetting       0
     bNumEndpoints           1
     bInterfaceClass       255 Vendor Specific Class
     bInterfaceSubClass    255 Vendor Specific Subclass
     bInterfaceProtocol    255 Vendor Specific Protocol
     iInterface              0 
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x02  EP 2 OUT
       bmAttributes            2
         Transfer Type            Bulk
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0200  1x 512 bytes
       bInterval               5

Compilation

Afin de compiler notre programme, nous avons un Makefile réalisant plusieurs commandes. Celui-ci est également disponible dans le source téléchargeable à la fin du wiki.

# Paramètres de compilation
CC = avr-gcc
MCU = atmega32u4
F_CPU = 16000000UL

# Options du compilateur
CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -Os

# Fichiers source
SRC = main.c HD44780.c

# Nom de l'exécutable
TARGET = lcd

all: $(TARGET).hex

$(TARGET).hex: $(TARGET).elf
	avr-objcopy -O ihex -R .eeprom $< $@

$(TARGET).elf: $(SRC)
	$(CC) $(CFLAGS) -o $@ $^

dfu: $(TARGET).hex
	dfu-programmer $(MCU) erase
	dfu-programmer $(MCU) flash $(TARGET).hex
	dfu-programmer $(MCU) reset

clean:
	rm -f $(TARGET).elf $(TARGET).hex

.PHONY: all upload clean

Réalisation

Défilement de gauche à droite :

/**
 * Permet défiler le message de gauche à droite
 * @param message
 */
void defiler_GD(char *message) {
    char temp = message[0];
    int length = strlen(message);
    for(int i = 0; i < length - 1; i++) {
        message[i] = message[i+1];
    }
    message[length-1] = temp;
}

Défilement de bas en haut :

/**
 * Permet de défiler le message de bas en haut
 * @param message
 */
void defiler_BH(char *message) {
    char temp[NB_COLS + 1];

    strncpy(temp, message, NB_COLS);
    temp[NB_COLS] = '\0';

    memmove(message, message + NB_COLS, strlen(message) - NB_COLS + 1);

    strcat(message, temp);
}
Code de l'écriture d'un message statique sur le LCD
Fonction qui fait défiler le message de gauche à droite




Démonstrations

Message en dur(dans le code) :

Défilement d'un message de gauche à droite
Défilement d'un message de bas en haut


Message transmit par USB :

Rendus

Projet KiCAD : Fichier:I2L-2023-Carte-G3.zip

Programmes : Fichier:I2L-2022-Programmes-G3.zip