SE3Groupe2025-9

De projets-se.plil.fr
Aller à la navigation Aller à la recherche


Programmation des systèmes embarqués

Carte électronique

Carte réalisée en utilisant le logiciel KiCAD : Fichier:2025-PSE-B9-PROG.zip.

Schéma électronique de la carte :

2025-PSE-P9-PCB.pdf

Résultat du routage :

2025-PSE-G9-PCB.png


Vidéo très courte et en basse résolution de la carte en fonctionnement :

Média:2025-PSE-09-PROG-video.mp4

Programmation

Bilan

J'indique où j'en suis arrivé à la fin des séances.

Eventuellement la vidéo brève du fonctionnement complet du programmateur : Média:2025-PSE-09-PROG-final.mp4.

Premier système embarqué

Liste des composants

1x Batterie Lithum 3.7V, 100mA

1x ATMega32u4

1x quartz 16MHz

1x port USB mâle

1x Régulateur de tension ref: LDL1117S33R (en stock E306)

1x Capteur de température, pression, humidité (BME680: https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme680-ds001.pdf )

1x écran LCD 1602A

1x régulateur de tension step up MCP1640

1x régulateur de tension MAX1811

4x Led

2x bouton


4x Pin mâle 1x3

1x Pin mâle 1x2

1x connecteur ISP

résistances:

2x 510Ω

2x 10kΩ

2x 22Ω

2x 2.2kΩ

1x 976kΩ

1x 309kΩ


capacités:

2x 10µF

3x 100µF

2x 22pF

1x 100nF

2x 2.2µF

3x 22µF

1x 4.7µF


Inductances:

1x 4.7µH

Archive GIT

Ajouter un .gitignore pour KiCAD et langage C.

Structure avec matériel (y compris production - gerber, bill of materials) / logiciel / documentation (e.g. documentation technique).

https://gitea.plil.fr/koutaleb/2025_PSE_09_koutaleb_aranivos

Description du système embarqué

Station météo: recuperation de données tel que la température, l'humidité, la qualité de l'air et la pression, ces données sont envoyé soit par USB soit sur affiché sur un écran.

L'usb permettra de charger la station et d'extraire les données.

Carte électronique

Carte réalisée en utilisant le logiciel KiCAD : Fichier:2025-station-G09.tar

Schéma électronique de la carte :

Mon schéma électronique
Mon schéma électronique

Résultat du routage :

Mon routage

Photo de la carte soudée :

Ma carte (cour-circuits à la place des LEDS d'alimentations)


très faible contraste entre les caractères et le fond, ce contraste est contrôlé par la tension envoyé au port V0, en général on utilise un potentiomètre dans le but de pouvoir régler ce paramètre. ce que je n'ai pas pu faire car ma schématique était erroné(V0 alimenté en 5V, R/W + VSS + led- non relié au GND), j'ai donc souder des fils pour corriger le problème.

Back (fils épais pour réparer la schématique)

Vidéo très courte et en basse résolution de la carte en fonctionnement :

Travail effectué

17/02: recherche du sujet

03/03: sujet trouvé

du 10/03 au 24/03: recherche des composants à utiliser

du 24/03 au 07/04: schématique et routage

05/05: réception des cartes, récupération des composants à souder

12/05: soudage des éléments de teste du µC (teste par ISP réussi)

18/05 et 19/05: soudage des composants USB, boutons et écran + création du code de teste de l'écran.

26/05: soudage du reste des composants, après avoir soudé les composants je remarque que l'écran n'affiche plus rien, je regarde la tension de sortie du régulateur qui alimente le microcontrôleur et je remarque qu'elle est grandement réduite (~2v au lieu de 3v3 quand branché par usb).


j'ai plus tard remarqué que j'avais placer mes LEDS d'alimentation (D4 et D3) en série avec l'alimentation du régulateur ce qui fait que le régulateur était alimenté bien en dessous de la tension prévu et ne pouvait pas sortir la bonne tension.

j'ai remplacé ces LEDS par des cour-circuits et l'écran semble a nouveau afficher les caractères voulu quand branché par USB.

cependant l'écran se comporte de la même façon qu'avant une fois branché par batterie, cela est du au fait que la batterie envois une tension de 4.1v à 3.7v et à cause du voltage dropout du régulateur LD117V33 de 1.1V, la tension d'alimentation n'est pas suffisante, pour obtenir du 3.3v en sortie il faut une tension d'entré de minimum 4.4V ce qui n'est pas possible avec la batterie utilisé.


il aurait fallu utilisé un régulateur du type MCP1700-3302E qui a un voltage dropout de 200mV, ce qui fait que le régulateur aurait pu fournir du 3.3v pour une tension d'alimentation de 3.5v ou plus.

Programmation

code permettant de tester le bon fonctionnement de l'écran:

#include <avr/io.h>
#include <util/delay.h>

// Définition des broches utilisées pour le LCD, selon notre câblage
#define RS PD0
#define EN PD1
#define D4 PD4
#define D5 PD5
#define D6 PD6
#define D7 PD7

// Définition des commandes
#define CLEAR 0x01
#define LIGNE1 0x80
#define LIGNE2 0xC0
#define RETOUR_CURSEUR 0x02
#define SCREEN_ON 0x0c
#define IO 0x06
#define CONFIG 0x28

//Fonction du gère les commandes données au LCD (commandes en 8 bits, on en 1er les 4 bits de poid fort, puis les 4bits de poid faible

void Read_bits(){
        PORTD |=(1<<EN);        //4 actions qui permettent à l'écran de lire une commande
        _delay_ms(5);           //ça permet de stocker les 4 bits envoyé en mémoire en attendant les 4 prochains bits
        PORTD &=~(1<<EN);       //pour effectuer la commande 8 bits à partir d'envois de donnée 4bits
        _delay_ms(10);          //(l'écran récupère les 4 bits de poid fort de PORTD lors d'un front déscendant de EN)
}

void LCD_Commandgiver(unsigned char command){
        PORTD &=~(1<<RS); //mode commande (RS à 0 et R/W à 0) (R/W toujours à 0 car relié au gnd)

        //envois des 4 bits de poid fort:
        PORTD = (PORTD & 0x0F); //remise à 0 des 4 bits de poid fort de PORTD
        PORTD|= (command & 0xF0); //envois des 4 bits de poid fort de command

        Read_bits();


        //envois des 4 bits de poid faible:
        PORTD = (PORTD & 0x0F); //remise à 0 des 4 bits de poid fort de PORTD
        PORTD|= ((command << 4) & 0xF0); //envois 4 bits de poid fort de command décalé vers à gauche de 4 bits

        Read_bits();
}

//Gère l'envoi d'un paramètre char
void LCD_Character( unsigned char data){ //même concepte que pour commandgiver
        PORTD |= (1<<RS); //mode écriture
        PORTD = (PORTD & 0x0F) | (data & 0xF0);

        Read_bits();

        PORTD = (PORTD & 0x0F) | ((data << 4)&0xF0);
        Read_bits();
}

//Initialise le LCD et active les registres pour écrire
void LCD_Initializer (void){
        DDRD = (1<<D7)|(1<<D6)|(1<<D5)|(1<<D4)|(1 << EN)|(1<<RS); //met les pins en mode écriture
        _delay_ms(20);

        LCD_Commandgiver(RETOUR_CURSEUR); //retour du cursor à la position initiale
        LCD_Commandgiver(CONFIG); //data 8bits, 2 lignes font type 11 dots
        LCD_Commandgiver(SCREEN_ON); //allume l'écran
        LCD_Commandgiver(IO); //mode d'entré I/D
        LCD_Commandgiver(CLEAR); //clear l'écran
        _delay_ms(2);
}

//Gère l'envoi d'une chaîne de caractère au contrôleur
void LCD_String(char* str){
        int i = 0;
        while(str[i] != '\0'){
                LCD_Character(str[i]);
        i++;
        }
}

//Clear l'écran
void LCD_Clear(){
        LCD_Commandgiver(CLEAR);//clear l'écran
        _delay_ms(2);
        LCD_Commandgiver(LIGNE1);
}
//changer de ligne
void aller_ligne(int ligne){
        _delay_ms(5);
        if(ligne ==1)
                LCD_Commandgiver(LIGNE1);
        else if(ligne ==2)
                LCD_Commandgiver(LIGNE2);
        _delay_ms(5);
}

//fonction principale
int main(){
        LCD_Initializer();
        aller_ligne(1);
        LCD_String("texte ligne1");
        _delay_ms(100);
        aller_ligne(2);
        LCD_String("texte ligne2");
        _delay_ms(100);
        LCD_Clear();
}



Eventuellement la vidéo brève du fonctionnement complet du programmateur : Média:2025-PSE-09-systeme-final.mp4.