LOCODUINO

Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803

.
Par : PICO

DIFFICULTÉ :

Avec une carte Arduino, l’intensité maximale en entrée/sortie (par broche et sur une durée très limitée) est de 40 mA.

ATTENTION :

  1. Toutefois le datasheet (la bible en quelque sorte) indique de ne pas dépasser 20 mA par broche.
  2. 200mA cumulé pour l’ensemble des broches E/S).

Pour ma réalisation je devais commander 12 électro-aimants d’aiguillage Märklin. Chaque électro-aimants demande une intensité qui approche 1A (certes pendant un court instant : 200 ms est la valeur qui permet un bon fonctionnement pour mes aiguillages). Il est d’ailleurs souhaitable que d’un point de vue programmation la durée de l’alimentation d’un électro-aimant soit imposée : comme cela il n’y a pas de risque de détruire l’électro-aimant. Vous pourrez voir cela sur l’article concernant ma réalisation de la commande de ma butte de triage.

Utiliser un transistor est une possibilité, mais Christian (il se reconnaîtra) m’a conseillé de prendre un ULN 2803.

Ce circuit sert d’interface « de puissance » entre une sortie Arduino et ce que vous souhaitez alimenter (Relais, électro-aimant, plusieurs DEL en même temps, moteur à courant continu dans un seul sens, etc).

N’étant PAS DU TOUT électronicien je me suis documenté sur ce circuit et je vous fais part de ma réalisation.

L’ULN 2803 comporte 8 amplificateurs avec diodes de protection incorporée.
Voici son schéma

Ses caractéristiques principales :

Tension de sortie max : 50 V.
Tension d’entrée max : 30 V.
Courant de sortie max : 500 mA théorique (pour une sortie) mais qu’il convient de limiter raisonnablement à 20 mA par sortie.
Circuit très bien adapté à recevoir des signaux d’un Arduino (5V).

Comment l’utiliser :

Il est très bien adapté pour commander des composants qui consomment plus que ce que peut fournir un Arduino.
Comme il comporte des diodes de protection, il peut commander des composants comportant des bobines tel qu’un relais ou un électro-aimant (comme un moteur d’aiguillage Märklin, Jouef, Kato, Trix et autres), sans mettre de protection supplémentaire.
Vous pouvez en ajouter une mais cela ne semble pas du tout nécessaire.
Voici le schéma de branchement d’un relais :

Pour ma part voici le schéma de câblage pour commander deux moteurs d’aiguillage Märklin :

Vous devez constater que le schéma est similaire au précédent à un détail près. En effet le besoin en intensité pour chaque électro-aimant était de 1A en courant continu.
Il est donc possible de mettre en parallèle deux entrées et faire de même pour les deux sorties correspondantes. Pour votre information c’est ce que j’ai constaté sur un décodeur d’aiguillage que j’ai sur mon réseau : donc cela fonctionne !

Voici ma réalisation :

A l’aide d’une plaque de circuit imprimé à bande un peu spécial (Conrad réf 531380), vous pouvez réaliser facilement votre montage (ce qui ne nécessite pas de réaliser un circuit imprimé spécifique et donc plus coûteux).

16 Messages

  • Bravo pour cette réalisation et pour l’idée du couplage en parallèle pour augmenter le courant !

    Marc-Henri

    Répondre

  • Bonjour à tous,

    J’ai mis en oeuvre le montage proposé ci-dessus pour le pilotage d’aiguillages Fleischmann en les alimentant avec du 16v redressé (en utilisant une seule sortie par contact)

    Tout cela a bien fonctionné..... jusqu’à ce qu’un aiguillage se soit bloqué pour une raison externe non identifiée.
    Et là l’ULN 2803 a émis une très jolie fumée ..... et une douce odeur de brûlé !!

    Pour éviter qu’un tel incident se reproduise, y aurait-il une protection envisageable ?
    Mes connaissances en électronique sont malheureusement bien trop faibles pour trouver la solution tout seul !

    Merci par avance pour votre aide !

    Répondre

  • Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803 26 janvier 2016 11:43, par Pierre GRAFTIEAUX

    Bonjour,
    Est-ce que vos "moteurs" d’aiguillages doivent être alimenté en permanence pour maintenir la position de l’aiguille ?
    Si ce n’est pas le cas vous vous trouvez dans le même cas que moi.
    Pour ma part ma centrale envoi une commande d’une durée imposée (environ 0.5 s de mémoire).
    Si ce n’est pas le cas pour vous, il faudrait faire une commande de ce type. A partir de votre commande générer une impulsion d’une durée imposée.
    Une possibilité est de faire cela par l’intermédiaire d’un Arduino par programme. Chaque sortie de l’Arduino étant reliée à un ULN 2803.
    C’est ce que j’ai fait dans la réalisation de ma butte de triage.
    Cordialement.
    Pierre

    Répondre

    • Non, les moteurs Fleischmann fonctionnent en impulsionnel.
      Ce mode est donc réalisé par un bref passage en HIGH temporisé par un Delay(100) inclus dans le programme.
      En fait lors de l’incident rencontré, la bobine du moteur s’est mise à "ronfler", et la fumée est sortie ensuite très rapidement de l’ULN 2803.
      Je pencherai donc vers l’hypothèse d’un problème de court circuit sur le 16V au niveau de l’ULN lié à un dysfonctionnement du moteur (pb de fin de course ?)..... mais comme je l’ai dit mes connaissances sont faibles ....!

      Répondre

  • Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803 26 janvier 2016 20:16, par Pierre GRAFTIEAUX

    Est-ce que tu as la possibilité de mesurer la résistance de la bobine d’un moteur d’aiguillage ?
    C’est ce que j’avais fait et en conséquence j’ai calculé l’intensité que l’ULN devait fournir (presque 1 A si j’ai bonne mémoire).
    Pou ton calcul de l’intensité pense que ta tension redressée est de 16V x 1.414 soit presque 23 V.
    Pour connaître l’intensité au moment de l’alimentation de ton moteur tu divises cette tension par la valeur de la résistance que tu auras mesurée.
    J’ai donc mis deux sorties en parallèle (idem en entrée bien sur).
    Étant curieux j’ai constaté que sur un décodeur professionnel (viessmann) c’est ce qu’il faisait aussi.
    Mais je ne prétend pas que c’est la bonne solution. En effet il est impossible d’affirmer que le courant va réellement se partager à 50 % dans chaque branche du montage parallèle.
    Bon courage.
    Pierre

    Répondre

    • Après avoir utilisé le multimètre je trouve une résistance de 17,4 ohm et 16,65 Volts en sortie du pont de diodes ce qui me donne une valeur effectivement proche de 1 A.
      Je vais donc modifier mon câblage et doubler les portes comme suggéré.

      Mais ce qui m’inquiète c’est que je n’ai pas de certitude sur la cause de l’incident rencontré....
      Et quoi qu’il en soit un mauvais fonctionnement de la bobine ou du contact fin de course n’étant jamais exclu, je me pose toujours la question des dommages possibles sur l’ULN et de l’utilité d’une protection de celui-ci.

      Seulement laquelle .....?

      Répondre

  • Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803 27 janvier 2016 13:16, par Pierre GRAFTIEAUX

    La cause possible est que ta bobine soit en court-circuit et là pas beaucoup de protection car il faudrait un fusible rapide (plus rapide que la destruction de l’ULN).
    Donc est-ce que cet aiguillage fonctionne aujourd’hui correctement ?
    Est-ce que ta durée d’impulsion est bien celle que tu as indiquée (100 ms) ?
    Quand à assurer une protection de l’ULN, je ne sais pas car je n’en ai jamais eu besoin.
    Mais un autre membre pourra peut être te répondre (je l’espère).
    Pierre

    Répondre

    • Difficile de répondre avec précision à la première question. En effet je cherche à mettre au point une gestion par itinéraires commandés chacun par un poussoir. Chaque poussoir actionne donc plusieurs aiguillages pour établir l’itinéraire demandé et pré défini. (Les aiguillages sont bien sûr actionnés l’un après l’autre dans une boucle et pas tous ensemble ! mais ceci dans un temps très court)
      Comme j’étais depuis quelques jours en période de test sur ce branchement j’avais 4 aiguillages branchés posés sur la table et les uns à côté des autres et lorsque j’ai entendu le bruit d’une bobine qui "ronflait", je n’ai pas pris le temps de vérifier duquel cela provenait, et me suis précipité sur l’alim pour la couper, mais trop tard ..!
      Aujourd’hui si je teste les 4 aiguillages, ils fonctionnent tous, mais l’un deux semble avoir une course incomplète au niveau de la commande manuelle présente.
      Peut-être est ce le fautif ?
      Pour ce qui est de la temporisation elle est bien programmée à 100ms. Ce qui m’intrigue c’est que la bobine a ronflé bien plus longtemps que çà (en fait jusqu’à la rupture d’alim ...!)

      Répondre

  • Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803 28 janvier 2016 10:52, par Pierre GRAFTIEAUX

    D’après tes informations, cela indique que la durée d’impulsion de commande n’est pas de 100 ms.
    Pour ma butte de triage, j’ai mis une durée de 200 ms et cela suffit.
    Est-ce que tu as la possibilité de mettre un relais DC 24 V en lieu et place d’un moteur d’aiguillage afin de "voir" la durée de commande réelle que tu envoi ?
    Ton application est similaire à ma butte de triage.
    Je te mets le lien sur mon blog qui explique un peu ma réalisation : http://train-train41.eklablog.com/a...
    Par quel intermédiaire tu génères la commande successives de tes aiguillages ?
    Pour ma part c’est un Arduino et je peux donc donner un temps d’impulsion imposée.
    A+
    Pierre

    Répondre

  • Si, si la tempo est bien à 100 ms !
    ci-dessous, extrait du sketch, la partie qui met en place les aiguillages successivement dans une boucle, par lecture d’un tableau où sont déclarés les positionnements d’aiguillages à réaliser en fonction de l’itinéraire souhaité (tableau nommé "parcours") :

    /*
     * puis on va lire les valeurs de la ligne correspondante
     * dans le tableau parcours et actionner chacune des portes
     * du MCP1 par une impulsion de 100ms
     */
          
      ligne = numPoussoir;
      for (colonne=0;colonne<=2;colonne++)
      {
        // Nombre de colonnes à adapter si modification taille tableau
        if ((parcours[ligne][colonne])>=0)
        {
          mcp1.digitalWrite((parcours[ligne][colonne]), HIGH);
          delay (100);
          mcp1.digitalWrite((parcours[ligne][colonne]), LOW);
        }
      }

    Schématiquement l’architecture est la suivante :
    Arduino Uno sur laquelle est connecté un ensemble de 8 boutons poussoirs (chacun d’eux correspond à un itinéraire différent)
    Ces 8 boutons poussoirs sont connectés à une seule entrée de l’arduino, selon le schéma donné par Jean-Luc (intervenant de ce site) sur son propre site :
    http://modelleisenbahn.triskell.org...

    L’arduino est ensuite connectée à un MCP23017 via le bus I2C. MCP qui via 2 ULN2803 gère les 8x2 positions des aiguillages. (à doubler donc dans le futur comme vu hier)
    Deux autres MCP sont également connectés sur le bus pour gérer les feux rouges et verts correspondants.

    N’ayant pas de relais sous la main, j’ai remplacé l’alim 16V par du 5V et remplacé les aiguillages par des leds. L’impulsion est tellement fugitive qu’elle n’est pas perceptible (à part une petite variation d’intensité)
    En revanche si j’augmente la valeur du delay l’alternance allumé/éteint fonctionne tout à fait.

    Espérant avoir répondu à tes questions, et en te remerciant pour le temps consacré !

    A+
    Michel.

    Répondre

  • Bonjour,
    j’ai déjà eu l’occasion de griller des circuits intégrés prévus pour être protégés en intensité, voire en température lorsque je les ai alimentés par des tensions continues "pas propres" et le redressement non filtré en est une. Un bon gros condensateur, genre 10000 µF 25V devrait convenir (RC=10ms). Les passages à 0 de la tension doivent perturber les fonctions de protection.
    Par ailleurs, pour doubler le courant de sortie et faire la mise en parallèle prévue par le constructeur on peut simplement poser et souder deux circuits l’un sur l’autre sans aucun câblage ...
    Cordialement

    Répondre

  • Bonsoir,
    J’ai appliqué ce principe pour piloter des PECO mais j’attaque l’ULN avec un ATTINY45 qui me génère un pulse de 300ms sur une sortie quand une entrée passe de 0 à 1 et sur une autre sortie quand cette même entrée passe de 1 à 0.
    Quand je teste avec des leds en sortie d’ULN, tout va bien.
    Avec les électro-aimant, il y a parfois une réaction sur l’ATTINY : alors que l’entrée ne bouge pas, les sorties bagottent toute seules (et donc l’électro-aimant aussi).
    Je sèche !
    A tout hasard, comment fait-on pour neutraliser la pin de RESET ?

    Répondre

    • Bonjour,

      Visiblement un courant est induit dans votre montage lorsque les électroaimants sont pilotés. Si RESET flotte, ça n’est pas bon. Même si en interne il y a une résistance de pullup de 30 à 60kΩ ça ne suffit pas en environnement bruité. Tirez le à 5V via une résistance de 4,7kΩ.

      Si le problème persiste c’est que l’alimentation est perturbée. Avez vous une photo du montage ?

      Cordialement

      Répondre

  • Bonsoir,

    J’ai un schéma sous forme d’un .jpg.
    Je fais comment pour l’inclure dans ce post ?
    Sinon je pense que c’est effectivement un problème de retour de courant via le 0V du à la "violence" d’un électro-aimant PECO. Quand je met un simple relais, tout se passe bien.
    J’ai toujours la solution de passer via des relais. C’est moins élégant que ce que j’envisageais mais cela fonctionne

    Répondre

Réagissez à « Amplifier le signal de sortie d’un ARDUINO avec un ULN 2803 »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Matériel »

Les derniers articles

Les articles les plus lus