← Le Moteur
Chapitre 4 / 8 — Prototype « Made In Zion », version roue de skate

Électronique de Commutation, Calibration et Récupération d'Énergie

MOSFET IRLZ44N, bip-mètre Hall SS49E, snubber Zener

Rejet de la commutation mécanique

À une vitesse de rotation de 750 tr/min avec une configuration multipolaire, la fréquence de commutation atteint 100 à 200 Hz. À ce régime, les micro-switches ou rupteurs mécaniques s'usent et s'arcent quasi instantanément — c'est exactement la limite chiffrée dans les premières versions de cette page, où un relais reed (≈1 ms de commutation) plafonnait le régime autour de 750 tr/min pour rester fiable. Le pilotage du prototype réel est donc confié exclusivement au transistor MOSFET de puissance canal N IRLZ44N (logic level), commandé par l'ESP32 : sa commutation en microsecondes ne borne plus le régime électroniquement.

⚠️ Conséquence pour le gouverneur de vitesse — en supprimant le plafond électronique imposé par le relais, ce choix supprime aussi le seul filet — même imparfait — qui limitait involontairement l'emballement. Voir Tests & sécurité — pas de gouverneur naturel : le frein de Prony (ou une charge contrôlée équivalente) devient plus que jamais la seule limite de vitesse du système, à engager dès la première mise sous tension.

Composants

Un canal (MOSFET + snubber) +Vcc / batterie bobine ESP32 pin R grille IRLZ44N GND 1N4007 (blocage) 24V Zener 1N5359B énergie de coupure recyclée vers +Vcc
ESP32 → MOSFET IRLZ44N → bobine ; à l'ouverture, la diode 1N4007 + Zener 24V renvoient le pic inductif vers +Vcc au lieu de le dissiper

La calibration par bip-mètre Hall

Pour régler précisément le courant d'annulation calibré à 0,11 A (pertes Joule minimes de ≈0,07 W par bobine), le prototype réel n'utilise pas de gaussmètre coûteux mais un capteur linéaire SS49E relié à l'ESP32. Ce « bip-mètre » acoustique traduit l'intensité du champ magnétique en son : lorsque le courant d'annulation est parfait, le champ net tombe à zéro (B = 0 T) et le buzzer indique le point de consigne (silence, ou changement de tonalité selon le montage).

module SS49E ESP32 ADC bip-mètre 🔊 buzzer piézo ajoute des spires jusqu'à B=0 (silence)
SS49E + ESP32 + buzzer : un gaussmètre acoustique fait maison

Le réseau de coupure et de récupération (snubber Zener)

Pour éviter l'effet de freinage magnétique (effet Lenz) lors de la coupure du circuit — tout en protégeant le MOSFET des surtensions de rupture (back-EMF) — le circuit intègre une diode de blocage 1N4007 et une diode Zener de 24V. Ce réseau assure une coupure nette (style moteur à impulsions) et recycle l'énergie inductive d'ouverture directement vers l'alimentation/batterie, au lieu de la dissiper en chaleur — sans aucune usure d'arc électrique, contrairement à un contact mécanique.

Compromis assumé vis-à-vis de la « boucle ouverte » — une version antérieure de cette page exigeait une coupure galvanique totale (relais, sans aucun composant en parallèle) pour respecter à la lettre le principe d'annulation de InfiniX — Pour les Nuls (Chapitre 4). Le snubber Zener n'est pas une coupure galvanique parfaite : au moment de l'ouverture, la diode 1N4007 + Zener offrent un chemin de conduction dès que la tension dépasse le seuil de 24V, le temps d'évacuer l'énergie stockée dans la bobine vers +Vcc. C'est un chemin transitoire et dirigé vers l'alimentation — pas une boucle locale bobine/diode qui entretiendrait indéfiniment un courant induit — mais ce n'est pas non plus un circuit ouvert à 100 % pendant toute la phase révélée. Retenu ici parce que la commutation mécanique (relais) est incompatible avec 100-200 Hz en continu ; à documenter au banc (voir Tests) pour mesurer l'écart réel avec la version relais.

Logique de commande

Un seul MCU, côté stator (fixe), pilote l'ensemble : ses 8 canaux stator, plus un 9e canal partagé qui alimente toutes les bobines rotor à travers les balais (voir plus bas). Contrairement à la version précédente, le déclenchement ne vient pas d'une lecture directe des 8 SS49E de chaque module : ces aimants sont masqués pendant l'approche, donc peu détectables au bon moment (voir Le capteur aveugle). Le timing réel est prédit à partir de l'aimant témoin, jamais masqué — code complet dans cette section.

⚠️ Une seconde couche de sécurité, logicielle — en plus du générateur de récupération et de sa résistance de délestage (charge physique, voir Tests & sécurité), le MCU mesure le régime en direct à partir du top de l'aimant témoin et bascule toutes les bobines (stator et rotor, puisque le même MCU pilote les deux) en roue libre logicielle dès qu'un seuil est dépassé : toutes restent ON en permanence, plus aucune impulsion de répulsion n'est produite, le système décélère sous l'effet du frottement et du générateur. C'est une coupure douce (on ne rompt jamais un courant établi), pas un arrêt brutal — et un état par défaut sûr au démarrage : tant que le firmware n'a pas confirmé une mesure RPM valide, les bobines démarrent masquées (ON), jamais révélées. Cette sécurité logicielle vient en plus du délestage physique, jamais à sa place : un bug ou un reset peut toujours la contourner, pas une résistance qui chauffe.

Interruptions matérielles (ou échantillonnage rapide en timer) recommandées plutôt qu'une lecture en boucle, pour ne rater aucun front à haut régime, et un filtrage (moyenne glissante) sur la mesure de période pour éviter les bascules intempestives dues au bruit d'une seule lecture. Seuils à caler expérimentalement, sous la marge de synchronisation calculée plus haut.

Où placer les sondes Hall

Les 8 SS49E permanents vont uniquement sur la plaque stator (fixe, câblage simple vers le MCU). Chaque sonde doit détecter l'aimant du rotor qui approche, pas l'aimant du stator juste à côté (déjà masqué/révélé par sa propre bobine — il fausserait la lecture).

Un module stator, vu de face (côté rotor) module aimant+bobine SS49E sens de rotation sonde décalée en avance sur le module — capte le rotor qui arrive, pas le stator voisin
Décalage volontaire de la sonde, dans le sens de rotation, pour anticiper le passage de l'aimant rotor

Liaison rotor : balais récupérés

Le rotor porte ses propres bobines de compensation (annulation symétrique des deux côtés, voir Assemblage — le rotor), mais pas d'électronique à lui — pas de MCU, pas de batterie embarquée. Un seul MOSFET, côté stator, pilote toutes les bobines rotor à la fois (câblées en parallèle, elles se masquent/révèlent toutes ensemble), à travers deux simples contacts glissants au niveau du moyeu.

✓ Récupérés, pas fabriqués — le porte-balais et les charbons d'un petit moteur à courant continu de voiture radiocommandée (ou de n'importe quel jouet à moteur DC bon marché) sont déjà prêts à l'emploi : ressort de contact, charbon, rien à fabriquer. Conçus pour encaisser plusieurs ampères à plusieurs milliers de tr/min, ils sont largement surdimensionnés pour nos quelques centaines de mA à 750 tr/min maximum — l'usure attendue ici est négligeable sur la durée de vie du démonstrateur. À confirmer au banc (voir Tests — endurance), pas à supposer, mais c'est un bon point de départ.
Balais récupérés, au moyeu axe / truck (fixe) anneaux cuivre (moyeu, tournant) balais récupérés (moteur RC), support fixe MOSFET rotor GND tourne avec la roue
Anneaux tournants au moyeu, balais fixes en contact permanent — même principe qu'un moteur à charbons, juste utilisé à l'envers

Le capteur aveugle : synchroniser sans voir l'aimant masqué

Un problème sérieux, pas un détail : la sonde Hall d'un côté est censée annoncer l'arrivée de l'aimant de l'autre côté — mais cet aimant est justement masqué (annulé à ~0T) pendant toute son approche, exactement pour éviter l'interaction prématurée. Résultat : pendant la phase où on aurait le plus besoin de la détecter, l'approche ne produit presque aucun signal — et au moment où le champ redevient détectable (la révélation), c'est déjà trop tard pour s'en servir comme déclencheur, l'événement a déjà eu lieu.

✓ Solution : un aimant témoin, jamais masqué — petit, faible (bien plus faible qu'un N42 de propulsion, pour ne pas réintroduire de réluctance notable), fixé sur le rotor à une position connue, détecté par une sonde Hall dédiée sur le stator. N'étant jamais compensé, il donne un signal franc et fiable, une fois par tour. À partir de ce top, le MCU mesure la période réelle de rotation et prédit — plutôt qu'il ne détecte — le moment d'alignement des 8 modules principaux, qui restent masqués tout le long de leur approche comme prévu. Le canal rotor (via les balais) suit la même prédiction : il se révèle chaque fois qu'une position quelconque atteint son alignement.

Les 8 SS49E du stator restent utiles pour la calibration (bip-mètre) — et peuvent en plus servir de secours au tout premier démarrage à la manivelle (voir Assemblage — démarrage manuel) : à très basse vitesse, avant que l'aimant témoin n'ait donné une première période fiable, le masquage n'est pas encore critique et un signal résiduel peut suffire à amorcer.

const uint8_t INDEX_PIN     = A7;  // aimant témoin (rotor), jamais masqué : 1 top par tour
const uint8_t ROTOR_MOSFET  = 19;  // canal partagé, vers les balais

unsigned long lastTop = 0, period = 0;

void loop() {
  static bool wasIndex = false;
  bool indexNow = (analogRead(INDEX_PIN) > INDEX_THRESHOLD);
  if (indexNow && !wasIndex) {
    unsigned long now = micros();
    period = now - lastTop;
    lastTop = now;
    currentRPM = 60.0e6 / period;         // 1 top par tour => RPM = 60 / T(s)
  }
  wasIndex = indexNow;
  // ... sécurité roue libre inchangée, basée sur currentRPM ...

  bool anyAligned = false;
  if (period > 0) {
    unsigned long elapsed = micros() - lastTop;
    for (uint8_t i = 0; i < 8; i++) {
      // position attendue du module i : i/8 de tour après le top
      unsigned long expected = (unsigned long)((i / 8.0) * period);
      bool nearAlignment = (abs((long)(elapsed - expected)) < REVEAL_WINDOW);
      bool coilOn = freewheelMode ? true : !nearAlignment;  // masqué sauf près de l'alignement prédit
      digitalWrite(MOSFET_PINS[i], coilOn ? HIGH : LOW);
      anyAligned |= nearAlignment;
    }
  }
  // canal rotor (balais) : révélé si une position quelconque est alignée
  digitalWrite(ROTOR_MOSFET, (freewheelMode || !anyAligned) ? HIGH : LOW);
}

Code illustratif, à affiner (gestion du premier tour sans mesure, filtrage de period, interruptions plutôt que boucle) — mais le principe compte : on planifie le cycle des aimants masqués à partir d'un signal qui, lui, ne l'est jamais.