Portfolio GEII
Rapport · SAE Asteroids · 11 / 12

Bilan, perspectives & conclusion

Compétences mises en œuvre, objectifs atteints au regard du cahier des charges, le fil rouge technique du projet, pistes d'amélioration et conclusion personnelle du binôme.

Ce dernier chapitre referme le rapport en prenant de la hauteur sur l'ensemble du travail mené. Après avoir détaillé, tout au long des chapitres précédents, chaque sous-ensemble matériel et chaque mécanisme logiciel, il s'agit ici de dresser le bilan global du projet, de confronter méthodiquement le résultat au cahier des charges, de rappeler le fil rouge technique qui a guidé tous les choix, puis d'ouvrir sur les améliorations envisageables. Le chapitre se conclut sur le retour personnel du binôme Emma Grosmaire et Dorian Sausse, du groupe C, au terme de cette SAE de deuxième semestre.

Bilan du projet : compétences mises en œuvre

La SAE avait pour ambition de couvrir l'intégralité de la chaîne de conception d'un système embarqué, depuis l'idée jusqu'au prototype démontrable. À ce titre, le projet a effectivement mobilisé un large éventail de compétences techniques, complémentaires les unes des autres.

La conception mécanique a été menée sous SolidWorks, pour modéliser le support et l'enveloppe destinés à accueillir l'écran, la manette et la carte son, et pour vérifier la cohérence dimensionnelle de l'assemblage (cotes exactes à confirmer). La conception électronique s'est appuyée sur KiCad 9 : tracé du schéma de la carte son autour de l'amplificateur LM386, routage du circuit imprimé double face de 45 mm × 45 mm en composants traversants (THT), puis génération des fichiers de fabrication (Gerbers : couches cuivre F_Cu et B_Cu, masques de soudure, sérigraphie, perçages PTH et NPTH).

La réalisation et le brasage du PCB ont prolongé naturellement cette phase : à la réception du circuit nu, le binôme a brasé au fer à souder les composants traversants, effectué un contrôle visuel des soudures, recherché d'éventuels courts-circuits et mesuré la continuité des pistes. Le développement embarqué a été conduit sous MPLAB X IDE avec le compilateur XC8 et l'outil MCC (MPLAB Code Configurator), depuis la configuration des périphériques du PIC16F18877 - convertisseur ADCC, bus SPI1 (MSSP1) et oscillateur numériquement commandé NCO1 - jusqu'à l'écriture de la logique de jeu, du moteur de rendu graphique et de la génération sonore.

Enfin, le câblage et l'intégration ont relié physiquement l'ensemble - écran ILI9488, manette à base de PIC, carte son et alimentation - et la validation expérimentale a consisté à éprouver la jouabilité réelle, à corriger les défauts observés et à confirmer que matériel et logiciel coopèrent de façon fiable. Cette diversité de compétences, exercée sur un même objet cohérent, constitue sans doute l'apport le plus précieux du projet.

Objectifs atteints

Il convient à présent de reprendre point par point les objectifs fixés dans le cahier des charges et de vérifier qu'ils sont effectivement remplis.

  • Architecture matérielle complète. Le système intègre les trois grands ensembles prévus - interface utilisateur (écran et manette), carte son dédiée et microcontrôleur jouant le rôle d'unité centrale - avec une répartition claire des fonctions sur les broches du PIC. Objectif atteint.
  • Carte son fonctionnelle. L'amplificateur audio basse tension à base de LM386 (boîtier DIP-8, gain fixé à 20) a été conçu, fabriqué et câblé. Il reçoit le signal issu de la broche RA6 (sortie du NCO1, patte 14) sur l'entrée J2 (Audio_In), l'amplifie, et le restitue vers le haut-parleur via J3 (Audio_out), le tout réglable en volume par le potentiomètre RV1 de 10 kΩ. Objectif atteint.
  • Mise en œuvre du PIC16F18877. Le microcontrôleur 8 bits, boîtier 40 broches PDIP, cadencé par l'oscillateur interne HFINTOSC à FOSC = 32 MHz (cycle d'instruction Tcy = 125 ns), a été configuré via MCC - ADCC 10 bits pour le joystick, SPI1 maître en mode 0 pour l'écran, NCO1 pour le son - et exécute l'intégralité du programme applicatif. Objectif atteint.
  • Interface écran et manette. L'écran TFT ILI9488 480 × 320 en mode paysage (setRotation(3)) affiche le jeu en temps réel, tandis que la manette - joystick analogique deux axes (axe X sur RC7, axe Y sur RC6) et boutons-poussoirs actifs à l'état bas - assure la commande du vaisseau, le tir (bouton B, RD6) et la navigation entre écrans (bouton C, RD5). Objectif atteint.
  • Logiciel embarqué. La logique de jeu, organisée autour d'une machine à états à quatre écrans (MENU, RÉGLAGES, JEU, GAME OVER), le moteur graphique reposant sur les trois niveaux de bibliothèques (pilote bas niveau ili9488, librairie graphique GFX_Library, code applicatif main.c) et la génération sonore fonctionnent de concert. Objectif atteint.
  • Prototype intégré. L'ensemble forme un prototype fonctionnel, testé et démontrable, où l'on joue effectivement à un Asteroids fluide : détruire un astéroïde rapporte +10 au score, tandis qu'une collision avec le vaisseau déclenche le GAME OVER. Objectif atteint.

L'ensemble des exigences du cahier des charges est donc satisfait : le projet aboutit non pas à une simple maquette de laboratoire, mais à un système cohérent et utilisable.

Le fil rouge technique : ménager un microcontrôleur lent

S'il fallait retenir une seule idée directrice de ce projet, ce serait celle-ci : tout le logiciel a été pensé pour tirer le meilleur parti d'un microcontrôleur modeste. Le PIC16F18877 ne possède aucune unité de calcul en virgule flottante matérielle ; chaque opération sur des réels (cosinus, sinus, racine carrée) est émulée par logiciel et donc coûteuse en cycles. Trois stratégies, déclinées tout au long du rapport, en découlent directement.

Fil rouge du projet

Ménager un microcontrôleur 8 bits dépourvu de FPU : déplacer le calcul du temps réel vers le temps de compilation, ne redessiner que ce qui change, et comparer les distances au carré pour éviter la racine carrée.

Éviter le flottant en cours de jeu

Plutôt que de calculer l'orientation du vaisseau par des fonctions trigonométriques, le programme exploite le fait que le vecteur normalisé du joystick vaut déjà (cos, sin). On dispose ainsi gratuitement du couple shipCos, shipSin sans appeler atan2, cos ni sin. De même, le demi-angle arrière du vaisseau est figé sous forme de constantes précalculées (COS245 = −0,7705 et SIN245 = 0,6374, soit le cosinus et le sinus de 2,45 rad), ce qui évite tout calcul trigonométrique répété à l'affichage. Cette approche illustre une règle d'or de l'embarqué : déplacer le calcul du temps réel vers le temps de compilation.

Ne redessiner que ce qui change

Le moteur de rendu n'efface jamais l'écran entier à chaque image. Il applique le principe effacer / déplacer / redessiner : un objet est repeint en noir à son ancienne position, puis dessiné à sa nouvelle position. Le seuil ANGLE_REDRAW_DOT = 0,9997 (un produit scalaire correspondant à un écart d'environ 1,4°) évite même de redessiner le vaisseau tant que son orientation n'a pas suffisamment varié. On économise ainsi un grand nombre d'écritures coûteuses sur le bus SPI, où chaque pixel coûte trois octets (couleur 18 bits).

Comparer les distances au carré

Pour la détection des collisions, comparer une distance à une somme de rayons exigerait une racine carrée. En élevant les deux membres au carré, on remplace cette opération coûteuse par de simples multiplications, sans rien perdre en exactitude - l'équivalence d ≤ r ⇔ d² ≤ r² étant rigoureusement vraie pour des grandeurs positives. Concrètement, le test d'impact ne s'écrit pas avec sqrtf mais sous la forme suivante :

float dx = ax - bx;
float dy = ay - by;
float r  = AST_RADIUS + BULLET_RADIUS;
if (dx*dx + dy*dy <= r*r) {
    /* collision : asteroide touche */
}

Ligne par ligne : dx et dy calculent l'écart de coordonnées entre les deux objets (par exemple un astéroïde et un projectile) ; r est la somme des deux rayons, c'est-à-dire la distance en dessous de laquelle les deux disques se chevauchent ; enfin le test compare le carré de la distance dx*dx + dy*dy au carré du seuil r*r. On n'extrait jamais la racine carrée : trois multiplications et une comparaison suffisent. Ce compromis entre exactitude géométrique et coût de calcul résume à lui seul l'esprit du projet.

On retrouve la même philosophie côté son : le NCO1, dont l'accumulateur 20 bits est cadencé par FOSC/4 = 8 MHz, délivre une fréquence f = (8 000 000 × NCO1INC) / 2²⁰ ≈ NCO1INC × 7,6294 Hz. Pour fixer un ton, le code écrit NCO1INC = frequence >> 3, c'est-à-dire une division par 8 réalisée par simple décalage de bits. Le facteur exact serait 0,1311, mais 1/8 = 0,125 en est une excellente approximation, instantanée pour le processeur - un nouvel exemple où l'on préfère un décalage entier à une multiplication flottante.

Perspectives d'amélioration

Le prototype étant fonctionnel, plusieurs axes d'amélioration peuvent être envisagés pour une version ultérieure.

  • Miniaturisation. L'intégration mécanique gagnerait à être resserrée : boîtier plus compact, regroupement des cartes, soin apporté au cheminement des câbles afin d'obtenir un objet plus proche d'un produit fini.
  • Optimisation logicielle. Le moteur de rendu et la boucle de jeu pourraient être affinés davantage, par exemple en réduisant encore les zones redessinées ou en remplaçant certaines opérations flottantes résiduelles (positions et vitesses des projectiles et astéroïdes, aujourd'hui en float) par de l'arithmétique entière en virgule fixe.
  • Améliorations audio. La génération sonore, aujourd'hui limitée à un canal unique piloté par le NCO1, pourrait évoluer vers plusieurs voix simultanées ou la lecture de courtes mélodies, pour enrichir l'ambiance sonore du jeu.
  • Nouvelles fonctionnalités de jeu. Le gameplay pourrait s'étoffer : introduction de niveaux de difficulté croissante, système de vies, astéroïdes se fragmentant en plus petits morceaux lorsqu'ils sont touchés, ou encore sauvegarde du meilleur score pour ajouter un enjeu de progression.

Ces pistes confirment que l'architecture retenue est extensible et que le projet peut servir de base solide à des développements futurs.

Conclusion personnelle du binôme

Au terme de cette SAE, Emma Grosmaire et Dorian Sausse retiennent une expérience particulièrement formatrice. Le projet a eu le mérite de relier entre elles des compétences souvent abordées séparément en formation : la conception mécanique sous SolidWorks, l'électronique analogique (la carte son à LM386), la fabrication d'un circuit imprimé et la programmation embarquée se sont ici rejointes au service d'un même objectif concret et motivant. Contraints par les limites d'un microcontrôleur 8 bits dépourvu de calcul flottant matériel, ils ont compris de façon tangible pourquoi certaines optimisations - éviter le flottant, ne redessiner que l'essentiel, raisonner sur des distances au carré - ne sont pas de simples astuces mais des réflexes d'ingénieur.

Le travail en binôme a également constitué un apprentissage en soi : répartition des tâches selon les affinités, mise en commun régulière des avancées, partage des phases d'intégration et de test, et résolution conjointe des difficultés rencontrées. Voir le prototype fonctionner - un vaisseau qui pivote au centre de l'écran, des projectiles qui détruisent les astéroïdes, un score qui grimpe de dix en dix et un son qui accompagne l'action - a procuré une réelle satisfaction, à la hauteur de l'investissement consenti.

Prototype du jeu Asteroids en fonctionnement
Figure - le prototype du jeu Asteroids en fonctionnement, écran de menu sur l'écran ILI9488.