Utilisation approfondie du package CircuiTikZ

Nicolas Le Boulaire

Dans un précédent tutoriel (voir ici), j’ai évoqué les bases pour débuter avec le package Latex CircuiTikZ. Dès qu’un circuit électrique se complexifie, les commandes citées dans ce tutoriel sont peu pratiques. Je propose donc ici de faciliter le tracé des circuits électriques. Il est également question d’utiliser des dipôles plus « complexes » que ceux traités précédemment : vous pourrez donc à l’issue de cet article être familiarisé avec le placement d’amplificateurs opérationnels ou de transistors.

Commentez

- Titre : Utilisation approfondie du package CircuiTikZ

- Auteur : Nicolas Le Boulaire

- Parution : 3 mai 2021

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2021 nlbmoi. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Voir également :

- les bases de CircuiTikZ

Sommaire

- I. Placement des composants

- I-A. Ajout de nœuds nommés

- I-B. Ancre d’un élément

- I-C. placement avec -| (intersection horizontal – vertical)

- I-D. Placement de nœuds et calcul de coordonnées

- II. Le transistor

- II-A. Quelques modèles

- II-B. Ajout d’une diode de roue libre

- II-C. Quelques exemples circuits

- II-C-1. Émetteur commun

- II-C-2. Darlington

- II-C-3. Schéma interne d’un AOP 741

- III. L’amplificateur opérationnel

- III-A. Quelques modèles

- III-B. Quelques exemples de circuits

- III-B-1. Suiveur

- III-B-2. Amplificateur non inverseur

- III-B-3. Filtre passe-bas du 1er ordre

- III-B-4. Filtre de Sallen et Key

- III-B-5. Oscillateur à pont de Wien

- III-B-6. Amplificateur d’instrumentation

- III-C. Principe de l’allumage/l’extinction des phares

- IV. Remerciements

I - Placement des composants

I-A - Ajout de nœuds nommés

Dès qu’un circuit commence à se complexifier, certaines pratiques sont à bannir, sous peine de s’arracher les cheveux à essayer de tracer un circuit électrique propre et net. Dans mon précédent article (ici), j’ai parlé de deux possibilités pour se repérer dans l’image : l’utilisation de coordonnées absolues (on indique les vraies coordonnées dans le plan de l’image) ou les coordonnées relatives (on indique un déplacement par rapport au point précédent).

Repartons d’un exemple et essayons de voir comment on peut l’améliorer : https://nboulaire.developpez.com/tutoriels/latex/circuitikz_base/#LIV-B

Le code indiqué dans cet exemple correspond au tracé d’une boucle principale, constituée d’un générateur, d’une lampe et d’une résistance de 33 W, et d’une seconde boucle constituée d’une lampe et une résistance de 10 W.

Le point de départ de cette seconde boucle est le point (0,2) : pour une raison d’esthétique, je souhaite resserrer le circuit pour faire en sorte que la ligne lampe + résistance 33 W ne soit pas à la hauteur 2, mais 1,5. Je dois donc d’abord modifier la première ligne :

resserrement_code1

1. \draw (0,0)

2. --++(0,1.5) coordinate(lampes)

3. to[lamp] ++(2,0)

4. to[R, l=$\SI{33}{\ohm}$]++(2,0)

5. --++ (0,-1.5)

6. to[vsource, l=$U$] ++(-4,0);

Mais je dois également modifier le point de départ de la commande suivante si je veux conserver des lignes bien horizontales :

resserrement_code2

1. \draw (0,1.5)

2. --++(0,2)

3. to[lamp] ++(2,0)

4. to[R, l=$\SI{10}{\ohm}$]++(2,0)

5. --++ (0,-2);

Cette dernière étape est fastidieuse, car plus mon circuit s’agrandit et plus le nombre de mailles est grand donc plus il faut faire attention en modifiant et vérifiant les points de départ des mailles.

La solution est de nommer un point du circuit à l’aide de la commande \coordinate(XX)où XX est le nom donné à ce point. Certaines caractéristiques sont à respecter (aucun signe de ponctuation ou de symboles spéciaux) pour éviter à votre compilateur de crier. Je vous engage également à choisir des noms efficaces qui évoquent directement l’emplacement du point. Ainsi, les deux propositions de noms suivantes sont acceptables, mais il faut avouer que savoir où se situe le point fleur dans le circuit n’a rien d’une sinécure, on privilégiera donc lampes (c’est d’ailleurs ce que je vais faire) :

nom_coordonnees

1. \draw (0,0)

2. --++(0,1,5) coordinate(fleur)

3. to[lamp] ++(2,0)

4. to[R, l=$\SI{33}{\ohm}$]++(2,0)

5. --++ (0,-1,5)

6. to[vsource, l=$U$] ++(-4,0);

nom_coordonnes2

1. \draw (0,0)

2. --++(0,1,5) coordinate(lampes)

3. to[lamp] ++(2,0)

4. to[R, l=$\SI{33}{\ohm}$]++(2,0)

5. --++ (0,-1,5)

6. to[vsource, l=$U$] ++(-4,0);

Pour utiliser par la suite un point nommé, il suffit de l’écrire entre parenthèses à la place des coordonnées. Pour tracer la 2e maille du circuit électrique, la ligne de commande sera donc :

trace_boucle2

1. \draw (lampes)

2. --++(0,2)

3. to[lamp] ++(2,0)

4. to[R, l=$\SI{10}{\ohm}$]++(2,0)

5. --++ (0,-2);

I-B - Ancre d’un élément

Dans le point précédent, on a vu que l’on pouvait nommer un point du circuit, mais il est également possible de nommer un élément d’un circuit.

Lorsqu’on ajoute un élément au circuit à l’aide de la commande to [], on peut le nommer en ajoutant l’option n=ou name=.

Par exemple, pour placer un potentiomètre, que je vais appeler potentio, j’utilise la commande to[potentiomer, n=potentio] ; pour une résistance appelée R1, ce sera to[R, n=R1].

Les fidèles lecteurs de mon précédent tutoriel auront remarqué que j’avais déjà parlé de cette possibilité pour permettre d’écrire le nom de la résistance R1 dans la résistance (voir III-A. Valeurs/nom des dipôles).

Pour les dipôles « classiques », il faut avouer que nommer cet élément n’apporte pas grand-chose par contre, pour les éléments plus complexes, l’atout est indéniable. Avec ce nom, il est possible d’utiliser les ancres attachées à chaque élément : ces ancres peuvent servir de point départ ou d’arrivée d’un fil électrique.

Certaines ancres sont communes à l’ensemble des éléments :

- left (en rouge), right (en jaune), center(en vert) ;

- west (en rouge), east (en jaune), south (en orange) et north (en bleu)

Vous remarquez que left et west d’une part, right et east d’autre part sont en fait les mêmes ancres.

Les combinaisons de ces ancres sont possibles : north west, north east, south east, south west.

D’autres ancres sont propres à certains dipôles : vous trouverez les principales dans le tableau suivant :

I-C - placement avec -| (intersection horizontal – vertical)

Après ce petit encart sur les ancres des éléments d’un circuit, revenons à notre dernier circuit : j’y ai juste remplacé la résistance de 10 W par un potentiomètre (je vous laisse trouver les noms que j’ai utilisés)

circuit_potentiometre

1. \draw (0,0) --++(0,1.5) coordinate(lampes)

2. to[lamp] ++(2,0)

3. to[R, l=$\SI{33}{\ohm}$]++(2,0)

4. --++ (0,-1.5)

5. to[vsource, l=$U$] ++(-4,0);

7. \draw (lampes) --++(0,2)

8. to[lamp] ++(2,0)

9. to[potentiometer, n=potentio] ++(2,0) coordinate(resistances)

10. --++ (0,-2);

J’aimerai désormais relier le point resistances au curseur du potentiomètre : la méthode traditionnelle nous dit de tracer un trait vertical, un trait horizontal puis éventuellement un trait vertical jusqu’à l’ancre wiper du potentiomètre comme ceci (voir les traits fléchés en pointillés rouge) :

Pour coder cette partie, une possibilité est d’ajouter au code précédent la ligne suivante

\draw (resistances) --++(0,0.75) --++(-1,0) --(potentio.wiper);

Sauf que cette solution a un inconvénient majeur : si la taille de la boucle est modifiée (par exemple en remplaçant to[potentiometer, n=potentio] ++(2,0) par to[potentiometer, n=potentio] ++(3,0)), je suis obligé de rectifier également la taille du trait horizontal : pas terrible surtout pour un schéma complexe.

Mais les commandes TikZ permettent de faire très simplement et (presque) sans effort ce que l’on souhaite faire : à l’aide de l’opérateur |- (ou son équivalent opposé -|).

Par exemple, la commande \draw (0,1) -| (2,0) va relier les points de coordonnées (0,1) à (2,0) en traçant un trait horizontal qui part du point (0,1) puis un trait horizontal pour rejoindre le point (2,0) : Latex se chargeant de donner les bonnes tailles aux segments pour que les traits soient bien horizontaux et verticaux.

La commande \draw (0,1) |- (2,0)trace un trait vertical qui part du point (0,1) puis un trait horizontal pour finir jusqu’au point (2,0) : selon ce que l’on souhaite obtenir, il faut donc bien choisir l’ordre de l’opérateur.

Revenons à notre exemple : en fait, on veut rejoindre le point resistances au point potentio.wiper, il suffit donc d’écrire \draw (resistances) |-(potentio.wiper);pour obtenir ce que l’on souhaite faire.

Si on voulait expliquer avec des mots, la commande précédente relie la verticale du point resistances à l’horizontale du point potentio.wiper.

On peut utiliser cet opérateur pour définir un point de départ ou d’arrivée, voire (et c’est très intéressant) pour aligner des éléments du circuit. Pour expliquer cela, je vais changer d’exemple et partir de ce circuit électrique :

Les plus attentifs auront reconnu le montage de principe d’un réseau R-2R à deux étages permettant de faire une conversion numérique analogique.

Pour rendre propre ce schéma, vous remarquerez que les masses sont alignées horizontalement.

Si on utilise la méthode « traditionnelle » (coordonnées absolues et/ou relatives), on arrive au même problème que précédemment : si on change un élément du circuit (la hauteur de la branche du générateur par exemple), il faut corriger tous les éléments que l’on souhaite aligner.

La solution est d’abord de nommer les points d’intérêt : celui sur lequel s’aligner (dans notre cas, GND est un bon choix node[ground](GND){}) et le point de départ du tracé recherché (dans notre cas coordinate(R)). Ensuite, il suffit d’indiquer que l’on va tracer un fil électrique (ou un composant) jusqu’au point de croisement entre la verticale du point de départ (dans notre cas au bout de la résistance R) et l’horizontale de la masse nommée GND : (R|-GND).

Ainsi, le code du réseau R-2R est donc

\draw (0,0) node[ground](GND){}
to [vsource, l=$E_{ref}$] ++(0,2)
to[R, l=R] ++(2,0) coordinate(R)
to[R, l=2R] (R|-GND) node[ground]{};
\draw (R)
to[R, l=R] ++(2,0) coordinate(R)
to[R, l=2R] (R|-GND) node[ground]{};

Cet outil est très puissant comme vous pourrez le constater dans les exemples plus loin. En effet, la combinaison du nommage de points (en particulier les ancres des éléments) et de la commande de placement permet de simplifier considérablement le tracé des fils électriques.

I-D - Placement de nœuds et calcul de coordonnées

CircuiTikZ peut calculer des coordonnées pour faciliter l’alignement et le placement des éléments entre eux.

Prenons l’exemple suivant qui comporte deux amplificateurs opérationnels (pas de panique si le branchement vous paraît pour l’instant obscur, cela viendra plus loin dans le tutoriel) :

On souhaite ajouter un 3e amplificateur à droite, mais situé au milieu verticalement des deux amplificateurs pour aboutir à l’image suivante :

Pour y arriver, après avoir nommé les éléments sur lesquels s’aligner (dans notre cas aop1 et aop2), on effectue le calcul à l’aide de la commande suivante : \draw ($(aop2.center)!0.5!(aop1.center)$) ++(3,0) node[en amp](aop3){};

Le calcul se fait en passant en mode mathématique à l’aide du signe $.

Le facteur 0,5 dans la commande précédente signifie que le placement de l’élément (ici aop3) se fait à 50 % de la distance entre les deux éléments (aop2.center) et (aop1.center) : ce chiffre peut donc aller de 0 à 1 (100 %), la référence étant celle du premier élément (aop2 dans notre cas).

Avec cette méthode, il est également possible de calculer des coordonnées :

- par un facteur multiplicatif \draw (0,0) --($2*(1,1)$) ;

- par addition/soustraction de coordonnées entre elles : par exemple \draw ($(A)+(0,-1)$) qui correspond au point A décalé de 1 vers le bas.

II - Le transistor

II-A - Quelques modèles

Certaines variantes des transistors présentés existent : seule une version (npn souvent) est présentée, mais peut souvent être déclinée également en pnp.

Pour obtenir une liste exhaustive, vous pouvez vous référer à la documentation du package https://www.ctan.org/pkg/circuitikz.

II-B - Ajout d’une diode de roue libre

Il n’est pas rare de voir un transistor disposé d’une diode, appelée diode de roue libre, entre l’émetteur et le collecteur : on peut la tracer en ajoutant l’option bodydiode.

Par exemple, le code \draw (0,0) node[npn, bodydiode]{};donne

En fait, le terme body fait référence à une ancre particulière du transistor qu’il est possible d’utiliser pour rajouter d’autres éléments qu’une diode : voir la documentation de CircuiTikZ à ce sujet ici.

Un exemple :

II-C - Quelques exemples circuits

II-C-1 - Émetteur commun

Ce montage (permettant une amplification de tension) n’est pas très compliqué surtout si on met en œuvre les méthodes vues précédemment :

- le transistor est un nœud (node[]) : on le place donc en un point du circuit ((0,0) dans mon cas) à la différence des dipôles qui nécessitent un point de départ et un point d’arrivée ((a,b) to[] (c,d)) ;

- l’usage des ancres du transistor (dans mon cas T.E, T.B et T.C) ;

- de nombreux points du circuit ont été nommés pour faciliter ensuite l’alignement des éléments ;

- la commande horizontal-vertical -| a été largement utilisée pour placer et aligner les éléments entre eux.

\documentclass[border=1mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}

\begin{document}
\begin{circuitikz}
\draw (0,0) node[npn](T){};
\draw (T.B)
--++(-1,0) coordinate (Rbase)
to[R=$R_2$] ++(0,-3) node[ground](GND){};
\draw (Rbase)
to[C=$C_1$, -o] ++(-2,0) coordinate (Cbase)
to[open, v<=$V_E$] (Cbase|-GND);
\draw (Rbase)
to[R=$R_1$] ++(0,4) coordinate (RbRc)
to[short] (RbRc -|T.C) coordinate (Rc)
to[R=$R_C$] (Rc|-T.C);
\draw (T.E)
--++(0,-0.5) coordinate (Remett)
to[R, l_=$R_E$] (T.E |-GND);
\draw (Remett)
--++(1,0) coordinate (Cemett)
to[C, l=$C_E$] (Cemett|-GND);
\draw (T.C)
--++(1,0) coordinate (Rcollec)
to[C] ++(2,0) coordinate (Ccollec)
to[R, l=$R_{ch}$] (Ccollec|-GND)
--(Cbase|-GND);
\draw (Ccollec)
to[short, -o] ++(1.5,0) coordinate (sortie)
to[open, v^<=$V_S$] (sortie |-GND) --(GND -|Ccollec);
\end{circuitikz}
\end{document}

II-C-2 - Darlington

Ce montage, permettant un gain élevé, est la combinaison de deux transistors de même type (soit deux NPN soit deux PNP) où la base de l’un est reliée à l’émetteur de l’autre, les collecteurs étant reliés entre eux.

L’intérêt de ce montage est de vous montrer comment peuvent être utilisées les ancres pour placer différemment qu’habituellement les éléments du circuit.

\documentclass{article}
\usepackage[european, straightvoltages]{circuitikz}

\begin{document}
\begin{circuitikz}

\draw (0,0) node[pnp](T1){T1}
\draw (T1.emitter) node[pnp, anchor=base](T2){T2};
\draw (T2.collector) |- (T1.collector);

\end{circuitikz}
\end{document}

II-C-3 - Schéma interne d’un AOP 741

En introduction du tutoriel sur les bases de CircuiTikz, je proposais comme exemple le schéma interne d’un AOP, le 741 pour être plus précis, afin de montrer la puissance du package.

Ainsi, pour tracer ceci :

une possibilité est le code suivant :

\documentclass[border=2mm]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[siunitx, european, straightvoltages, cute inductors]{circuitikz}

\begin {document}
\begin{circuitikz}

\draw (0,0) node[above]{3} node[below]{input +} coordinate (debut)
to[short, o-] (0.5,0) node [npn, anchor=B](Q1){Q1};

\draw (Q1.E) node [pnp, anchor=E, xscale=-1](Q3){\scalebox{-1}[1]{Q3}};
\draw (Q3.C)
to[short, -*] ++(0,-0.8) coordinate (q3q5q7);
\draw (q3q5q7)
--++(0,-0.8) node [npn, anchor=C, xscale=-1](Q5){\scalebox{-1}[1]{Q5}};
\draw (Q5.E)
to[short, -*] ++(0,-0.5) coordinate (q5r)
to[R, l=\SI{1}{\kilo\ohm}] ++(0,-2) coordinate (bas) node{$\bullet$}
;
\draw (q5r)
to[short, -o] (q5r -|debut) node[above]{1} node[below]{offset null};
\draw (q3q5q7) node [npn, anchor=B](Q7){Q7};
\draw (Q7.E)
to[short, -*] (Q5.B)
to[short, -*] ++(1,0) coordinate (q5q6q7)
to[R, l=\SI{50}{\kohm}] (q5q6q7|-bas) node{$\bullet$};
\draw (q5q6q7)
--++(1,0) node [npn, anchor=B](Q6){Q6};
\draw (Q6.E)
to[short, -*] ++(0,-0.5) coordinate (q6r)
to[R, l=\SI{1}{\kilo\ohm}] (q6r |-bas) node{$\bullet$};
\draw (Q1.C)
to[short, -*] ++(2,0) coordinate (q1q2q8)
--(Q1.C -|Q6.C) node [npn, anchor=C, xscale=-1](Q2){\scalebox{-1}[1]{Q2}};
\draw (Q2.B)
to[short, -o] ++(0.5,0) node[above]{2} node[below]{input -}coordinate (q2b);
\draw (q6r)
to[short, -o]  (q2b|-q6r) node[above]{5} node[below]{offset null};
\draw (Q2.E) node [pnp, anchor=E](Q4){Q4};
\draw (Q4.B)
--(Q3.B);
\draw (Q4.C)
--(Q6.C);
\draw (q1q2q8) node[pnp, anchor=C, xscale=-1](Q8){\scalebox{-1}[1]{Q8}};
\draw (Q8.B)
to[short, *-*] (Q8.B |-Q2.C);
\draw (Q7.C) |- (Q8.E);
\draw (Q8.E)
to[short, *-*] ++(4,0) node [pnp, anchor=E](Q9){Q9};
\draw (Q9.B)
--(Q8.B);
\draw (Q9.C)
to[short, -*]++(0,-3.5) coordinate (q4q9q10);
\draw (q4q9q10)
-| (Q4.B) node{$\bullet$};
\draw (q4q9q10)
--(q4q9q10 |-Q6) node [npn, anchor=C, xscale=-1](Q10){\scalebox{-1}[1]{Q10}};
\draw (Q10.E)
to[R, l=\SI{5}{\kohm}] (Q10.E |-bas) node{$\bullet$};
\draw (Q10.B) node [npn, anchor=B](Q11){Q11};
\draw (Q11.C)
to[R, l=\SI{39}{\kohm}] (Q11.C |-Q9.C) node[pnp, anchor=C, xscale=-1](Q12){\scalebox{-1}[1]{Q12}} node{$\bullet$}
-| (Q12.B);
\draw (Q12.B)
to[short, *-] ++(2,0) node[pnp, anchor=B](Q13){Q13};
\draw (Q13.E)
to[short, *-*] (Q12.E)
to[short] (Q9.E);
\draw (Q13.C)
to[short, *-*] ++(1,0)
node[npn, anchor=B](Q14){Q14};
\draw (Q14.B)
node[npn, anchor=C, xscale=-1](Q17){\scalebox{-1}[1]{Q17}};
\draw (Q14.E) node{$\bullet$}
to[R, l=\SI{25}{\ohm}] ++(0,-1.5) coordinate (r25r50)
to[short, *-*] ++(0,-0.5) coordinate (r50r25)
to[R, l=\SI{50}{\ohm}] ++(0,-1.5) node [pnp, anchor=E](Q20){Q20};
\draw (r50r25)
to[short, -o] ($(r50r25)+(1.5,0)$) node[above]{6} node[below]{output};
\draw (Q20.C)
to[short, -*] (Q20.C |-bas);
\draw (r25r50)
-|(Q17.E);
\draw (Q13.C)
--++(0,-1) node[npn, anchor=C](Q16){Q16};
\draw (Q16.E)
|-(Q20.B);
\draw (Q16.B)
to[R, l=\SI{4.5}{\kohm}] (Q16.B |-Q13.C) coordinate (cq13q14) node{$\bullet$}
--(Q13.C);
\draw (Q16.B)
to[R, l=\SI{7.5}{\kohm}] ++(0,-2) coordinate (rq16)
to[short, *-*] (rq16 -|Q16.E);
\draw (rq16) node [npn, anchor=C](Q15){Q15};
\draw (Q15.E)
--++(0,-0.5) node [npn, anchor=B](Q19){Q19};
\draw (Q19.B)
to[R, l_=\SI{50}{\kohm}] (Q19.B |-bas) node{$\bullet$};
\draw (Q19.E)
to[R, l=\SI{50}{\ohm}] (Q19.E |-bas) node{$\bullet$};
\draw (cq13q14)
--++(-1.8,0) coordinate (c)
to[C, l=\SI{30}{pF}]  (c|-Q15.B)
--++(0,-1.2) node[npn, anchor=C, xscale=-1](Q22){\scalebox{-1}[1]{Q22}};
\draw (Q15.B)
to[short, -*] (c|-Q15.B)
to[short, -*] (Q15.B -|Q4.C);
\draw (Q22.B)
to[short, -*] (Q22.B -|Q19.E);
\draw (Q22.E)
to[short, -*](Q22.E |-bas);
\draw (Q11.E)
to[short, -*] (Q11.E |-bas);
\draw (bas)
--(bas-|Q20.C) coordinate (q20bas)
to[short, -o]($(q20bas)+(1.5,0)$) node[above]{4} node[below]{$V_s^-$};
\draw (Q10.B)
to[short, *-] (Q10.B|- Q11.C)
to[short, -*] (Q11.C);
\draw (Q14.C)
to[short, -*] (Q14.C |-Q13.E) coordinate (q13q14);
\draw (Q13.E)
--(q13q14)
to[short, -o]($(q13q14)+(1.5,0)$) node[above]{7} node[below]{$V_s^+$};
\end{circuitikz}
\end {document}

Pour un même circuit, plusieurs possibilités existent pour obtenir un rendu équivalent, voire identique. Ne vous énervez donc pas si votre solution donne le bon schéma, mais avec un code différent.

III - L’amplificateur opérationnel

III-A - Quelques modèles

III-B - Quelques exemples de circuits

III-B-1 - Suiveur

Avec ce premier exemple, vous pourrez vous familiariser avec l’utilisation et le placement d’un amplificateur opérationnel :

- à l’instar du transistor, un amplificateur opérationnel est un nœud (node[]) qui se place donc en un point du circuit et non entre un point de départ et un point d’arrivée ((a,b) to[] (c,d)) ;

- l’usage des ancres de l’amplificateur (pour ce premier exemple, j’ai notamment fait figurer les ancres liées au branchement de l’amplificateur opérationnel (dans mon cas aop.up et aop.down).

\documentclass[border=1mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}
\begin{document}
\begin{circuitikz}
\draw (0,0) node[en amp](aop){};
\draw (aop.up)
--++(0,0.5) node[vcc]{$+\SI{15}{V}$};
\draw (aop.down)
--++(0,-0.5) node[vee]{$-\SI{15}{V}$};
\draw (aop.-)
--++(0,1)
-| (aop.out)
to[short, -o] ++(0.3,0);
\draw (aop.+)
to[short,-o] ++(-0.3,0);
\draw (-1.5,-1.5) node[ground]{}
to[open, v>=$V_e$] (-1.5,-0.3);
\draw (1.5,-1.5) node[ground]{}
to[open, v>=$V_s$] (1.5, 0.1);
\end{circuitikz}
\end{document}

III-B-2 - Amplificateur non inverseur

Ce montage est un classique du « débutant » qui apprend l’amplificateur opérationnel.

\draw (0,0) node[en amp, noinv input up](aop){};
\draw (aop.-)
--++(0,-2) coordinate (deuxR)
to [R, l=$R_2$] ++(0,-2) node [ground](GND){};
\draw (deuxR)
to[R, l=$R_1$] (deuxR-| aop.out)
to[short] (aop.out);
\draw (aop.+)
to[short,-o] ++(-1,0) coordinate (entree)
to[open, v<=$V_e$] (entree |-GND) node[ground]{} ;
\draw (aop.out)
to[short, -o] ++(1,0) coordinate (sortie)
to[open, v<=$V_s$] (sortie|-GND) node[ground]{};

III-B-3 - Filtre passe-bas du 1er ordre

\documentclass[border=1mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}
\begin{document}
\begin{circuitikz}
\draw (0,0)
node[en amp](aop){};
\draw (aop.+)
to[short] ++(0,-2) node[ground](GND){};
\draw (aop.-)
--++(-0.5,0) coordinate (entree)
to[R=$R$, -o] ++(-2,0) coordinate (ve)
to[open, v<=$V_e$] (ve|-GND) node [ground]{};
\draw (entree)
--++(0,1.5) coordinate (RC)
to[C] (aop.out |-RC) coordinate (CR)
to[short] (aop.out);
\draw (RC)
--++(0,1) coordinate (R)
to[R] (aop.out |-R)
to[short] (CR);
\draw (aop.out)
to[short, -o] ++(0.5,0) coordinate (vs)
to [open, v^<=$V_s$] (vs|-GND) node [ground]{};
\end{circuitikz}

\end{document}

III-B-4 - Filtre de Sallen et Key

\documentclass[border=1mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}
\begin{document}
\begin{circuitikz}
\draw (0,0) node[en amp, noinv input up](aop){};
\draw (aop.-)
|- ($(aop.out)+(0,-1.5)$)
to [short] (aop.out) ;
\draw (aop.+)
--++(-1,0) coordinate (entree)
to [C, l_=$C_2$] ++(0,-2) node [ground](GND){};
\draw (entree)
to[R, l_=$R_2$] ++(-2,0) coordinate (RRC)
to [R, l_=$R_1$, -o] ++(-2,0) coordinate (ve)
to[open, v<=$V_e$] (ve |-GND) node[ground]{} ;
\draw (RRC)
to[C, l=$C_1$] ++(0,2)
-|($(aop.out)+(0,-1.5)$)
to [short] (aop.out) ;
\draw (aop.out)
to[short, -o] ++(0.5,0) coordinate (sortie)
to[open, v^<=$V_s$] (sortie|-GND) node[ground]{};
\end{circuitikz}

\end{document}

III-B-5 - Oscillateur à pont de Wien

\documentclass[border=1mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}
\begin{document}
\begin{circuitikz}
\draw (0,0)
node[en amp, noinv input up](aop){};
\draw (aop.-)
--++(0,-1.5) coordinate (deuxR)
to [R, l_=$R_1$] ++(0,-2) node [ground](GND){};
\draw (deuxR)
to[R, l_=$R_2$] (deuxR-| aop.out)
to[short] (aop.out);
\draw (aop.out)
to[short, -o] ++(1,0) coordinate (sortie)
to[open, v^<=$V_s$] (sortie|-GND) node[ground]{};
\draw (aop.+)
--++(-3,0) coordinate (entree)
--++(0,2)
to[C] ++(3,0) coordinate (CR)
to[R] (CR -|aop.out) --(aop.out);
\draw (entree)
to[short, -o] ++(-2,0) coordinate (ve)
to[open, v<=$V_e$] (ve |-GND) node[ground]{};
\draw (entree)
--++(0,-1) coordinate (entree)
to[short] ++(1,0)
to[R] ++(0,-3)
to [short] ++(-1,0) coordinate(CR)
to[short] (CR|-GND) node [ground](GND){};
\draw (entree)
to[short] ++(-1,0)
to[C] ++(0,-3)
to [short] ++(1,0);
\end{circuitikz}

\end{document}

III-B-6 - Amplificateur d’instrumentation

Dans le code suivant se trouve une utilisation du calcul de coordonnées pour faire en sorte que l’amplificateur opérationnel de droite soit centré verticalement entre les deux amplificateurs opérationnels de gauche comme je l’ai évoqué ici.

detecteur_luminosite

\documentclass[border=1mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}
\begin{document}
\begin{circuitikz}
\draw (0,0) node[en amp](aop2){AO2};
\draw (aop2.+)
to[short] ++(-0.5,0)
to[open, v<=$v_2$] ++(0,-1) node[ground]{};
\draw (aop2.out)
-- ++(0.5,0) coordinate (out2)
to [R=$R$] ++(0,2) coordinate (RP)
to [vR, l=$P$] ++(0,2) coordinate (PR)
to [R=$R$] ++(0,2) coordinate (out1)
-- ++(-0.5,0) node[en amp, noinv input up, anchor=out](aop1){};
\draw (aop2.-)
--(aop2.- |- RP)
to[short] (RP);
\draw (PR) -| (aop1.-);
\draw (aop1.+)
-- ++(-0.5,0)
to[open, v<=$v_1$] ++(0,-1) node[ground]{};
\path ($(aop2.center)!0.5!(aop1.center)$) ++(6,0) node[en amp](aop3){};
\draw (out2)
-- ++(1,0) coordinate (out2)
to[short] (out2|-aop3.+)
to[R, l_=$R'_1$] ++(2,0) coordinate (in+3)
to[short] (aop3.+);
\draw (in+3)
to[R, l_=$R'_2$] ++(0,-2) node[ground]{};
\draw (out1)
-- ++(1,0) coordinate (out1)
to[short] (out1|-aop3.-)
to[R, l=$R_1$] ++(2,0) coordinate (in-3)
to[short] (aop3.-);
\draw (in-3)
--++(0,1.4) coordinate (R)
to[R=$R_2$] (R-|aop3.out)
to[short] (aop3.out)
-- ++(0.5,0)
to[open, v<=$v_s$] ++(0,-1) node[ground]{};
\end{circuitikz}

\end{document}

III-C - Principe de l’allumage/l’extinction des phares

Cet exemple peut paraître beaucoup plus complexe que les précédents, non pas sur le placement des éléments du circuit, mais sur « l’habillage » du circuit (nœuds d’évitement, blocs de fonction matérialisés par les rectangles en pointillés). Mais en réalité, si vous y regardez de plus près, vous vous rendrez compte que l’utilisation des outils présentés plus haut (calcul de coordonnées, intersection) suffit pour arriver à nos fins.

\documentclass[border=1mm]{standalone}
\usepackage[european, straightvoltages]{circuitikz}

\usetikzlibrary{intersections, fit, babel}
\newlength{\crossing}
\makeatletter
\setlength{\crossing}{\ctikzvalof{bipoles/crossing/size}\pgf@circ@Rlen}
\makeatother

\begin{document}
\begin{circuitikz}
\draw (0,0) node[en amp](aop1){AO1};
\draw (aop1.+)
to[short] ++(0,-2) node[ground](GND){};
\draw (aop1.-)
--++(0,1.5) coordinate (in-1)
--++(-2,0)  node[npn, photo, anchor=E](photo){} ;
\draw (photo.C)
--++(-2,0) coordinate (pile)
to[battery2] (pile|-GND);
\draw (in-1)
to [vR, mirror] (in-1 -|aop1.out)
to[short] (aop1.out);
\draw [name path=ab] (aop1.out)
--++(1,0) coordinate (out1)
to[R] ++(2,0) coordinate (in-2)
--++(0.5,0) node[en amp, anchor=-](aop2){AO2};
\draw (photo.C)
--(photo.C-|out1) coordinate (jump);

\draw [name path = cd] (jump)
-- (aop1.out-|jump)
to[pR, n=curseur] (jump|-GND)
to [short] (jump|-GND) ;

\path [name intersections={of=ab and cd,by=e}]
[fill=white] (e) circle[radius=0.5\crossing]
node[jump crossing,rotate=90]{};

\draw (in-2)
--(in-2|-curseur.wiper) coordinate(ao2r)
to[R] (ao2r-|curseur.wiper)
to[short] (curseur.wiper);
\draw (aop2.+)
to[short] (aop2.+|-GND);
\draw (in-2)
--++(0,1.5) coordinate(RC)
to [R] (RC -|aop2.out);
\draw (RC)
--++(0,1) coordinate (C)
to[C] (C-|aop2.out)
to[short] (aop2.out);
\path (aop2.center) ++(2,0) coordinate (in-3) ++(1,0) node[en amp, anchor=-](aop3){AO3};
\draw (aop2.out)
-| (aop3.-);
\draw (jump)
--(jump-|in-3) coordinate (jump2);
\node at (aop2.out-|jump2) [jump crossing, rotate=90](J2){};
\draw (jump2)
-- (J2.east);
\draw (J2.west)
to[pR, n=curseur2] (jump2|-GND)
to [short] (jump2|-GND) ;
\draw (aop3.+)
-|(curseur2.wiper);
\draw (aop3.out)
to[R] ++(3,0) coordinate (ledR)
to[leDo] (ledR|-GND);
\draw (GND)
to[short] (GND-|ledR);
\draw (GND)
to[short] (GND-|pile);

%Tracé des blocs
\coordinate (rectbas) at ($(GND)+(0,-1)$);
\coordinate (recthaut) at ($(pile)+(0,0.5)$);
\coordinate (rect1gauche) at ($(pile)+(-0.5,0)$);
\coordinate (rect1droit) at ($(aop1)+(-2,0)$);
\coordinate (rect2gauche) at($(rect1droit)+(0.3,0)$);
\coordinate (rect2droit) at ($(aop1.out)+(0.3,0)$);
\coordinate (rect3gauche) at($(rect2droit)+(0.3,0)$);
\coordinate (rect3droit) at ($(aop2.out)+(0.2,0)$);
\coordinate (rect4gauche) at($(rect3droit)+(0.3,0)$);
\coordinate (rect4droit) at ($(aop3.out)+(0.5,0)$);
\coordinate (rect5gauche) at($(rect4droit)+(0.3,0)$);
\coordinate (rect5droit) at ($(ledR)+(0.5,0)$);

\node   [draw, dashed, inner sep=0pt,
fit=(rectbas -|rect1gauche) (recthaut -| rect1droit),
label={[align=center]below: Détecteur\\ d'obscurité}] {};

\node [draw, dashed, inner sep=0pt, fit=(rectbas-|rect2gauche) (recthaut-|rect2droit),
label={[align=center]below: Convertisseur\\ courant-tension}] {};
\node [draw, dashed,inner sep=0pt, fit=(rectbas-|rect3gauche) (recthaut-|rect3droit),
label={[align=center]below: Amplification\\ filtrage \\ décalage}] {};

\node [draw, dashed,inner sep=0pt, fit=(rectbas-|rect4gauche) (recthaut-|rect4droit),
label={[align=center]below: Comparateur}] {};
\node [draw, dashed,inner sep=0pt, fit=(rectbas-|rect5gauche) (recthaut-|rect5droit),
label={[align=center]below: Allumage/extinction\\ des feux}] {};

\end{circuitikz}
\end{document}

IV - Remerciements

Vous voilà rendu à la fin de ce tutoriel avancé pour CircuiTikZ.

Ce package regorge encore de possibilités entre autres celles de créer des circuits avec des blocs diagramme et des portes logiques : peut-être feront-elles l’objet d’un futur tutoriel.

J’en profite pour remercier sincèrement ceux qui ont contribué à sa réalisation plus particulièrement -Nikopol- et Malick pour leur relecture technique ainsi que Claude Leloup pour sa relecture orthographique. Merci également à celles et ceux qui, au gré de mes quelques errements, m’ont remis dans le droit chemin !