Utilisation d'un signal FRSKY pwm pour le pilotage d'un L293D

Bonjour,

Je tente d'utiliser un récepteur 4voies (fonctionnent très bien avec des servo) pour faire fonctionner un moteur DC.
Mon code permet d'avoir un point mort au milieu du throttle.

Je rencontre plusieurs problèmes :

  • quand je pousse les gaz à fond d'un sens ou d'un autre, le moteur s'emballe et reste à fond pendant quelques dizaines de secondes.
  • quand je vais dans la partie haute des gaz, le moteur donne des acoups alors que dans l'autre sens, je n'ai aucun problème

voici mon montage et mon code :

#define THROTTLE_SIGNAL_IN 0 // INTERRUPT 0 = DIGITAL PIN 2 - use the interrupt number in attachInterrupt
#define THROTTLE_SIGNAL_IN_PIN 2 // INTERRUPT 0 = DIGITAL PIN 2 - use the PIN number in digitalRead

#define NEUTRAL_THROTTLE 1500 // this is the duration in microseconds of neutral throttle on an electric RC Car

#define ENABLE 5
#define DIRA 3
#define DIRB 4

volatile int nThrottleIn = NEUTRAL_THROTTLE;
volatile unsigned long ulStartPeriod = 0;
volatile boolean bNewThrottleSignal = false;
volatile int vitesse = 0;
void setup()
{
  // tell the Arduino we want the function calcInput to be called whenever INT0 (digital pin 2) changes from HIGH to LOW or LOW to HIGH
  // catching these changes will allow us to calculate how long the input pulse is
  attachInterrupt(THROTTLE_SIGNAL_IN, calcInput, CHANGE);
  pinMode(ENABLE, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(DIRB, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  // if a new throttle signal has been measured
  if (bNewThrottleSignal)
  {
    if (nThrottleIn > 1000 && nThrottleIn < 2000) { // une vaine tentative de supprimer les acoups mais qui provoque l'affolement du moteur...
      vitesse = min((((nThrottleIn > NEUTRAL_THROTTLE ? nThrottleIn - NEUTRAL_THROTTLE : NEUTRAL_THROTTLE - nThrottleIn) / 5) * 255 / 100), 255);
      vitesse = vitesse > 25 ? vitesse : 0; //défini une zone morte
      analogWrite(ENABLE, vitesse);
      Serial.println(nThrottleIn);
      if (nThrottleIn > NEUTRAL_THROTTLE) {
        digitalWrite(DIRA, HIGH); //one way
        digitalWrite(DIRB, LOW);
      } else {
        digitalWrite(DIRA, LOW); //one way
        digitalWrite(DIRB, HIGH);
      }
    }
    bNewThrottleSignal = false;
  }
  delay(1);// je me suis demandé si une loop vide risquait de crasher l'arduino
}

void calcInput()
{
  if ((bNewThrottleSignal == false) && digitalRead(THROTTLE_SIGNAL_IN_PIN) == HIGH)
  {
    ulStartPeriod = micros();
  }
  else
  {
    if (ulStartPeriod && (bNewThrottleSignal == false))
    {
      nThrottleIn = (int)(micros() - ulStartPeriod);
      ulStartPeriod = 0;
      // tell loop we have a new signal on the throttle channel
      // we will not update nThrottleIn until loop sets
      // bNewThrottleSignal back to false
      bNewThrottleSignal = true;
    }
  }
}

Auriez-vous une idée ?
Pour info, le petit truc noir qui traine est la schématisation de mon récepteur alimenté en 5v
le circuit n'est pas alimenté par une pile 9v mais par une lipo 3S (11,5v) 450mAh 75C, j'ai tenté avec ou sans l'alimentation usb conservée, ça ne change rien.

Merci pour votre aide.

Cordialement,

Separer l'alimentation du 293D de celle de l'Arduino, à savoir que le courant d'alimentation du moteur passe actuellement par la carte Arduino pour le GND, ce qui doit générer des parasites monumentaux. Mettre un condesateur de découplage au plus près du 293D. Torsader les fils d'alimentation de puissance, entre alim et 293D, entre 293D et moteur. Voir après ça ce qui se passe.

bonjour

il peut être intéressant de faire un lissage de la valeur

(valeur précédente x coefficient + valeur lue) / (coeff +1) -> sauvegarde de cette valeur et utilisation

avec un coeff 3 on commence a avoir un bon lissage (faire varier le coeff pour choisir le compromis en réactivité stabilité) c'est ce que j'utilise pour commander deux moteurs de bateaux speed 700 avec une flysky et des IBT4

Bonjour,
Merci pour cette information qui me semble pertinente mais peux-tu m'en dire plus sur cette utilisation des condensateurs, j'ai l'impression que c'est comme sur les drones, les condos qu'on mets en sortie du XT60 pour dégommer les parasites, me confirmes-tu l'information ?
Si oui, j'ai déjà tenté d'en mettre un entre le vin et le ground et je n'ai pas eu d'amélioration, idem entre le +5 et gnd mais je pense que ça ne sert à rien vue que c'était l'Arduino qui générait le 5v.

Merci !

Bonjour Jfs59,
Ce n'est pas con mais si c'est bien ce que dit JiPe38, c'est l'Arduino qui part en vrille électriquement et donc ça ne va pas donner grand-chose si c'est ça.
Je garde quand même l'idée car je pense que ça peut quand même jouer sur la surcharge qu'on génère en demande plus de courant d'un coup.
Merci !

La commande d'un moteur mange bien plus de puissance que la carte Arduino, et quand ça commute, il y a du parasitage. C'est dû au fait que les diodes de roue libre (intégrées dans le 293D, je l'ai appris il y a peu) ont ce qu'on appelle un "temps de recouvrement inverse", qui fait que lors de la commutation c'est comme si on avait un bref court circuit temporaire. Si on ne place pas de condensateur à proximité des broches d'alimentation du 293D, un courant important, pendant un temps très bref, parcourt les fils qui amènent l'énergie sur ce composant. Et de fortes variations instantanées de courant (di/dt), associées à la self inductance des fils d'alimentation, génèrent des tensions parasites importantes, lesquelles se propagent par les fils d'alimentation de la carte Arduino et peuvent planter les programmes. Alors que si on place un condensateur (ou plus exactement l'association d'un condensateur chimique et d'un condensateur céramique ou tantale), ce pic de consommation d'énergie est fourni par le condensateur, et les liaisons entre le condensateur et ce boitier de puissance étant très courtes, les self-inductances sont faibles, d'où peu de parasitage en tension.