IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Shield X-NUCLEO-6180XA1 VS VL6180X-SATEL


Sujet :

Embarqué

  1. #1
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut Shield X-NUCLEO-6180XA1 VS VL6180X-SATEL
    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 fonction defini l'adresse du device
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MyDev_Init(dev) (dev=0x52)

    La seconde fonction
    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);
    }
    effectue un reset du capteur comme indiqué dans la doc:

    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:
    Nom : Reset_GPIO0.png
Affichages : 868
Taille : 408,1 Ko

    XNUCLEO6180XA1_Reset(1); CHANNEL B = 3.25V
    Nom : Set_GPIO0.png
Affichages : 858
Taille : 405,8 Ko

    Après une temporisation on appel deux fonction
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    VL6180x_InitData(myDev); VL6180x_Prepare(myDev);
    afin de configurer le proximity sensor:

    Nom : Init.png
Affichages : 662
Taille : 26,9 Ko

    A ce stade le capteur est prêt a calculer une distance via la fonction
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    VL6180x_RangePollMeasurement(myDev, &Range);
    si 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
    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):
    Nom : trame_I2C.png
Affichages : 834
Taille : 424,4 Ko

    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).

    Nom : TRAME_I2C_BIS.png
Affichages : 724
Taille : 23,9 Ko

    Mais du coup je ne comprends pas le
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MyDev_Init(dev) (dev=0x52)
    pourtant en mode debugger je vois bien que de fonction en fonction 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.
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 189
    Points : 11 571
    Points
    11 571
    Par défaut
    Salut Julien,
    J'ai juste une question avant la suite.

    Je vois que sur le shield X-NUCLEO-6180XA1 qui fonctionne si je comprends bien, il y a un Level translator entre le bus I2C en 2.8V du côté du VL6180X-SATEL et le bus I2C en 3.3V côté Nucleo. Voir page 2 ici :
    http://www.st.com/resource/en/data_b...eo-6180xa1.pdf

    Mais si je regarde le shield VL6180X-SATEL ici :
    http://www.st.com/resource/en/data_b...180x-satel.pdf
    Je vois que le bus I2C est en 2.8V. Donc si tu connecte directement ce petit shield sur ta carte Nucleo alors tu n'as plus le Level translator qui s'assurait que les bus I2C 3.3V et 2.8V arrivent à causer ensemble.

    Déjà ça ça me paraît suspect ! Si ST (donc tes collègues) ont mit un Level translator c'est pas pour rien.

    A demain.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut
    Salut Vincent page 47 de la datasheet du VL6180X indique ceci:

    Nom : VL6180X.png
Affichages : 796
Taille : 47,9 Ko

    Cela devrait donc fonctionner AVDD+0.5 = 3.3V

    Par contre c'est la valeur MAX...
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 189
    Points : 11 571
    Points
    11 571
    Par défaut
    Ok donc ça va.
    En plus à la page 46 le tableau Absolute Maximum Ratings dit qu'on peut aller jusque 3.6V avant que ça crame.

    Nom : Capture16.PNG
Affichages : 709
Taille : 24,3 Ko

    On attend la suite alors.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  5. #5
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut
    Avant de montrer les essais avec le satellite et pour que les explications soient plus claires avant le shield X-NUCLEO-6180XA1 (“expansion board version 2”.) il y avait le shield X-NUCLEO-IKP01A1 (“expansion board version 1”.).

    La version 2 a été crée pour palier a ce problème:
    Nom : shield_V1.png
Affichages : 739
Taille : 38,6 Ko

    Dans la version 2 (shield utilisé lors des essais ci-dessus) ils ont ajouté principalement un GPIO expander, deux level shifter (voir cm ci-dessus) et trois emplaçement pour insérer des satellites:
    Nom : shield_V2.png
Affichages : 836
Taille : 26,6 Ko

    On remarque que le pin mapping du shield V2 n'est plus le même:
    Nom : Pin_mapping_V2.png
Affichages : 767
Taille : 28,6 Ko


    V1_vs_V2:
    Nom : V1_vs_V2.png
Affichages : 739
Taille : 309,9 Ko

    Donc afin d'enlever de la complexité j'ai décidé de connecter le VL6180x-SATEL avec le pin mapping du shield version 1:
    PB8(D15) = SCL
    PB9(D14) = SDA
    PA5(D13) = GPIO0
    PA6(D12) = GPIO1(INT)
    AVDD = AVDD(8 cn arduino)
    GND = GND(7 cn arduino)

    Pin Mapping VL6180X-SATEL:
    Nom : VL6180X-SATEL.png
Affichages : 723
Taille : 52,4 Ko

    Voila pour la connectique.

    Les essais:

    Oscillo branché sur GPIO0 lors du reset de la pin PA5(D12).
    Reset(0):
    Nom : Reset(0)_satel.png
Affichages : 830
Taille : 241,3 Ko

    Reset(1):
    Nom : Reset(1)_SATEL.png
Affichages : 762
Taille : 241,0 Ko

    Pas de problème de ce coté la le reset s'effectue correctement.

    Si je suis le même exemple que montré précédemment en mode run ou debugger j'obtiens toujours la même trame I2C c.à.d. flat:
    Nom : I2C_flat.png
Affichages : 822
Taille : 242,8 Ko

    Il est temps de vous présenter le int main(void):

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    int main(void) {
        uint8_t offset;
     
        /* MCU Configuration----------------------------------------------------------*/
     
        /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
        HAL_Init();
     
        /* Configure the system clock */
        SystemClock_Config();
     
        /* System interrupt init*/
        /* Sets the priority grouping field */
        HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
        HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
     
        /* Initialize all configured peripherals */
        MX_GPIO_Init();
        MX_I2C1_Init();
     
        /* these almost just redo what already done just above by CubeMx Init */
        XNUCLEO6180XA1_GPIO_Init();
        XNUCLEO6180XA1_I2C1_Init(&hi2c1);
     
        /* SysTick end of count event each 1ms */
        SysTick_Config(HAL_RCC_GetHCLKFreq() / 1000);
     
        while (1) {
     
            Sample_SimpleRanging();
     
            //Sample_FreeRunningRanging();
     
            //Sample_SimpleAls();
     
            //Sample_AlternateRangeAls();
     
            //offset = Sample_OffsetCalibrate();
     
            //Sample_XTalkCalibrate(offset);
     
            //Sample_Interrupt();
        }
        /* USER CODE END 3 */
     
    }

    En mode debugger on voit que dès la première fonction I2C rencontrée dans la fonction
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    VL6180x_InitData(myDev);
    ca merde le retour de la fonction stocké dans status vaut 3 alors que l'on doit avoir 0 si tout c'est bien passé
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    status = VL6180x_RdByte(dev, SYSRANGE_PART_TO_PART_RANGE_OFFSET, (uint8_t *)&offset);
    cela nous renvoi directement a la fin de la fonction VL6180x_InitData(myDev) alors qu'il y plein d'autre fonction a passer...

    Il y a clairement un pb avec l'I2C.

    Si je regarde ce que fait la fonction XNUCLEO6180XA1_I2C1_Init:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    void XNUCLEO6180XA1_I2C1_Init(I2C_HandleTypeDef *hi2c1) {
        GPIO_InitTypeDef GPIO_InitStruct;
        uint8_t ExpanderID[2];
     
        int status;
        /* Peripheral clock enable */
        __GPIOB_CLK_ENABLE();
        __I2C1_CLK_ENABLE();
     
        /**I2C1 GPIO Configuration
         PB8     ------> I2C1_SCL
         PB9     ------> I2C1_SDA
         */
        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
     
        hi2c1->Instance = I2C1;
    #ifdef __STM32F4xx_HAL_H
        hi2c1->Init.ClockSpeed = 400000;
        hi2c1->Init.DutyCycle = I2C_DUTYCYCLE_2;
    #else 
        hi2c1->Init.Timing = 0x00300F38; /* set 400KHz fast mode i2c*/
    #endif
        hi2c1->Init.OwnAddress1 = 0;
        hi2c1->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
        hi2c1->Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
        hi2c1->Init.OwnAddress2 = 0;
        hi2c1->Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
        hi2c1->Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
     
        HAL_I2C_Init(hi2c1);
     
     
        /* try to detect v1 v2 by reading i2c expander register
         *  if rd i2c fail assume it is a v1 shield it may be a v2 with an i2c bus hangs (happen some time)*/
        _hi2c=hi2c1;
        status = V2_ExpanderRd( 0, ExpanderID, 2);
        if( status == 0 && ExpanderID[0]==0 && ExpanderID[1]==0x16){
            IsV2=1;
            _V2_GPIO_Init();
        }
        else{
            _V1_GPIO_Init();
        }
    }

    jusqu'a la ligne 41 nous sommes dans la même config peut importe que ce soit le shield version 1 ou version 2 a partir de la ligne la fonction V2_ExpanderRd vient interroger l'expander si il repond alors on executera _V2_GPIO_Init(); sinon on executera _V1_GPIO_Init();.

    Je confirme qu'en branchant le satellite (sans shield V2) on execute la fonction _V1_GPIO_Init(); tout simplement parce qu'il n'y a pas d'expender sur le VL6180X-SATEL.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    static void _V1_GPIO_Init(void) {
     
        GPIO_InitTypeDef GPIO_InitStruct;
     
        /* GPIO Ports Clock Enable */
        __GPIOC_CLK_ENABLE();
        __GPIOH_CLK_ENABLE();
        __GPIOA_CLK_ENABLE();
        __GPIOB_CLK_ENABLE();
     
     
        /*Configure GPIO pins : PA0 PA1 PA4 PA5 PA8 PA9 */
        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
     
        /*Configure GPIO pins : PA7 select  */
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
     
     
        /*Configure GPIO pins : PA6 interrupt */
        GPIO_InitStruct.Pin = GPIO_PIN_6;
        GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
     
        /*Configure GPIO pins : PB0 PB10 PB3 PB4 PB5  PB6 */
        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_10 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6;
    #ifndef OS_USE_TRACE_ITM
        GPIO_InitStruct.Pin |=  GPIO_PIN_3;
    #endif
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
     
     
     
        /*Configure GPIO pin : PC7 7 segment  B */
        GPIO_InitStruct.Pin = GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
        /* turn off all 7 seg digit */
        _V1_DisplayOff();
    }

    La pas de mystère il configure le pin mapping du shield version 1 et notamment PA6 en interrupt et PA5 en general purpose.

    Donc XNUCLEO6180XA1_I2C1_Init ==> PB8 ------> I2C1_SCL
    PB9 ------> I2C1_SDA
    et _V1_GPIO_Init ==> Configure GPIO pins : PA5
    Configure GPIO pins : PA6 interrupt

    Ca tombe bien c'est celle que j'utilise...

    Je pense avoir trouvé le blèmepro en commentant dans int main(void)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* Initialize all configured peripherals */
        //MX_GPIO_Init();
        //MX_I2C1_Init();

    L'I2C a parlé il devait il y avoir une redondance de configuration car j'ai généré ces fonctions via cubemx...

    Je peux partir dormir tranquillement

    Ne vous inquietez pas car je n'ai pas fini car maitnenat je souhaites utiliser un shield LoRa de chez segger ca va etre passionnant... une usine le bouzin...
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. install shield express
    Par quedudev dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/09/2007, 13h45
  2. [Série] The shield
    Par lper dans le forum Films & TV
    Réponses: 4
    Dernier message: 30/03/2007, 08h33
  3. comment deployer son application avec install shield
    Par diden138 dans le forum Bases de données
    Réponses: 19
    Dernier message: 18/01/2007, 09h18
  4. creér un exècutable avec Install shield
    Par draiah dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/12/2006, 16h09
  5. install shield builder c++ 6
    Par duhl dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/06/2006, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo