PYTHON → ROBOTIQUE · 21

Séance 21 · Partie D · Électronique et embarqué

Bases
d’électronique.

Avant d’écrire une ligne pour l’Arduino, il faut savoir pourquoi une LED sans résistance grille, pourquoi un moteur ne se branche pas sur une broche, et ce que mesure vraiment un capteur. Une séance de physique, avec Python comme calculatrice.

Durée : 2 séances · Objectifs : tension, courant, résistance, loi d’Ohm, puissance ; LED et résistance série ; pont diviseur et capteurs résistifs ; breadboard et multimètre ; numérique vs analogique ; sécurité.

Ce que vous saurez faire à la fin
  • Calculer la résistance à mettre devant une LED, et pourquoi.
  • Lire un schéma simple et le monter sur une breadboard.
  • Comprendre ce qu’une broche d’Arduino peut et ne peut pas alimenter.
  • Mesurer tension, courant et résistance avec un multimètre.

Matériel : breadboard, LED, résistances (220 Ω, 1 kΩ, 10 kΩ), bouton, potentiomètre, photorésistance, multimètre, une pile ou une alimentation 5 V.

01 / Grandeurs

Tension, courant, résistance : l’analogie de l’eau

GrandeurUnitéImageSe mesure
Tension Uvolt (V)La pression, la différence de hauteur entre deux pointsEntre deux points, en parallèle
Courant Iampère (A)Le débit d’eau qui circuleDans le fil, en série
Résistance Rohm (Ω)L’étroitesse du tuyauComposant hors circuit
Puissance Pwatt (W)L’énergie dissipée par seconde (chaleur, lumière, mouvement)Se calcule : P = U × I

Loi d’Ohm : U = R × I

Une tension pousse un courant à travers une résistance. Plus la résistance est grande, moins il passe de courant pour une même tension.

Ordres de grandeur : pile 1,5 V ; USB 5 V ; Arduino 5 V ; ESP32 et Pico 3,3 V ; secteur 230 V (jamais dans ce cours). LED 10 à 20 mA ; broche Arduino 20 mA max ; petit moteur 0,5 à 2 A.

La masse

Une tension est toujours une différence entre deux points. On choisit un point de référence, la masse (GND, 0 V), et toutes les tensions sont mesurées par rapport à lui. Tous les composants d’un circuit doivent partager la même masse : deux cartes qui communiquent sans masse commune, c’est le bug n°1 des débutants.

01 / Grandeurs

La loi d’Ohm et la puissance, en Python

Trois formules à connaître par cœur

U = RI, P = UI, et leurs combinaisons P = U²/R = RI². Avec elles, on dimensionne 90 % d’un circuit de robot. Le court-circuit : résistance quasi nulle → courant énorme → chaleur → fumée. Une batterie LiPo court-circuitée peut prendre feu : d’où les fusibles et la vérification au multimètre avant de mettre sous tension.

02 / Composants

La LED et sa résistance : le premier calcul de tout roboticien

Une LED n’obéit pas à la loi d’Ohm : en dessous de sa tension de seuil elle ne conduit pas ; au-dessus, le courant explose. Il faut donc une résistance en série qui absorbe la différence de tension et fixe le courant.

  5 V ──[ 220 Ω ]──▶|── GND
                    LED
  (anode : patte longue, côté +)

Retenez : 220 Ω sur 5 V, 100 Ω sur 3,3 V. Ça marche pour toutes les couleurs.

Pourquoi ces valeurs

Les résistances du commerce suivent la série E12 : 12 valeurs par décade. On prend la valeur normalisée juste au-dessus du calcul : un peu moins de courant, jamais plus. Une LED tolère 20 mA en continu ; 15 mA est déjà très lumineux. Une broche d’Arduino fournit au plus 20 mA (40 mA absolu) : une LED avec 220 Ω, oui ; deux en parallèle sur la même broche, c’est limite ; un moteur, jamais.

02 / Composants

Série et parallèle

Les deux lois de Kirchhoff, en une phrase chacune

Nœuds : le courant qui entre dans un point ressort intégralement (rien ne s’accumule). Mailles : en faisant le tour d’une boucle, les tensions s’additionnent à zéro (on revient à la même « hauteur »). Toute l’analyse de circuit en prépa découle de ces deux lois, et elles suffisent ici pour comprendre série (même courant) et parallèle (même tension).

02 / Composants

Le pont diviseur : transformer une résistance en tension

   U_in
    │
  [R_haut]
    ├──── U_out
  [R_bas]
    │
   GND

 U_out = U_in × R_bas / (R_haut + R_bas)

La plupart des capteurs bon marché sont des résistances variables : photorésistance, thermistance, capteur de flexion, potentiomètre. Le pont diviseur les transforme en tension, que la carte sait lire.

Choisir la résistance fixe

Pour une sensibilité maximale, on prend R_bas proche de la résistance du capteur dans la zone qui nous intéresse. Un potentiomètre est un pont diviseur réglable : ses deux extrémités sur 5 V et GND, son curseur donne de 0 à 5 V. Attention : un diviseur consomme en permanence (5 V / 20 kΩ = 0,25 mA) et ne fournit presque pas de courant : il sert à mesurer, pas à alimenter.

02 / Composants

Le bouton et la résistance de rappel

  Sans rappel : broche « en l'air »
  quand le bouton est relâché →
  valeur aléatoire, parasites.

  Avec pull-down :
    5 V ──[bouton]──┬── broche
                    [10 kΩ]
                    GND
  relâché : 0 (via 10k) ; pressé : 1

  Avec pull-up (interne à l'Arduino) :
    pinMode(2, INPUT_PULLUP);
    broche ──[bouton]── GND
  relâché : 1 ; pressé : 0 (inversé !)

Une entrée numérique lit 0 ou 1 selon que sa tension est proche de 0 V ou de 5 V. Entre les deux, ou non connectée, elle lit n’importe quoi.

La résistance de rappel (pull-up ou pull-down) impose une valeur par défaut. Les microcontrôleurs en ont une intégrée (pull-up) : le montage se réduit à un bouton entre la broche et GND.

Avec le pull-up interne, « pressé » = 0. Ne pas l’oublier dans le code.

Le rebond

Un bouton mécanique ne fait pas un contact franc : pendant 1 à 10 ms, il « rebondit » et la broche voit 0101010 avant de se stabiliser. Un compteur naïf compte alors 5 appuis pour un. On anti-rebond (debounce) par logiciel (ignorer les changements pendant 20 ms après un changement) ou par matériel (condensateur). Séance 22.

03 / Signaux

Numérique et analogique

Ce que la carte sait faire

Entrée numérique : 0 ou 1. Sortie numérique : 0 V ou 5 V. Entrée analogique (ADC) : une tension → un entier de 0 à 1023. Sortie « analogique » : en réalité une PWM (séance 23). Une tension supérieure à la référence (5 V, ou 3,3 V !) ne donne pas une valeur plus grande : elle détruit la broche. C’est la première chose à vérifier avant de brancher un capteur sur un ESP32.

03 / Signaux

Ce qu’une broche ne peut pas faire : alimenter

ChargeCourantSur une broche ?Solution
LED + résistance15 mAoui
Buzzer piézo~10 mAoui
Servomoteur SG90100–700 mAnonAlimentation séparée, signal seul sur la broche
Moteur CC0,2–2 AnonTransistor ou pont en H (séance 27)
Relais, électro-aimant50–100 mAnonTransistor + diode de roue libre
  Piloter un moteur avec un transistor :

   +6 V ──[moteur]──┬── collecteur
                    ▲ diode        NPN
   broche ─[1 kΩ]── base
                    émetteur ── GND

  Le petit courant de base commande
  le grand courant du moteur.
Le transistor, interrupteur commandé

Un transistor laisse passer un courant important (collecteur → émetteur) quand un petit courant arrive sur sa base. La broche fournit 4 mA, le moteur en tire 1 A depuis son alimentation. La diode de roue libre est obligatoire avec tout moteur ou bobine : à la coupure, la bobine génère une pointe de tension inverse qui détruirait le transistor. Un MOSFET fait la même chose sans courant de base ; un pont en H permet d’inverser le sens.

04 / Pratique

Breadboard et multimètre

  Breadboard (vue de dessus) :

  + ━━━━━━━━━━━━━━━━━━━━  rails d'alimentation
  − ━━━━━━━━━━━━━━━━━━━━  (reliés horizontalement)

    a b c d e   f g h i j
  1 ○ ○ ○ ○ ○   ○ ○ ○ ○ ○   chaque ligne de 5
  2 ○ ○ ○ ○ ○   ○ ○ ○ ○ ○   trous est reliée
  3 ○ ○ ○ ○ ○   ○ ○ ○ ○ ○   (a-e ensemble,
  ...                       f-j ensemble)
        ┃ rigole centrale : coupure

Multimètre

  • Tension (V⎓) : sondes en parallèle, sur les deux points. Toujours sûr.
  • Résistance (Ω) : composant débranché, hors tension.
  • Courant (A) : le multimètre s’insère dans le fil (série). Sonde sur la borne A. Jamais en parallèle : court-circuit.
  • Continuité (♪) : bip si les deux points sont reliés. Pour trouver un mauvais contact.
Méthode de montage

1. Dessiner le schéma. 2. Alimentation débranchée. 3. Placer les composants en suivant le schéma, fils courts, couleurs (rouge +, noir GND). 4. Vérifier à l’œil puis au multimètre (continuité entre + et GND = court-circuit !). 5. Brancher. 6. Mesurer les tensions attendues. Une LED à l’envers ne s’allume pas et ne casse rien ; une alimentation à l’envers sur une carte la détruit.

04 / Pratique

Montages à réaliser

  1. LED seule — 5 V, 220 Ω, LED, GND. Mesurer la tension aux bornes de la LED (≈ 2 V) et de la résistance (≈ 3 V) : la somme fait 5 V. Mesurer le courant.
  2. Deux LED en série — combien de tension reste-t-il pour la résistance ? Peut-on en mettre trois sur 5 V ?
  3. Potentiomètre — extrémités sur 5 V et GND, mesurer la tension du curseur en tournant. C’est votre premier capteur analogique.
  4. Photorésistance — pont diviseur avec 10 kΩ, mesurer la tension à la lumière et à l’ombre. Inverser LDR et résistance : que change-t-on ?
  5. Bouton avec pull-down — mesurer la tension sur la broche, pressé et relâché. Retirer la résistance : mesurer encore, toucher le fil avec le doigt.

Notez chaque mesure. Comparez avec les calculs Python. L’écart, c’est la tolérance des composants (±5 %) et la résistance interne du multimètre.

05 / Défis

Défi ★ — Le vérificateur de LED

Consigne

Écrire verifier_led(U_alim, U_led, R) qui renvoie un diagnostic : « OK » si le courant est entre 5 et 20 mA, « trop faible, LED éteinte ou pâle » en dessous, « DANGER » au-dessus, et « ne s’allume pas » si U_alim ≤ U_led. Tester avec plusieurs combinaisons, dont 3,3 V avec une LED blanche (3,2 V) et 100 Ω.

Correction
def verifier_led(U_alim, U_led, R):
    if U_alim <= U_led:
        return "ne s'allume pas (tension insuffisante)"
    I = (U_alim - U_led) / R * 1000
    if I > 20: return f"DANGER : {I:.0f} mA"
    if I < 5:  return f"trop faible : {I:.1f} mA"
    return f"OK : {I:.1f} mA"

La LED blanche sur 3,3 V avec 100 Ω ne reçoit que 1 mA : à peine visible. Sur une carte 3,3 V, les LED bleues et blanches sont un problème ; on préfère rouge ou verte, ou un transistor vers 5 V.

05 / Défis

Défi ★★ — Dimensionner l’alimentation d’un robot

Consigne

Un robot contient : 2 moteurs (6 V, 0,8 A chacun en charge, 2 A au démarrage pendant 0,2 s), 1 servomoteur (5 V, 0,25 A moyen, 0,7 A en pointe), 1 Arduino (5 V, 50 mA), 1 capteur ultrason (15 mA), 4 LED (15 mA). Batterie : 6 × AA NiMH (7,2 V, 2000 mAh) avec un régulateur 5 V à 85 % de rendement pour la partie logique.

Calculer : le courant total moyen et en pointe ; l’autonomie ; la puissance dissipée par le régulateur. Puis : combien de temps le robot peut-il rouler si les moteurs ne tournent que 60 % du temps ?

Correction
U_bat, capacite = 7.2, 2.0                 # V, Ah
rendement = 0.85
I_logique = sum(c["I_moy"] for n, c in composants.items() if c["U"] == 5)
P_logique = 5 * I_logique
I_bat_logique = P_logique / rendement / U_bat        # ce que la batterie fournit pour la partie 5 V
I_moteurs = composants["moteurs"]["I_moy"]           # supposés directement sur la batterie
I_total = I_bat_logique + I_moteurs
I_pointe = sum(c["I_max"] for c in composants.values())
print(f"Courant moyen batterie : {I_total:.2f} A, pointe : {I_pointe:.2f} A")
print(f"Autonomie moteurs 100 % : {capacite / I_total:.2f} h")
print(f"Autonomie moteurs 60 % : {capacite / (I_bat_logique + 0.6 * I_moteurs):.2f} h")
print(f"Régulateur : dissipe {(U_bat - 5) * I_logique / rendement:.2f} W (chauffe !)")

≈ 1,9 A moyen, 4,7 A en pointe : les piles AA tiennent, à condition que les fils et le connecteur supportent la pointe. Un régulateur linéaire dissiperait (7,2 − 5) × I en chaleur ; un régulateur à découpage (85 %) est bien meilleur. Le démarrage des moteurs peut faire chuter la tension et redémarrer l’Arduino : c’est le bug classique du robot qui « reboote quand il accélère ». Solution : condensateur de découplage, ou alimentation logique séparée.

05 / Défis

Défi ★★★ — Esprit prépa : le condensateur et le temps

Consigne

Un condensateur C chargé à travers une résistance R suit U(t) = U₀(1 − e^(−t/RC)). La constante de temps τ = RC (en secondes si R en Ω et C en F).

1. Simuler la charge avec la méthode d’Euler (séance 15) : dU/dt = (U₀ − U)/(RC). Comparer à la formule. Pour R = 10 kΩ, C = 100 µF : temps pour atteindre 63 % ? 99 % ?
2. Un bouton avec anti-rebond matériel : R = 10 kΩ, C = 100 nF. Combien de temps le signal met-il à passer de 0 à 2,5 V (seuil logique) ? Est-ce suffisant pour masquer des rebonds de 5 ms ?
3. Tracer avec matplotlib la charge et la décharge.

Correction et ouverture
def charge(R, C, U0=5.0, dt=None, duree=None):
    tau = R * C
    dt = dt or tau / 200; duree = duree or 6 * tau
    t, U = 0.0, 0.0; ts, Us = [0.0], [0.0]
    while t < duree:
        U += (U0 - U) / tau * dt; t += dt
        ts.append(t); Us.append(U)
    return ts, Us

R, C = 10_000, 100e-6
ts, Us = charge(R, C)
tau = R * C
print(f"τ = {tau} s ; 63 % à t ≈ {next(t for t, u in zip(ts, Us) if u >= 0.63 * 5):.2f} s ; 99 % à ≈ {next(t for t, u in zip(ts, Us) if u >= 0.99 * 5):.2f} s (théorie : τ et 4.6 τ)")
ts2, Us2 = charge(10_000, 100e-9)
print(f"Anti-rebond : 2.5 V atteint en {1000 * next(t for t, u in zip(ts2, Us2) if u >= 2.5):.2f} ms (théorie : RC·ln2 = {1000 * 10_000 * 100e-9 * math.log(2):.2f} ms)")

plt.plot(ts, Us, label="charge (Euler)")
plt.plot(ts, [5 * (1 - math.exp(-t / tau)) for t in ts], "--", label="formule")
plt.plot(ts, [5 * math.exp(-t / tau) for t in ts], label="décharge")
plt.xlabel("t (s)"); plt.ylabel("U (V)"); plt.legend(); plt.grid(alpha=.3); plt.show()

τ = 1 s : 63 % en 1 s, 99 % en 4,6 s. L’anti-rebond RC = 1 ms retarde le front de 0,7 ms : trop court pour des rebonds de 5 ms — il faudrait C = 1 µF (τ = 10 ms). Le condensateur est le composant « mémoire de tension » : découplage d’alimentation (il fournit la pointe de courant que la batterie ne peut pas donner assez vite), filtrage, temporisation. L’équation dU/dt = (U₀ − U)/τ est votre première équation différentielle linéaire ; sa solution exponentielle est le pain quotidien de la prépa, et vous venez de la vérifier numériquement.

06 / Vérification

Peut-on brancher un petit moteur directement entre une broche de l’Arduino et GND ?

Deux questions supplémentaires

1. Pourquoi une résistance devant une LED ? Parce qu’au-dessus de son seuil, la LED laisse passer un courant quasi illimité : la résistance fixe ce courant à 10–20 mA.

2. Que lit une entrée numérique non connectée ? N’importe quoi : il faut une résistance de rappel (pull-up ou pull-down).

Référence

Les mots à retenir

MotDéfinition
Tension U (V)Différence de potentiel entre deux points.
Courant I (A)Débit de charges dans un fil.
Loi d’OhmU = R × I.
Puissance P (W)P = U × I ; se dissipe en chaleur.
Masse (GND)Référence 0 V commune à tout le circuit.
Pont diviseurDeux résistances en série ; tension au milieu proportionnelle.
Pull-up / pull-downRésistance qui fixe la valeur par défaut d’une entrée.
ADCConvertisseur tension → entier (10 bits Arduino, 12 bits ESP32).

Pour continuer

Vous savez ce que vous branchez

Séance suivante : le code prend le contrôle des broches. Arduino en C/C++, premiers programmes.

À faire chez soi

Ressources

Loi d’Ohm · Simulateur de circuits Falstad (interactif) · Arduino Docs : Learn

← Séance 20SommaireSéance 22 : Arduino 1 →