Probleme Arduino-DRV8833 et moteur DC

Bonjour,
Je galère depuis plusieurs jours pour faire fonctionner des moteurs DC avec Arduino et différentes cartes (L293D, mini L293D puis DRV8833). Après avoir vérifier les connexions plusieurs fois, je ne suis jamais arrivé à faire tourner aucun moteur. J'ai 2 types de moteurs :

Les cartes :

Je me suis mis sur des DRV8833 car le moteur que je souhaite réellement utilisé (avec réduction) est en 6V et les l293D ne sorte pas cette valeur.
Voici mon montage

et mon programme :

// Define the control inputs
#define MOT_B1_PIN 10
#define MOT_B2_PIN 9

void setup(void)
{
  // Set all the motor control inputs to OUTPUT
  pinMode(MOT_B1_PIN, OUTPUT);
  pinMode(MOT_B2_PIN, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(MOT_B1_PIN, LOW);
  digitalWrite(MOT_B2_PIN, LOW);

  // Initialize the serial UART at 9600 baud
  Serial.begin(9600);
}

void loop(void)
{
  // Generate a fixed motion sequence to demonstrate the motor modes.

  // Ramp speed up.
  for (int i = 0; i < 11; i++) {
    spin_and_wait(25*i, 25*i, 500);
  }
  // Full speed forward.
  spin_and_wait(255,255,2000);

  // Ramp speed into full reverse.
  for (int i = 0; i < 21 ; i++) {
    spin_and_wait(255 - 25*i, 255 - 25*i, 500);
  }

  // Full speed reverse.
  spin_and_wait(-255,-255,2000);

  // Stop.
  spin_and_wait(0,0,2000);

  // Full speed, forward, turn, reverse, and turn for a two-wheeled base.
  spin_and_wait(255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, -255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(255, -255, 2000);
  spin_and_wait(0, 0, 1000);
}

/// Set the current on a motor channel using PWM and directional logic.
///
/// \param pwm    PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN  pin number xIN1 for the given channel
/// \param IN2_PIN  pin number xIN2 for the given channel
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
  if (pwm < 0) {  // reverse speeds
    analogWrite(IN1_PIN, -pwm);
    digitalWrite(IN2_PIN, LOW);

  } else { // stop or forward
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN2_PIN, pwm);
  }
}

/// Set the current on both motors.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
void set_motor_currents(int pwm_A, int pwm_B)
{
  set_motor_pwm(pwm_A, MOT_B1_PIN, MOT_B2_PIN);

  // Print a status message to the console.
  Serial.print("Set motor A PWM = ");
  Serial.println(pwm_A);
}

/// Simple primitive for the motion sequence to set a speed and wait for an interval.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
/// \param duration delay in milliseconds
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{
  set_motor_currents(pwm_A, pwm_B);
  delay(duration);
}

Programme de test trouvé sur internet (pour sécuriser mon test).
Le problème est donc le suivant :
Quelque soit la carte, quelque soit le moteur, ces derniers ne tournent jamais. Pourtant, en les connectant directement sur les pin 5V et GND de l'arduino pour tester, ils fonctionnent bien.
Quand je teste le voltage en sortie, j'ai toujours zéro, nada, rien, 0, etc. En entrée, depuis une pile 9v, j'ai bien mes 9v. Le module Arduino qui est alimenté en Vin et GND par la même pile (mais le problème existe également quand les deux cartes sont alimentées séparément) j'ai bien 5v sur la pin 5V.
Je ne sais plus quoi faire pour faire tourner ces p...... de moteurs.
Si vous avez des idées, je suis preneur.
Pour information, mon projet actuel est de réaliser un véhicule télécommandé (télécommande de téléviseur) tout en bois avec 1 moteur DC pour la motricité et un servo moteur pour la direction (qui fonctionne très bien celui-ci).
Merci à vous

Bonjour jcg95

Si je prends cet exemple:


La première chose qui apparaît est que le GND du Nano n'est pas connecté au GND du driver.
Puis, ces piles 9V ne sont pas du tout adaptées à ce genre d'application.

A+
Cordialement
jpbbricole

Bonjour Jpbbricole,
Il y avait longtemps que tu ne t'étais pas penché sur un de mes problèmes.
Pour la connexion de l'Arduino, erreur de schéma, dans la réalité, il est bien connecté, désolé je remets le schéma corrigé .


Pour la pile, pourquoi ce type de pile ne serait pas adapté ? Même si la durée de vie est courte, même si la stabilité de la fourniture est discutable, pour faire mes tests ça devrait pouvoir suffire ? Sachant que ce test fonctionne :

Sinon, quel type de pile choisir ? Il me faut une puissance à peu prêt équivalente et un volume semblable. Les mêmes au lithium ? Les mêmes au lithium et rechargeables ?
Merci encore pour tes réponses rapides

Bonjour jcg95

Ca fait plaisir de te recroiser :wink:

Dans ce cas, pas de problème, pour un essai assez bref. Ces piles ont une résistance interne assez élevée, ce qui, pour commander un moteur, peut fausser le test, en résumé, le moteur aura très peu de couple.
J'ai essayé avec le shield L293D et ça fonctionne nickel avec le programme et câblage ci-dessous:

A+
Bonne soirée.
jpbbricole

Pour les tests avec un L293D j’ai beau faire des configurations ultra simples et minimaliste aucun de mes moteurs ne fonctionnent. Ce qui m’étonne le plus c’est qu’en testant les valeurs aux sorties, j’ai toujours zéro, donc pas assez pour alimenter les moteurs, ceci avec une L293D pour Uno ou une mini l293D pour nano ou une drv8833. J’ai aussi tester avec une alimentation externe (chargeur en 9v) et idem. Je pense que je dois être maudit ou que la maison émet des ondes néfastes !:weary:

Il y a un truc qui m'étonne.
Sur le DRV8833, les entrées et les sorties de chaque driver sont en face l'une de l'autre. C'est-à-dire que les INA sont face aux OUTA. Or là, ce n'est pas le cas. Je trouve assez étonnant qu'il y ait un croisement sur la carte.

Merci fdufnews et j’ai été également étonné de cette inversion mais l’image du verso de cette carte confirme ce croisement.


Est-ce que ça pourrait être une erreur d’impression ? Je crois avoir essayé les in1 et 2 avec les out3 et 4 mais je ne suis pas certain. Je refais le test et je vous tiens au courant.

Bonsoir jcg95

As tu fais l'essai du sketch dans le lien du post #4 en connectant ton moteur sur
image
Attention, pour ce qui est de l'alimentation:

Considérations relatives à l’alimentation électrique du pilote de moteur L293D.

Si vous utilisez une seule alimentation pour l'Arduino et les moteurs, branchez-la simplement sur la prise CC de la carte Arduino ou utilisez le bloc EXT_PWR sur le blindage. Assurez-vous que le cavalier d'alimentation sur le blindage du moteur est en place. Cette méthode est la meilleure si la tension d'alimentation du moteur est inférieure à 12 V.

Vous pouvez également utiliser deux alimentations séparées pour l'Arduino et les moteurs. Par exemple, vous pouvez alimenter l'Arduino via l'USB et le moteur alimenté par une alimentation CC ou utiliser deux alimentations CC séparées pour l'Arduino et les moteurs. Dans ce cas, assurez-vous que le cavalier est retiré du blindage du moteur.

Bonne soirée
jpbbricole

Bonsoir JPbbricole,
J’ai fait beaucoup d’essais au niveau alimentation.

  • Une seule alimentation de l’ensemble via l’usb Arduino,
  • Une seule alimentation via la CC de la carte pour l’arduino ET la carte avec et sans le j’imperméabilisai en place. L’effet est flagrant dans la réaction ou pas des actions issues de l’arduino (constat sur le servomoteur qui est opérationnel)
  • Une seule alimentation via la prise jack de la carte uno
  • l’arduino via son usb ET la pile 9v pour la carte et la prise CC sans le j’imperméabilisai
    Tous ces essais ont donné les mêmes résultats : en dehors du servomoteur qui fonctionne dans tous les cas valides, les moteur de ne fonctionnent jamais.
    Je n’ai pas essayé l’exemple du poste 4 car j’avais fait ce type d’essai simple issu d’un autre site mais je ferai tout de même un test demain, on ne sait jamais.
    Merci

PS: ce qui est nommé « blindage » dans ton message c’est bien le jumper ? Sinon je ne vois pas à quoi ça correspond.
Bonne soirée aussi et à suivre demain.

Bonsoir jcg95

Je l'ai essayé en vrai avec le moteur sur le slot 4 et ça fonctionne avec alimentation sur EXT-PWR.

C'est une mauvaise traduction de Google, ce blindage est le shield.

Bonne soirée
jpbbricole

Bonjour,
J'ai bien avancé mais ce que j'ai constaté n'est pas rassurant.
J'ai testé le programme présenté en Post4 et il a bien fonctionné sur le M3.
En fait, mes moteur doivent être gérés par une télécommande (origine ancienne télévision) et j'ai donc la bibliothèque IRRemote.h activée.
Après recherche, il y a un conflit de timer entre les bibliothèque IRRemote et AFMotor qui utilisent le même timer.
Une modification trouvée sur internet (AF_DCMotor motor1(3, MOTOR12_64KHZ):wink: permet de passer outre ce conflit.
MAIS, si la gestion de la télécommande (serial.print des valeurs reçues) fonctionne correctement si je déclare les sorties M3 ou M4, ces valeurs sont totalement farfelues si je déclare les sorties M1 ou M2. Et bien entendu, les seuls moteurs qui réagissent (maintenant) sont ceux connectés aux M3 ou M4.
Ensuite, via une entrée de pilotage par Serial.print, pour éviter la télécommande, et donc en enlevant la bibliothèque IRRemote, là aussi, seuls les moteurs en M3 ou M4 fonctionnent, rien sur les M1 ou M2.
J'ai essayé avec deux cartes L293D différentes.
Au niveau alimentation, pour le téléversement et les tests associés, je retire le jumper et je branche l'USB de l'Arduino et une pile 9v sur le GND et le VCC de la carte. C'est OK.
Pour une utilisation plus réaliste, seule la pile 9v alimente la L293D ET l'Arduino. Pour cela, je remets le jumper sinon la télécommande, gérée par l'Arduino ne fonctionne plus.
Donc, sauf si vous avez une idée pour corriger le problème de conflit entre les deux bibliothèques (comme modifier le timer utilisé dans l'une des 2 bibliothèque, par exemple), je considère mon problème comme résolu et je vous remercie pour vos informations précieuses.
Cordialement.
JCG95

Bonjour jcg95

Il faut tenir compte des pin utilisées par le shield L293D
Les pins digitales 3, 4, 5, 6, 7, 8, 9, 10, 11 et 12 sont utilisées par le shield.
Les pins 4, 7, 8 et 12 sont utilisées par le registre à décalage.
Les pins 9 et 10 sont réservées aux servo-moteurs
Les pins 3, 5, 6 et 11 sont utilisées pour les signaux PWM contrôlant les moteurs.
(Source Perplexity)

Pins qui peuvent entrer en conflit avec le reste de ton montage.

Pour commander des petits moteurs CC, j'utilise ce type de module (H-Bridge):
image

tu peux piloter 2 moteurs.

Cordialement
jpbbricole

Merci Jpbbricole pour ce complément.
J'ai aussi un complément d'information à faire sur mon projet.
Je souhaitai utiliser une carte DRV8833 pour certaines raisons en particulier la taille et l'association possible avec un arduino nano. J'avais le même problème qu'avec ma L293D, c'est à dire que rien ne sortait des pin out.
Voici un nouveau schéma de ma qui lui est opérationnel :

où j'ai ajouté le "réveil" (utilisation de digitalWrite sur la pin SLEEP de la carte) et les moteurs se sont mis à fonctionner parfaitement.
Je vais tout de même vérifier qu'il n'y a pas de conflit avec le driver IRRemote et le driver DRV8833.h utilisé.
Pour information, sur cette carte les pins IN et OUT sont bien croisées, allez savoir pourquoi !
Voici mon code de test opérationnel avec le montage présenté ci-dessus.

#include <DRV8833.h>

// Creation de l'instance de la DRV8833:
DRV8833 driver = DRV8833();

// Pins Ain1 et Ain2 du DRV8833
const int inputA1 = 10, inputA2 = 9;
// ajout de ce lien pour reveiller la carte DRV8833
const int vsleep = 12;

void setup() { 
  Serial.begin(9600);
  
  while (!Serial);
  
  // Attach un moteur a la pin d'entree
  driver.attachMotorA(inputA1, inputA2);
  Serial.println("Ready!");
  // envoi de l'ordre de reveil
  digitalWrite(vsleep, HIGH);
}

void loop() {
  
  Serial.println("Forward:");
  // Ordre d'avancer
  driver.motorAForward();
  delay(1500);
  
  // Arret du moteur
  Serial.println("Stop:");
  driver.motorAStop();
  delay(1500);
  
  Serial.println("Reverse:");
  // Ordre de reculer
  driver.motorAReverse();
  delay(1500);
  
  Serial.println("Stop:");
  // Arret du moteur
  driver.motorAStop();
  delay(1500);
}

Différence de taille entre la L293D (la UNO est dessous) et une nano avec sa DRV8833


Pour moi et mon projet, il n'y a pas photo.
Cordialement à tous
JCG95

J'ai vu qu'on pouvait mettre un pont de soudure au dos de la carte pour qu'elle soit active en permanence sans avoir à gérer le SLEEP.

Oui, j'ai vu cela aussi mais la soudure ou la désolidarisation a un caractère définitif et une fausse manipulation peut avoir des conséquences graves. Ce réveil logiciel reste plus doux et souple.
De plus, j'ai lu que par défaut le SLEEP est HIGH ce qui est en contradiction avec le fait que j'ai du le faire dans mon programme pour activer la carte. Peut-être que c'est différent selon le fabriquant de la carte. N'ayant aucune certitude sur la situation exacte de ce composant, je préfère gérer par soft.
Merci pour cette information.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.