8 LEDs de plus - Registre à décalage 74HC595.

Le moment est venu de commencer à s'amuser avec les puces, ou circuits intégrés (CIs) comme ils aiment être appelés. Le packaging interne d'une puce peut être très décevant. Par exemple, la puce sur la carte Arduino (un microcontrôleur) et celle que nous allons utiliser dans ce circuit (un registre à décalage) semblent très similaires mais sont en fait plutôt différents. Le prix de la puce ATMega sur la carte Arduino est de quelques dollars tandis que le 74HC595 vaut un couple de centimes.
C'est un bon circuit d'introduction, et une fois que vous êtes à l'aise dans sa mise en oeuvre et avec sa fiche (disponible en ligne) vous serez dans le monde des puces comme dans un cocon.
Le registre à décalage (aussi appelé convertisseur série en parallèle), vous offrira 8 sorties de plus (pour contrôler des LEDS ou n'importe quoi) en utilisant seulement trois ports Arduino.
Ils peuvent être reliés ensemble pour vous donner un nombre quasi illimité de sorties en utilisant les quatres mêmes ports (ou 3, NdT). Pour une vision plus approfondie de la façon dont fonctionne un registre à décalage rendez vous sur le wiki en ligne.

COMPOSANTS

SCHEMA DU CIRCUIT

Schéma du circuit

MONTAGE DU CIRCUIT

Diagramme d'assemblage

Vidéo d'assemblage.

CODE

Vous pouvez trouver ce code dans CIRC-05-code-shiftregister.js.

var five = require("johnny-five"),
    board, shiftRegister;
board = new five.Board();
board.on("ready", function() {
  shiftRegister = new five.ShiftRegister({
    pins: {
      data: 2,
      clock: 3,
      latch: 4
    }
  });
  var value = 0;
  function next() {
    value = value > 0x11 ? value >> 1 : 0x88;
    shiftRegister.send( value );
    setTimeout(next, 300);
  }
  this.repl.inject({
    sr: shiftRegister
  });
  next();
});

DEPANNAGE

Le voyant d'alimentation de l'Arduino s'éteint

Cela peut arriver quand la puce est insérée à l'envers. Si vous le corrigez rapidemment, il n'y aura pas de dégâts.

Ne fonctionne pas vraiment

C'est probablement quelque chose d'aussi simple que des fils intervertis ou des LED inversées.

ETENDRE LE CODE

Comprendre ce qui se passe

L'objet Johnny-Five ShiftRegister cache les détails de bas niveau quand à l'envoi d'une valeur au registre à décalage. Pour envoyer des données à la puce, vous "horlogez" les données puis vous les verrouillez. Pour ce fait le code place le port de données soit sur HAUT ou BAS, donne une impulsion à l'horloge, puis de nouveau positionne le port et donne une impulsion, tout cela de façon répétée jusqu'à ce qu'il ait décalé 8 bits de données. Ensuite il donne une impulsion au loquet et les 8 bits sont transférés aux ports du registre à décalage. Cela semble compliqué mais c'est vraiment simple une fois que vous avez pris le coup.

Si vous regardez le code de la méthode send de ShiftRegister, vous pouvez voir comment cela est implémenté dans Johnny-Five:

ShiftRegister.prototype.send = function( value ) {
  this.board.digitalWrite( this.pins.latch, this.firmata.LOW );
  this.board.shiftOut( this.pins.data, this.pins.clock, true, value );
  this.board.digitalWrite( this.pins.latch, this.firmata.HIGH );
  return this;
};

Contrôler individuellement des LEDs

Le moment est venu de commencer à contrôler les LEDs avec une méthode similaire à celle utilisée dans l'exercice 2. Comme les états des 8 LEDs sont stockés sur un octet (une valeur de 8 bits) alors le nombre binaire (en base 2) 10000100 montre que les LED un et six sont allumées, tandis que les autres sont éteintes. Pour contrôler quelles LEDs sont allumées, utilisez la méthode send, en fournissant l'équivalent décimal (base 10) ou hexadécimal (base 16) du nombre binaire pour la configuration que vous voulez (comme 0x84 pour la configuration précédente).

Commentez l'appel de fonction next() à la fin et lancez le programme de nouveau. Utilisez le REPL pour essayer d'envoyer différentes valeurs au registre à décalage jusqu'à ce que vous compreniez comment cela fonctionne, ainsi ce qui suit éteint toutes les LEDs et ensuite allume la LED 2.

sr.send(0);
sr.send(0x02);

Quelques configurations à essayer:

Configuration Valeur binaire Valeur hexadécimale Valeur décimale
LED 8 seule 00000001 0x01 1
LED 7 seule 00000010 0x02 2
LED 6 seule 00000100 0x04 4
LED 5 seule 00001000 0x08 8
LED 4 seule 00010000 0x10 16
LED 3 seule 00100000 0x20 32
LED 2 seule 01000000 0x40 64
LED 1 seule 10000000 0x80 128

Pour mieux comprendre comment cela fonctionne, vous devriez vous documenter sur les nombres binaires, il y a de nombreux tutoriels sur le Web. Arduino excelle à manipuler les bits et il y a tout un ensemble d'opérateurs pour vous aider.


Licence Common Creative. Traduction par Scriptol.fr du tutoriel en anglais d'Anna Gerber, sous la même licence. Copie et modification autorisées sous réserve de conserver cette notice y compris le lien sur la page originale.