jeudi 7 mars 2013

Accéléromètre MMA7455 (et Arduino)

Un accéléromètre pouvant se brancher sur un Arduino:  l'exemple parfait du machin que j'achète parce que ce n'est pas cher et que ça semble intéressant, sans avoir la moindre idée de ce à quoi ça pourra me servir dans un projet concret.

Il s'agit donc d'un petit breakout d'environ 2 cm X 1 cm dont le composant principal est le circuit imprimé MMA7455:  un accéléromètre qui permet de mesurer l'accélération selon 3 axes.  Celui que j'ai acheté a été fabriqué par LCStudio et est vendu sur eBay pour $3...ou $15, ça dépend du vendeur.

D'après la description du vendeur, il peut fonctionner aussi bien à 5 V qu'à 3,3 V.  Et on a le choix entre le protocole SPI ou I2C.

Pour ce premier test rapide, désireux de me faciliter la tâche au maximum, j'ai installé la bibliothèque MMA-7455 mise au point par Moritz Kemper et utilisé l'exemple "simpleRead" qui est distribué avec la bibliothèque.  Cette bibliothèque est conçue pour une utilisation en I2C, ce qui clôt le débat:  j'utiliserai  le mode I2C.

Ma seule hésitation concernait la façon de brancher le breakout à l'Arduino, car le schéma présenté par l'auteur de la bibliothèque concerne un breakout qui n'est pas identique à celui que j'ai utilisé.

Si votre breakout est identique à celui qui apparaît sur la photo au début de cet article, les branchements à faire sont:

  • Vcc du breakout au 5V de l'Arduino (le circuit intégré fonctionne à 3,3 V, mais le breakout comporte un régulateur de tension).
  • GND du breakout au GND de l'Arduino.
  • SCL du breakout à l'entrée analogique A5 de l'Arduino.
  • SDA du breakout à l'entrée analogique A4 de l'Arduino.
C'est tout:  les 4 autres connecteurs du breakout ne sont pas nécessaires en I2C. Certaines personnes disent que la connexion CS du breakout doit aussi être relié à VCC pour activer le mode I2C, mais dans mon cas j'ai obtenu le même résultat peu importe que CS soit branché ou non.

En principe, l'I2C nécessite des résistances de tirage 4,7 kΩ (entre SCL et 5 V, et entre SDA et 5 V), mais ça fonctionne très bien sans qu'elles soient là.  Elle sont peut-être déjà présentes sur le  breakout? 

J'ai ensuite fait l'essai de l'exemple "simpleRead"  fourni avec la librairie. Lorsque l'accéléromètre est immobile, bien à plat sur la table, le moniteur série affichait initialement une valeur de -6 en x, -15 en y et 71 en z.   On s'attendrait plutôt à 0 en x, 0 en y et 63 en z (63 étant la valeur pour 1g, qui est l'effet de la gravité).  En ajoutant l'instruction  "mySensor.calibrateOffset(6, 15, -8)" au début du sketch, les valeurs affichées sont maintenant les bonnes.

Évidemment, les valeurs changent si je déplace, incline ou secoue l'accéléromètre.  D'après ce que j'ai constaté, l'axe des x est orienté dans le sens de la longueur du breakout, l'axe des y est dans le sens de sa largeur, et l'axe des z est perpendiculaire au plan du breakout.

À lire aussi, 3 projets impliquant cet accéléromètre:




Yves Pelletier (Twitter: @ElectroAmateur)

mercredi 6 mars 2013

Spirographe laser

Voici un projet relativement spectaculaire, mais excessivement simple, qui exploite le phénomène de persistance rétinienne:  si vous faites réfléchir un rayon laser sur un miroir en rotation autour d'un axe qui n'est pas exactement perpendiculaire au plan du miroir, une ellipse sera projetée sur le mur.  Si le laser est réfléchi successivement sur deux miroirs en rotation, un motif similaire à celui qui est illustré ci-contre sera projeté sur le mur.

Vous obtiendrez des motifs d'autant plus complexes et variés si le laser est réfléchi sur 3 ou 4 miroirs en rotation, et si vous êtes en mesure de varier individuellement la vitesse de rotation de chaque miroir.


Matériel

En plus d'un laser (il peut s'agir d'un simple pointeur), il vous faut donc quelques petits miroirs qui seront installés sur des moteurs électriques.   En ce qui me concerne, j'ai utilisé un plateau de disque dur d'ordinateur, que j'ai découpé en 4 quartiers pour faire 4 petits miroirs (de forme un peu étrange, j'en conviens, mais ça fonctionne quand même).  Idéalement, on recommande d'utiliser des miroirs circulaires dont la face réfléchissante n'est pas recouverte par une couche transparente, mais ce n'est pas toujours facile d'en trouver.

Comme moteur, j'ai choisi d'utiliser des ventilateurs de 12 volts pris dans des ordinateurs pour au moins trois raisons: d'une part parce que c'est facile d'y coller les miroirs, d'autre part parce qu'ils sont déjà munis d'un support qui permet de les maintenir facilement dans une position verticale, et finalement parce que j'en avais un plein tiroir...

Pour que ça fonctionne bien, il faut que la surface du miroir ne soit pas parfaitement perpendiculaire à l'axe de rotation du moteur, mais dans la plupart des cas, l'inclinaison apparaît d'elle-même quand vous collez le miroir au moteur, sans que vous ayez à prendre de précaution particulière.  Après avoir collé un miroir à son moteur, vous pouvez facilement vérifier que l'inclinaison est adéquate en faisant réfléchir la lumière du laser sur le miroir pendant que le moteur tourne à pleine vitesse:  une forme circulaire ou elliptique devrait être réfléchie sur le mur.  Si l'ellipse est minuscule, c'est que votre miroir n'est pas assez incliné.

Disposition des miroirs


Vous devrez disposer le laser et les miroirs de façon que la lumière du laser atteigne successivement le centre de chaque miroir, puis le mur (il est plus simple d'effectuer cet alignement pendant que les moteurs ne tournent pas).  Ensuite, il faut trouver une façon de fixer les moteurs en place car des ventilateurs en marche, ça se repousse!  (Moi, je me suis contenté d'un peu de ruban gommé et d'un livre assez lourd placé par-dessus les ventilateurs).

Ensuite, vous faites tourner les moteurs:  un motif assez complexe devrait apparaître sur le mur.

Contrôle de la vitesse des moteurs

Pour obtenir un plus grand nombre de motifs, il est utile de varier individuellement la vitesse de rotation de chaque moteur.  Ça peut se faire au moyen de potentiomètres qui diminueront la tension appliquée aux moteurs, ou par PWM (modulation de largeur d'impulsion).

Dans un premier temps, j'ai réalisé le circuit schématisé ci-contre.  Ça fonctionne, mais la sensibilité du système est faible (pour la plupart des positions du potentiomètre, le miroir ne tourne pas, et quand il accepte de tourner il est déjà presque à sa vitesse maximale).

Arduino et "motor shield"

Le PWM semble donc une meilleure option, et l'Arduino est tout indiqué pour envoyer de brèves impulsions aux ventilateurs.  Et avec 3 moteurs, j'ai jugé qu'il était temps d'utiliser pour la première fois mon "motor shield".

Je n'avais jamais utilisé ce shield auparavant parce que, d'une part, il nécessite l'utilisation d'une librairie spécialisée et, surtout, il accapare toutes les sorties numériques de l'Arduino Uno même si vous ne désirez faire tourner qu'un seul moteur!

Heureusement, les entrées analogiques sont disponibles, mais pour les utiliser j'ai dû souder moi-même des connecteurs femelles sur le shield.

Les branchements nécessaires sont relativement évidents:  un moteur branché sur chacune des sorties moteur "M1", "M2" et "M3" du shield, une source de tension de 12 V sur l'entrée "EXT-PWR", et des potentiomètres aux entrées analogiques A0, A1 et A2 (à la condition d'avoir soudé des headers pour rendre ces entrées accessibles à partir du shield).

Voici le sketch:


Yves Pelletier (Twitter: @ElectroAmateur)