Utilisation de composants simple : contrôle de LEDs

Commençons simplement, commençons par contrôler des LEDs.

Intro

Avant de regarder les branchements électrique, intéressons nous à la partie logiciel. Pour gérer notre LED nous allons utiliser le module johnny-five.io, véritable couteau suisse pour gérer un maximum de composants électronique.

npm install johnny-five raspi-io -save

Grâce à cela, nous pouvons coupler notre service REST à la gestion des LEDs, ce qui nous permettra de :

  • allumer la LED
  • éteindre la LED
  • faire clignoter la LED avec une vitesse réglable

A savoir pour la suite, le numéro de channel à utiliser est celui utilisant la nomenclature par défaut (A+/B+ et B2), le schéma ci-dessous résume le numéro et le nom des PIN ainsi que leurs type d’utilisation  :

Raspberry-Pi-GPIO-Layout-Model-B-Plus-rotated

à imprimer et garder près de soit 🙂

Le code

Côté code (component.service.js), ce dernier évolue pour prendre en compte les mécanismes inhérents au module utilisé. Cela commence par ajouter les dépendances et déclarer le type de carte que l’on utilise :

var five = require("johnny-five");
var Raspi = require("raspi-io");
var board = new five.Board({
 io: new Raspi()
});
var crypto = require('crypto');

On définit ensuite les composants disponibles dans notre application. A savoir que ce sera ces objets qui seront envoyés à par l’API REST. Des constantes permettrons ensuite de facilement retrouver les composants lorsque l’on devra gérer de l’IA :

var LEDRED = 'GPIO21';
var LEDYELLOW = 'GPIO20';
var LEDGREEN = 'GPIO26';
var components = {
  led: [
    {channel: LEDRED, name: 'Red LED', info: '#ff0000', value: 0},
    {channel: LEDYELLOW, name: 'Yellow LED', info: '#ffff00', value: 0},
    {channel: LEDGREEN, name: 'Green LED', info: '#00ff00', value: 0},
    {channel: LEDWHITE, name: 'Double White LED', info: '#ffffff', value: 0},
  ]
}

La définition d’un cache permettra de garder en mémoire l’instance de nos composants (chargés par fohnny-five) sans pour autant les envoyer au client REST :

var gpios = {};

On rajoute une méthode _getId() permettant de calculer l’id d’un composant en fonction de son channel. A savoir qu’un composant peut être constitué de plusieurs channels, à ce moment là c’est un Array qui est passé en paramètre

_getId(channel) {
 return crypto.createHash('md5').update(channel.toString()).digest('hex');
}

Dans le constructeur du service on gère l’initialisation et on ajoute un id à chaque composant :

var types = Object.keys(components);
types.forEach(type => {
  components[type].forEach(component => {
    component.id = this._getId(component.channel);
    component.type = type;
    console.log('- registered: ' + component.id + ' (' + component.type + ') => ' + component.name)
  });
});

Pour finir, on définit le callback permettant de réaliser une action à la fin de l’initialisation de la carte et ainsi instancier nos composants :

board.on("ready", () => {
 console.log('> Board ready !');
 components.led.forEach(led => {
   gpios[led.id] = new five.Led(led.channel);
 });
 componentService.action(componentService._getId(LEDGREEN)); // toggle led => on
});

Attention ici, le callback « ready » est appelé en dehors du constructeur, l’appel au service de composant doit être fait de manière explicite et sans utiliser le mot clé « this »

Plus de détail sur le code sur github : https://github.com/achorein/aligator

L’electronique

Niveau électronique nous avons besoin de :

  • LEDs de 3mm (les plus courantes et les moins cher), qui consomme entre 1.6V et 3.7V (entre 0.02€ et 0.10€).
  • résistances 220 Ohm (entre 0.02€ et 0.10€)
  • des câbles pour prototypage mâle/femelle
  • une breadboard

La valeur de la résistance dépend de la LED, la LED utilisée ici  consomme 1,8 volts pour 10 mA. Ainsi en appliquant la bonne vieille formule U=RI pour une source de 3.3V nous obtenons : R=U/I

R = (3.3-1.8) / 0.01 = 150 Ohm

Il faut donc utiliser une résistance d’au minimum 150 Ohm, sachant que plus la résistance est élevée moins la LED éclairera fort. Et que dans la cas contraire, si la résistance est trop faible, la LED risque de cramer.

Passons au branchement des trois LED de notre feux tricolore.

La théorie :

Electronic Sketch_led

A savoir que l’emplacement de la résistance (avant ou après la LED) ne change rien, car pour un branchement en série l’intensité est constante dans tous le circuit.

La pratique :

led

Nous passons par une breadboard pour simplifier le prototypage, cependant il est tout à fait possible de s’en passer vu la faible complexité du montage.

LED_schemaPour réaliser ce montage nous avons simplement besoin de savoir reconnaître la borne + (branchée au gpio actif) de la borne –  (branchée à la masse). Pour cela rien ne vaut un bon schéma :

Une fois le câblage réalisé, place aux tests. Mais avant cela, il faut prendre soin de vérifier que les numéros de channel câblés et ceux déclarés correspondent bien  : server/api/component/component.service.js.

Dans le schéma ci-dessus nous utilisons les PIN ayant la plus grande valeur (40, …) car alimentés en 3V et au centre du Raspberry Pi.

Nous en profitons aussi pour allumer la LED verte par défaut, ce qui nous permet de savoir visuellement sur le Lego que l’initialisation est terminée.

Test

Lancer le serveur à l’aide de la commande « sudo grunt serve » (injecte les dépendances AngularJS) ou « sudo npm start » (relance rapide du serveur).

Il est important d’exécuter la commande avec sudo pour avoir le droit de piloter les ports GPIO (compte root).

Ensuite, direction l’interface Web avec son navigateur ou son téléphone pour activer/désactiver les LEDs :

aligator-web-v2

Une petit vidéo pour illustrer le résultat :

Et pour finir, une fois le prototype terminé, il ne reste plus qu’à faire les branchements sur le pickup. Les projecteurs sont ajoutés sur le toit par la même occasion :

led-truck


Partager

comments powered by Disqus