Bonsoir,
comme indiqué lors de mon précédent mail, dans mon projet je souhaites utiliser un capteur de proximité de chez STMicroelectronics le VL6180X plus précisément deux VL6180X-SATEL (http://www.st.com/en/evaluation-tool...80x-satel.html) qui seront pilotés par une nucleo-L476RG. Pour mettre en oeuvre ce projet j'ai commencé par utiliser le shield X-NUCLEO-6180XA1 (http://www.st.com/en/ecosystems/x-nucleo-6180xa1.html) avec l'API VL6180(X) API 3.2.0 fournit par ST (code source)
Depuis mon fichier source main.c la fonction Sample_SimpleRanging(); s’exécute correctement:
vl6180x_simple_ranging.c:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 /*! [SimpleRanging] */ void Sample_SimpleRanging(void) { VL6180xDev_t myDev; VL6180x_RangeData_t Range; MyDev_Init(myDev); // your code init device variable MyDev_SetChipEnable(myDev); // your code assert chip enable MyDev_uSleep(1000); // your code sleep at least 1 msec VL6180x_InitData(myDev); VL6180x_Prepare(myDev); do { VL6180x_RangePollMeasurement(myDev, &Range); if (Range.errorStatus == 0 ){ MyDev_ShowRange(myDev, Range.range_mm,0); // your code display range in mm //HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } else MyDev_ShowErr(myDev, Range.errorStatus); // your code display error code } while (!MyDev_UserSayStop(myDev)); // your code to stop looping } /*! [SimpleRanging] */
La première fonctiondefini l'adresse du device
Code C : Sélectionner tout - Visualiser dans une fenêtre à part MyDev_Init(myDev);
Code C : Sélectionner tout - Visualiser dans une fenêtre à part #define MyDev_Init(dev) (dev=0x52)
La seconde fonctioneffectue un reset du capteur comme indiqué dans la doc:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 static inline void MyDev_SetChipEnable(VL6180xDev_t dev) { XNUCLEO6180XA1_Reset(0); XNUCLEO6180XA1_WaitMilliSec(5); XNUCLEO6180XA1_Reset(1); XNUCLEO6180XA1_WaitMilliSec(5); }
1. Applying power to the VL6180X is as simple as applying 2.8V to the VDDA and VDDA_VCSEL pins. It is important to take note of the power up sequencing described in this document.
2. Changing the GPIO0 to logic ‘1’ allows the device to come out of reset.
3. Device boots in 1ms so the HOST should wait this minimum amount of time before communicating with the VL6180X.
Capture d'ecran Reset GPIO0(PB0) ==> XNUCLEO6180XA1_Reset(0); CHANNEL B = 0V:
XNUCLEO6180XA1_Reset(1); CHANNEL B = 3.25V
Après une temporisation on appel deux fonctionafin de configurer le proximity sensor:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part VL6180x_InitData(myDev); VL6180x_Prepare(myDev);
A ce stade le capteur est prêt a calculer une distance via la fonctionsi il capte un objet dans son spectre il affiche une distance en mm sinon il affiche une erreur:
Code C : Sélectionner tout - Visualiser dans une fenêtre à part VL6180x_RangePollMeasurement(myDev, &Range);
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if (Range.errorStatus == 0 ){ MyDev_ShowRange(myDev, Range.range_mm,0); // your code display range in mm } else MyDev_ShowErr(myDev, Range.errorStatus); // your code display error code
Capture de mon analyseur logique (I2C) alors que l'afficheur 7 segment affiche E-11 (11 Max_Signal_To_Noise_Ratio Too much ambient light detected):
Il y a bien une communication I2C et si j'approche un objet du capteur l'afficheur 7 segment affiche une distance en mm.
On est content tout fonctionne, voila j'ai posé les bases maintenant je souhaites enlever le shield installer un VL6180X-SATEL et allumer une led si il détecte un objet a partir d'une certaine distance.
Il y a quand même deux petites choses que je ne m'explique pas quand j'analyse ma trame I2C je récupère systématiquement 2 adresses:
-Première adresse 0x29 semble correspondre a ce que j'ai trouvé dans la datasheet ==> The VL6180X is controlled over an I2C interface. The default I2C address is 0x29 (7-bit).
Mais du coup je ne comprends pas lepourtant en mode debugger je vois bien que de fonction en fonction dev=0x52...
Code C : Sélectionner tout - Visualiser dans une fenêtre à part #define MyDev_Init(dev) (dev=0x52)
-Seconde adresse 0x42 au début je pensé que c'était l'expander (STMPE1600) mais je pense que c'est plutôt l'adresse I2C de mon µcontroleur mais je ne retrouve pas cette info dans la datasheet du STM32L476xx.
Voila pour la première partie demain je ajouterais la suite les essais avec le VL6180X-SATEL.
Partager