L293D Motor Driver

L293D Motor Driver

Si l’on branche un moteur à courant continu (DC Motor) à une source de courant adaptée, celui ci tournera. Si l’on veut inverser le sens de rotation, il suffit d’inverser le branchement. Cependant, inverser des branchements “à la main” ne convient pas à un robot. Nous verrons donc aujourd’hui comment contrôler le sens et la vitesse de rotation d’un ou deux moteurs en utilisant un circuit intégré L293D. Pour davantage de moteurs, il suffira de multiplier les puces L293D. Cette puce vaut environ 2.5$. Dans ce tutoriel, nous verrons comment interfacer cette puce avec un raspberry pi (les branchements). Ce tutoriel est également valable  pour un Arduino ou tout autre microcontrôleur ayant des sorties programmables En premier lieu, voyons la liste des composants dont nous aurons besoin:

  • Un Raspberry Pi (ou un Arduino, ou autre microcontroleur)
  • Une puce L293D ou L293
  • Une breadboard (facultatif, mais bien pratique 🙂 )
  • Un ou deux moteurs consommant chacun moins de 600mA max.

Etape 1 : Alimentation électrique

Le circuit intégré (CI) L293D a tout d’abord besoin d’une alimentation électrique. Il faut donc connecter la broche 16 de la puce (tout en haut à droite. Sur le schéma il s’agit du fil rouge en haut à droite, qui ressort sur du +5V.) à une source de courant, en 5V. Sur un Raspberry pi, si la carte SD est en haut, ce sera le pin en haut à droite (P1-02).
Pour que notre circuit soit fermé, il faudra connecter la masse de notre puce (pin 4,5 12 ou 13 : à savoir le 4 ou 5 eme pin en partant du haut à gauche ou à droite!, fil noir à droite sur le schéma) à la masse de notre Raspberry pi, donc sur le port GPIO P1-06 (3 eme en partant du haut sur la colonne de droite, toujours avec la carte SD vers le haut).
Maintenant, notre CI est alimenté. Nous devrons également alimenter nos moteurs, et pour cela il faudra connecter l’alimentation des moteurs (le + de la source d’alimentation, fil rouge en bas à gauche du schéma) au pin 8 du CI, le 8eme en partant du haut dans la colonne de gauche.
La masse (le – de notre source d’alimentation des moteurs) sera connectée à l’une des broches 0V du CI, soit les broches 4, 5, 12 ou 13 (fil noir en bas à gauche).
La masse du Raspberry et de l’alimentation des moteurs sont connectées (le fil noir tout en bas qui va de gauche à droite), mais attention à ne surtout pas connecter le +5v du Raspberry et le + de la source d’alimentation des moteurs si celle ci est externe. En effet, vos moteurs peuvent être alimentés de 4 à 36v selon les spécifications, et le Raspberry n’aimerait sans doute pas recevoir des tensions bizarres sur son +5v! Toutefois, il est possible d’alimenter les moteurs via le 5V du Raspberry, même si c’est déconseillé, car les moteurs peuvent générer du bruit électrique et perturber le fonctionnement du Raspberry. En outre, il faudra s’assurer que le 5V du Raspberry est assez puissant pour alimenter les moteurs : si l’adaptateur secteur utilisé délivre 1000mA en 5V, et sachant que le Raspberry consomme jusqu’à 700mA, il ne reste donc que 300mA potentiels pour les moteurs. Attention donc à la valeur “stall current” de vos moteurs, si cette valeur est trop importante, vous pourriez griller quelque chose sur le Raspberry pi dans le cas ou les moteurs se retrouveraient bloqués. (S’ils n’ont aucune charge – s’ils tournent dans le vide par exemple- cela devrait aller sans soucis pour de petits moteurs).
Comme source externe, le plus simple est de prendre des piles AA (4 piles AA alcalines donnent du 6V, 5 AA rechargeables du 6V). Il est cependant également possible d’utiliser un transformateur secteur qui donne du 5-6V. Pour les moteurs de lecteurs CD, j’ai pu utiliser des valeurs entre 6 et 10V (je n’ai pas essayé plus haut). Le + des piles serait connecté à +VM et le – à -VM sur le schéma.
L'alimentation électrique du CI et des moteurs est en place

Etape 2 : Connexion du premier moteur

Nous disposons maintenant d’un CI alimenté et prêt à contrôler notre moteur. L’étape suivante est de connecter les fils du moteur aux pins OUT1 et OUT2 (pins 3 et 6, 3ème et 6eme en partant du haut de la colonne de gauche du CI). Sur le schéma, ce sont les fils jaunes, et M1 représente le moteur 1. Ce sont ces pins qui enverront le courant au moteur. Attention donc à ne pas les connecter aux pins GPIO du Raspberry par erreur!
Il ne reste plus maintenant qu’a connecter pins de commande aux pins GPIO du Raspberry. En premier lieu, le pin Enable1, qui sert à activer ou non le moteur (pin 1, en haut à gauche sur le CI), sert à activer/désactiver le moteur. Il est représenté par le fil bleu “GPIO C(PWM)“. Quand le signal est haut, le moteur tourne, quand le signal est bas, le moteur est arrêté. Pour contrôler la vitesse du moteur, il faudra donc brancher ce pin sur un port GPIO capable de PWM. En pratique, le seul capable de cela est le pin P1-12, ou GPIO18 (le 6eme en partant du haut, sur la colonne de droite). Enfin on connectera les pins IN1 et IN2 (pins 2 et 7, 2eme et 7eme en partant du haut) du CI à deux ports GPIO du raspberry, par exemple les pins P1-11 (GPIO 17) et  P1-15 (GPIO22) du Raspberry, afin de pouvoir envoyer les données sur le sens de rotation du moteur. Ce seront les fils verts, GPIO A et GPIO B, sur le schéma.
En pratique, si le L293D reçoit un signal HIGH sur le pin IN1 et LOW sur le pin IN2, le moteur tournera dans un sens. Si il reçoit LOW sur le pin IN1 et HIGH sur le pin IN2, le moteur tournera dans l’autre sens.
Il ne reste donc plus qu’à écrire un programme pour contrôler tout cela!
Le premier moteur connecté

Etape 3 : Connexion du second moteur

Ce câblage permet de contrôler un seul moteur (ou deux, mais qui font exactement la même chose. Vérifiez toutefois si vos deux moteurs ne consomment pas trop avant de le faire.) Si l’on veut un second moteur, il faudra donc ajouter des connections. En pratique, il ne reste qu’à câbler les pins OUT3 et OUT4 (pins 11 et 14 du CI, 6eme et 3eme en partant du haut sur la colonne de droite – les fils jaunes foncés connectés à M2 sur le schéma.) pour les connecter sur le second moteur, puis câbler les pins IN3 et IN4 (pins 10 et 15, 7eme et 2 eme en partant du haut sur la colonne de droite du CI), et à les connecter à des ports GPIO du Raspberry pi (par exemple les pins P1-16GPIO23– et P1-18GPIO24– du Raspberry) pour contrôler le moteur, de la même façon que pour l’autre moteur (HIGH et LOW ou LOW et HIGH sur ces deux pins pour faire tourner dans un sens ou dans l’autre le moteur), et enfin à connecter le pin ENABLE2 (EN2, pin 9 du circuit, à savoir le 8eme de la colonne de droite en partant du haut) à un pin PWM du Raspberry pi. Malheureusement, nous n’avons plus de pins PWM!  Une solution serait donc de connecter cette broche du CI à la broche EN1, qui elle même est connectée à la broche PWM du Raspberry Sur le schéma, ce branchement est matérialisé par le câble bleu foncé.. L’inconvénient est que du coup, il devient impossible de contrôler la vitesse des moteurs de façon individuelle : ils tourneront à la même vitesse. En revanche, on peut toujours les faire tourner dans des sens contraires si on le souhaite.
Les deux moteurs sont connectés et leur vitesse est contrôlée par une seule broche PWM

Cela suffira déjà à faire un robot pouvant avancer (les deux moteurs tournent dans le même sens), reculer (les deux moteurs tournent dans l’autre sens), ou tourner (un moteur tourne dans un sens, l’autre dans l’autre sens. Pour tourner dans l’autre sens, on inversera les sens de rotation des deux moteurs).

Si l’on dispose d’une seconde broche capable de PWM, ou s’il on utilise la PWM logicielle, on pourra toujours câbler comme ceci :
Les deux moteurs sont connectés et leur vitesse est contrôlée individuellement
Cette fois ci, le pin EN2 sera connecté à une broche GPIO capable de PWM (ou non). Sur le schéma, il s’agit du câble bleu marine GPIO F (PWM).
On pourra également connecter les GPIO C et F (bleu et bleu foncé) à des GPIO classiques du raspberry et ne pas utiliser de contrôle fin de la vitesse, ou alors coder soir même une PWM logicielle. Cependant, attention à la consommation CPU d’une pwm software, si le processeur est surchargé, la fréquence des impulsions peut changer.

Notes et limitations

Cette puce est prévue pour alimenter des moteurs consommant jusqu’à 600mA par moteur. Vérifiez donc bien que le “stall current” de vos moteurs ne dépasse pas trop cette valeur, car il y a risque de surchauffe de la puce dans le cas contraire.
D’autre part, sur Adafruit, on indique que cette puce est prévue pour fonctionner en 5V pour l’alimentation et les signaux logiques. Mais les datasheets indiquent que les signaux logiques peuvent aller de 2.3V à VCC1 pour un signal HIGH, et de -0.3V à 1.5V pour un LOW. VCC1 est le courant d’alimentation de la puce, qui lui doit être de 4.5V à 7V. Dans tous les cas, comme nous alimentons la puce par du 5V, le HIGH doit être compris entre 2.3V et 5V, ce qui est bon, puisque le Raspberry enverra 3.3V pour un HIGH. Le LOW sera à 0V, ce qui est conforme également.
Si on désire utiliser plus que 600mA par moteur, on peut utiliser plusieurs puces, en connectant toutes la pin 1 du premier CI à la pin1 du second, la pin 2 du premier à la pin 2 du second, et ainsi de suite, jusqu’à ce qu’on aie connecté la pin 16 du premier à la pin16 du second. On doublera ainsi la puissance de sortie théorique. On peut répéter l’opération une troisième fois, et encore davantage, mais plus on rajoute des puces, moins cela est efficace. Dans tous les cas, la puce s’utilise toujours de la même façon, le câblage vers le Raspberry pi reste le même, et le code source ne changera pas. D’autre par, la température de la puce influe sur ses performances : si elle surchauffe, elle se dégradera plus vite. Un radiateur peut donc permettre d’exploiter la puce pour de plus forts courants.
Documentation
Voici quelques liens utiles pour se servir de cette puce, et aller plus loin :
Réseaux sociaux