[Outils/Fab/Comp] esp32 - moteur dc12v - pwm et mofset LR7843
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

esp32 - moteur dc12v - pwm et mofset LR7843



  1. #1
    glouglou

    Angry esp32 - moteur dc12v - pwm et mofset LR7843


    ------

    Bonjour à tous

    je souhaite commander 8 moteurs dc 12v avec un esp32
    en tapant des commandes depuis le terminal de mon pc

    je dispose de :
    un pc avec ubuntu
    un esp32
    8 moteurs dc 12v
    une alimentation atx capable de délivrer du 12v, 5v, 3.3v
    d'un multimetre (on sait jamais)
    et enfin de 8 modules mofset LR7843 acheté sur amazon

    je pensais que tout irait bien, je veux juste contrôler la vitesse de 8 moteurs dc dans un seul sens via des commandes sur un terminal

    même si je suis certains que le problème ne viens pas de là
    je transmet mon code

    Code:
    // --- Configuration ---
    const int SERIAL_BAUD = 115200;
    const int NUM_MOTORS = 16;  // élargissable jusqu'à 16 si besoin
    
    // Définition des pins des moteurs
    const int motorPins[NUM_MOTORS] = {
      4,   // M1
      5,   // M2
      12,  // M3
      13,  // M4
      14,  // M5
      15,  // M6
      16,  // M7
      17,  // M8
      18,  // M9
      19,  // M10
      21,  // M11
      22,  // M12
      23,  // M13
      25,  // M14
      26,  // M15
      27   // M16
    };
    
    int motorDutyMin[NUM_MOTORS] = {
      0,    // PIN 4  M1
      0,    // PIN 5  M2
      0,    // PIN 12 M3
      0,    // PIN 13 M4
      0,    // PIN 14 M5
      0,    // PIN 15 M6
      0,    // PIN 16 M7
      0,    // PIN 17 M8
      153,  // PIN 18 M9
      114,  // PIN 19 M10
      200,  // PIN 21 M11
      0,    // PIN 22 M12
      0,    // PIN 23 M13
      0,    // PIN 25 M14
      0,    // PIN 26 M15
      0     // PIN 27 M16
    };
    
    // État actuel des moteurs
    int motorPowerPercent[NUM_MOTORS] = {0};
    
    String inputLine = "";
    
    // --- Fonctions utilitaires ---
    void setupMotor(int index) {
      ledcAttachChannel(motorPins[index], 20000, 8, index);  // chaque moteur a son canal
      ledcWrite(motorPins[index], 0);
    }
    
    
    // --- Setup ---
    void setup() {
      Serial.begin(SERIAL_BAUD);
      delay(1000);
    
      for (int i = 0; i < NUM_MOTORS; i++) {
        setupMotor(i);
      }
    
      Serial.println("ESP32 moteurs prêts");
    }
    
    
    // --- Loop ---
    void loop() {
      while (Serial.available() > 0) {
        char c = Serial.read();
    
        if (c == '\n' || c == '\r') {
          if (inputLine.length() > 0) {
            handleCommand(inputLine);
            inputLine = "";
          }
        } else {
          inputLine += c;
        }
      }
    }
    
    
    // --- Gestion des commandes ---
    void handleCommand(const String &cmd) {
      // Exemple attendu : "M1:75"
      if (cmd.startsWith("M")) {
        int motorIndex = cmd.substring(1, cmd.indexOf(':')).toInt() - 1;
        if (motorIndex >= 0 && motorIndex < NUM_MOTORS) {
          String valueStr = cmd.substring(cmd.indexOf(':') + 1);
          valueStr.trim();
          int value = valueStr.toInt();
          value = constrain(value, 0, 100);
    
          setMotorPower(motorIndex, value);
        } else {
          Serial.println("Index moteur invalide !");
        }
      }
      else if (cmd.startsWith("STOP")) {
        stopAllMotors();
        Serial.println("Tous les moteurs arrêtés");
      }
      else {
        Serial.print("Cmd inconnue: ");
        Serial.println(cmd);
      }
    }
    
    
    // --- Fonction générique de contrôle moteur ---
    void setMotorPower(int index, int percent) {
      motorPowerPercent[index] = percent;
      int duty = map(percent, 0, 100, motorDutyMin[index], 255);
    
      if (percent == 0) {
        ledcWrite(motorPins[index], 0);
      } else {
        ledcWrite(motorPins[index], 255);
        delay(10);
        ledcWrite(motorPins[index], duty);
      }
    
      Serial.print("Moteur ");
      Serial.print(index + 1);
      Serial.print(" = ");
      Serial.print(percent);
      Serial.println("%");
    }
    
    
    // --- Arrêt global ---
    void stopAllMotors() {
      for (int i = 0; i < NUM_MOTORS; i++) {
        ledcWrite(motorPins[i], 0);
      }
    }
    le but de ce code est simple
    depuis mon pc, j'ouvre un terminal, j'utilise pipocom pour interagir avec l'esp32
    je tape par exemple "M6:80" et la pin 15 doit faire tourner le moteur 6 à 80% de sa vitesse via pwm (donc envoyé 80% de 12V en théorie)

    pour moi le problème ne vient pas du code
    mais de l’électronique

    je n'arrive pas à savoir si j'ai un défaut de branchement
    ou si c'est mon module qui n'est pas adapté ou autre
    je pense avoir fait le bon choix de module, puisqu'il accepte les signaux d'entrée de niveau logique de 3 V ou 5 V (et dans mon cas, l'esp32 fournit du 3.3v) et donne les tensions et intensités nécessaire pour un moteur 12v dc


    des photos qui j’espère aideront à la compréhension globale :

    image1.jpg

    image2.jpg

    l'alimentation atx qui me fournit le

    image3.jpg

    l'esp32 qui est normalement branché à mon pc via usb-C

    le truc où il est écrit "MASSE" est prévue pour recevoir tous les "-" des moteurs dc et autres gnd ...
    je me suis dit que ce n'était pas forcément nécessaire de relier le gnd de l'esp32 à cette masse commune, pensant que l'esp est "indépendant" puisqu'il est alimenté via usb-C ?
    le gros machin ovale noire avec des fils jaune, c'est mon moteur dc
    le petit module avec la led rouge c'est le mofset LR7843 acheté sur amazon
    (ne pas tenir compte des autres inscriptions "3V" et "5V" qui sont des reliquats d'autres projets)

    Qu'est-ce que j'ai loupé ???
    je n'arrive pas à faire tourner mon moteur
    la led rouge sur le module mofset est allumée en permanence, que j'envoie un signal pwm ou pas, donc je ne sais pas dire ce que cette led signifie
    tension entre + et - du module = 12V (ok)
    tension entre pwm et gnd quand je tape ma commande à 100 % = 3.3v (ok)
    tension entre LOAD et la MASSE commune quand le pwm est à 100% = 0V (pas ok)
    tension entre gate et source = 10v (???)

    est-ce que quelqu'un saurait m'aiguiller ?
    si je n'arrive même pas à controler un moteur dc seul, je ne risque pas d'en controler 8 ....

    merci d'avance

    pour info, j'avais essayer juste avant, de controler par exemple 2 moteurs avec un module L298N de ce type
    cela fonctionnait globalement bien, mon code, les moteurs, ... donc je suis sure de mon code, mon esp32, les moteurs
    mais je ne pouvais qu'obtenir 10V en sortie et pas 12V car il y a de la perte.
    c'est pour cela que j'ai essayé de passer sur un mofset, et depuis, je n'arrive pas à faire fonctionner quoique ce soit, probablement pour des problème de branchements !?

    -----
    Dernière modification par gienas ; Hier à 16h43. Motif: Rapatrié les images externes qui doivent OBLIGATOIREMENT être sur le serveur

  2. #2
    jiherve

    Re : esp32 - moteur dc12v - pwm et mofset LR7843

    bonjour,
    reunir les masses pour les signaux de commande est indispensable, il doit y avoir deux masses une pour l'entrée et une pour la sortie.
    ensuite le module inverse la charge doit être entre le +12V et sa sortie, donc dans le drain du MOS ce qui fait que avec 100% de PWM cette sortie est perpétuellement à zéro.
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    racard

    Re : esp32 - moteur dc12v - pwm et mofset LR7843

    bonjour

    pouvez vous faire un schéma du hard car une image du câblage n'aide pas à vous conseiller.

  4. #4
    lutshur

    Re : esp32 - moteur dc12v - pwm et mofset LR7843

    Bonjour,
    tension entre LOAD et la MASSE commune quand le pwm est à 100% = 0V (pas ok)
    Pourquoi "pas OK" ?
    Tu t'attends à ce que le module fournisse le +12V au moteur ? Il est plus probable qu'il met en liaison le pole négatif du moteur et la masse.

  5. A voir en vidéo sur Futura
  6. #5
    glouglou

    Re : esp32 - moteur dc12v - pwm et mofset LR7843

    Ok, j'ai trouvé le soucis

    Effectivement, le problème portait sur le cablage du moteur
    un fil sur le LOAD
    et l'autre au 12v pas à la masse ...
    c'est reglé, ça fonctionne

    Merci à tous

Discussions similaires

  1. Remplacement relais EER2C-S12-DC12V
    Par inviteddca84c1 dans le forum Bricolage et décoration
    Réponses: 6
    Dernier message: 24/03/2021, 06h52
  2. [Programmation] ESP32 moteur pas à pas ArduinoIDE
    Par invite09c2abab dans le forum Électronique
    Réponses: 18
    Dernier message: 25/11/2018, 20h55
  3. MOFSET et Vgs
    Par schneiderj dans le forum Électronique
    Réponses: 13
    Dernier message: 07/02/2015, 17h55
  4. Qu'utiliser pour transformer du DC12v en DC3v?
    Par invitebf2ada25 dans le forum Électronique
    Réponses: 12
    Dernier message: 02/07/2012, 22h59
  5. Mofset sous 9V
    Par inviteb6aea961 dans le forum Électronique
    Réponses: 5
    Dernier message: 09/04/2010, 11h32
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...