DRV8833 - Piloter facilement des moteurs continus avec un Pi ou Arduino

Bonjour a tous,
Cette semaine, nous nous penchons sur le contrôle de moteur continu. Cela peut se réaliser à l'aide de Pont-H comme le L293 ou un shield moteur... mais rien n'est plus comfortable qu'un petit breakout dédié à cette tâche.

Le DRV8833 - Contrôleur pour deux moteur continu
Le DRV8833 - double pont-H
disponible chez MCHobby

Ce petit breakout pour le DRV8833 de Texas Instruments est un pilote permettant de connecter 2 moteurs continu souvent identifié sur le WEB par DC Motor (anglais) ou brushed Motor (Moteur continu avec collecteur).
Le DRV8833 est capable de délivrer continuellement 1.2A sur chaque canal (1.5 avec refroidissement actif et des pointes juste 2 A).

Voici une petite vidéo de mise en bouche et démonstration...

Vous pouvez également accéder directement à la vidéo ici (YouTube)

Avec une tension de fonctionnement de 2.7 V à 10.8 V, le DRV8833 inclus les protections suivantes:
  • contre la polarisation inverse,
  • la sous-tension (tension trop basse pour fonctionnement correcte),
  • les courants trop important,
  • et les températures trop élevées
Ce pilote est une excellente solution permettant de controler de petits moteurs en basse tension.
Le DRV8833 de Texas Instruments est un circuit intégré incluant un double pont-H qui peut être utilisé pour contrôler, dans les deux sens, deux moteurs continu ayant une tension de fonctionnement entre 2.7 V et 10.8 V. Il est capable de supporter courant d'environ 1.2A sur chaque pont-H et peut tolérer des pointes de courants jusqu'à 2A par canal pendant quelques seconds. Cela en fait un excellent breakout pour les moteurs hobbyistes (généralement entre 5 et 9v, en basses tensions) et des moteurs en très basse tension (sous 3.5v) tout en tolérant les éventuels courants de blocages. Cette carte utilisant le DRV8833, nous recommandons de lire attentivement la fiche technique du DRV8833 (1Mb pdf). Les autres composants de la carte sont montés en surface (SMD/CMS) et inclus un FET pour protéger la carte contre une polarisation inverse.

Comment l'utiliser
Le montage est relativement simple... tout comme le code d'utilisation.
Source: Tutoriel de MCHobby sur le DRV8833
Dans une application type, les connexions de puissances sont faites d'un côté de la carte et les connexions de contrôle de l'autre côté de la carte. La broche nSLEEP est maintenue au niveau haut par la carte (à l'aide d'une résistance pull-upp), il n'est donc pas nécessaire de la connecter (sauf si vous voulez mettre le DRV8833 en mode veille).
Chacun canal moteur dispose d'une paire d'entrées de contrôle , xIN1 et xIN2, qui active l'état de la sortie correspondante , xOUT1 et xOUT2; Ces entrées sont équipées de pull-down en interne (qui ramène le signal de la broche au niveau bas/low), ce qui désactive les sorties par défaut (méthode efficace qui évite à vos moteurs de tressauter à la mise sous tension).
Voyez la table de contrôle des entrées (dans la fiche technique) pour voir comment celles-ci influence l'état des sorties.

Source: Tutoriel de MCHobby sur le DRV8833
Il est possible d'appliquer un signal PWM (pulse width modulated/modulation de largeur d'impulsion) sur ces entrées, ce qui permet de contrôler la vitesse du moteur. Quand vous contrôlez la rotation en PWM, le courant tend à continuer à circuler lorsque le pilote interrompt celui-ci. Cela se s'appelle le "courant de recirculation" (cfr doc de Texas Instruments). Le pont-H peut gérer cette recirculation de deux façons différentes: en mode roue libre (Coat/Fast decay) ou en mode de freinage (Brake/Slow Decay). En mode roue libre (Coat/Fast Decay) le pont H est désactivé et le courant de recirculation circule à travers les diodes. En mode freinage, les bobines du moteur sont court-circuités, ce provoque le freinage du moteur.

Exemple Arduino
Voici l'exemple utilisé dans la vidéo de présentation.
Montage d'un DRV8833 sur un Arduino UNO - Source: MCHobby.be
.

// --- Commande de controleur moteur DC ----------------------
// DRV8833_Test.ino
//
// Commande du DRV8833, prenant le controle de deux moteurs 
// continu.
//
// Un projet www.mchobby.be (vente de kit et composant)
// Meurisse D. - Licence CC-SA-BY
//
// Un tutoriel http://mchobby.be/wiki/index.php?title=DRV8833
// Ou Acheter un StepStick DRV8833
//    http://shop.mchobby.be/product.php?id_product=499
//

#define pinINA1 5 // Moteur A, entrée 1 - Commande en PWM possible
#define pinINA2 6 // Moteur A, entrée 2 - Commande en PWM possible

#define pinINB1 10 // Moteur B, entrée 1 - Commande en PWM possible
#define pinINB2 11 // Moteur B, entrée 2 - Commande en PWM possible

void setup(){
  Serial.begin(9600);
  Serial.println("Test DRV8833");
  
  // Initialize les broches de commandes 
  // du moteur A
  pinMode( pinINA1, OUTPUT );
  pinMode( pinINA2, OUTPUT );
  digitalWrite( pinINA1, LOW );
  digitalWrite( pinINA2, LOW ); 
}

void loop(){
  // --- Moteur A: Controle pleine puissance -------------------
  // Marche avant
  digitalWrite( pinINA1, HIGH );
  digitalWrite( pinINA2, LOW  );
  
  delay( 3000 );
  
  // Arret par frein (voir documentation)
  digitalWrite( pinINA1, LOW );
  digitalWrite( pinINA2, LOW );
  
  delay( 2000 );
  
  // Marche arriere
  digitalWrite( pinINA1, LOW );
  digitalWrite( pinINA2, HIGH );
  
  delay( 3000 );
  
  // Arret en roue libre
  digitalWrite( pinINA1, HIGH );
  digitalWrite( pinINA2, HIGH );
  
  delay( 2000 );
  
  // Arret par frein (voir documentation)
  digitalWrite( pinINA1, LOW );
  digitalWrite( pinINA2, LOW );
  
  // ---- Moteur A: Controle de vitesse en PWM ------------ 
  // Marche avant progressive
  digitalWrite( pinINA2, LOW ); // réactive la commande en digital sur la broche
  for( int i = 20; i<=240; i=i+20 ){
    analogWrite( pinINA1, i );
    Serial.println( i );
    delay( 500 ); // attentre 0.5 sec
  }
  // Arret 
  digitalWrite( pinINA1, LOW );
  digitalWrite( pinINA2, LOW );
  delay( 2000 );
  
  // arret
  digitalWrite( pinINA1, LOW );
  digitalWrite( pinINA2, LOW );  

  // Marche arriere progressive
  digitalWrite( pinINA1, LOW ); // réactive la commande en digital sur la broche
  for( int j = 20; j<=240; j=j+20 ){
    analogWrite( pinINA2, j );
    delay( 500 ); // attentre 0.5 sec
  }
 
   // Arret par frein (voir documentation)
  digitalWrite( pinINA1, LOW );
  digitalWrite( pinINA2, LOW );
 
  // Arreter le programme 
  while(true);
}


Tutoriel
Où acheter