Vous êtes sur la page 1sur 6

TP5 : Initiation aux MEMS (accélérométré)

1 Objectif
1. Manipuler les API destinées aux MEMS (Accéléromètre),
2. Contrôler les diodes Leds par l’accéléromètre.

2 Principe

La carte STM32F4 Discovery dispose d’un capteur MEMS (MicroElectroMechanical Systems) (voir
Figure 1). Le capteur utilisé dans la carte est le LIS3DSH. Le fichier « en.DM00040962.pdf » est le
manuel d’utilisation de ce capteur.

Figure 1. Accéléromètre en technologie MEMS.

Le LIS3DSH est un capteur ultra-compact capable de mesurer l’accélération d’un mouvement sur les
trois axes (X,Y,Z). La pleine échelle de ce capteur est configurable et elle peut atteindre jusqu’à une
accélération +/- 16g. La fréquence de mesure est réglable entre 3.125 Hz et 1.6 kHz.

La Figure 2 illustre le schéma block du LIS3DSH. Le capteur effectue des mesures sur les trois axes,
convertit ces mesures par un convertisseur analogique numérique avant de les envoyer au
microcontrôleur à travers une interface série I2C/SPI.
Figure 2. Le schéma bloc du LIS3DSH.

Dans le travail demandé vous aller utiliser le driver offert par « STMicroelectronics » pour commander
les Leds de la carte. Vous devez avoir le fichier « Files.rar » qui contient tous les fichiers sources
nécessaires au bon fonctionnement du capteur.

3 Création d’un projet


1. Créer un projet TP05,
2. Sous le menu « Project » -> « Manage » -> « Run-Time Environment », sélectionner « LED
API », « Start up »et il est important de préciser la board « STM32F4-Discovery ». Cliquer sur
« Resolve » et cocher « Classic » sous « STM32Cube Framework (API) » puis sur « OK ».
3. Ajouter les dossiers « sources » et « headers » et les fichiers « main.c »,
« main.h », «stm32f4xx_it.c » et «stm32f4xx_it.h.

4. Cliquer sur l’icône « options for target » , ensuite sur l’onglet « Debug » afin de
configurer les options de la carte cible sur laquelle le programme sera exécuté. Sélectionner
l’option émulation. Ajouter le macro « HSE_VALUE=8000000 » qui indique la fréquence du
Crystal installé sur la carte. A ce stade le code doit être compilable sans fautes avec
l’arborescence suivante.
4 Travail demandé

1. Sous le menu « Project » -> « Manage » -> « Run-Time Environment », sous « Device », sous
« STM32Cube HAL » , sélectionner « I2C » et « SPI ». Ceci ajoutera les fichiers sources
nécessaires pour la communication série entre le capteur et le microcontrôleur. Appuyer sur
résolve pour ajouter automatiquement les bibliothèques manquantes et que la sélection passe
au vert.

A ce stade la compilation se termine toujours sans fautes.


2. Copier les fichiers «stm32f4_discovery_accelerometer.c » et
« stm32f4_discovery_accelerometer.h » dans le répertoire du projet TP05. Tous les fichiers
nécessaires sont dans le fichier zip fourni.
3. Avec un clic droit sur les dossiers « Sources » et « Headers » puis «add exiting files… » ajouter
les deux fichiers comme suit :.

4. Compiler le projet. La compilation ne sera pas réussie car des fichiers sont encore manquants.
Il faut ajouter les fichiers demandés un par un dans les dossier « Sources » et « Headers »
comme indiquer dans le point 3 et en recompilant à chaque fois. Le projet doit compiler sans
erreurs quand tous les fichiers sont ajoutés.
5. Dans le fichier « main.c » vers la ligne 44 assurez-vous d’inclure les fichiers header suivants :

#include "Board_LED.h"
#include "stm32f4_discovery_accelerometer.h"

6. Dans le fichier « main.c » vers la ligne 73 insérer la macro suivante. Cette macro retourne la
valeur absolue d’une variable :

#define ABS(x) (x < 0) ? (-x) : x

7. Dans le fichier « main.c » vers la ligne 75 déclarer les variables globales comme suit :

/* Typical value:
- No acceleration: X, Y inferior to 100 (positive or negative)
- Max acceleration: X, Y around 2000 (positive or negative) */
int16_t ThresholdHigh = 200;
int16_t ThresholdLow = -200;

Ces variables seront utilisées comme seuils de décision pour le mouvement de la carte.

8. Dans la fonction «main ()» vers la ligne 115 ajouter la fonction qui permet d’initialiser les Leds :

/* Add your application code here


*/
LED_Initialize();

9. Dans la fonction «main ()» vers la ligne 116 ajouter la fonction qui permet d’initialiser
l’accéléromètre comme suit :
/* Add your application code here
*/
if(???????? != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}

NB: Chercher cette fonction dans l’onglet « functions » sous le fichier BSP (Board Support Package)
« stm32f4_discovery_accelerometer.c ».

A ce stade le projet doit compiler sans erreurs.

10. Dans le fichier « main.c » vers la ligne 91 ajouter la déclaration de la fonction suivante:

static void ACCELERO_ReadAcc(void);

11. Dans la fonction «main ()» vers la ligne 132 appeler la fonction qui vient d’être ajoutée dans la
boucle while(1):

/* Infinite loop */
while (1)
{
ACCELERO_ReadAcc();
}

12. Dans le fichier « main.c » vers la fin du fichier ligne 248 ajouter le contenu de la fonction
comme suit:

/**
* @brief Read Acceleration data.
* @param None
* @retval None
*/
static void ACCELERO_ReadAcc(void)
{
/* Accelerometer variables */
int16_t buffer[3] = {0};
int16_t xval, yval = 0x00;
}
NB: A ce stade le projet doit compiler sans erreurs.
13. Chercher la fonction dans l’onglet « functions » sous le fichier BSP (Board Support Package)
« stm32f4_discovery_accelerometer .c» qui permet de récupérer l’accélération sur les 3 axes.

14. Dans la fonction « static void ACCELERO_ReadAcc(void) » utiliser cette fonction pour lire
l’accélération sur le plan (X,Y)

/* Read Acceleration */

??????????(buffer);

xval = buffer[0];

yval = buffer[1];

15. Dans le fichier « main.c » implémenter la fonction « static void ACCELERO_ReadAcc(void) » qui
permet de mesurer l’inclinaison de la carte pour allumer la Led correspondante selon la figure
suivante.
Mini
USB

Sensor
Y

x
y
X

audio
Y

X g

La fonction doit lire les deux composantes (x,y) et décider s’il s’agit d’une inclinaison autour
de l’axe Y pour allumer la led rouge ou verte selon le signe x ou bien d’une inclinaison autour
de l’axe X pour allumer la led bleu ou orange selon le signe de y.
Par défaut la fonction éteint toutes les Leds. Si la fonction détecte une inclinaison elle allume
la led correspondante pendant 10ms.

NB : Utiliser la macro ABS(.) pour calculer les modules ||x|| et ||y||.


utiliser “ThresholdHigh” et “ThresholdLow” pour décider du sens de l’inclinaison.

Vous aimerez peut-être aussi