Contrôler un moteur CC de trottinette

Bonjour à tous,

je sollicite votre aide car j'ai un projet d'électrifier un chariot de golf. j'ai récupéré d'une ancienne trottinette la roue motrice et la batterie. j'ai acheté un contrôleur 36V. 250W. je souhaite pouvoir contrôler la vitesse du moteur via une télécommande IR.
le problème est que je n'arrive pas à faire varier la vitesse du moteur avec le code ci-dessous. le moteur fonctionne car lorsque je joue Digitalwrite(HIGH) le moteur se lance à fond.
j'ai essayé la pin 8 digitalwrite et la 9 avec analogwrite, même effet le moteur fait du bruit mais ne tourne pas.

Ci dessous le code.

merci à vous

//****************librairies***************
#include <Arduino.h>
#include <Servo.h>
#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp> // include the library

// ***************Constantes******************
const int motor =12;
int comptD =90;
int comptV =0;

Servo esc;
Servo myservo;

//******************SETUP**************
void setup() {
    Serial.begin(9600);
    myservo.attach(7);
    esc.attach(8);
     //if not 3. parameter specified, take LED_BUILTIN pin from the internal boards definition as default feedback LED
    IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
    //printActiveIRProtocols(&Serial);
    //pinMode(motorPin,OUTPUT);
}

void loop() {
   
    if (IrReceiver.decode()) {
        /*
         * Print a summary of received data
         */
        if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
            Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
            // Nous avons ici un protocole inconnu, veuillez imprimer des informations supplémentaires
            IrReceiver.printIRResultRawFormatted(&Serial, true);
            IrReceiver.resume(); // Faites-le ici, afin de préserver les données brutes pour l'impression avec printIRResultRawFormatted()
        } else {
            IrReceiver.resume(); // Réception anticipée de la trame IR suivante

            IrReceiver.printIRResultShort(&Serial);
            IrReceiver.printIRSendUsage(&Serial);

        }
        Serial.println();
        /*
         * Finally, check the received data and perform actions according to the received command
         */
        if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) {
            Serial.println(F("Répétition reçue. Ici, vous pouvez répéter la même action qu'auparavant."));
        } else {

            //********************Comande de direction ****************
            if (IrReceiver.decodedIRData.command == 0x6) {//16

                Serial.println(comptD);
                comptD=comptD-10;
                Serial.println(comptD);
                if (comptD>=0 && comptD<=180)
                {
                myservo.write (comptD);
                delay (15);
                }
                else
                {
                comptD=0;
                }
            } else if (IrReceiver.decodedIRData.command == 0x7) {//15
                comptD=comptD+10;
                if (comptD>=0 && comptD<=180)
                {
                myservo.write (comptD);
                delay (15);
                }
                else
                {
                comptD=180;
                }

                
            } 
            //***********************COMMANDE DE VITESSE***********************
            else if (IrReceiver.decodedIRData.command == 0x40) {//14
                Serial.println(F("Received command vitesse+."));
                Serial.println(comptV);
                 comptV=comptV+100;
               
                if (comptV>=0 && comptV<=1000)
                {

                esc.write (comptV);
                delay (15);
                  Serial.println(comptV);
                }
                else
                {
                comptV=1000;
                }

            }else if (IrReceiver.decodedIRData.command == 0x28) {//13
                 Serial.println(F("Received command vitesse-."));
                 Serial.println(comptV);
                 comptV=comptV-10;
                 Serial.println(comptV);
                if (comptV>=0 && comptV<=256)
                {
                esc.write (comptV);
                delay (15);
                }
                else
                {
                comptV=0;
                }

            //**************** Remise à Zéro des commandes ***************
            }else if (IrReceiver.decodedIRData.command == 0x44) {//35
                myservo.write(90); // remet le servo à 90 dg
                comptD=90; // réinitialise le compteur de direction 
                 esc.write (0);
                 comptV=0;
            }
        }
    }
    
}

Bonsoir,

Pourquoi se serait uniquement le code qui soit en défaut?

Il y a du monde entre la batterie et le moteur, comment tu a connecté tout cela et comment cela devrait se connecter?

L’erreur peut être là!

Il faut commencer petit.
Déjà, as-tu une doc de ton contrôleur moteur?
Est-il capable de fonctionner avec un signal PWM sur son entrée?

  1. Si le moteur accepte une entrée PWM
    • Je pense qu'il faudrait dans un premier temps commencer à piloter le moteur seul en faisant varier doucement le PWM avec analogWrite()
  2. Si le moteur n'accepte pas une entrée PWM mais une tension variable
    • il faudrait ajouter un filtrage passe-bas entre l'Arduino et le contrôleur moteur.

merci pour ces débuts de réponses.

Alors je n'ait pas de doc sur le contrôleur (https://fr.aliexpress.com/item/1005009208020215.html?spm=a2g0o.order_list.order_list_main.4.7ca65e5blD0fB2&gatewayAdapt=glo2fra).

le moteur fonctionne quand je mets un potentiomètre directement sur les câbles d'accélérateur.

j'ai connecté la sortie D9 ou D8 selon le test au câble du signal du contrôleur et le cable de masse du contrôleur au GND de l'arduino.

Le moteur claque comme s'il voulait démarrer.

j'arrive à le faire fonctionner avec une télécommande RC 2.4 Ghz et un récepteur F-06A en mode digital mais lorsque le bouton reviens au centre, il continu de tourner à 50% de sa vitesse je pense, donc cela ne me convient par, c'est pour ca que je regarde du coté d'un arduino.

c'est quoi un filtrage passe-bas ?

Merci encore

Bonjour brunol

Quelle tension tu mesures sur la borne centrale du potentiomètre en position minimum et maximum?
En général 0 à 4 volts.

Cordialement
jpbbricole

En fouillant un peu sur Ali, j'ai vu que la majorité des contrôleurs équivalents indiquent une tension de commande dans la fourchette 1 à 4V environ.

@brunol franchement quand on voit la quantité d'offres pour ce genre de produits sur AliExpress je pense que c'est dommage de prendre sur un site marchand où il n'y a aucune documentation.

Bon alors la je ne sais pas quoi dire.

J'ai retester analogwrite et miracle ca marche. J'avais peut-être mis une mauvaise valeur ou un cable mal connecté.

Encore désolé et merci a vous d'avoir pris le temps de me répondre.

Et pour info.
Avec le potar. 0 volts et 4.4 volts à fond.
Quand j'ai acheté le controleur, je ne savais pas qu'il n'y avait pas de documentation et je ne voulait pas trop cher, ne sachant pas si c'etait possible de le faire avec un arduino.

Bon bin reste plus qu'a me fabriquer une telecommande en 2.4ghz car l'infra rouge n'a pas assez de portée.

Si vous avez un tuto, je suis preneur.

Encore merci à tous.