Partie 3 - Conception électronique
Index :
- Partie 1: Post-mortem V0, objectifs et spécifications des V1
- Partie 2: Choix techniques
- Partie 3 (vous êtes ici) : Conception électronique
- Partie 4: Conception mécanique
- Partie 5: Conception logicielle
- Partie 6: Pré-série industrielle (construction de 200 lanternes)
- Partie 7: Post-mortem & conclusion
Ce chapitre est réservé à la conception du circuit intégré, utilisant les composants choisis dans la Partie 2.
Évaluation des optimisations de coût de fabrication
En première étape, j’ai réalisé une estimation avec les fabricants de PCB pour repérer les paliers d’augmentation de tarifs, à prendre en compte lors du design.
On sait déjà qu’on utilisera un composant BGA, ce qui nous oblige à utiliser une finition ENIG et des via de 0.3 mm.
Contraintes de fabrication :
- épaisseur minimum des tracks: 4 mil (0,1016 mm)
- espacement minimum des tracks: 4 mil (0,1016 mm)
- Diamètre interne minimum des Vias : 0.3 mm
- Via in padds: Normalement obligatoire pour les BGA, j’ai sacrifié plusieurs GPIO pour contourner la limitation. Pas nécessaire donc
- Nombre de couches : 4 minimum pour ce type de circuits
- Finition de la surface : ENIG (revêtement or)
- Composants sur un seul coté
Schématique
La première étape est de peupler les composants complémentaires des composants choisis durant la Partie 2.
C’est l’étape la plus longue et fastidieuse, ou il faut prendre les datasheet de chaque composants et sélectionner les composants qui vont lui permettre de fonctionner. La sélection des composants m’a pris plusieurs semaines, et je me suis aidé d’un LLM afin d’être sur de ne pas oublier de vérifier un des paramètres d’un composant.
Pas exemple, le BQ25713 nécessite des condensateurs avec un certain derating, voltage, capacité… Mais également des MOSFETs avec une dizaine de paramètres à vérifier, etc. Certains composants nécessitent des calculs pour obtenir les valeurs à sélectionner, c’est un gigantesque casse-tête.
Mais après plusieurs semaines à lire des documents techniques, plusieurs semaines à relier les composants entre eux, et plusieurs semaines à se relire pour vérifier qu’il n’y a pas d’erreurs, voici le résultat :
Chaque bloc logique est représenté par une boite, et les entrées sorties sont représentées par des flèches bleues. On peux remarquer que le microcontrôleur à des sorties GPIO, qui seront reliées à des emplacements physiques sur le PCB, afin de permettre d’utiliser cette carte électronique comme carte programmable standard.
Une fois que le schematics est posé, il est temps de passer au routage.
Conception du PCB
Forme générale
La première étape du routage va être de déterminer la forme du PCB, ce qui va contraindre le placement des composants.
Comme j’utilise un tube de diamètre interne 46 mm, je vais faire un PCB circulaire de 44 mm de diamètre afin d’avoir un peu de marge lors de l’installation. C’était une bonne décision en rétrospective, le diamètre interne des tubes n’était pas fiable.
Je vais ensuite ajouter des encoches circulaires de 3.4 mm de diamètre, à 60 degrés d’écart pour laisser passer des pièces mécaniques. Ces encoches asymétriques servent également à toujours installer le PCB de la même façon dans le tube. Cette régularité permet de calibrer une seule fois la position et rotation de l’IMU et réutiliser cette calibration dans toutes les lampes. Cela permet aussi d’avoir toujours les mêmes distances entre les connecteurs physiques et les connecteurs du PCB.
Zonage des composants
Maintenant que la forme du PCB est fixée, on doit déterminer ou vont aller les composants.
Chaque composant appartient à une catégorie, qui va déterminer sa position sur le PCB. Les composants de puissance seront placés à une extrémité du PCB, le plus loin possible des capteurs et des composants sensibles qui risqueraient d’être dérangés par leurs émissions. Les composants USB seront placés proches du port USB. Les capteurs seront placés le plus loin possible des composants de puissance et proche du microcontrôleur.
| Composant | Catégorie |
|---|---|
| NRF52840 | Contrôle, USB |
| FUSB302 | USB |
| TPD8S300 | USB |
| BQ25713 | Puissance / charge |
| BQ76905 | Batteries |
| TPS629206 | Puissance |
| UCS3205T | Puissance |
| LSM6DS3 | Capteur |
| Micro Mems | Capteur |
Le placement des composants contraint également le placement des ports de la carte. Sur l’image ci-dessous, vous pourrez noter la position du port des Leds, du port USB, du connecteur des batteries et des GPIO.
J’ai dû réduire le diamètre de deux points de la trace BGA du NRF52840 pour faire passer une piste entre deux connections. Ce n’est pas une pratique standard, mais sans avoir de via-in-pads, je n’avais pas le choix. Heureusement ça n’a posé aucun problèmes en fonctionnement.
Routage
J’utiliserai les rôles de couche suivante :
- Couche supérieure : Signal/puissance.
- Couche interne 1 : Common ground plane.
- Couche interne 2 : Power lines.
- Couche inférieure : Signal/puissance.
Ci-dessous, des images du placement des composants sur le PCB. Ce processus est itératif, je n’ai pas obtenu ce résultat en un essai, mais en plusieurs semaines de travail.
Je place d’abord les composants principaux, puis leurs condensateurs de découplage. Ces condensateurs doivent être au plus près de la pin à laquelle ils sont associés, et servent à réguler la tension en entrée.
Une fois ces composants placés, j’ajoute les plus gros composants (Inducteur, rangées de condensateurs, connecteurs sur circuit), puis les composants de puissance qui nécessitent des pistes larges et droites (MOSFET, Shunts).
L’antenne est placée dans une zone isolée du reste du circuit, et il faudra se rappeler lors du routage qu’aucuns fils ne doit passer à portée pour ne pas brouiller le signal.
Les composants de sécurité doivent être placés au plus près des éléments qu’ils protègent, en particulier les composants protégeant des décharges électrostatiques.
Une fois les composants principaux placés, on peut commencer le routage. C’est une étape que je trouve satisfaisante, comme résoudre un labyrinthe qui n’a pas forcément de solutions.
L’épaisseur des pistes et leur espacement minimum est la plus grosse contrainte, qui oblige de bien planifier certains passages étroits entre des composants. De même, le placement des vias (trous de connexion à travers le PCB) est critique et contraint beaucoup le routage.
Quelques règles générales s’appliquent pour éviter des problèmes de CEM (Compatibilité ÉlectroMagnétique) :
- Peu de pistes parallèles, surtout si elles transportent des signaux hautes fréquences.
- Des angles les moins aigus possibles sur les pistes, plutôt si elles transportent des signaux hautes fréquences.
- Croiser les pistes entre les couches : Une couche ne devrait pas être routée parallèlement à une autre couche.
- Ne pas séparer le plan de masse en sections. Garder la plus grande surface possible
- et bien d’autres, mais c’est un métier à part entière.
Certaines pistes doivent avoir une longueur égale à une autre, comme les pistes D+ et D- de l’USB, qui doivent avoir une longueur très similaire.
Les documentations de composants peuvent parfois recommander des agencements de pistes et plans. Il est important de les respecter dans la mesure où ces décisions font du sens. J’ai par exemple perdu beaucoup de temps à implémenter deux plans de masses (un pour la haute puissance et un pour la basse puissance), jusqu’à une consultation avec un ingénieur en électronique de mon entreprise qui m’a conseillé de ne pas le faire. Et après ces modifications, j’ai observé moins de problèmes qu’avec le design conseillé.
J’ai utilisé un port JTAG pour la programmation initiale du microcontrôleur. C’est un modèle de port sans composant, uniquement une trace sur le PCB, ce qui le rend gratuit à installer. Il nécessite cependant une sonde JTAG (70€) pour être utilisé. Dans mon cas, c’est très avantageux, car je peux économiser le coût du connecteur sur tous les circuits.
J’ai utilisé la même logique pour le port de Reset du microcontrôleur : plutôt qu’ajouter un bouton qui ne servira jamais, j’ai ajouté deux pads très proche, qui peuvent être touchés avec un objet conducteur pour remettre le microcontrôleur à zéro.
Un autre aspect important a été de penser en avance au placement des connecteurs sur une face du PCB. Le connecteur USB, le bouton et les Leds seront au-dessus du PCB, mais la batterie sera en dessous. J’ai donc placé le port femelle du connecteur XH en dessous du PCB.
Le dernier point important est la largeur des pistes. Certaines pistes de ce PCB vont transporter jusqu’à 3 ampères à 20 volts, et doivent avoir une grande largeur en conséquence. Cette largeur dépend de l’épaisseur des couches et la qualité du cuivre, et est donc dépendante du fabricant. Pour ma part, j’ai pu tester avec des prototypes que la largeur que j’avais choisis était suffisante.
On remarque bien sur cette image à quel point la place était limitée pour faire rentrer tous les composants.
J’ai fait en sorte que les lignes I2C traversent tout le PCB en gardant la même longueur, en les faisant également passé par des pads en dessous du PCB. Ces pads serviront à débugger les communications au besoin et ajouter des nouveaux composants sur la ligne au besoin.
Une fois tout ce processus terminé, le PCB est prêt à être construit.
Prototypes
La section précédente a présenté le résultat final d’un long processus. Je ne suis pas formé à la conception de circuits intégrés, et j’ai appris à l’usage (ce circuit est mon premier PCB custom), et j’ai donc fait mon lot d’erreurs.
En tout, six générations de prototypes de circuit ont été construits. Ils représentent la vraie temporalité du projet, avec tous les problèmes qui ont été corrigés. Les résolutions de ces problèmes ont été mentionnés dans les spécifications comme des données d’entrée, mais dans les faits, ils ont été le fruit d’un travail itératif.
Revenons sur ces prototypes et les causes de leur décès :
Prototype 1 : 5 circuits
Ce sont mes tout premier PCB custom, et en conséquence pas un seul ne fonctionne.
| Problème | Cause | Correction |
|---|---|---|
| Impossible de programmer la puce | Oublie d’un port de programmation bootloader | Ajout de pads reliés aux pins de programmation |
| Les batteries ne chargent pas avec moins de 14 V sur le port USB | Le chargeur est un buck, pas buck boost | Changement pour un chargeur buck-boost |
On peut voir sur ce circuit qu’un composant en haut a droite est réservé pour l’alimentation des Leds : c’est un contrôleur CC. Je n’avais pas encore réalisé que le mode OTG était capable de jouer ce rôle.
Proto 2 : 5 circuits
En utilisant le port de programmation, j’ai cette fois pu ajouter un bootloader qui permet de programmer les circuits via USB.
Cette fois-ci le circuit est bien programmable via USB, et j’ai pu tester avec succès la charge des batteries et l’alimentation externe des Leds.
| Problème | Cause | Correction |
|---|---|---|
| USB jamais détecté | Résistance qui produit un drop de tension trop fort sur VBUS | Enlever cette résistance |
| Composant USB-PD pas présent sur la ligne I2C | Cause inconnue | Changement pour un composant similaire avec le même format et pinout |
Ce circuit comporte déjà les traits du circuit final, avec son port de programmation et le port de reset en pads, et le module de charge de la famille BQ257.
Il n’est pas équipé d’un équilibreur, car mon plan initial était de créer un circuit à part avec un BMS et un équilibreur dessus. La lampe aurait donc eu deux PCB custom. Quand j’ai gagné en maturité sur la conception de circuits intégrés, j’ai vite corrigé ce design inefficace.
Proto 3 : 5 circuits
| Problème | Cause | Correction |
|---|---|---|
| Rien ne fonctionne, pas de réponse USB, pas de possibilité de flasher le bootloader… | L’usine à assembler le BQ257 avec la mauvaise orientation | Dessouder et ressouder le composant |
J’ai grillé 3 circuits avant de comprendre la cause du problème. L’usine (via JLC-PCB) a refusé tout remboursement et m’a à la place fournie un bon d’achat d’une valeur de 2.5% le montant de la commande. J’ai donc changé de fournisseur et je ne travaillerai plus jamais avec eux.
J’utilise maintenant PCB WAY, qui sont plus chers, mais dont je n’ai jamais eu à me plaindre. Leur travail est à mon avis de bien meilleure qualité.
Après réparation des deux derniers circuits encore fonctionnels, j’ai pu continuer les tests de cette génération.
La négociation USB-PD fonctionne sans accrocs, la charge des batteries est parfaite, le circuit est stable en tension et température. L’alimentation des Leds fonctionne sans accros également.
| Problème | Cause | Correction |
|---|---|---|
| Si VBUS monte au-dessus de 15V, le PCB brûle | La méthode utilisée pour avoir un VBUS 5V est mauvaise | Remplacement de la diode Zener par un LDO |
| Les GPIO se détruisent quand le ruban Leds est alimenté | Une des GPIO est utilisée pour mesurer la tension de la sortie Leds, qui monte bien au-dessus de la limite de voltage (à cause du contrôleur CV) | Ne pas mesurer la tension de sortie avec une GPIO |
Proto 4 : 10 circuits
Avec la dernière génération en grande majorité fonctionnelle, j’ai commandé plus de PCB qu’avant.
Sur les 10 circuits, cinq fonctionnent parfaitement !
Les autres ont été détruits dans des tests assez violents. J’ai par exemple tenté d’alimenter un ruban RGB avec le contrôleur CV, ce qui a juste produit des surtentions sur la GPIO de contrôle des Leds indexables. D’autres tests de sureté sur les surtensions/courants sur VBUS et la batterie ont aussi eu raison de certains circuits.
| Problème | Cause | Correction |
|---|---|---|
| un des circuits plante régulièrement | Pas confirmée, mais surement due aux oscillateurs pas adaptés au NRF52840 | Remplacement des oscillateurs plus compatibles |
| Les chargeurs USB-PD plantent quand brancher | Appel de courant trop fort par le BQ257 | Ajout de la VBUS gate |
| Mode OTG refuse de démarrer | Une des conditions d’activation n’est pas respectée : VBUS < 3.2 V | Ajout de la VBUS gate |
Cette version était encore avec des batteries 18650 en configuration 4S1P, et nécessitait le PCB supplémentaire pour faire BMS et équilibreur.
J’ai utilisé les 5 circuits fonctionnels pour construire cinq lanternes, prêtées à des amis pour qu’ils puissent tester et éprouver le système.
Proto 5 : 10 circuits (V1.0)
10/10, tous les circuits sont fonctionnels !!
Cette version est la première à utiliser le mode OTG comme alimentation des Leds, et a donc aussi ajouté la Output gate. Elle est par ailleurs la version ou l’équilibreur et d’autres sécurités font leur apparition sur le même PCB. La configuration des batteries a aussi été changée pour des batteries 21700 en configuration 3S1P.
Utilisation du port et de la sonde JTAG pour flasher les bootloader plutôt que les fils à souder comme précédemment.
Cependant, ces circuits ne fonctionnaient pas dès la réception :
| Problème | Cause | Correction |
|---|---|---|
| Bootloader flashable, mais sans réponse | utilisation de condensateurs 10 µF plutôt que 10 nF autour des oscillateurs | Remplacer par des 10 nF |
| L’output gate est toujours passante | Un MOSFET P a été échangé avec un P | Changer le MOSFET pour un type P |
| Si VBUS > 15 V, les Leds indexables explosent | Utilisation d’une low side gate, fuites de courant via le fil de contrôle indexable | Changement pour une high side gate. Temporairement arrangé avec une diode |
| Léger scintillement des Leds jaunes | Inconnue | Inconnue |
Sur cette génération, j’ai commencé à fatiguer de faire des cours circuits en soudant les fils de batteries (hot wires), et j’ai donc ajouté le connecteur XH sur la prochaine.
Le PCB commence à être bien mature, la prochaine génération sera celle de la production de masse.
Génération 6 : 300 circuits (V1.1)
La dernière génération est celle qui servira lors de la petite production de 200 lanternes.
Le circuit est déjà fonctionnel, mais j’ai quand même risqué des modifications de dernier moment :
- Utilisation de la High side gate. C’était risqué de ne pas tester ce changement sur un PCB avant, mais j’ai effectué des dizaines de tests avec les composants exacts avant de passer commande donc j’étais assez sûr de moi.
- Ajout de pullups sur beaucoup de lignes en ayant besoin plutôt que se reposer sur les pullups intégrés au NRF52840.
- Remplacement des MOSFET P par une autre version identique, mais avec une tolérance à 30 V plutôt que 20 pour avoir une marge de sécurité. Ce changement était risqué sans tester le composant en avance.
- Ajout d’une diode sur la ligne 3.3 V disponible à l’utilisateur.
- Remplacement des résistances de l’équilibreur par des versions plus petites. Elles chaufferont plus, mais me permettent d’utiliser un connecteur de batterie JST-XH.
La commande totale s’élève à 6364€, et l’attente commence… Les circuits arrivent un mois plus tard et les tests effectués dans l’anxiété révélèrent que tout fonctionne parfaitement !
Les circuits V1.1 ont tout de même des petits problèmes, que j’ai corrigé pour la V1.1 pour la plupart :
- Les rubans jaunes scintillent : C’est à peine visible, mais je mesure une oscillation de 15 Hz avec une amplitude de quelques millivolts qui suffit à produire un scintillement visible. Je n’ai toujours pas trouvé la cause.
- Quand le système est très chaud, un voltage de 4.5 V apparait sur VBUS même si aucun cable USB n’est branché. J’ai identifié que ce voltage provient d’une diode Schottky qui devient passante au-dessus de 70°C. Ajout d’une pulldown sur la ligne VBUS_5V. En attendant, j’ai développé un fix Software pour les circuits V1.0.
Et on y est ! Des circuits fonctionnels, tout le design en place, il est temps de construire des lampes.
Conclusion
Après 5 prototypes, la version 6 est fonctionnelle et prête à être intégrée.
Le design à été revu avec un ingénieur qualifié avant le prototype 5, et ces circuits sont déjà en circulation depuis octobre 2025 avec beaucoup de succès.
La Partie 4 portera sur la conception mécanique des lampes.