lundi 5 janvier 2015

Cartes SD et STM32 Nucleo

Aujourd'hui, nous expérimentons l'écriture de de fichiers sur une carte SD au moyen de la carte STM32 Nucleo.

Matériel:

J'ai utilisée la carte Nucleo F030R8 et un lecteur de carte SD fabriqué par LC Studio, le modèle de base qu'on trouve partout pour vraiment pas cher.

Connexions:

Un premier avantage évident du Nucleo, c'est qu'il communique avec un niveau logique de 3,3 V qui convient parfaitement aux cartes SD.  Contrairement à l'Arduino, nous n'aurons donc pas besoin d'utiliser un 4050 pour abaisser le niveau logique de 5 V à 3,3 V:  les connexions sont directes.

Le lecteur de carte SD utilise le protocole SPI.  6 connexions sont nécessaires et, puisque la carte est compatible avec les shields Arduino, les pins SPI du Nucleo sont les mêmes que sur un Arduino:
  • Pin  GND du lecteur SD  :  Pin GND du Nucleo
  • Pin +3.3 du lecteur SD:   Pin 3V3 du Nucleo
  • Pin CS du lecteur SD: Pin D10 du Nucleo
  • Pin MOSI du lecteur SD:  Pin D11 du Nucleo
  • Pin SCK du lecteur SD:  Pin D13 du Nucleo
  • Pin MISO du lecteur SD:  Pin D12 du Nucleo
Pour utiliser pleinement le sketch que je vous propose ci-dessous, vous branchez également un potentiomètre à l'entrée A0 (prenez garde d'alimenter ce potentiomètre avec 3,3 volts et non avec 5 volts).


Importation des bibliothèques

La meilleure méthode que j'ai trouvée pour importer toutes les bibliothèques nécessaires dans mon espace de travail mbed, c'est d'importer le programme intitulé "Seeed_SDCard_Shield".

Dans mbed, vous cliquez sur le bouton "Imports", vous sélectionnez l'onglet "Programs", vous faites une recherche pour "SDCard", vous choisissez dans la liste "Seeed_SDCard_Shield", puis vous cliquez sur le bouton "Import!".


Dans la boîte de dialogue qui apparaît ensuite, ne cochez pas "Update all libraries with latest revision":  étrangement, j'avais des erreurs de compilation si je cochais cette case!


Mon sketch

Le programme que vous avez importé devrait fonctionner correctement:  il écrit un message dans un fichier sur la carte SD.  Si le fichier existe déjà, il l'efface pour en créer un nouveau.

Je vous propose ci-dessous un sketch un peu différent, qui me semble plus utile  (vous pourrez le copier dans le fichier main.c pour remplacer l'autre programme):  chaque fois que vous appuyez sur  le bouton reset (le bouton noir sur la carte Nucleo), la valeur analogique lue sur l'entrée A0 sera ajoutée dans un fichier intitulé Nucleo.txt.  Si le fichier n'existait pas déjà, il sera créé.  S'il existait déjà, les données qu'il contenait ne seront pas effacées:  les nouvelles données sont simplement ajoutées à celles qui s'y trouvaient déjà.

Voilà une excellente base pour construire un data logger avec votre carte Nucleo!


Yves Pelletier (@ElectroAmateur)

dimanche 4 janvier 2015

Une boîte qui crie quand elle tombe

Aujourd'hui, nous poursuivons notre exploration de l'accéléromètre MMA7455.  Au cours des derniers jours, nous avons fabriqué un appareil qui mesure avec quelle intensité il est secoué, et nous avons construit un inclinomètre.  Cette fois-ci, nous allons construire un détecteur de chute libre.  Pour ce faire, nous allons mettre dans une petite boîte un Arduino Uno, un accéléromètre et un haut-parleur:  le haut-parleur va émettre un son chaque fois que la boîte sera en chute libre (si vous préférez, vous pouvez utiliser le même principe pour construire un ballon qui devient lumineux aussitôt qu'il se trouve dans les airs).


Si vous avez suivi quelques cours de physique, vous savez que l'accélération d'un objet en chute libre est de 9,8 m/s² vers le bas.  Et, bien entendu, l'accélération d'un objet qui repose sagement immobile est nulle.

Notre accéléromètre, toutefois, ne fait aucune différence entre la gravité et l'accélération:  lorsqu'il est immobile, il mesure une accélération vers le haut égale à 9,8 m/s², et lorsqu'il est en chute libre il mesure une accélération nulle (c'est assez logique:  dans l'espace intersidéral, si vous désirez que les passagers d'un vaisseau spatial subissent une gravité artificielle identique à celle de la terre, vous devrez faire subir au vaisseau une accélération de 9,8 m/s²).

Les branchements

En supposant que vous utilisez le même breakout MMA7455 que moi (celui qui est illustré ci-contre), c'est tout simple:

  • Vcc du breakout au 5V de l'Arduino 
  • 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.
Il faut aussi brancher le haut-parleur à l'Arduino:  un fil à la pin 9, et l'autre à une pin GND de l'Arduino.
Ensuite, vous mettez tout ça dans une boîte, avec un peu de papier journal froissé pour éviter que les divers composants se déplacent l'un par rapport à l'autre dans la boîte (et pour les protéger lors du choc de la boîte sur le plancher).

Le mieux, c'est d'alimenter votre Arduino au moyen d'une pile (dans mon prototype, je me suis contenté de faire passer mon câble USB par un trou dans la boîte).


Bibliothèque MMA7455

À moins que ce ne soit déjà fait, vous installez la bibliothèque mise au point par Moritz Kemper pour utiliser ce genre d'accéléromètre avec l'Arduino.


Le sketch

Rien de bien compliqué ici:  nous utilisons la fonction "Tone" pour émettre un son lorsque l'accéléromètre mesure une valeur nulle.  Nous avons tout de même une assez grande marge de manoeuvre entre la situation où l'accéléromètre est immobile (il indique alors une accélération de 63) et celui où il est en chute libre.  Pour tenir compte des incertitudes de mesure,  je me contente de détecter une accélération inférieure à 15.

Pour une meilleure fiabilité, prenez la peine de calibrer votre accéléromètre en modifiant les valeurs de calibrateOffset pour que les valeurs affichées par l'accéléromètre quand il est immobile, bien à plat sur une table soient de 0 en x, 0 en y et 63 en z.

Il ne vous reste plus qu'à tester le dispositif:  laissez tomber la boîte, ou lancez-là dans les airs:  aussitôt qu'elle quitte vos mains (et jusqu'à ce qu'elle touche au sol), elle émet un beep.


Yves Pelletier (Twitter:  @ElectroAmateur)

samedi 3 janvier 2015

Mesurer un angle d'inclinaison avec un accéléromètre

Aujourd'hui, nous construisons un inclinomètre, c'est à dire un appareil qui mesure sa propre inclinaison par rapport à l'horizontale.

Pour ce faire, nous utiliserons encore une fois un breakout basé sur l'accéléromètre MMA7455 relié à un Arduino Uno.

Puisqu'un accéléromètre sert à mesurer une accélération, il peut être un peu surprenant d'apprendre qu'on peut s'en servir pour mesurer l'inclinaison d'un objet immobile...   La raison, c'est qu'un accéléromètre ne fait pas la différence entre l'accélération et la gravité.  Lorsqu'il est immobile, l'accéléromètre mesure, en fait, le champ gravitationnel.

Pour être plus précis, l'accéléromètre mesure la composante de la force de gravité selon 3 axes:  l'axe des x (orienté selon le sens de la longueur du breakout), l'axe des y (orienté selon le sens de la largeur du breakout) et l'axe des z (orienté perpendiculairement à la surface du breakout).

Par exemple, si votre accéléromètre repose à plat sur la surface d'une table, l'axe des x et l'axe des y sont horizontaux, et l'axe des z est vertical:  toute la force gravitationnelle est orientée selon l'axe des z et l'accéléromètre affichera:

x:  0    y : 0     z: 63

... ce qui est l'équivalent de:

x:  63 sin 0°       y: 63 sin 0°     z: 63 cos 0°

(63 est la valeur correspondant à une accélération de 1 g, lorsque l'accéléromètre a été réglé pour mesurer des valeurs allant de -2g à +2g).

Supposons maintenant que vous inclinez  l'accéléromètre de 30°, de façon que l'axe des x ne soit plus parfaitement horizontal, et que l'axe des z ne soit plus parfaitement vertical.  La force gravitationnelle se répartit maintenant sur deux axes, avec une composante x et une composante z:

x: 63 sin 30°            y = 0      z = 63 cos 30°

Donc, pour mesurer l'angle d'inclinaison du breakout, il s'agit de mesurer les 3 composantes de l'accélération (x, y et z) et de faire un peu de trigonométrie.

Les branchements

Notre breakout sera branché pour être utilisé en mode I2C:
  • Vcc du breakout au 5 V de l'Arduino (car le breakout que j'utilise comporte un régulateur de tension:  si le vôtre n'en comporte pas, ou si vous n'êtes pas certain qu'il en comporte un, commencez par le brancher à 3,3V).
  • 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
Mon breakout semble déjà comporter des résistances de tirage à SCL et SDA, ainsi qu'à CS (pour activer le mode I2C).  Ces résistances peuvent être nécessaires si votre breakout est différent du mien.

Bibliothèque MMA7455

Si ce n'est pas déjà fait, installez la bibliothèque MMA7455 de Moritz Kemper.

Le sketch

Ce court sketch utilise les composantes x, y et z mesurées par l'accéléromètre pour calculer:

- l'angle que fait l'axe des x du breakout par rapport à l'horizontale
- l'angle que fait l'axe des y du breakout par rapport à l'horizontale
- l'angle que fait l'axe des z du breakout par rapport à la verticale, peu importe que cette inclinaison soit causée par une inclinaison de l'axe des x, ou par une inclinaison de l'axe des y, ou  par une combinaison des deux.



Conclusion:

Les mesures sont plausibles, mais il y a du bruit:  en laissant l'accéléromètre parfaitement immobile (donc son inclinaison ne change pas), la valeur mesurée peut varier de quelques degrés;  je m'attendais à mieux.

Yves Pelletier (Twitter: @ElectroAmateur)