SE3Groupe2025-2
Programmation des systèmes embarqués
Programmeur.
Carte électronique
Carte réalisée en utilisant le logiciel KiCAD : Fichier:2025-PSE-2-Prog.zip.
Schéma électronique de la carte :
Résultat du routage :
Résultat du routage en 3D:
Photo de la carte soudée :
Vidéo très courte et en basse résolution de la carte en fonctionnement :
Programmation
Pour tester notre carte on a fait des codes simples.
Teste de la carte
led_blink
// Clignote les 3 LEDS
#include <avr/io.h>
#include <util/delay.h>
#define BLINK_DELAY 50 // en milli secondes
// PB 5, 6, 7 correspond respectivement aux leds 1 , 2 , 3
int main()
{
// configurer les led en sortie :
DDRB |= (1 << 5); // PORTB 5e bit pour la LED1
DDRB |= (1 << 6); // PORTB 6e bit pour la LED2
DDRB |= (1 << 7); // PORTB 7e bit pour la LED3
for (int i = 0; i < 50; i++)
{
// led on
PORTB |= (1 << 5); // OR
PORTB |= (1 << 6);
PORTB |= (1 << 7);
_delay_ms(BLINK_DELAY);
// led off
PORTB &= ~(1 << 5); // AND + NOT
PORTB &= ~(1 << 6);
PORTB &= ~(1 << 7);
_delay_ms(BLINK_DELAY);
}
return 0;
}
boutons
#include <avr/io.h>
#include <util/delay.h>
#define b7 0b10000000
#define b6 0b01000000
#define L5 0b11011111
#define L6 0b10111111
#define L7 0b01111111
void config()
{
DDRB |= (1 << 5);
DDRB |= (1 << 6);
DDRB |= (1 << 7);
DDRC &= 0x00;
// Activation des résistances de Pull-Up internes sur le port C
PORTC |= (b6 | b7);
}
int lire_bouton(int bouton)
{
return (PINC & bouton) == 0;
}
void ecrire_LED(int LED, int etat)
{
switch (etat)
{
case 0:
PORTB &= LED; // Applique le masque avec le 0 pour éteindre
break;
case 1:
PORTB |= ~LED; // Inverse le masque pour avoir un 1 et allumer
break;
}
}
int main()
{
config();
while (1)
{
if (lire_bouton(b6) && lire_bouton(b7))
{
ecrire_LED(L7, 1);
ecrire_LED(L6, 0);
ecrire_LED(L5, 0);
}
else if (lire_bouton(b7))
{
ecrire_LED(L5, 1);
}
else if (lire_bouton((b6)))
{
ecrire_LED(L6, 1);
}
else
{
// On éteint tout si aucun bouton n'est pressé
ecrire_LED(L6, 0);
ecrire_LED(L5, 0);
ecrire_LED(L7, 0);
}
}
return 0;
}
LUFA
connexion avec minicom
On a récupéré le dossier LUFA depuis le wiki du cours. Puis on a récupéré le fichier VirtualSerial situé dans lufa-LUFA-210130-NSI/Demos/Device/ClassDriver/VirtualSerial.
L'objectif ici est de communiquer grâce à la LUFA en USB sur minicom.
On injecte le code sur la carte :
dfu-programmer atmega16u2 erase --force ✔
sudo dfu-programmer atmega16u2 flash --suppress-bootloader-mem VirtualSerial.hex
sudo dfu-programmer atmega16u2 reset
Erasing flash... Success
Checking memory from 0x0 to 0x2FFF... Empty.
Checking memory from 0x0 to 0xEFF... Empty.
0% 100% Programming 0xF00 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
0% 100% Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
Validating... Success
0xF00 bytes written into 0x3000 bytes memory (31.25%).
et on observe bien un changemenat de nom de notre carte :
lsusb ✔
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0408:a061 Quanta Computer, Inc. HD User Facing
Bus 001 Device 003: ID 8087:0026 Intel Corp. AX201 Bluetooth
Bus 001 Device 005: ID 046d:0aba Logitech, Inc. PRO X Wireless Gaming Headset
Bus 001 Device 012: ID 046d:c08b Logitech, Inc. G502 SE HERO Gaming Mouse
Bus 001 Device 016: ID 03eb:2044 Atmel Corp. LUFA CDC Demo Appli
Bilan
Séance du 03/03
Soudure presque terminée. LEDs et résistances associées manquantes, 1 bouton poussoir traversant manquant.
Séance du 10/03
- Problème : le programmateur n'est pas détecté en USB. Un erreur est détectée ce qui montre qu'il y a une connexion, mais n'apparaît pas dans
lsusb. - Programmable : La connexion en ISP en revanche fonctionne. On pourra donc programmer les leds et les boutons avec une UNO. Voir dans le futur si on peut fixer le problème de l'USB pour rendre le programmateur fonctionnel.
- ajout d'un premier
blink_led.c(brouillon) au git - TESTS : Le code
blinkfonctionne mais pas le codeboutons-> faut contact / pbs de soudure sur les pattes
Séance du 11/03
LEDS et boutons fonctionnent -> attente de réparation de notre USB par le prof ou fin de projet pour le programatteur.
08/04
Nouvelle carte imprimée et détéction de notre carte via lsusb.
Eventuellement la vidéo brève du fonctionnement complet du programmateur : Média:2025-PSE-B2-PROG-final.mp4.
Premier système embarqué
Archive GIT
Notre archive GIT pour le projet KiCAD et pour les programmes : https://gitea.plil.fr/mterrier/2025_PSE_B2_mterrier_jramesh
Structure avec matériel (y compris production - gerber, bill of materials) / logiciel / documentation (e.g. documentation technique).
Description du système embarqué
Nous avons décider de réaliser BMO, un système comportant un écran affichant un visage minimaliste, munis d'un détécteur de mouvement et d'un buzzer.
Lorsque notre main s'approche de détécteur, le visage plisse les yeux (ou devient triste). Lorsque notre main s'écarte de celui ci, le visage réouvre les yeux (ou devient heureux).
Le système sera alimenté par une batterie, ou une alimentation USB en 5V.
Afin de valider l'utilisation du port USB, nous connecterons un ordinateur au système via USB et éffectuerons un transfert de données sonores (divers sons) qu'on ira stocker dans la flash.
On a ajouté 2 servos moteurs pour faire office de bras. On pourra s'en servir pour proposer plus d'interactions.
Historique des Scéances
S1 (17/02/26):
- Modification initiale du wikicode
- Brainstorming pour se décider sur un projet
S2 (03/03/26): Début de la schématique
- Encodeur: voir si on peut en utiliser un pour régler le son/luminosité écran.
- Connecteur ISP (le même que le programatteur)
- USB-A, condensateurs de découplage, condensateur VUSB.
- Chargeur Lipo (le même que celui du wiki donc à modifier selon notre schéma).
- haut parleur : 8 entrée DAC.
- Ecran : 11 entrée (8 affichage et 3 gestion).
- Cerveaux moteur optionnels si on a pas assez de ports
- Voir comment connecter la flash.
S3 (10/03/26):V1 schématique
-
Push de la V1 sur le git.
S4 24/03/26): corrections + modification chargeur LIPO
- Correction de la V1, et ajout des connecteurs pour le chargement de la batterie/ choix de l'alimentation / connecteur batterie
- Routage : début, du placement des composants. A FAIRE:
- Demander les composants physique tel que le buzzer et le cerveau moteur
- On a enlevé des pins sur l'AVR qui étaient pris inutilement par la batterie LIPO => voir si on ne peut pas rajouter un cerveau moteur et des boutons à la place.
- Tension : Analyser les composants qui nécéssitent 5V de tension pour ajouter un booster de tension pour garder le 5V en batterie (3,3V). Inversement mettre un régulateur de tension sur les composants fonctionnant en 3,3V, lors de l'alimentation en 5v. Convertisseur : TPS61033-Q1
(29/03/26):push de la V2 de la schématique
- Ajout du booster de tension TPS61033-Q1 pour l'écran, le LM386, le capteur ultrason et les 2 cervosmoteur.
- Ajout d'un régulateur de tension pour la flash.
- Ajout de la section "Détail schématique" et première explication du boost et régulateur de tension.
- A FAIRE:
- Demander les composants physique disponibles : buzzer et les cerveaux moteur
- Demander une vérification de la V2 pour avancer sur le routage
S5 (31/03/26):Correction de la V2
- Correction de la V2, changement de booster et du regulateur pour simplifier le comosant et la commande sur Farnell. A FAIRE
- Modifier la section "détail de la schématique" en conséquence et revoir le dimsensionnement des composants.
S5 ((04-05)/04/26):V1 Routage
- Ajout du shifter pour la flash.
- V1 routage : Alimentation en 0.8mm, pas d'angles droits, DRC au maximum, annotation avec du texte en silkscreen.
Carte électronique
Carte réalisée en utilisant le logiciel KiCAD : ma carte électronique.
Schéma électronique de la carte :
Résultat du routage :
Résultat du routage en 3D :
Photo de la carte soudée :
Vidéo très courte et en basse résolution de la carte en fonctionnement :
Média:2025-PSE-02-systeme-video.mp4
Détail de la schématique
Booster de tension
-
Pour alimenter la logique (écran LCD, capteur ultra son, Haut parleur) et surtout les servomoteurs depuis la batterie de 3.3V, le choix s'est porté sur le régulateur boost TPS61033-Q1. La broche FB est reliée directement à l'entrée (VIN) pour fixer la tension de sortie à 5.0V en interne, rendant inutile l'usage d'un pont diviseur. La broche EN est maintenue à VIN pour un fonctionnement continu, tandis que la broche MODE est à la masse (GND) pour activer le mode Auto PFM. Ce mode garantit un excellent rendement énergétique à faible charge, ce qui est crucial pour économiser la batterie lorsque les moteurs sont à l'arrêt.
Pour gérer la décharge lors de l'extinction, une résistance de 1kΩ (Rdummy) est placée sur la broche PG. Cela tire seulement 5mA (bien en deçà de la limite de 50mA imposée par le transistor à drain ouvert) et assure une chute de tension propre et rapide en un quart de seconde.
Côté puissance, les servomoteurs SG90 imposent des pics de courant importants (estimés à 1.5A au total au démarrage). Pour éviter les chutes de tension critiques (brownouts), les capacités de filtrage ont été dimensionnées avec une marge de sécurité : 22µF en entrée et 47µF en sortie pour compenser la perte de capacité sous tension continue. Le cœur du convertisseur est une inductance de 0.47µH. En considérant un rendement (η), soit environ 40.6%. Le courant continu moyen demandé à la bobine se calcule via , soit environ 2.53A. En y ajoutant la moitié de l'ondulation crête-à-crête , le courant de crête absolu atteint , soit 3.12A. L'inductance choisie doit donc impérativement présenter un courant de saturation supérieur à 3.5A pour garantir la stabilité du système en pleine charge. C'est pour cela qu'on a choisi comme conseillé dans la datasheet l'inductance XGL4020-471MEC qui peut avoir un courant de saturation allant jusqu'à 6,1A.
Régulateur de tension
-
Pour alimenter la mémoire flash AT45DB641E, qui requiert une tension de fonctionnement < 3,6V, le choix s'est porté sur le convertisseur LTC3531-3.3. Contrairement à un régulateur linéaire (LDO) qui dissiperait l'excédent de tension sous forme de chaleur, ce composant est un régulateur de type Buck-Boost synchrone. Cette topologie permet de maintenir une sortie de 3,3V parfaitement stable, que la tension d'entrée provienne du 5V ou directement de la batterie.
Le dimensionnement des composants périphériques s'appuie sur les recommandations strictes du constructeur. L'inductance de puissance a été fixée à une valeur standard de 10 µH. Cette valeur est optimisée par le fabricant pour limiter l'ondulation du courant et maximiser le rendement énergétique à faible charge (la mémoire flash consommant au maximum ~25 mA lors des cycles d'écriture/effacement).
En entrée, un condensateur CIN = 4.7 µF est chargé d'absorber le bruit haute fréquence et les appels de courant transitoires liés au hachage interne du régulateur. En sortie, un condensateur COUT = 10 µF est implanté au plus près de la broche VCC de la mémoire. Le respect de ces valeurs (L = 10 µH, CIN = 4.7 µF, COUT = 10 µF) garantit que les appels de courant soudains de la puce SPI ne provoqueront aucune chute de tension hors des tolérances logiques.
Bilan
Eventuellement la vidéo brève du fonctionnement complet du programmateur : Média:2025-PSE-B2-systeme-final.mp4.

