SE3Groupe2025-9
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 :
Résultat du routage :
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 :
Résultat du routage :
Photo de la carte soudée :
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.
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.
