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
le but de ce code est simpleCode:// --- 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); } }
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 !?
-----


