diff --git a/Tests.c b/Tests.c index 410c2f4..910ff29 100644 --- a/Tests.c +++ b/Tests.c @@ -12,6 +12,7 @@ void test_couleur_led(); void blink_test(void){ const uint LED_PIN = PICO_DEFAULT_LED_PIN; + uint8_t * distance_capteur_cm = get_distance_capteur_cm(); while(1){ for(uint8_t capteur=0; capteur<12; capteur++){ printf(">distance%x:%d\n", capteur, distance_capteur_cm[capteur]); @@ -62,11 +63,25 @@ void Tests(void){ break; case 'j': case 'J': - printf("Lecture continue des capteurs inutilisés.\nAppuyer sur une touche pour quitter"); + printf("Lecture continue des capteurs inutilisés.\nAppuyer sur une touche pour quitter\n"); multicore_launch_core1(blink_test); do{ + static uint8_t capteur_courant=0; + uint8_t * distance_capteur_cm = get_distance_capteur_cm(); keycode = getchar_timeout_us(0); - continuous_multiple_reading(); + // Lecture des capteurs + if(capteur_pret(capteur_courant)){ + uint8_t distance_cm; + if(capteur_lire_distance_cm(capteur_courant, &distance_cm)){ + distance_capteur_cm[capteur_courant]= distance_cm; + } + } + capteur_courant++; + if(capteur_courant > 11){ + capteur_courant = 0; + } + // Affichage des distances sur les LEDs. + affiche_distance_sur_led(distance_capteur_cm); }while(keycode == PICO_ERROR_TIMEOUT || keycode == 0); break; case 'k': diff --git a/VL53L1X_Fonctions.c b/VL53L1X_Fonctions.c index c427abb..d338834 100644 --- a/VL53L1X_Fonctions.c +++ b/VL53L1X_Fonctions.c @@ -12,6 +12,7 @@ #define DISTANCE_PROCHE_CM 15 /* Seuil entre violet et jaune*/ #define NB_CAPTEURS 12 +#define ADRESSE_I2C_BASE 0x31 // Stock les valeurs lues des capteurs uint8_t distance_capteur_cm[12]; @@ -22,6 +23,11 @@ enum { MODE_MANUEL } mode_led[NB_CAPTEURS]; + +uint8_t * get_distance_capteur_cm(void){ + return distance_capteur_cm; +} + void reset_affichage_led(void); void initialise_adresses(void){ @@ -38,22 +44,22 @@ void initialise_adresses(void){ reset_affichage_led(); // Pour chaque capteur - for(uint capteur=1; capteur<=NB_CAPTEURS; capteur++){ + for(uint capteur=0; capteur %x, capteur : %d\n", VL53L1X_device, 0x30 + capteur, capteur); - ws2812_set_buffer_rgb(0x4, 0, 0, capteur-1); + if(change_address(&VL53L1X_device, ADRESSE_I2C_BASE + capteur)){ + printf("Erreur change adresse : %x => %x, capteur : %d\n", VL53L1X_device, ADRESSE_I2C_BASE + capteur, capteur); + ws2812_set_buffer_rgb(0x4, 0, 0, capteur); statu_capteurs[capteur]=0; }else{ if(VL53L1X_SensorInit(VL53L1X_device)){ // bad init - ws2812_set_buffer_rgb(0x4, 0, 0, capteur-1); + ws2812_set_buffer_rgb(0x4, 0, 0, capteur); statu_capteurs[capteur]=0; }else{ // good init @@ -64,7 +70,7 @@ void initialise_adresses(void){ status |= VL53L1X_SetTimingBudgetInMs(VL53L1X_device, 200); if(status){ printf("Custom config KO, error %d\n", status); - ws2812_set_buffer_rgb(0x4, 0, 0, capteur-1); + ws2812_set_buffer_rgb(0x4, 0, 0, capteur); }else{ printf("Custom config OK\n"); } @@ -139,7 +145,54 @@ int continuous_multiple_reading(){ //return 0; } } - affiche_distance_sur_led(); + affiche_distance_sur_led(distance_capteur_cm); + return 1; +} + + +/// @brief Renvoie 1 si capteur prêt +/// @param capteur : capteur à interroger, entre 0 et 11 +/// @return 1 si prêt, 0 si pas prêt, -1 si erreur +int capteur_pret(uint8_t capteur){ + int status; + uint8_t data_ready = 0; + + if(statu_capteurs[capteur]==0){ + printf("capteur non prêt:%d\n",capteur); + return 0; + } + status=VL53L1X_CheckForDataReady(capteur + ADRESSE_I2C_BASE, &data_ready); + if(status){ + printf("CheckForDataReady KO, error %d, capteur:%x\n", status, capteur + ADRESSE_I2C_BASE); + return 1; + } + return data_ready; + +} + +/// @brief Lecture d'un capteur prêt. +/// @param capteur : identifiant du capteur entre 0 et 11 +/// @return 1 si la lecture s'est bien passée, 0 sinon. +int capteur_lire_distance_cm(uint8_t capteur, uint8_t * distance_cm){ + int status; + uint16_t distance_mm; + status=VL53L1X_GetDistance(capteur + ADRESSE_I2C_BASE, &distance_mm); + if(status){ + printf("GetDistance KO, error %d, capteur:%x\n", status, capteur + ADRESSE_I2C_BASE); + return 0; + }else{ + if(distance_mm/10 < (uint16_t) DISTANCE_TROP_LOIN_CM){ + *distance_cm = distance_mm / 10; + }else{ + *distance_cm = DISTANCE_TROP_LOIN_CM; + } + } + + status=VL53L1X_ClearInterrupt(capteur + ADRESSE_I2C_BASE); + if(status){ + printf("ClearInterrupt KO, error %d, capteur:%x\n", status, capteur + ADRESSE_I2C_BASE); + return 0; + } return 1; } @@ -182,12 +235,12 @@ int continuous_special_reading(){ //return 0; } } - affiche_distance_sur_led(); + affiche_distance_sur_led(distance_capteur_cm); return 1; } -void affiche_distance_sur_led(){ +void affiche_distance_sur_led(unsigned char * distance_capteur_cm){ uint8_t distance_cm; uint32_t couleur; for(uint8_t capteur=0; capteur<12; capteur++){ diff --git a/VL53L1X_Fonctions.h b/VL53L1X_Fonctions.h index 47e2205..353c86d 100644 --- a/VL53L1X_Fonctions.h +++ b/VL53L1X_Fonctions.h @@ -12,14 +12,15 @@ int continuous_multiple_reading(void); int continuous_special_reading(void); -void affiche_distance_sur_led(void); +void affiche_distance_sur_led(unsigned char *); void affiche_couleur_sur_led(uint8_t couleur_8bits, uint8_t led); void reset_affichage_led(void); void initialise_adresses(void); int change_address(uint8_t *device, uint8_t new_i2c_7bits_address); int calibration(uint8_t device); int continuous_reading(uint8_t device); - -extern uint8_t distance_capteur_cm[]; +int capteur_pret(uint8_t capteur); +int capteur_lire_distance_cm(uint8_t capteur, uint8_t * distance_cm); +uint8_t * get_distance_capteur_cm(void); extern uint8_t statu_capteurs[]; diff --git a/main.c b/main.c index ac05333..a0a20de 100644 --- a/main.c +++ b/main.c @@ -125,6 +125,7 @@ void blink(void){ void main(void) { int status; + uint8_t distance_capteur_cm[12]; const uint LED_PIN = PICO_DEFAULT_LED_PIN; gpio_init(LED_PIN); @@ -147,15 +148,28 @@ void main(void) printf("End waiting\n"); setup_slave(); - //Tests(); + Tests(); multicore_launch_core1(blink); initialise_adresses(); + + uint8_t capteur_courant=0; while(1){ // Lecture des capteurs - continuous_multiple_reading(); - //continuous_special_reading(); + if(capteur_pret(capteur_courant)){ + uint8_t distance_cm; + if(capteur_lire_distance_cm(capteur_courant, &distance_cm)){ + distance_capteur_cm[capteur_courant]= distance_cm; + } + } + capteur_courant++; + if(capteur_courant > 11){ + capteur_courant = 0; + } + + // Affichage des distances sur les LEDs. + affiche_distance_sur_led(distance_capteur_cm); // Envoie des valeurs des capteurs for(uint8_t capteur=0; capteur<12; capteur++){