Carte de relais

15/2012 : j'ai trouvé sur un site d'enchères en ligne des cartes de relais toute prête pour piloter une source de courant fort tel que des prises électrique (220 V) par exemple à l'aide d'une commande en 5 V. Ainsi, allumer ou éteindre une lampe est un jeu d'enfant !

Ces cartes intègrent sur un même circuit imprimé un relais et une diode dite de roue libre permettant de protéger l'arduino des surtensions apparaissant lors du pilotage du relais ainsi qu'un bornier pour brancher des fils electriques.

Carte 2 relais

La tension d'alimentation de la carte est de 5V comme celle de l'arduino. Il suffit de brancher directement les sorties numériques du micro-contrôleur sur les pins d'entrée de la carte de relais pour ouvrir ou fermer le relais. Le montage final est le suivant :

  • Alimentation +5V et masse : fils rouge et noir;
  • Pilotage des 2 relais, un fil pour chaque relais : fils jaune et vert.

Shéma de cablage d'une carte 2 relais

Pour piloter l'ensemble, j'ai developpé un script perl coté serveur associé à un sketch Arduino :

  • l'arduino écoute sur le port serie et exécute les ordres émis : basculer à 0 ou 1 la sortie indiquée;
  • coté serveur, à partir des arguments fournit au script perl, l'ordre d'allumer ou éteindre une sortie est transmis à l'arduino.

L'ensemble du code est publié sur gitlab : https://gitlab.com/coliss86/arduino-controller

Arduino

La connection à l'arduino s'effectue par un port serie émulée via le port USB. Au branchement sur un ordinateur, un device /dev/ttyACM0 est créé. Pour s'y connecter, il faut utiliser une simulateur de console série, comme picocom :

$ picocom /dev/ttyACM0 -b 9600

Faire Ctrl + A puis Ctrl + X pour sortir.

Comme pour un shell, un prompt invite à la saisie. Pour lancer l'aide, taper h.

> h
    ___          _       _
   / _ \        | |     (_)
  / /_\ \_ __ __| |_   _ _ _ __   ___
  |  _  | '__/ _` | | | | | '_ \ / _ \
  | | | | | | (_| | |_| | | | | | (_) |
  \_| |_/_|  \__,_|\__,_|_|_| |_|\___/

  Build Feb  7 2015 : 14:10:41

Help
Command available :
      <pin number [2-9]>=<0,1>
      h - help
      s - i/o status

Pour connaitre l'état des sorties actuelles, taper s :

> s
I/O Status :
  2 => 0
  3 => 1
  4 => 0
  5 => 0
  6 => 0 (R)
  7 => 0 (R)
  8 => 0 (R)
  9 => 0 (R)

Ici, les sorties de 2 à 9 sont listées, elles sont toutes à l'état bas (0) sauf la n°3 qui est à l'état haut (1). Pour mes besoins, les sorties des relais devaient être inversées. Les sorties notées (R) sont configurées de la sorte.

Pour activer/désactiver une sortie, il faut donner le numéro de la sortie suivi du symbole = puis de l'état souhaité : 1 ou 0. Exemple : activation de la sortie n°2 :

> 2=1
  OK

Vérification de l'état :

> s
I/O Status :
  2 => 1
  3 => 1
  4 => 0
  5 => 0
  6 => 0 (R)
  7 => 0 (R)
  8 => 0 (R)
  9 => 0 (R)

Perl

Le script perl offre les mêmes fonctionnalités que ci dessus tout en masquant la communication via le port serie et la transmission des ordres.

Utilisation :

> ./pin.pl
./pin.pl [-p dev] (<pin> <state> | status)
        <dev>   - device [/dev/ttyACM0]
        status  - retrieve the current status of the outputs
        <pin>   - pin number
        <action> - low|off / high|on / toggle

Afficher le statut des sorties :

> ./pin.pl status
Status
  2 => 1
  3 => 0
  4 => 0
  5 => 0
  6 => 0 (R)
  7 => 0 (R)
  8 => 0 (R)
  9 => 0 (R)

Inversion de l'état d'une sortie :

> ./pin.pl 2 toggle

Auto reset

Une fois l'ensemble opérationnel, je me suis rendu compte que l'arduino subissait un RESET à chaque fois que je me connectais dessus, c'est à dire à chaque lancement d'une connexion série. Cela est lié à la manière dont l'arduino UNO gère les connexions en USB : lors de l'ouverture d'une connexion serie, le signal DTR est émis pour établir les flux. Ce signal est également utilisé par l'arduino pour qu'il se reboote tout seul afin de lancer un nouveau programme après un upload. Pour faire du dev, cela est très pratique. Par contre, cela est génant dans mon cas car à chaque connexion, le RESET remet à zero toutes les sorties à l'état haut et leur état est perdu, ce qui va provoquer une extinction de toutes les lampes.

Parmis les solutions disponibles, j'ai choisi de connecter un condensateur de 10 μF entre la broche Reset et Ground. J'ai également mis un interrupteur pour faciliter la désactivation ou non du auto reset : en phase de dev, l'auto reset est activé (comportement natif), en phase d'utilisation, le condensateur est actif.

Désactivation du RESET automatique

Pour faciliter les manipulations, j'ai tout rassemblé dans un même boitier electrique. Pour gagner de la place dans cet espace exigü, j'ai soudé un cable USB directement sur les broches du port USB de la carte permettant ainsi de ne plus devoir utiliser le gros connecteur USB.

Arduino et carte relais

J'ai branché la webcam dessus pour l'allumer et l'éteindre en fonction de lever et du coucher du soleil.