Variation de puissance électrique via Raspberry

Dans cette article nous allons faire varier la puissance électrique d’une via le Raspberry. Le principe de fonctionnement peut permettre de contrôler par exemple l’intensité d’une lampe ou la vitesse d’un moteur.

Normalement pour effectuer cette tache nous devrions faire varier le courant ou l’intensité dans sur la charge. Seulement voila, avec un Rpi capable uniquement d’envoyer un signale en tout ou rien comment on fait? La réponse la voici : utiliser les deux états de façon alterné et répété. Cette technique se nomme le PWM pour Pulse Width Modulation, ce qui donne modulation de largeur d’impulsion en frenchy.

 

Principe de fonctionnement

La modulation de largeur d’impulsions  est une technique couramment utilisée pour synthétiser des signaux continus à l’aide de circuits à fonctionnement tout ou rien. Le principe général est qu’en appliquant une succession d’impulsion (passage de l’état 0 à 1) pendant des durées bien choisies, on peut obtenir en moyenne sur une certaine durée n’importe quelle valeur intermédiaire.

Ce principe repose sur deux paramètres:

  • La fréquence (période)

  • Le rapport cyclique

PWM_parametres

La fréquence (ou période) est le nombre de fois par seconde ou  l’impulsion est générée. Cela se compte entre le moment du début d’une impulsion et le début de la suivante. L’unité de la fréquence est le Hertz (Hz). Le hertz est une pulsation par seconde. Par exemple 50 Hz correspond à 50 impulsions en une secondes, se qui donne une impulsion toute les 0.02 secondes.

Le rapport cyclique est le pourcentage de temps ou le signal est en position 1 pendant le cycle.

Par exemple une fréquence de 50 Hz et un rapport cyclique de 50% signifie que toutes les 0.02 secondes le signal sera à 1 (high) pendant la moitié du temps et à 0 (LOW) pendant l’autre moitié.

fivty_percent

50 Hertz et cycle de 50%

Pour une fréquence de 50 Hz et un rapport cyclique de 80% le signal sera à 1(HIGH) pendant 80% du temps du cycle de 0.02 secondes.

 eighty_percent

50 Hertz et cycle de 80%

Test avec une LED

Bon la théorie c’est cool mais le plus fun c’est bien la pratique ! Pour un premier test vous aurez besoin d’une LED et d’une résistance de 10 Ohm pour protéger cette dernière. Le courant max d’une broche GPIO d’un Raspberry ne dépasse pas 16 mA. Sur la grande majorité des LED le courant supporté est de 20 mA. La résistance ne devrais donc pas être nécessaire mais ça protège quand même. A vous de voir. La formule de calcul est la suivante (si vous avez la documentation de votre LED).

Résistance = (Tension d’alimentation – Tension de LED) / Courant max LED

Le circuit est le suivant:

 

schema_test_rpi_del

 

Pour la suite je suppose que vous avez installé la librairie python permettant  le contrôle des ports GPIO. Si ce n’est pas le cas je vous renvoie vers cet article.

Clignotement d’une LED

On va commencer par un simple clignotement de la LED. Le code suivant permet de faire clignoter la LED pendant 50% du temps de chaque période. Les périodes durent 0.5 Hz soit une période toutes les 2 secondes. Les commentaires devraient suffire à la compréhension du code.

Clignotement d’une LED avec variation d’intensité

Dans l’exemple suivant nous allons faire clignoter la LED mais cette fois en contrôlant son niveau d’intensité grâce au rapport de cycle.

Variation de vitesse d’un moteur via Raspberry

Les ports GPIO du Rapsberry n’envoient qu’un signal de 3,3 V. Alors comment faire varier la puissance d’une charge nécessitant bien plus que ces 3,3V comme par exemple un moteur ? Pour cela nous allons utiliser un composant qui fonctionne comme un interupteur que l’on appel MOSFET.  Un MOSFET est un composant électronique permettant de faire de la commande en puissance. Le principe du fonctionnement de ce type de transistor est que lorsque la tension de la Gate atteint une valeur suffisante, le courant passe entre le Drain et la Source. Certains transistors sont commandés en courant, le Mosfet est commandé en tension.

schema_MOSFET

 

  • 1 = G = GATE : broche de commande. La commande ici sera le port GPIO.

  • 2 = D = DRAIN : broche qui draine le courant (la charge quoi… c’est ici que l’on va raccorder notre moteur)

  • 3 = S = SOURCE : broche source de courant (ou le courant est collecté pour être envoyé vers la charge… dans notre cas, il s’agit de la masse)

Donc le MOSFET permet de séparer le circuit ou ce trouve nôtre charge du circuit de commande, en l’occurrence le Rpi.

Voila le schéma avec un moteur éclectique et une alimentation sur batterie de 12V.

moteur_raspberry

 

Le code à utiliser est exactement le même que pour le clignotement de la LED avec avec variation d’intensité.

Vous n’avez pas de moteur ou d’alimentation sous la main? Vous pouvez essayer le circuit avec le Rpi. Pour cela il vous faut une LED et une résistance cette fois de 100 Ohm car nous allons utiliser la source Vcc 5v dur Rpi pour le circuit de test.

Matériel nécessaire pour tester:

  • LED
  • Résitance de 100 Ohm
  • MOSFET

Sur le circuit ci dessous, la source Vcc 5v du Rpi passe dans la résistance de 100 Ohm de façon à limiter le courant, puis dans la LED et enfin se branche au drain du MOSFET. Le port GPIO 4 permet, comme pour le circuit précédent de commander le MOSFET sur la gate.

raspberry_pwm

 

La encore, le code à utiliser est exactement le même que pour le clignotement de la LED avec avec variation d’intensité.

24 thoughts on “Variation de puissance électrique via Raspberry”

  1. Samoth47 dit :

    Excellent tutoriel, marche parfaitement chez moi pour la LED, je cherche un MOSFET mais je suis sûr que ça marchera ^^

    Merci 🙂

  2. Mateo68 dit :

    Dans l’avant dernier schéma, il ne manque pas une liaison qui va de S(3) vers l’une des masses du Raspberry pour que sa fonctionne ? 🙂

    1. Sispheor dit :

      Non, le courant se dirige dans la source dans tout les cas. C’est notre masse pour ce schéma. Essayez vous verrez 😉

      1. Mateo68 dit :

        Mh d’accord, ben justement j’avais essayer et ça n’a pas fonctionné :/ une ref. de MOSFET à utilisé pour que sa fonctionne comme sur le schéma ? merci 🙂

    2. Sispheor dit :

      Dans l’avant dernier schéma S3 est relié à la masse du générateur. Mais si ce dernier est le RPI alors oui il faut le relier à la masse du RPI. Dans tous les cas S3 est relié à une masse.

  3. Mateo68 dit :

    PS: J’avais testé avec un transistor IRF3205

    1. Sispheor dit :

      Bonjour, en ce qui me concerne je suis sur un IRF520 et IRF740.

      1. Mateo68 dit :

        Bonjour, je viens de tester avec un IRF520, sa ne fonctionne toujours pas sauf quand je relis S(3) à la masse du Rpi en plus 🙁 une idée ? merci

        1. Sispheor dit :

          Et bien oui, il faut que S3 soit relié à une masse comme dans le dernier schéma.

          1. Mateo68 dit :

            D’accord, j’aurais bien voulu utilisé que la masse de mon générateur à savoir une batterie de 12 volts sans utilisé en plus la masse du RPI. Faire un montage comme sur l’avant dernier schéma :/

  4. David dit :

    Bonjour, Parfait pour envoyer des fréquences, mais comment faire l’inverse, c-à-d lire les fréquences envoyées par exemple par le TCS3200 détecteur de couleurs. Peut-être est-ce dans vos projets ?

    1. Sispheor dit :

      Ah non désolé pas pour le moment.

  5. michel dit :

    bonjour,
    aurais-il une solution pour que une fois sorti de la boucle la led garde sont état?

    1. N.i.c.O dit :

      Et bien comme l’article l’explique, c’est grâce au code et à cette boucle que la variation est possible. Si vous souhaitez maintenir une puissance vous devez faire une boucle avec les bon paramètres de fréquence et de rapport cyclique.

  6. moissan dit :

    le moteur est inductif … le mosfet va se prendre une grosse surtention chaque fois qu’il veut couper le courant , et va griller sauf si il est largement dimensionné en tension maxi

    il est indispensable d’ajouter une diode de roue libre a ce schema

  7. Orarkad dit :

    Bonjour, article très intéressant, j’aimerais faire varié la vitesse d’un moteur de 36V, vous penser que c’est possible avec cette technique ? Sinon existe t-il des logiciels de simulation pour pouvoir essayer avant ? j’ai peur de faire n’importe quoi vu que je débute ^^

    1. N.i.c.O dit :

      Cela marchera parfaitement. Faites vos tests avec une LED pour valider votre code et votre circuit.

      1. Orarkad dit :

        Ok merci de votre réponse, mon projet est de réaliser un kart électrique, vous penser que c’est pertinent d’utiliser cette méthode pour mon projet ?

  8. Pat dit :

    Salut à tous !
    J’ai vraiment besoin d’aide car je ne m’en sors pas. J’ai testé le système avec une led ou un moteur et ça marche très bien (pour le moteur DC, il faut ajouter une diode, IN4004 par ex, entre S et D).
    Je me suis dit que je pouvais appliquer le principe à la commande d’un moteur avec un L293D + RPI + alim externe en faisant varier l’alim du moteur de la broche 8 du L293D et là est mon pb, je n’arrive pas à faire fonctionner le tout, pas à faire varier la puissance vers le moteur.
    Quelqu’un pourrait-il me donner une coup de main et me dire comment connecter tout ça ? Ce serait vraiment cool car mon projet est à l’arrêt. Inutile de me dire comment connecter les broches 1 à 7 et 16 du L293D, je sais faire…
    A noter que le but la manoeuvre n’est pas d’utiliser la pin 18 du GPIO qui permet d’tuliser le prinicipe du PWM…
    Merci d’avance pour vos réponses.

  9. Rofnar dit :

    Bonjour j’aimerais savoir pourquoi vous mettez un timesleep() pour faire le clignotement dans votre deuxième programme alors que dans le premier vous le faites avec la fréquence ( GPIO.PWM(4, 0.5) ) ?
    Est ce que j’ai mal compris a quoi sert la fréquence ?
    Et d’ailleurs pourquoi mettre un timesleep() aussi court ? Ne pas en mettre du tous est il mauvais ?

    Merci d’avance

    1. N.i.c.O dit :

      Il permet de laisser à la machine le temps de respirer et faire autre chose pendant un petit laps de temps. Vous pouvez tester sans si vous voulez.

      1. Rofnar dit :

        Merci j’essayerais

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *