>          Mise en oeuvre accéléromètre MPU-9150           <

   Introduction


Le MPU-9150™ est le premier dispositif de suivi de mouvement 9 axes au monde conçu pour les exigences élevées de performance des équipements électroniques grand public, y compris les smartphones, les tablettes et les capteurs portables de faible puissance, à faible coût.

Le MPU-9150™ est en fait deux puces implantées dans le même boîtier: le MPU-6050 (3 axes gyroscope / accéléromètre 3 axes) et un AK8975 (3 axes boussole numérique). Ils ont également intégré ce qu'ils appellent un processeur de mouvement Digital, Digital Motion Processor™ (DMP™) qui est utilisé pour traiter avec précision les données des capteurs et expédier celles-ci vers un microcontrôleur via le bus I2C à 400 KHz.

  De petite taille 4 x 4 x 1 mm avec une plage de fonctionnement de 2,4 à 3.46 V, ce capteur peut être raccordé directement à un microcontrôleur 3V3 par l’intermédiaire d’une carte Breakout comme celle de SparkFun.

Ce document regroupe quelques notes expliquant la mise en oeuvre du module centrale inertielle MPU-9150, contenant un accéléromètre 3 axes, un gyroscope 3 axes, un compas magnétique 3 axes et un capteur de température pour la correction d’erreurs, dérive des mesures du à cette dernière.


   Sommaire


Caractéristiques

Block Diagram

PIN description du capteur

Adressage du capteur MPU-9150

Différences avec le capteur MPU-6050

Initialisation du capteur

Démo i2cdevlib sur Arduino

Connections à la carte Arduino Due

Vérifier puis Téléverser le code

Exécution du code

Exemple de capture d’une trame

Retour d’erreur

Démo PIC32 sur carte chipKIT™ Max32™

Connections à la carte chipKIT™ Network Shield

Premier essai

Détecter la présence du capteur

Lire la valeur “WHO_AM_I”

Faire une lecture de la température interne

Calcul de la température en degré Celsius

Configurer les interruptions du capteur sur l’évènement donnée prête

Mesure de l’accéléromètre 3 axes

Mesure de l’accéléromètre en mode économie d’énergie

Calibration

Description des registres

Register Map Description du magnétomètre

Liens Internet


Caractéristiques

  • Sortie de données digital des 9 axes du MotionFusion dans une matrice de rotation, de quaternion, d'angles d'Euler, ou au format de données brutes
  • Accéléromètre 3 axes avec une gamme programmable pleine échelle comprise de ±2, ±4, ±8 et ±16 g
  • Capteur 3 axes de vitesse angulaire (gyroscope) avec une sensibilité jusqu'à 131 LSB/dps et une plage pleine échelle de ±250 ±500 ±1000 et ±2000 dps
  • Boussole 3 axes avec une pleine échelle de ±1200 μT
  • Capteur de température à sortie numérique
  • Réduction de la sédimentation et de la dérive du capteur par l'élimination des effets de bord inter-axes du à l’accumulation d’erreurs d'alignement entre les voies de mesures de l’accéléromètre et du gyroscope
  • Le processeur numérique interne “Digital Motion Processing™” (DMP ™), permet de simplifier la mise en oeuvre de détection de mouvement et la reconnaissance de geste complexe par la mise en forme de trame “MotionFusion”
  • Algorithmes embarqués permettant l'exécution sans intervention de l'utilisateur de l'étalonnage de la boussole.
  • Interruptions programmable pour la reconnaissance des gestes, exemple: panoramique, zoom, défilement, chute libre, la détection “zéro mouvement”, détection de tapotement ou de secouement
  • communication sur bus I2C jusqu’à 400 KHz
  • Gamme de tension d'alimentation VDD de 2.4 V à 3.46 V

Block Diagram

PIN description du capteur

Adressage du capteur MPU-9150

Par la broche AD0, en la raccordant à VDD ou au GND, soit 2 adresses possibles sur le même bus I2C, Address+R/W = byte 0xD0 ou 0xD2

→  AD0 low  = 0x68 (default for SparkFun breakout and InvenSense evaluation board)

→  AD0 high = 0x69

Ces 2 adresses sont codées sur 7 bits, si l’on envoie un octet (8 bits) sur le bus I2C pour spécifier l’adresse du composant avec lequel on souhaite dialoguer, il faut faire un décalage de 1 bit vers la gauche et mettre à 1 ou 0 le bit de poids faible (R/W) en fonction d’une demande de lecture ou d’écriture, soit le format de trame :

Différences avec le capteur MPU-6050

La différence principal est l’ajout du magnétomètre AK8975, les adresses I2C du capteur MPU-6050 sont identiques au MPU-9150.

Initialisation du capteur

A la mise sous tension tous les registres sont initialisés avec la valeur 0x00h, sauf  pour le registre 107 (= 0x40) et pour le registre 117 (= 0x68). Le Module est ensuite mis en mode sommeil “SLEEP”.

Démo i2cdevlib sur Arduino

Lancer le Sketch “Due9150”, à télécharger sur Pansenti/MPU9150Lib

Connections à la carte Arduino Due

MPU-9150 9-axis accelerometer/gyroscope/magnetometer → 20 (SDA), 21 (SCL) + GND + 3.3V

La carte Due est raccordé au PC via le connecteur USB “PROGRAMMING”, l’alimentation est également fournit par le PC via l’USB.

Vérifier puis Téléverser le code

S’assurer d’avoir correctement sélectionné la carte “Arduino Due (Programming Port)”, dans le menu “Outils > Board”, sans oublier le port COM.

Appuyer une fois sur le bouton “RESET” de la carte lors du Téléversement :

Exécution du code

Ouvrez un terminal série afin de communiquer avec la carte.

Voici ce que l’on doit obtenir :

Arduino9150 starting using device 0

Setting up compass

Compass sens: 290 292 305

Loading firmware

Firmware loaded

x: 0.69 y: -0.02 z: 12.44

x: 0.49 y: 0.06 z: 23.67

x: 0.30 y: 0.14 z: 33.21

x: 0.12 y: 0.21 z: 41.82

x: -0.06 y: 0.27 z: 50.47

x: -0.23 y: 0.34 z: 58.28

x: -0.38 y: 0.40 z: 63.93

x: -0.54 y: 0.46 z: 69.03

x: -0.70 y: 0.52 z: 75.44

x: -0.84 y: 0.57 z: 81.26

x: -0.98 y: 0.62 z: 86.87

x: -1.11 y: 0.67 z: 91.97

x: -1.24 y: 0.72 z: 95.87

x: -1.37 y: 0.77 z: 99.41

x: -1.49 y: 0.81 z: 102.08

Exemple de capture d’une trame

Add: 0x68 sur 7 bits + le bit RD/WR

0x68 WR + 0x39

0x68 RD + 0x01 + 0x03

Capture d’une trame I2C à l’analyseur logique (base de temps: 200 us/div)

(Pour agrandir l’image, faites clic droit sur la sélection contenant l’image puis “Ouvrir l’image dans un nouvel onglet”)


Retour d’erreur

 → absence de réponse du capteur, après 2 tentatives de communication (le maître envoi l’adresse de capteur en écriture et si le capteur ne valide pas le bit d'acquittement, alors la communication est considéré comme échouée)

Arduino9150 starting using device 0

Using accel cal

Product ID read as 0 indicates device is either incompatible or an MPU3050

mpu_init failed with code: -6

Démo PIC32 sur carte chipKIT™ Max32™

Connections à la carte chipKIT™ Network Shield

MPU-9150 → 20 (SDA), 21 (SCL) + GND + 3.3V sur le connecteur J7 (I2C1), mettre également les résistances de pull-up via les jumper JP9 et JP12.

La carte chipKIT™ Max32™ est raccordé au PC via le connecteur mini USB “FTDI”, l’alimentation est également fournit par le PC via l’USB, voir Universal Serial Bus. Elle est équipé d’un microcontrôleur PIC32MX795F512L, disposant de 5 bus I2CTM permettant d’y connecter jusqu'à 10 capteurs MPU-9150 :

Premier essai

Tout d’abord, nous pouvons tester si la liaison I2C entre le microcontrôleur et le capteur fonctionne correctement, pour cela nous pouvons réaliser 2 tests simples.

Par convention dans ce document, vous trouverez sous le terme “I2C transaction payload”, la trame que le maître envoie sur le bus. Celle ci sera constituée généralement par un bit de Start “[S_]“ puis l’adresse de l’esclave en écriture ou lecture, suivit par un octet de commande ou d’adresse de registre en fonction du périphérique avec lequel le maître veut communiquer. Les octets sont représenté au format hexadécimal, par exemple “[D0]“ (voir dans les trame plus ci-dessous) représente le nombre binaire 0b 1101 0000, comme le premier octet envoyé sur le bus est l’adresse de l’esclave, on retrouve les 7 bits de poids forts 0b 110 1000, soit 0x68 et le bit 0, qui ici vaut 0, donc indiquant un accès au périphérique en mode “Write”. Dans le cas d’une lecture, généralement l’adresse en mode “Read” (bit 0 à 1 de l’octet d’adresse) succède au bit “Restart” et sera ensuite suivit par le nombre d’octet à lire depuis un périphérique esclave. Vous trouverez  également dans la représentation “I2C transaction payload”, le bit Restart “[RS]“ et le bit Stop “[P_]“ qui terminera forcément une trame.

Détecter la présence du capteur

Émettre sur le bus I2C uniquement l’adresse du composant avec le bit 0 à 0 (mode I2C Write). Ceci devrait produire un signal dit d'acquittement “ACK” (Acknowledge) par le capteur, sur le 9 ème bit de la trame I2C. Ce premier test permet de vérifier la présence du capteur avec son adresse “slave”.

I2C transaction payload: [S_][D0][P_]
slave return:  Acknowledge bit on 9 clock bit

Capteur non présent sur le bus:

Exemple d’une fonction de la bibliothèque XC32 de Microchip pour l’écriture sur le bus I2C d’un octet. Celle-ci retourne la valeur du bit d'acquittement (ACK ou NACK), le Start et le Stop bit sont eu aussi envoyé à l’aide d’une fonction non explicité dans ce document.

read_ack = MasterWriteI2C1(MPU9150_7BIT_ADDR_AD0_LOW<<1);

ici, retourne la valeur -2 (return NACK), exemple si le composant a sa broche AD0 à VDD, son adresse est 0x69 et non 0x68 (AD0 à GND)

Réponse du capteur présent sur le bus:

la fonction read_ack = MasterWriteI2C1(MPU9150_7BIT_ADDR_AD0_LOW<<1); retourne la valeur 0 (return ACK)

Lire la valeur “WHO_AM_I”

Pour cela, nous devons envoyer une commande de lecture du registre 117:

voir la page 36 du document “PS-MPU-9150A.pdf” du chapitre “9.3 I2C Communications Protocol

read_value = I2C_Read(MPU9150_7BIT_ADDR_AD0_LOW, MPU9150_RA_WHO_AM_I);

cette commande demande le retour de la valeur du registre 0x75 “WHO_AM_I”, qui devrait être 0x68 à la mise sous tension et ce indépendamment de la valeur de la broche A0.

Comme indiqué dans la datasheet, la valeurs d'initialisation des registres au moment de la mise sous tension du capteur est 0x00, sauf pour deux registres:

  • Register 107 “PWR_MGMT_1” = 0x40
  • Register 117 “WHO_AM_I” = 0x68

I2C transaction payload: [S_][D0][75][RS][D1][01][P_]

slave return: 0x68

Faire une lecture de la température interne

A la mise sous tension, le module est en mode “SLEEP”. Il faut donc réveiller celui-ci à travers le registre 107 (0x6B) “Power Management 1” PWR_MGMT_1. Sa valeur à la mise sous tension (POR) vaut 0x40. Vous devez mettre les bits SLEEP à 0 et CYCLE à 1 et s’assurer que le capteur de température ne soit pas désactiver, le bit TEMP_DIS doit être à 0 pour que celui-ci fonctionne, soit la configuration suivante PWR_MGMT_1 = 0b00100000 (0x20)

I2C transaction payload: [S_][D0][6B][20][P_]

Ensuite, il suffit de faire une lecture des registres “Temperature Measurement”, 65 (0x41) “TEMP_OUT_H“ et 66 “TEMP_OUT_L”

I2C transaction payload: [S_][D0][41][RS][D1][02][P_]  (~500 us à 100 KHz)

slave return, example raw data: 0xEF, 0xB0

Calcul de la température en degré Celsius

Temperature in degrees C = (TEMP_OUT Register Value as a signed quantity)/340 + 35

TemperatureReg = (UINT16)I2C_Read(MPU9150_7BIT_ADDR_AD0_LOW, MPU9150_RA_TEMP_OUT_H) << 8;

TemperatureReg += I2C_Read(MPU9150_7BIT_ADDR_AD0_LOW, MPU9150_RA_TEMP_OUT_L);

Temperature = (TemperatureReg/340)+35;

// Read register TEMP_OUT: 0xEFB0

// 0b 1110 1111 1011 0000 → 16-bits signed = -4176 d (16-bit signed numbers)

// Temperature = (-4176/340)+35= 22.717647 °C

// 0x8000 → (-32768/340)+35= -61,376471 (temperature min)

// 0x7FFF → (+32767/340)+35= 131.373529 (temperature max)

Configurer les interruptions du capteur sur l’évènement donnée prête

Configurer à travers le registre 56, l’activation de l’interruption dans le mode “donnée prête”:

→ passer le bit 0 “DATA_RDY_EN” à 1

I2C_Write(MPU9150_7BIT_ADDR_AD0_LOW, 0x38, 0x01);

I2C transaction payload: [S_][D0][38][01][P_]

Sans autres configurations, en activant l’interruption et le registre PWR_MGMT_1 à 0x20 (Cycle Mode), il se produit une interruption sur la broche INT du capteur, sous la forme d’un pulse à l’état bas de  6 ms, toutes les 807 ms. Cela correspond à la valeur lors de la mise sous tension du registre 108 “PWR_MGMT_2”, dont les bits “LP_WAKE_CTRL=0” donne la valeur Wake-up Frequency = 1.25 Hz :

Vu du signal en sortie de la broche INT du capteur.

En configurant PWR_MGMT_1 à 0x00 (Standard Mode), la fréquence des interruptions passe environs à 8.10 KHz (T_low= 75 us, T_high= 48.5 us):

Mesure de l’accéléromètre 3 axes

Afin de lire les mesures de l’accéléromètre, il faut configurer au minimum le registre PWR_MGMT_1 à 0x20. Vous pouvez aussi utiliser les interruptions sur l’évènement donnée prête vu précédemment, qui fonctionne de la même façon que pour la température. Par défaut la pleine échelle du capteur est configuré en ±2 g.

Après la mise sous tension, faite sortir le capteur du mode SLEEP:

I2C transaction payload: [S_][D0][6B][20][P_]

Puis faire une lecture des registres “Accelerometer Measurements”, 59 (0x3B) “ACCEL_XOUT_H”, 60 “ACCEL_XOUT_L”, 61 “ACCEL_YOUT_H”, 62 “ACCEL_YOUT_L”,  63 “ACCEL_ZOUT_H” et 64 “ACCEL_ZOUT_L”, soit 6 octets à lire à partir du registre d’adresse 0x3B:

I2C transaction payload: [S_][D0][3B][RS][D1][06][P_]  (~900 us à 100 KHz)

slave return, example raw data: 0x03, 0xB4, 0x06, 0xF4, 0xC0, 0x4C

Mesure de l’accéléromètre en mode économie d’énergie

Le MPU-9150 peut être mis en accéléromètre uniquement “Low Power Mode”, pour le configurer dans le mode basse consommation, il faut suivre les étapes suivantes:

  1. mettre le bit CYCLE à 1
  2. mettre le bit SLEEP à 0
  3. mettre le bit TEMP_DIS à 1
  4. mettre les bits STBY_XG, STBY_YG, STBY_ZG à 1

Tous les bits ci-dessus peuvent être trouvés dans le registre “Power Management 1” (Registre 107). Dans ce mode, le MPU-9150 mettra hors tension tous les capteurs et périphériques à l'exception de l'interface I2C principale, réveillant seulement l'accéléromètre à intervalles fixes pour prendre une seule mesure. La fréquence des réveils peut être configuré avec les bits “LP_WAKE_CTRL” comme indiqué ci-dessous:

configurer au minimum le registre à PWR_MGMT_1 à 0x28 et PWR_MGMT_2 à 0x38

[S_][D2][6B][28][P_]

[S_][D2][6C][38][P_] ou [S_][D2][6C][78][P_] pour 5 Hz

[S_][D2][3B][RS][D3][06][P_]

→ 1 mesure unique des accéléromètres

→ Il n’y a plus de signal INT (0V) est toutes autres lecture de l’accéléromètre retournera la même valeur !

Read Registers 59 to 64 – Accelerometer Measurements

ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, ACCEL_YOUT_L, ACCEL_ZOUT_H, and

ACCEL_ZOUT_L

Test à réaliser pour la lecture des accéléromètres :

> Enable DLPF for accelerometer output rate at 1 kHz: [S_][D0][1A][01][P_]?

> Configure Register 25 – Sample Rate Divider: SMPRT_DIV?

> ACCEL_FIFO_EN = 1 pour chargement des données du capteur vers la FIFO

> Configurer l’interruption sur DATA_RDY_EN → donnée prête

> Activer la FIFO: Register 106 – User Control USER_CTRL → bit 6: FIFO_EN

Calibration

Pour calibrer le zéro on met l’axe souhaité de l'accéléromètre, perpendiculaire à la force de l'accélération de pesanteur Terrestre (égale à 1 g).

Pour l'amplitude, on met ensuite l’axe dans un sens, puis dans l'autre pour avoir +/-1G sur l’axe de pesanteur.

Description des registres

- les registres 13 à 16 permette d’affecter une valeur usine de départ pour chacun des axes

- le registre 25 permet de définir l’échantillonnage du gyroscope (voir si c’est utile car output rate défini)

Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)

where Gyroscope Output Rate = 8 kHz when the DLPF is disabled (DLPF_CFG = 0 or 7), and 1 kHz when the DLPF is enabled (see Register 26).

The accelerometer output rate is 1kHz. This means that for a Sample Rate greater than 1kHz, the same accelerometer sample may be output to the FIFO, DMP, and sensor registers more than once.

- le registre 26 permet la config de la pin FSYNC permettant de se synchroniser via une clock externe de la donnée à lire valeur décimal à retranscrire sur 5 bits (5-3) bit 7 et 6 réservé

les bits 3-0 permette la configuration du filtre de l’accéléromètre valeur décimal à retranscrire sur 3 bits

- le registre 27 config gyro (inutile si l’on ne s'intéresse qu’à l’accéléromètre)

- le registre 28 configuration de l’accéléromètre bits 7-5 active les axes en auto test à 1, bits 4-3 valeur de la pleine échelle.

- le registre 35 autorise le chargement de la valeur mesuré du périphérique sélectionné dans la FIFO.

When a sensor’s FIFO_EN bit is enabled in this register, data from the sensor data registers will be loaded into the FIFO buffer. The sensors are sampled at the Sample Rate as defined in Register 25. For further information regarding sensor data registers, please refer to Registers 59 to 96

ACCEL_FIFO_EN When set to 1, this bit enables ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, ACCEL_YOUT_L, ACCEL_ZOUT_H, and ACCEL_ZOUT_L (Registers 59 to 64) to be written into the FIFO buffer

- le registre 36 configuration en multi I2C + décalage de l’interruption interne si un capteur externe charge sa valeur dans son registre +config fréquence du master clock I2C (inutile si l’on n’utilise pas le mode multi I2C)

- les registres de 37 à 53 permette la configuration de la séquence de transfert entre les capteurs esclave 0 à 4 est le maître. (mode multi I2C...)

- le registre 54 ce registre montre le statu des interruptions générées par le bus I2C

- le registre 55 configuration de la pin INT + utilisation de la pin FSYNC en interruption définition du niveau de déclenchement

I2C_BYPASS_EN        When this bit is equal to 1 and I2C_MST_EN (Register 106 bit[5]) is equal to 0, the host application processor will be able to directly access the auxiliary I2C bus of the MPU-9150.

When this bit is equal to 0, the host application processor will not be able to directly access the auxiliary I2C bus of the MPU-9150 regardless of the state of I2C_MST_EN (Register 106 bit[5]).

- le registre 56 permet l’activation 3 interruptions: FIFO pleine, DATA_RDY_EN (bit 0) → donnée prête, interruption sur I2C maitre

- le registre 58 permet de lire l”état des interruptions vu dans le registre 56 donc voir si elle sont générées.

- les registres 59-60 permettent de lire la valeur du registre ACCEL_XOUT_H/L

- les registres 61-62 permettent de lire la valeur du registre ACCEL_YOUT_H/L

- les registres 63-64 permettent de lire la valeur du registre ACCEL_ZOUT_H/L

- les registres 65 à 96 permettent de lire la valeur des registres du gyro, capteur de température et capteur sur l’I2C secondaire.

- les registres 99 à 102 permettent le passage de données au capteur sur I2C auxiliaire

- le registre 103 permet d’activer les capteurs de 0 à 4 sur l’I2C auxiliaire ainsi que le délai de lecture des data de ces capteurs.

- le registre 104 permet le Reset des chemins des data des capteurs internes.

 

- le registre 106 permet l’activation du buffer FIFO + désactivation de l’I2C ainsi que le reset du FIFO +MST-I2C

FIFO_EN When set to 1, this bit enables FIFO operations.

When this bit is cleared to 0, the FIFO buffer is disabled. The FIFO buffer cannot be written to or read from while disabled.

The FIFO buffer’s state does not change unless the MPU-9150 is power cycled.

I2C_MST_EN When set to 1, this bit enables I2C Master Mode.

When this bit is cleared to 0, the auxiliary I2C bus lines (AUX_DA and AUX_CL) are logically driven by the primary I2C bus (SDA and SCL).

I2C_IF_DIS Always write this bit as zero.

FIFO_RESET This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This bit automatically clears to 0 after the reset has been triggered.

I2C_MST_RESET This bit resets the I2C Master when set to 1 while I2C_MST_EN equals 0. This bit automatically clears to 0 after the reset has been triggered.

SIG_COND_RESET When set to 1, this bit resets the signal paths for all sensors (gyroscopes, accelerometers, and temperature sensor). This operation will also clear the sensor registers. This bit automatically clears to 0 after the reset has been triggered.

When resetting only the signal path (and not the sensor registers), please use Register 104, SIGNAL_PATH_RESET.

Register PWR_MGMT_1

-le registre 107 permet le reset du module, le passe en mode sleep ou cycle


Register Map Description du magnétomètre

Les registres RSV , TS1, TS2  ne sont pas utilisables “reserved”

Il y a 13 registres en lecture seule de 0x00h à 0x09h et 0x10h à 0x12h

WIA: registre d’identification du module valeur fixé à 0x48

INFO: registre d’information du module (Quel utilité de ce registre?)

ST1: registre Status à 0x00h par defaut. le Bit 0 “DRDY” de ce registre est à 1 si une donnée est prête. 0 s’il ya un évènement sur ST2 ou si le registre de donnée de HXL à HZH  est lu.

HXL: donnée mesurée sur X 8 bits de poids faible

HXH: donnée mesurée sur X 8 bits de poids fort

HYL: donnée mesurée sur Y 8 bits de poids faible

HYH: donnée mesurée sur Y 8 bits de poids fort

HZL: donnée mesurée sur Z 8 bits de poids faible

HZH: donnée mesurée sur Z 8 bits de poids fort

Les données mesurées sont sur 2 octets. Plage de mesure sur chaque axes -4096 à +4095 en décimal.

ST2: registre Status à 0x00 par défaut. Le bit 2 “DERR” est à 1 si pendant la lecture la donnée lue est fausse, revient à 0 après une lecture du registre ST2. Le bit 3 “HOFL” est à 1 si pendant la mesure le capteur magnétique est saturée même si le registre de données n’est pas saturé la donnée mesurée est fausse, revient à 0 lors de la prochaine mesure.

CNTL: registre control à 0x00 par défaut (Power-down mode)

d’autre mode sont possible:

0x00h Power-down mode: aucune mesure mode initialisation

0x01h Single measurement mode: 1 mesure après l’écriture sur ce registre

0x08h Self-test mode: auto test (probablement mesure en continu)

0x0Fh Fuse ROM access mode (pas trouver d’explication pour ce mode) → pour la programmation du Motion Processing ?

tout autre valeur est interdite. après l’écriture sur ce registre les registres de 0x02H “ST1” à 0x09h “ST2” sont initialisés.

Liens Internet

Arnauld Biganzoli et Vincent Guiraud                               page /