L293D couplé au PCA9685 pour faire du PWM sur n'importe quelle sortie GPIO

Un lieu pour discuter des composants et de leur utilisation. Un passage obligé si vous devez interfacer votre Raspberry Pi avec le monde extérieur. On y trouvera aussi les cartes type commande de moteur pas à pas, continu, servo...

Modérateurs : Francois, smba38

Répondre
golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

L293D couplé au PCA9685 pour faire du PWM sur n'importe quelle sortie GPIO

Message par golum » mar. 18 juil. 2017 17:56

Salut à tous !
N'étant pas une bête en électronique, je ne m'explique pas mon problème...
Je suis sous Raspbian avec un RPI3.
Mon but est de faire varier la vitesse d'un moteur DC en le commandant via les broches GPIO du RPI3.
Je l'ai déjà fait avec un L293D relié à la pin 18, seule à pouvoir gérer le mode PWM (contrairement à l'Arduino) et ça marche très bien.

Mon idée est d'utiliser n'importe quelle sortie GPIO pour utiliser le mode PWM.
J'ai donc acheté un PCA9685 (16 sorties PWM possibles).
Voici mes connexions :
Côté L293D :
Enable1 relié à la sortie PWM du canal 0 du PCA9685.
Pins input1A, inputB reliées à 2 broches GPIO du RPI3 (24 et 25)
Pins output1A, output1B reliées aux borne du moteur DC
Pin Alim moteurs reliée à du 5V (alim externe)
Pin Alim L293D reliée au 5V du RPI3
Côté PCA9685 :
Pin SCL reliée à la pin GPIO 3 du RPI3
Pin SDA reliée à la pin GPIO 2 du RPI3
Pin VCC reliée à la pin 3.3V du RPI3
Pin PWM du canal 0 reliée à l'entré Enable 1 du L293D

Tous les GND (L293D, PCA9685, alim externe 5V, RPI3) sont reliés ensembles, en étoile.

Mon pb : lorsque je fais un set_pwm du PCA9685 au max, je n'obtiens qu'une tension proche de 3V d'un OUTPUT1 du L293D et donc, le moteur ne tourne quasiment pas.

Je m'attendais à une tension plus élevée...

Quelqu'un pourrait me dire où je me suis viandé ? J'ai beau chercher dans des forums ,je ne trouve rien...

Merci d'avance pour vos réponses.

dyox
Raspinaute
Messages : 459
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: L293D couplé au PCA9685 pour faire du PWM sur n'importe quelle sortie GPIO

Message par dyox » mar. 18 juil. 2017 18:29

Bonjour,

Pour ce genre de problème, un lien vers les datasheets seraient un grand plus...
Débutant sous RPi / linux
[Pour bien commencer] Pour les nouveaux acquéreurs de Raspberry Pi (liste de liens utiles)

golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

Re: L293D couplé au PCA9685 pour faire du PWM sur n'importe quelle sortie GPIO

Message par golum » mer. 19 juil. 2017 00:14

Oui, désolé.
Voici le datasheet du PCA9685 : http://www.nxp.com/docs/en/data-sheet/PCA9685.pdf et du L293D : http://www.ti.com/lit/ds/symlink/l293.pdf
Ci-joint, le schéma de mon montage. Désolé pour les fils qui se croisent...
et le code python :

Code : Tout sélectionner

from Tkinter import *
import RPi.GPIO as GPIO
import time

# Import the PCA9685 module.
import Adafruit_PCA9685

MoteurA = 23      # premiere sortie du moteur
MoteurB = 25      # deuxieme sortie de moteur

# Initialise the PCA9685 using the default address (0x40).
pwm = Adafruit_PCA9685.PCA9685()

# Set frequency
pwm.set_pwm_freq(50)

# Initialisations
GPIO.setmode(GPIO.BCM)
GPIO.setup(MoteurA, GPIO.OUT)
GPIO.setup(MoteurB, GPIO.OUT)
GPIO.output(MoteurA, GPIO.HIGH)
GPIO.output(MoteurB, GPIO.LOW)

class App:

    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        scale = Scale(frame, from_=0, to=3830, orient=HORIZONTAL, command=self.update)
        scale.grid(row=0)
		
    def update(self, pulse):
		pwm.set_pwm(0, 0, int(pulse))	

root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()

GPIO.cleanup() 
Fichiers joints
Montage.jpg
Montage.jpg (102.02 Kio) Vu 423 fois

dyox
Raspinaute
Messages : 459
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: L293D couplé au PCA9685 pour faire du PWM sur n'importe quelle sortie GPIO

Message par dyox » mer. 19 juil. 2017 08:40

Merci, cela va aider grandement !
Je l'ai déjà fait avec un L293D relié à la pin 18, seule à pouvoir gérer le mode PWM (contrairement à l'Arduino) et ça marche très bien.
Si je lis pin 18, pour moi c'est la borne physique alors que là c'est GPIO18 (pin 12) d'après Pinout. Et on voit que les bornes 32 et 33 le font aussi.
Je viens de chercher, et avec ça, les GPIO sont programmables en PWM, peut-être à tester ?
Je complète avec d'autres solutions, voir https://www.raspberrypi.org/forums/view ... 65&t=36319

EDIT
Pins input1A, inputB reliées à 2 broches GPIO du RPI3 (24 et 25)
=> sur le schéma c'est 23 et 25 :D (je pense que c'est une erreur de recopiage)
Débutant sous RPi / linux
[Pour bien commencer] Pour les nouveaux acquéreurs de Raspberry Pi (liste de liens utiles)

spourre
Raspinaute
Messages : 735
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: L293D couplé au PCA9685 pour faire du PWM sur n'importe quelle sortie GPIO

Message par spourre » mer. 19 juil. 2017 14:35

Bonjour,

Tout d'abord, je tiens à préciser que je ne dispose pas du même matériel et que je ne peux donc pas tester.
Si j'ai bien compris (d'après las data sheet),, nous avons 2 circuits qui assurent 2 fonctions bien différentes (et complémentaires):

- PCA9685 est, au départ, un driver pour LED dont il peut commander l'extinction, l'allumage ou l'éclairage à puissance variable.
Ce circuit se commande en I2C, en mode fast et dispose de 16 sorties INDÉPENDANTES codées sur 12 bits. Il embarque son propre générateur PWM (1 par LED) et se commande en I2C (adresse configurable).
Adafruit met à disposition une bibliothèque et un howto bien documenté.

- L293D qui est un quadruple demi-ponts pour commander des moteurs PAP ou des moteurs Courant Continu. La commande d'un moteur CC, tant en vitesse qu'en sens de rotation, nécessite 2 x 1/2 ponts par moteurs . C'est donc une interface de puissance, qui attend des signaux logiques TTL (donc 5 V).

Un peu de logique: Si on applique la méthode cartésienne, on va découper ce "monstre" en sous-problèmes, plus simple à résoudre.

1 ère fonction: Générer du PWM pour piloter la sortie désirée du PCA9685. Ne relier que ce circuit au GPIO du Raspberry, en I2C (donc ne pas oublier d'activer cette interface dans raspi-config). Disposer en sorties, des LED (ou, mieux encore, un oscilloscope USB même basique). Vérifier la détection du circuit en I2C (libwiringpi), essayer d'envoyer des ordres avec la bibliothèque Adafruit.

2 ème fonction: commander un moteur continu avec un signal PWM: On peut relier directement le L293D au port PWM du raspberry (sans passer par PCA), il y a une bibliothèque capable de gérer des servos (je ne sais plus laquelle).
Cela permettra, par talonnements, de découvrir les caractéristiques du PWM, adaptées au moteur (fréquence, rapport cyclique..). Ne pas oublier que le GPIO du Raspberry est en 3.3V et que le L93 attend des signaux TTL (5V). Comme souvent souligné, ça peut passer comme ça peut merder aléatoirement et être difficile à analyser.

Quand les 2 fonctions sont maîtrisées de manière indépendante, alors on peut essayer de les enchaîner.

Sylvain

golum
Messages : 34
Enregistré le : mer. 10 août 2016 01:11

Re: L293D couplé au PCA9685 pour faire du PWM sur n'importe quelle sortie GPIO

Message par golum » mer. 19 juil. 2017 18:50

spourre a écrit :Bonjour,

Tout d'abord, je tiens à préciser que je ne dispose pas du même matériel et que je ne peux donc pas tester.
Si j'ai bien compris (d'après las data sheet),, nous avons 2 circuits qui assurent 2 fonctions bien différentes (et complémentaires):

- PCA9685 est, au départ, un driver pour LED dont il peut commander l'extinction, l'allumage ou l'éclairage à puissance variable.
Ce circuit se commande en I2C, en mode fast et dispose de 16 sorties INDÉPENDANTES codées sur 12 bits. Il embarque son propre générateur PWM (1 par LED) et se commande en I2C (adresse configurable).
Adafruit met à disposition une bibliothèque et un howto bien documenté.

- L293D qui est un quadruple demi-ponts pour commander des moteurs PAP ou des moteurs Courant Continu. La commande d'un moteur CC, tant en vitesse qu'en sens de rotation, nécessite 2 x 1/2 ponts par moteurs . C'est donc une interface de puissance, qui attend des signaux logiques TTL (donc 5 V).

Un peu de logique: Si on applique la méthode cartésienne, on va découper ce "monstre" en sous-problèmes, plus simple à résoudre.

1 ère fonction: Générer du PWM pour piloter la sortie désirée du PCA9685. Ne relier que ce circuit au GPIO du Raspberry, en I2C (donc ne pas oublier d'activer cette interface dans raspi-config). Disposer en sorties, des LED (ou, mieux encore, un oscilloscope USB même basique). Vérifier la détection du circuit en I2C (libwiringpi), essayer d'envoyer des ordres avec la bibliothèque Adafruit.

2 ème fonction: commander un moteur continu avec un signal PWM: On peut relier directement le L293D au port PWM du raspberry (sans passer par PCA), il y a une bibliothèque capable de gérer des servos (je ne sais plus laquelle).
Cela permettra, par talonnements, de découvrir les caractéristiques du PWM, adaptées au moteur (fréquence, rapport cyclique..). Ne pas oublier que le GPIO du Raspberry est en 3.3V et que le L93 attend des signaux TTL (5V). Comme souvent souligné, ça peut passer comme ça peut merder aléatoirement et être difficile à analyser.

Quand les 2 fonctions sont maîtrisées de manière indépendante, alors on peut essayer de les enchaîner.

Sylvain
Salut !
J'ai déjà testé les deux fonctions indépendamment avec succès.
Ce qui me pose problème, c'est de coupler le L293D au PCA9685.

Répondre

Retourner vers « L'électronique et le Raspberry Pi »