Ajoute le générateur de schémas (schemdraw + matplotlib) et les figures du module 3

Charte commune (style.py), générateur SVG/PNG (generer.py) et 4 figures pour le module PWM & ADC : rapport cyclique, servo 50 Hz, montage du variateur, quantification ADC.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Artemia
2026-10-18 14:38:29 +02:00
co-authored by Claude Opus 5.5
parent 059afa8b69
commit 343a557332
13 changed files with 43415 additions and 0 deletions
+4
View File
@@ -18,3 +18,7 @@ build/
.env
secrets.h
*.key
# Environnement Python
.venv/
__pycache__/
+47
View File
@@ -0,0 +1,47 @@
"""Génère les schémas (SVG + PNG) de tous les modules, ou de ceux passés en argument.
Usage : python schemas/generer.py [m03 ...]
"""
import importlib
import sys
from pathlib import Path
import matplotlib.pyplot as plt
ICI = Path(__file__).resolve().parent
sys.path.insert(0, str(ICI))
DOSSIER_SVG = ICI / "svg"
DOSSIER_PNG = ICI / "png"
def modules_figures(filtres=()):
"""Renvoie {préfixe 'mXX': [Figure, ...]} pour chaque fichier mXX_*.py."""
resultat = {}
for fichier in sorted(ICI.glob("m[0-9][0-9]_*.py")):
prefixe = fichier.stem[:3]
if filtres and prefixe not in filtres:
continue
resultat[prefixe] = importlib.import_module(fichier.stem).FIGURES
return resultat
def enregistrer(fig, id_):
if hasattr(fig, "fig"): # dessin schemdraw (backend matplotlib)
fig = fig.fig
fig.savefig(DOSSIER_SVG / f"{id_}.svg")
fig.savefig(DOSSIER_PNG / f"{id_}.png", dpi=200)
plt.close(fig)
def main():
DOSSIER_SVG.mkdir(exist_ok=True)
DOSSIER_PNG.mkdir(exist_ok=True)
for prefixe, figures in modules_figures(sys.argv[1:]).items():
for f in figures:
enregistrer(f.dessiner(), f.id)
print(f"{f.id} : OK")
if __name__ == "__main__":
main()
+153
View File
@@ -0,0 +1,153 @@
"""Module 3 — Signaux analogiques : PWM & ADC."""
import numpy as np
import matplotlib.pyplot as plt
import schemdraw
import schemdraw.elements as elm
from style import BLEU, ORANGE, GRIS, ENCRE, VERT, CM, Figure
schemdraw.use("matplotlib")
def _signal_carre(rapport, periodes=3, points=2000):
t = np.linspace(0, periodes, points, endpoint=False)
return t, np.where((t % 1) < rapport, 3.3, 0.0)
def pwm_rapport_cyclique():
fig, axes = plt.subplots(3, 1, figsize=(16 * CM, 11 * CM), sharex=True)
for ax, rapport in zip(axes, (0.25, 0.50, 0.75)):
t, v = _signal_carre(rapport)
moyenne = 3.3 * rapport
ax.fill_between(t, v, step=None, color=BLEU, alpha=0.12)
ax.plot(t, v, color=BLEU)
ax.axhline(moyenne, color=ORANGE, ls="--", lw=1.8)
ax.text(3.04, moyenne, f"moyenne\n{round(moyenne + 1e-9, 2):.2f} V".replace(".", ","),
color=ORANGE, va="center", fontsize=9, fontweight="bold")
ax.set_ylim(-0.3, 4.1)
ax.set_yticks([0, 3.3], ["0 V", "3,3 V"])
ax.set_title(f"Rapport cyclique {int(rapport * 100)} % → analogWrite(pin, {round(rapport * 255)})",
loc="left", fontsize=10, pad=16 if rapport == 0.25 else 6)
ax.grid(axis="x")
# Cotes T et t_on sur le premier graphe
ax = axes[0]
ax.annotate("", xy=(1, 3.75), xytext=(2, 3.75),
arrowprops=dict(arrowstyle="<->", color=ENCRE, lw=1))
ax.text(1.5, 3.85, "période T", ha="center", va="bottom", fontsize=8.5, color=ENCRE)
ax.annotate("", xy=(0, 3.75), xytext=(0.25, 3.75),
arrowprops=dict(arrowstyle="<->", color=ENCRE, lw=1))
ax.text(0.125, 3.85, "t$_{on}$", ha="center", va="bottom", fontsize=8.5, color=ENCRE)
axes[-1].set_xticks([0, 1, 2, 3], ["0", "T", "2T", "3T"])
axes[-1].set_xlabel("temps (ex. T = 0,2 ms à 5 kHz)")
fig.tight_layout()
return fig
def servo_50hz():
fig, axes = plt.subplots(3, 1, figsize=(16 * CM, 9.5 * CM), sharex=True)
cas = ((1.0, "0°"), (1.5, "90°"), (2.0, "180°"))
t = np.linspace(0, 40, 4000, endpoint=False)
for ax, (largeur, angle) in zip(axes, cas):
v = np.where((t % 20) < largeur, 3.3, 0.0)
ax.plot(t, v, color=BLEU, lw=1.8)
ax.fill_between(t, v, color=BLEU, alpha=0.12)
ax.set_ylim(-0.3, 4.3)
ax.set_yticks([0, 3.3], ["0 V", "3,3 V"])
ax.text(22.8, 2.0, f"impulsion {str(largeur).replace('.', ',')} ms → bras à {angle}",
fontsize=9, color=ENCRE, va="center")
ax.grid(axis="x")
ax = axes[0]
ax.annotate("", xy=(0, 3.85), xytext=(20, 3.85),
arrowprops=dict(arrowstyle="<->", color=ORANGE, lw=1.2))
ax.text(10, 3.95, "période = 20 ms (50 Hz)", ha="center", va="bottom",
fontsize=9, color=ORANGE, fontweight="bold")
axes[-1].set_xticks([0, 5, 10, 15, 20, 25, 30, 35, 40])
axes[-1].set_xlabel("temps (ms)")
fig.tight_layout()
return fig
def montage_variateur():
d = schemdraw.Drawing(show=False)
d.config(fontsize=11, unit=2.5, color=ENCRE)
ic = elm.Ic(
pins=[
# schemdraw empile les broches de gauche de bas en haut
elm.IcPin(name="GND", side="left", anchorname="GNDL"),
elm.IcPin(name="GPIO1 (ADC1)", side="left", anchorname="ADC"),
elm.IcPin(name="3V3", side="left", anchorname="V33"),
elm.IcPin(name="GPIO4 (PWM)", side="right", anchorname="PWM", slot="1/3"),
],
size=(6.5, 4.2), pinfontsize=10, lblsize=13,
).label("ESP32-S3", loc="top", fontsize=14).color(BLEU)
d += ic
# Potentiomètre 10 kΩ entre 3V3 et GND, curseur vers GPIO1
haut = ic.V33
bas = ic.GNDL
d += elm.Line().at(haut).left().length(2.2)
p_haut = d.here
d += elm.Line().at(bas).left().length(2.2)
p_bas = d.here
d += (pot := elm.Potentiometer().at(p_haut).down().toy(p_bas).label("10 kΩ", loc="top").color(VERT))
d += elm.Wire("-").at(pot.tap).to((ic.ADC[0], pot.tap[1])).color(VERT)
d += elm.Ground().at(p_bas)
# Sortie PWM : résistance 220 Ω puis LED vers GND
d += elm.Line().at(ic.PWM).right().length(1)
d += elm.Resistor().right().label("220 Ω").color(ORANGE)
d += elm.LED().down().label("LED", loc="bottom").color(ORANGE)
d += elm.Ground()
return d.draw(show=False)
def adc_quantification():
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16 * CM, 7.5 * CM),
gridspec_kw={"width_ratios": [1, 1.25]})
# (a) principe de la quantification, illustré sur 3 bits
v = np.linspace(0, 3.3, 1000)
niveaux = 8
code = np.minimum(np.floor(v / 3.3 * niveaux), niveaux - 1)
ax1.plot(v, v / 3.3 * (niveaux - 1), color=GRIS, ls=":", lw=1.3, label="tension réelle")
ax1.step(v, code, where="post", color=BLEU, label="valeur numérique")
ax1.set_xlim(0, 3.3)
ax1.set_yticks(range(niveaux))
ax1.set_xlabel("tension d'entrée (V)")
ax1.set_ylabel("valeur lue")
ax1.set_title("(a) Principe : la tension est\ndécoupée en paliers", loc="left", fontsize=10)
ax1.text(2.35, 0.6, "illustré avec 8 paliers (3 bits)\nl'ESP32-S3 en a 4096 (12 bits)",
fontsize=7.5, color=GRIS, ha="center")
ax1.legend(fontsize=7.5, loc="upper left", frameon=False)
# (b) chaîne de conversion utilisée dans l'exercice
ax2.plot([0, 3.3], [0, 4095], color=BLEU)
ax2.set_xlim(0, 3.3)
ax2.set_ylim(0, 4095)
ax2.set_yticks([0, 1024, 2048, 3072, 4095])
ax2.set_xlabel("tension d'entrée (V)")
ax2.set_ylabel("analogRead()", color=BLEU)
sec = ax2.secondary_yaxis("right", functions=(lambda x: x * 255 / 4095, lambda y: y * 4095 / 255))
sec.set_ylabel("map() → PWM", color=ORANGE)
sec.set_yticks([0, 85, 170, 255])
sec.tick_params(colors=ORANGE)
sec.spines["right"].set_visible(True)
sec.spines["right"].set_color(ORANGE)
ax2.plot([1.65, 1.65, 3.3], [0, 2048, 2048], color=ORANGE, ls="--", lw=1.2)
ax2.plot(1.65, 2048, "o", color=ORANGE)
ax2.text(1.75, 1150, "1,65 V → 2048\nmap() → 127", color=ORANGE, fontsize=8.5, fontweight="bold")
ax2.set_title("(b) Lecture puis mise à l'échelle", loc="left", fontsize=10)
fig.tight_layout()
return fig
FIGURES = [
Figure("m03-pwm-rapport-cyclique",
"Le rapport cyclique fixe la tension moyenne perçue par la charge (LED, moteur)",
"1. Qu'est-ce que le PWM ?", pwm_rapport_cyclique),
Figure("m03-servo-50hz",
"Commande d'un servomoteur : la largeur de l'impulsion (1 à 2 ms) fixe l'angle",
"2.2 Approche explicite : API LEDC (contrôle fin)", servo_50hz, largeur_cm=15),
Figure("m03-montage-variateur",
"Câblage de l'exercice : potentiomètre sur GPIO1 (ADC1), LED sur GPIO4 (PWM)",
"3. Exercice : variateur de luminosité avec potentiomètre", montage_variateur, largeur_cm=14),
Figure("m03-adc-quantification",
"Conversion analogique-numérique puis mise à l'échelle avec map()",
"4. Le convertisseur analogique-numérique (ADC)", adc_quantification),
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

+3
View File
@@ -0,0 +1,3 @@
schemdraw>=0.23
matplotlib>=3.11
lxml>=6.1
+51
View File
@@ -0,0 +1,51 @@
"""Charte graphique commune à tous les schémas de la formation."""
from dataclasses import dataclass
from typing import Callable
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt # noqa: E402
# Palette
BLEU = "#1f5fa8" # signal principal
ORANGE = "#e07a1f" # valeur moyenne, mise en évidence
VERT = "#2e8b57"
ROUGE = "#c0392b"
GRIS = "#6b7280"
GRIS_CLAIR = "#e5e7eb"
ENCRE = "#1f2937" # texte
CM = 1 / 2.54 # conversion cm -> pouces pour figsize
plt.rcParams.update({
"font.family": "DejaVu Sans",
"font.size": 10,
"axes.edgecolor": GRIS,
"axes.labelcolor": ENCRE,
"axes.titlesize": 11,
"axes.titleweight": "bold",
"axes.titlecolor": ENCRE,
"axes.spines.top": False,
"axes.spines.right": False,
"axes.grid": True,
"grid.color": GRIS_CLAIR,
"grid.linewidth": 0.8,
"xtick.color": GRIS,
"ytick.color": GRIS,
"lines.linewidth": 2,
"svg.fonttype": "path", # texte vectorisé : rendu identique partout
"savefig.bbox": "tight",
"savefig.pad_inches": 0.1,
"savefig.facecolor": "white",
})
@dataclass
class Figure:
"""Déclaration d'une figure à générer puis insérer dans un support."""
id: str # ex. "m03-pwm-duty" ; le préfixe mXX donne le module
legende: str # texte de la légende (sans « Figure X.Y — »)
ancre: str # texte exact du titre de section concerné
dessiner: Callable # renvoie une figure matplotlib ou un dessin schemdraw
largeur_cm: float = 16.0
File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 75 KiB

+720
View File
@@ -0,0 +1,720 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="497.702001pt" height="242.282279pt" viewBox="0 0 497.702001 242.282279" xmlns="http://www.w3.org/2000/svg" version="1.1">
<metadata>
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<cc:Work>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:date>2026-10-18T14:38:22.285543</dc:date>
<dc:format>image/svg+xml</dc:format>
<dc:creator>
<cc:Agent>
<dc:title>Matplotlib v3.11.2, https://matplotlib.org/</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
</rdf:RDF>
</metadata>
<defs>
<style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M -0 242.282279
L 497.702001 242.282279
L 497.702001 0
L -0 0
z
" style="fill: #ffffff"/>
</g>
<g id="axes_1">
<g id="patch_2">
<path d="M 444.794366 164.385404
L 437.451525 174.665381
L 430.108684 164.385404
L 444.794366 164.385404
z
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #e07a1f; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_1">
<path d="M 129.052194 147.496869
L 319.966065 147.496869
L 319.966065 24.137136
L 129.052194 24.137136
L 129.052194 147.496869
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f5fa8; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_2">
<path d="M 129.052194 132.811186
L 114.366512 132.811186
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f5fa8; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_3">
<path d="M 129.052194 85.817003
L 114.366512 85.817003
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f5fa8; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_4">
<path d="M 129.052194 38.822819
L 114.366512 38.822819
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f5fa8; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_5">
<path d="M 319.966065 132.811186
L 334.651748 132.811186
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f5fa8; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_6">
<path d="M 114.366512 38.822819
L 82.05801 38.822819
L 49.749509 38.822819
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f2937; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_7">
<path d="M 114.366512 132.811186
L 82.05801 132.811186
L 49.749509 132.811186
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f2937; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_8">
<path d="M 49.749509 38.822819
L 49.749509 71.13132
L 57.09235 73.578934
L 42.406668 78.474161
L 57.09235 83.369389
L 42.406668 88.264616
L 57.09235 93.159844
L 42.406668 98.055071
L 49.749509 100.502685
L 49.749509 132.811186
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #2e8b57; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_9">
<path d="M 70.896892 85.817003
L 64.435191 85.817003
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #2e8b57; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="patch_3">
<path d="M 64.435191 88.019855
L 57.09235 85.817003
L 64.435191 83.61415
z
" clip-path="url(#p34353fba05)" style="fill: #2e8b57"/>
</g>
<g id="line2d_10">
<path d="M 70.896892 85.817003
L 114.366512 85.817003
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #2e8b57; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_11">
<path d="M 49.749509 132.811186
L 49.749509 144.559732
L 42.406668 144.559732
L 57.09235 144.559732
M 44.60952 148.084296
L 54.889498 148.084296
M 48.280941 151.60886
L 51.218077 151.60886
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f2937; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_12">
<path d="M 334.651748 132.811186
L 349.33743 132.811186
L 364.023113 132.811186
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f2937; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_13">
<path d="M 364.023113 132.811186
L 386.051636 132.811186
L 388.49925 125.468345
L 393.394477 140.154028
L 398.289705 125.468345
L 403.184932 140.154028
L 408.08016 125.468345
L 412.975387 140.154028
L 415.423001 132.811186
L 437.451525 132.811186
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #e07a1f; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_14">
<path d="M 437.451525 132.811186
L 437.451525 164.385404
M 444.794366 174.665381
L 430.108684 174.665381
M 437.451525 174.665381
L 437.451525 206.239598
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #e07a1f; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="line2d_15">
<path d="M 448.465787 171.728245
L 456.215461 176.15663
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #e07a1f; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="patch_4">
<path d="M 457.381244 174.116512
L 461.315759 179.071086
L 455.049679 178.196749
z
" clip-path="url(#p34353fba05)" style="fill: #e07a1f"/>
</g>
<g id="line2d_16">
<path d="M 448.465787 165.119688
L 456.215461 169.548073
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #e07a1f; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="patch_5">
<path d="M 457.381244 167.507954
L 461.315759 172.462529
L 455.049679 171.588192
z
" clip-path="url(#p34353fba05)" style="fill: #e07a1f"/>
</g>
<g id="line2d_17">
<path d="M 437.451525 206.239598
L 437.451525 217.988144
L 430.108684 217.988144
L 444.794366 217.988144
M 432.311536 221.512708
L 442.591514 221.512708
M 435.982956 225.037272
L 438.920093 225.037272
" clip-path="url(#p34353fba05)" style="fill: none; stroke: #1f2937; stroke-width: 2; stroke-linecap: round"/>
</g>
<g id="text_1">
<!-- GND -->
<g style="fill: #1f5fa8" transform="translate(133.457899 137.906968) scale(0.14 -0.14)">
<defs>
<path id="DejaVuSans-2a" d="M 3809 666
L 3809 1919
L 2778 1919
L 2778 2438
L 4434 2438
L 4434 434
Q 4069 175 3628 42
Q 3188 -91 2688 -91
Q 1594 -91 976 548
Q 359 1188 359 2328
Q 359 3472 976 4111
Q 1594 4750 2688 4750
Q 3144 4750 3555 4637
Q 3966 4525 4313 4306
L 4313 3634
Q 3963 3931 3569 4081
Q 3175 4231 2741 4231
Q 1884 4231 1454 3753
Q 1025 3275 1025 2328
Q 1025 1384 1454 906
Q 1884 428 2741 428
Q 3075 428 3337 486
Q 3600 544 3809 666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-31" d="M 628 4666
L 1478 4666
L 3547 763
L 3547 4666
L 4159 4666
L 4159 0
L 3309 0
L 1241 3903
L 1241 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-27" d="M 1259 4147
L 1259 519
L 2022 519
Q 2988 519 3436 956
Q 3884 1394 3884 2338
Q 3884 3275 3436 3711
Q 2988 4147 2022 4147
L 1259 4147
z
M 628 4666
L 1925 4666
Q 3281 4666 3915 4102
Q 4550 3538 4550 2338
Q 4550 1131 3912 565
Q 3275 0 1925 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-2a"/>
<use xlink:href="#DejaVuSans-31" transform="translate(77.484375 0)"/>
<use xlink:href="#DejaVuSans-27" transform="translate(152.296875 0)"/>
</g>
</g>
<g id="text_2">
<!-- GPIO1 (ADC1) -->
<g style="fill: #1f5fa8" transform="translate(133.457899 90.205128) scale(0.14 -0.14)">
<defs>
<path id="DejaVuSans-33" d="M 1259 4147
L 1259 2394
L 2053 2394
Q 2494 2394 2734 2622
Q 2975 2850 2975 3272
Q 2975 3691 2734 3919
Q 2494 4147 2053 4147
L 1259 4147
z
M 628 4666
L 2053 4666
Q 2838 4666 3239 4311
Q 3641 3956 3641 3272
Q 3641 2581 3239 2228
Q 2838 1875 2053 1875
L 1259 1875
L 1259 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-2c" d="M 628 4666
L 1259 4666
L 1259 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-32" d="M 2522 4238
Q 1834 4238 1429 3725
Q 1025 3213 1025 2328
Q 1025 1447 1429 934
Q 1834 422 2522 422
Q 3209 422 3611 934
Q 4013 1447 4013 2328
Q 4013 3213 3611 3725
Q 3209 4238 2522 4238
z
M 2522 4750
Q 3503 4750 4090 4092
Q 4678 3434 4678 2328
Q 4678 1225 4090 567
Q 3503 -91 2522 -91
Q 1538 -91 948 565
Q 359 1222 359 2328
Q 359 3434 948 4092
Q 1538 4750 2522 4750
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-14" d="M 794 531
L 1825 531
L 1825 4091
L 703 3866
L 703 4441
L 1819 4666
L 2450 4666
L 2450 531
L 3481 531
L 3481 0
L 794 0
L 794 531
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-3" transform="scale(0.015625)"/>
<path id="DejaVuSans-b" d="M 1984 4856
Q 1566 4138 1362 3434
Q 1159 2731 1159 2009
Q 1159 1288 1364 580
Q 1569 -128 1984 -844
L 1484 -844
Q 1016 -109 783 600
Q 550 1309 550 2009
Q 550 2706 781 3412
Q 1013 4119 1484 4856
L 1984 4856
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-24" d="M 2188 4044
L 1331 1722
L 3047 1722
L 2188 4044
z
M 1831 4666
L 2547 4666
L 4325 0
L 3669 0
L 3244 1197
L 1141 1197
L 716 0
L 50 0
L 1831 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-26" d="M 4122 4306
L 4122 3641
Q 3803 3938 3442 4084
Q 3081 4231 2675 4231
Q 1875 4231 1450 3742
Q 1025 3253 1025 2328
Q 1025 1406 1450 917
Q 1875 428 2675 428
Q 3081 428 3442 575
Q 3803 722 4122 1019
L 4122 359
Q 3791 134 3420 21
Q 3050 -91 2638 -91
Q 1578 -91 968 557
Q 359 1206 359 2328
Q 359 3453 968 4101
Q 1578 4750 2638 4750
Q 3056 4750 3426 4639
Q 3797 4528 4122 4306
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-c" d="M 513 4856
L 1013 4856
Q 1481 4119 1714 3412
Q 1947 2706 1947 2009
Q 1947 1309 1714 600
Q 1481 -109 1013 -844
L 513 -844
Q 928 -128 1133 580
Q 1338 1288 1338 2009
Q 1338 2731 1133 3434
Q 928 4138 513 4856
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-2a"/>
<use xlink:href="#DejaVuSans-33" transform="translate(77.484375 0)"/>
<use xlink:href="#DejaVuSans-2c" transform="translate(137.78125 0)"/>
<use xlink:href="#DejaVuSans-32" transform="translate(167.28125 0)"/>
<use xlink:href="#DejaVuSans-14" transform="translate(246 0)"/>
<use xlink:href="#DejaVuSans-3" transform="translate(309.625 0)"/>
<use xlink:href="#DejaVuSans-b" transform="translate(341.40625 0)"/>
<use xlink:href="#DejaVuSans-24" transform="translate(380.421875 0)"/>
<use xlink:href="#DejaVuSans-27" transform="translate(448.828125 0)"/>
<use xlink:href="#DejaVuSans-26" transform="translate(525.828125 0)"/>
<use xlink:href="#DejaVuSans-14" transform="translate(595.65625 0)"/>
<use xlink:href="#DejaVuSans-c" transform="translate(659.28125 0)"/>
</g>
</g>
<g id="text_3">
<!-- 3V3 -->
<g style="fill: #1f5fa8" transform="translate(133.457899 43.9186) scale(0.14 -0.14)">
<defs>
<path id="DejaVuSans-16" d="M 2597 2516
Q 3050 2419 3304 2112
Q 3559 1806 3559 1356
Q 3559 666 3084 287
Q 2609 -91 1734 -91
Q 1441 -91 1130 -33
Q 819 25 488 141
L 488 750
Q 750 597 1062 519
Q 1375 441 1716 441
Q 2309 441 2620 675
Q 2931 909 2931 1356
Q 2931 1769 2642 2001
Q 2353 2234 1838 2234
L 1294 2234
L 1294 2753
L 1863 2753
Q 2328 2753 2575 2939
Q 2822 3125 2822 3475
Q 2822 3834 2567 4026
Q 2313 4219 1838 4219
Q 1578 4219 1281 4162
Q 984 4106 628 3988
L 628 4550
Q 988 4650 1302 4700
Q 1616 4750 1894 4750
Q 2613 4750 3031 4423
Q 3450 4097 3450 3541
Q 3450 3153 3228 2886
Q 3006 2619 2597 2516
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-39" d="M 1831 0
L 50 4666
L 709 4666
L 2188 738
L 3669 4666
L 4325 4666
L 2547 0
L 1831 0
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-16"/>
<use xlink:href="#DejaVuSans-39" transform="translate(63.625 0)"/>
<use xlink:href="#DejaVuSans-16" transform="translate(132.03125 0)"/>
</g>
</g>
<g id="text_4">
<!-- GPIO4 (PWM) -->
<g style="fill: #1f5fa8" transform="translate(222.475673 137.199311) scale(0.14 -0.14)">
<defs>
<path id="DejaVuSans-17" d="M 2419 4116
L 825 1625
L 2419 1625
L 2419 4116
z
M 2253 4666
L 3047 4666
L 3047 1625
L 3713 1625
L 3713 1100
L 3047 1100
L 3047 0
L 2419 0
L 2419 1100
L 313 1100
L 313 1709
L 2253 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-3a" d="M 213 4666
L 850 4666
L 1831 722
L 2809 4666
L 3519 4666
L 4500 722
L 5478 4666
L 6119 4666
L 4947 0
L 4153 0
L 3169 4050
L 2175 0
L 1381 0
L 213 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-30" d="M 628 4666
L 1569 4666
L 2759 1491
L 3956 4666
L 4897 4666
L 4897 0
L 4281 0
L 4281 4097
L 3078 897
L 2444 897
L 1241 4097
L 1241 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-2a"/>
<use xlink:href="#DejaVuSans-33" transform="translate(77.484375 0)"/>
<use xlink:href="#DejaVuSans-2c" transform="translate(137.78125 0)"/>
<use xlink:href="#DejaVuSans-32" transform="translate(167.28125 0)"/>
<use xlink:href="#DejaVuSans-17" transform="translate(246 0)"/>
<use xlink:href="#DejaVuSans-3" transform="translate(309.625 0)"/>
<use xlink:href="#DejaVuSans-b" transform="translate(341.40625 0)"/>
<use xlink:href="#DejaVuSans-33" transform="translate(380.421875 0)"/>
<use xlink:href="#DejaVuSans-3a" transform="translate(440.71875 0)"/>
<use xlink:href="#DejaVuSans-30" transform="translate(539.59375 0)"/>
<use xlink:href="#DejaVuSans-c" transform="translate(625.875 0)"/>
</g>
</g>
<g id="text_5">
<!-- ESP32-S3 -->
<g style="fill: #1f5fa8" transform="translate(191.090692 19.295781) scale(0.14 -0.14)">
<defs>
<path id="DejaVuSans-28" d="M 628 4666
L 3578 4666
L 3578 4134
L 1259 4134
L 1259 2753
L 3481 2753
L 3481 2222
L 1259 2222
L 1259 531
L 3634 531
L 3634 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-36" d="M 3425 4513
L 3425 3897
Q 3066 4069 2747 4153
Q 2428 4238 2131 4238
Q 1616 4238 1336 4038
Q 1056 3838 1056 3469
Q 1056 3159 1242 3001
Q 1428 2844 1947 2747
L 2328 2669
Q 3034 2534 3370 2195
Q 3706 1856 3706 1288
Q 3706 609 3251 259
Q 2797 -91 1919 -91
Q 1588 -91 1214 -16
Q 841 59 441 206
L 441 856
Q 825 641 1194 531
Q 1563 422 1919 422
Q 2459 422 2753 634
Q 3047 847 3047 1241
Q 3047 1584 2836 1778
Q 2625 1972 2144 2069
L 1759 2144
Q 1053 2284 737 2584
Q 422 2884 422 3419
Q 422 4038 858 4394
Q 1294 4750 2059 4750
Q 2388 4750 2728 4690
Q 3069 4631 3425 4513
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-15" d="M 1228 531
L 3431 531
L 3431 0
L 469 0
L 469 531
Q 828 903 1448 1529
Q 2069 2156 2228 2338
Q 2531 2678 2651 2914
Q 2772 3150 2772 3378
Q 2772 3750 2511 3984
Q 2250 4219 1831 4219
Q 1534 4219 1204 4116
Q 875 4013 500 3803
L 500 4441
Q 881 4594 1212 4672
Q 1544 4750 1819 4750
Q 2544 4750 2975 4387
Q 3406 4025 3406 3419
Q 3406 3131 3298 2873
Q 3191 2616 2906 2266
Q 2828 2175 2409 1742
Q 1991 1309 1228 531
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-10" d="M 313 2009
L 1997 2009
L 1997 1497
L 313 1497
L 313 2009
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-28"/>
<use xlink:href="#DejaVuSans-36" transform="translate(63.1875 0)"/>
<use xlink:href="#DejaVuSans-33" transform="translate(126.671875 0)"/>
<use xlink:href="#DejaVuSans-16" transform="translate(186.96875 0)"/>
<use xlink:href="#DejaVuSans-15" transform="translate(250.59375 0)"/>
<use xlink:href="#DejaVuSans-10" transform="translate(314.21875 0)"/>
<use xlink:href="#DejaVuSans-36" transform="translate(350.296875 0)"/>
<use xlink:href="#DejaVuSans-16" transform="translate(413.78125 0)"/>
</g>
</g>
<g id="text_6">
<!-- 10 kΩ -->
<g style="fill: #2e8b57" transform="translate(7.2 89.91794) scale(0.11 -0.11)">
<defs>
<path id="DejaVuSans-13" d="M 2034 4250
Q 1547 4250 1301 3770
Q 1056 3291 1056 2328
Q 1056 1369 1301 889
Q 1547 409 2034 409
Q 2525 409 2770 889
Q 3016 1369 3016 2328
Q 3016 3291 2770 3770
Q 2525 4250 2034 4250
z
M 2034 4750
Q 2819 4750 3233 4129
Q 3647 3509 3647 2328
Q 3647 1150 3233 529
Q 2819 -91 2034 -91
Q 1250 -91 836 529
Q 422 1150 422 2328
Q 422 3509 836 4129
Q 1250 4750 2034 4750
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-4e" d="M 581 4863
L 1159 4863
L 1159 1991
L 2875 3500
L 3609 3500
L 1753 1863
L 3688 0
L 2938 0
L 1159 1709
L 1159 0
L 581 0
L 581 4863
z
" transform="scale(0.015625)"/>
<path id="DejaVuSans-33d" d="M 4647 556
L 4647 0
L 2772 0
L 2772 556
Q 3325 859 3634 1378
Q 3944 1897 3944 2528
Q 3944 3278 3531 3731
Q 3119 4184 2444 4184
Q 1769 4184 1355 3729
Q 941 3275 941 2528
Q 941 1897 1250 1378
Q 1563 859 2119 556
L 2119 0
L 244 0
L 244 556
L 1241 556
Q 747 991 519 1456
Q 294 1922 294 2497
Q 294 3491 894 4106
Q 1491 4722 2444 4722
Q 3391 4722 3994 4106
Q 4594 3494 4594 2528
Q 4594 1922 4372 1459
Q 4150 997 3647 556
L 4647 556
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-14"/>
<use xlink:href="#DejaVuSans-13" transform="translate(63.625 0)"/>
<use xlink:href="#DejaVuSans-3" transform="translate(127.25 0)"/>
<use xlink:href="#DejaVuSans-4e" transform="translate(159.03125 0)"/>
<use xlink:href="#DejaVuSans-33d" transform="translate(216.9375 0)"/>
</g>
</g>
<g id="text_7">
<!-- 220 Ω -->
<g style="fill: #e07a1f" transform="translate(384.288022 121.035037) scale(0.11 -0.11)">
<use xlink:href="#DejaVuSans-15"/>
<use xlink:href="#DejaVuSans-15" transform="translate(63.625 0)"/>
<use xlink:href="#DejaVuSans-13" transform="translate(127.25 0)"/>
<use xlink:href="#DejaVuSans-3" transform="translate(190.875 0)"/>
<use xlink:href="#DejaVuSans-33d" transform="translate(222.65625 0)"/>
</g>
</g>
<g id="text_8">
<!-- LED -->
<g style="fill: #e07a1f" transform="translate(468.952313 173.535236) scale(0.11 -0.11)">
<defs>
<path id="DejaVuSans-2f" d="M 628 4666
L 1259 4666
L 1259 531
L 3531 531
L 3531 0
L 628 0
L 628 4666
z
" transform="scale(0.015625)"/>
</defs>
<use xlink:href="#DejaVuSans-2f"/>
<use xlink:href="#DejaVuSans-28" transform="translate(55.71875 0)"/>
<use xlink:href="#DejaVuSans-27" transform="translate(118.90625 0)"/>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="p34353fba05">
<rect x="21.461213" y="14.09213" width="460.8" height="220.990149"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 357 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 644 KiB