Les circuits imprimés ou PCB (pour printed circuit board) ont prouvé leur valeur grâce aux densités de composants et à la fiabilité de connexions qu’ils permettent d’atteindre. Depuis peu, ces modes de fabrication jusqu’alors réservés à l’industrie sont devenus accessibles pour les particuliers grâce à des entreprises qui proposent de les fabriquer à partir d’un fichier informatique et de les envoyer pour des sommes très faibles (de l’ordre de la dizaine d’euros).

Dans ce post, nous allons apprendre les bases de la conception de circuits imprimés et ses différentes étapes. Nous utiliserons KiCad, un logiciel open source et puissant, pour concevoir un PCB simple. Cet article étant une description générale et non pas un tutoriel, nous ne nous attarderons pas sur la prise en main de KiCad mais il est assez facile de trouver de la documentation en ligne si vous ne l’avez jamais utilisé. Notre PCB contiendra une LED, un potentiomètre et un microcontrôleur. Le but est de faire clignoter la LED plus ou moins vite selon l’état du potentiomètre. Nous aurons donc besoin de ces 3 composants ainsi que de quelques autres composants que nous détaillerons plus tard.

Le processus de conception d’un PCB se découpe en deux grandes étapes : La conception des schémas électroniques et le placement des composants et connexions sur la carte finale.

Le schéma électronique

Nous allons donc commencer par dessiner les schémas électroniques de notre PCB. Le but de cette étape est de définir les composants et leurs connexions. Chaque composant est représenté par un symbole qui est simplement un visuel matérialisant le composant, son nom et ses entrées/sorties.

La LED

Le premier circuit que nous allons créer est celui de la LED. Nous avons donc besoin du symbole associé à une LED (sur KiCad appuyer sur A puis sélectionner LED dans la liste de symboles disponibles par défaut) et une résistance (sur KiCad chercher R). Pour cette résistance nous choisirons une valeur de 330 Ohm (simplement car j’en ai déjà en stock). Avec cette valeur le courant sera d’environ 9 mA ce qui est amplement suffisant pour allumer la LED : 5V (tension d’alimentation) – 2V (tension directe de la LED) => 3V / 330 Ohm = 9 mA. Pour appliquer cette valeur sur KiCad, sélectionner la résistance, appuyer sur E et écrire 330 dans « Valeur ». Nous avons donc une LED et une résistance mais il faut les alimenter maintenant. Pour cela, la borne + de la LED sera connectée directement au microcontrôleur et le côté opposé de la résistance sera connecté à la masse. Pour la connexion au microcontrôleur nous allons utiliser un label. Un label est une connexion utilisant un nom au lieu d’un fil. Connecter un label X sur un pin du microcontrôleur et le même label X sur la borne + de la LED aura pour effet de connecter les deux sans avoir à utiliser un fil qui traverse le schéma électronique. C’est donc exactement ce que nous allons faire mais en utilisant un nom plus explicite, « LED » par exemple. Pour la masse, nous pourrions utiliser un label MASSE mais KiCad en fournit déjà un avec un symbole associé. Pour le trouver, appuyez sur A et cherchez GND.

LED

Le potentiomètre

Pour déterminer la vitesse à laquelle on veut que la LED clignote, nous allons utiliser un potentiomètre. Pour cela, on va faire varier une tension entre 0V et 5V puis la lire via un ADC (analog to digital converter) dans le microcontrôleur. On peut utiliser un potentiomètre externe à 3 pins qui fait varier la résistance entre les pins 1 et 2 entre 0 et 100% de la résistance entre les pins 1 et 3 (voir schéma ci-dessous). Quand le potentiomètre est au minimum la résistance A est très faible car les pins 1 et 2 sont directement connectés. Quand il est au maximum elle est très élevée. En connectant la masse au pin 1 et 5V au pin 3, on obtient donc une tension variable que l’on peut lire sur le pin 2. Comme le potentiomètre est externe, nous n’allons pas le représenter par un symbole dédié, mais par un connecteur. Nous utiliserons un pin socket (petit connecteur noir sur lesquels on peut facilement brancher des câbles). Mais, pour l’instant, comme nous sommes dans le schéma électronique, nous ne nous occupons pas de ce type de détails. On veut un connecteur générique à 3 pins. Pour ajouter un connecteur, cherchez Conn et sélectionnez la version 01x03 female.

Potentiometre

Le microcontrôleur

Maintenant on va ajouter le microcontrôleur. Nous allons utiliser un ATmega328p en package TQFP32 (pour Thin Quad Flat Package avec 32 pins: celui présent sur la Arduino Nano). C’est un microcontrôleur très commun donc il est déjà présent dans les librairies de symboles de KiCad. Pour le trouver tapez Atmega328p et prenez la variante A.

ATmega

On va évidemment avoir beaucoup de choses à connecter. Pour voir quelles fonctionnalités sont associés à chaque pin on peut lire la datasheet ou utiliser les images récapitulatives que l’on trouve en cherchant « Atmega328p pinout » sur Google.

Pinout

On choisit donc un pin ayant un ADC pour le potentiomètre et à peu près n’importe quel pin pour la LED et on les connecte aux deux circuits précédents en utilisant des labels. Il y a plusieurs pins qu’il est important de connecter pour garantir le bon fonctionnement du microcontrôleur. Parmi eux, le pin reset qui réinitialise (redémarre) le microcontrôleur quand il est mis à la masse (on dit qu’il est actif à l’état bas). Comme nous ne voulons pas que notre microcontrôleur se réinitialise de façon aléatoire il faut que ce pin reset soit à 5V. Mais nous allons avoir besoin de reset le microcontrôleur pour une autre raison expliquée plus tard. On veut donc mettre une valeur par défaut sur ce pin reset, et en électronique on fait cela via une résistance de pull-up. Sur l’image ci-dessous, quand l’interrupteur est ouvert il n’y a pas de courant donc le pin voit une tension de 5V, mais quand il est fermé la tension passe à 0V.

Pull up

Le prochain groupe de pins important est XTAL1 et XTAL2. Ces pins sont utilisés pour cadencer le microcontrôleur (lui fournir une horloge) avec un oscillateur externe. C’est utile dans certains cas (pour augmenter la précision des délais notamment) mais dans notre cas nous pouvons utiliser l’oscillateur 8MHz interne pour nous simplifier la vie. Ensuite le pin AREF sert à définir un maximum de tension pour les ADC ce qui permet notamment d’augmenter leur précision en définissant une tension plus faible puisque chaque pas sera donc plus petit. Par défaut le microcontrôleur utilise la tension AVCC que l’on connecte au 5V nous n’avons pas non plus besoin de nous en soucier. Il y a aussi bien sur les pins d’alimentation VCC et GND à connecter respectivement au 5V et à la masse et le microcontrôleur est utilisable !

Enfin, nous allons ajouter deux connecteurs supplémentaires. Le premier servira pour l’alimentation de la carte. On a donc besoin d’un pin 5V et d’un pin GND. Le deuxième est un connecteur SPI qui servira à charger le programme dans le microcontrôleur. Pour cela nous avons besoin de 4 pins : MISO, MOSI, SCK qui sont connectés aux pins correspondants sur le microcontrôleur, et RESET connecté au RESET du microcontrôleur. Le RESET sera connecté au chip select du programmeur, il lui servira à reset notre microcontrôleur au bon moment pendant la programmation.

Finalisation

Quand on lance l’ERC (Electrical Rules Check) sur KiCad pour vérifier que nous n’avons pas fait d’erreurs, il nous donne des erreurs de pins non connectés concernant le GND et le 5V. En fait l’ERC remarque que des pins d’entrée d’alimentation ne sont pas connectés à des pins de sortie d’alimentation, donc le circuit n’est pas alimenté. Pour résoudre cette erreur, il faut ajouter un label spécial (PWR_FLAG) sur le connecteur d’alimentation pour dire à l’ERC que l’alimentation vient de là.

Schematic

Et le schéma électronique est terminé !

Maintenant, nous allons faire la jonction entre la partie théorique des schémas électroniques, et la partie pratique que nous allons commencer juste après (la conception du PCB en lui-même). Le but est d’associer chaque symbole du schéma à une empreinte. Une empreinte est simplement un ensemble de pads, trous et marquages correspondant au composant. Par exemple pour les résistances on pourrait sélectionner des grosses résistances avec des pates traversantes, ou des petites résistances soudées en surface. Ces deux types de résistances sont identiques dans le schéma électronique mais ont une empreinte différente, que l’on doit choisir maintenant.

Empreinte de connecteur USB Vue 3D
USB connector footprint USB connector 3D view

KiCad met à disposition un petit outil de sélection, voici les associations que j’ai faites.

Associations

La conception du PCB

Maintenant, nous allons concevoir le PCB, c’est-à-dire placer les composants et leurs connexions. Quand nous importons les composants, KiCad les place les uns à côté des autres avec des lignes pour matérialiser les connexions. Une chose importante à noter : à droite on voit toutes les couches qui s’affichent à l’écran. Parmi elles, F.Cu et B.Cu correspondent au cuivre (Front et Back, on peut donc dessiner des connexions et placer des composants sur l’avant ou sur l’arrière du PCB), (F/B).Silkscreen correspondent au marquages sur le PCB, Edge.Cuts correspond aux bordures du PCB. (F/B).Fab peuvent être masquées, ce sont des informations utiles mais dans notre cas elles ne font que charger l’affichage pour rien.

Le placement

La première chose à faire est le placement des composants. Le but est de faciliter le routage (le dessin des connexions que nous allons faire juste après) autant que possible en plaçant les composants ayant des connexions entre eux proches les uns des autres. Par défaut les composants sont sur le dessus du PCB, on peut les déplacer sur le dessous avec F. L’affichage de KiCad nous montre les composants sur le dessous à travers le PCB, il y a donc un effet miroir. Pendant cette étape il faut garder à l’esprit que les pins ne sont pas tous fixes. Par moment on peut vouloir modifier le schéma électronique pour faciliter le routage (par exemple changer le pin sur lequel on branche la LED).

Placement

Le routage

Ensuite on dessine toutes les connexions sauf le 5V et le GND. KiCad fait automatiquement en sorte de respecter le minimum de distance entre deux fils (appelés pistes). Ces distances sont là pour éviter le phénomène de crosstalk, c’est-à-dire des interférences capables d’induire un signal d’une piste vers une autre. Certaines pistes comme le reset doivent passer d’un côté à l’autre du PCB. Pour ça on utilise une via c’est-à-dire un trou conducteur qui relie les deux faces. Pour en placer une appuyer sur V en dessinant une piste. Maintenant nous allons dessiner la piste de 5V. Etant donné qu’elle va conduire plus de courant que les autres, elle chauffera plus. Pour éviter qu’elle chauffe trop on peut la rendre plus large ce qui va réduire sa résistance et donc l’échauffement. Dans ce cas précis ce n’est pas important car aucun composant n’engendre des courants importants, mais c’est une bonne habitude à prendre.

Routage

La sérigraphie

Maintenant on va s’occuper des dessins sur le PCB sur (F/B).silkscreen (U1, D1, R1, R2…). Ces dessins sont très utiles au moment des soudures pour savoir quel composant va où, et pendant l’utilisation du PCB pour savoir quel branchement correspond à quoi. On commence donc par placer les labels de composants là où il y a de la place, et on ajoute des labels à côté des connecteurs pour indiquer quel est la fonction de chaque pin. Pour voir plus facilement le résultat, KiCad permet d’afficher le PCB dans une vue 3D avec Alt+3. C’est notamment le moment de vérifier si les labels sont bien visibles et ne sont pas coupés ou transpercés par une via.

PCB Vue 3D
Labels 3D view

Le plan de masse

Il ne nous reste donc plus qu’à connecter les pins correspondant à la masse. Pour la masse on utilise généralement un plan, c’est à dire un remplissage de tout l’espace disponible avec du cuivre. Ces plans ont comme principal avantage de réduire drastiquement les interférences entre les signaux sur le PCB et aussi avec l’extérieur. Pour ajouter un plan de masse on crée une “filled zone” sur B.Cu (le dessous du PCB) et on englobe tout le PCB, KiCad se charge de trouver les zones qu’il peut remplir.

Pour être efficace, le plan de masse doit être le moins coupé possible c’est à dire qu’il faut réduire autant que possible les pistes qui passent dedans. C’est pour cela que j’ai fait passer un maximum de pistes par le dessus, que les composants qui sont sur le dessous sont regroupés en un bloc compact, et que le reset passe au bord et pas en plein milieu. Ensuite on ajoute des vias pour connecter le microcontrôleur au plan de masse. Ces vias doivent être placées le plus proche possible du pin mais il vaut mieux éviter de les mettre directement dessus car c’est embêtant pour les soudures.

Les plans de masse sont une des raisons pour lesquelles ont été développés les PCB à plus de deux couches. Les couches supplémentaires sont placées à l’intérieur du PCB et une ou plusieurs d’entre elles sont dédiées à des plans de masse. L’autre raison principale étant bien sûr de faciliter le routage de PCB très denses comme des cartes mères d’ordinateurs.

Plan de masse

Finalisation

On rajoute des lignes sur la couche Edge.Cuts pour délimiter les bordures et notre PCB est prêt ! Comme pour le schéma électronique, il y a un outil de vérification automatique qui s’appelle cette fois DRC (Design Rules Check). Il est particulièrement utile pour cette étape car il y a bien plus de règles à respecter que pour le schéma électronique et certaines erreurs ne se voient pas (par exemple j’avais laissé un petit bout de piste sous un pad, il n’était pas visible mais le DRC l’a trouvé et me l’a signalé).

Fabrication

Pour fabriquer le PCB il ne nous reste plus qu’à générer les fichiers de fabrication et les envoyer au fabricant (JLCPCB, PCBWay…). Il est possible de commander le PCB avec les composants pré-soudés dessus mais cette option coûte plus cher et j’ai le matériel nécessaire pour faire les soudures moi-même, donc je commande les PCB nus.

Il existe de nombreux sites spécialisés dans la vente de composants (Mouser, Farnell, RS…). Les prix sont généralement assez bas (la resistance 10k que j’ai utilisé coûte 3 centimes l’unité) mais souvent il n’est pas possible de commander à l’unité (plutôt par lot de 10 au minimum). Pour chercher des composants il existe aussi des sites qui regroupent tous les distributeurs comme octopart.

Une fois soudé, on obtient notre PCB comme dans la vue 3D de KiCad !

PCB nu PCB soudé
PCB nu PCB

Notez que ce n’est pas exactement le PCB montré dans l’article car j’ai dû le refaire. Quand j’ai conçu le circuit pour la première fois j’ai connecté le potentiomètre au pin PD5 au lieu de PC5. Le pin PD5 ne contenant pas d’ADC, je ne peux donc pas lire la valeur de tension… Pour tester le code quand même j’ai pris le fil qui devait être branché sur le pin POT du connecteur et je l’ai fait toucher un pin ayant un ADC sur le microcontrôleur. C’est bancal mais ça fonctionne

Programmation

Nous n’allons pas trop nous attarder sur la partie logicielle qui n’est pas le but de cet article. La procédure de programmation d’un microcontrôleur d’Arduino seul (ou « standalone ») est assez bien documentée sur internet. En résumé, elle consiste à charger un script dans une Arduino Uno pour la transformer en programmeur (ArduinoISP dans les scripts d’exemple). Puis de brancher notre carte en SPI à la Arduino en connectant le Reset de notre carte au Chip select de la Arduino. Ensuite, après avoir sélectionné le bon programmeur et le bon type de carte sur l’IDE Arduino, on peut charger nos programmes avec Sketch > Upload using programmer.

Voici le programme utilisé (avec l’IDE Arduino):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define PIN_LED 2
#define PIN_POT A0

#define AVCC 5
#define ADC_BITS 10
#define MIN_VOLT 0.5
#define MAX_VOLT 4.5
#define MIN_DELAY 100
#define MAX_DELAY 1000

void setup() {
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_POT, INPUT);
}

void loop() {

  float voltage = AVCC * (float) analogRead(PIN_POT) / (float) (1 << ADC_BITS) ;
  voltage = max(MIN_VOLT, min(voltage, MAX_VOLT));
  float alpha = (float)(voltage - MIN_VOLT) / (float)(MAX_VOLT - MIN_VOLT);
  int delayms = MIN_DELAY + alpha * (MAX_DELAY - MIN_DELAY);

  digitalWrite(PIN_LED, HIGH);
  delay(delayms);
  digitalWrite(PIN_LED, LOW);
  delay(delayms);
}
Programmation Fonctionnement
Programmation Fonctionnement

Conclusion

Comme on a pu le voir dans cet article, la conception de PCB est accessible pour tous, et ne demande pas un travail insurmontable. De plus, le gain de fiabilité par rapport à un amas de câbles est tellement élevé qu’il n’y a aucune raison de s’en priver !

Le projet d’exemple est disponible en téléchargement: Download

Pour aller plus loin

Cet article explique les concepts de base de la conception de PCB. Pour en apprendre plus sur ce sujet, je vous conseille les ressources suivantes :