From b459287e116ed50e17856d3a7dd47ab1afc46bca Mon Sep 17 00:00:00 2001 From: Samuel Date: Sun, 16 Apr 2023 20:22:20 +0200 Subject: [PATCH] =?UTF-8?q?Stauration=20de=20la=20distance=20=C3=A0=20200?= =?UTF-8?q?=20cm=20+=20ajout=20de=20commentaires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 18 ++++++++++++++++++ VL53L1X_Fonctions.c | 22 ++++++++++++++++------ main.c | 17 +++++------------ 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/Readme.md b/Readme.md index 0cea4d0..943b6f1 100644 --- a/Readme.md +++ b/Readme.md @@ -17,6 +17,24 @@ La première étape de l'initialisation consiste à changer tous les capteurs d' La seconde étape consiste, pour chaque capteur, à le désactiver puis à le réactiver à l'aide du 74HC4067 et de la boche `XSHUT` du composant. Ce faisant, il reprend son adresse par défaut et il est le seul à cette adresse. Ainsi il est possible, via le bus I2C de lui attribuer une adresse unique. +Communication I2C +----------------- + +Avec le reste du robot, la carte communique en I2C sur le bus i2c1, se comportant comme une EPROM en utilisant le code de Valentin Milea , [Pico_i2c_slave](https://github.com/vmilea/pico_i2c_slave). + +Description de la mémoire d'échange: +------------------------------------ +Les adresses 0 à 11 (0x0B) contiennent les distances des capteurs en centimètre. Cette distance est saturée à 200 cm. +Les adresses 16 (0x10) à 18 (0x12) contiennent les consignes d'éclairage des LEDs: +* 0x10 : Couleur sur 8 bits. +* 0x11 : octet de poids fort pour le masque sélectionnant les LEDs à commander. +* 0x12 : octet de poids faible pour le masque sélectionnant les LEDs à commander. + +Couleur sur 8 bits structurée ainsi : 3-3-2 (Rouge - vert - bleu). +Le masque sur 16 bits, 1 : la led doit être piloter de la couleur indiquée, 0 la led affiche la distance. +Valeur spéciale pour le masque : 0x00. Dans ce cas, toutes les LEDs reprennent leur fonction par défaut (affichage de la distance). + + Démo - Ne fonctionne plus ---- diff --git a/VL53L1X_Fonctions.c b/VL53L1X_Fonctions.c index cb40e25..4866067 100644 --- a/VL53L1X_Fonctions.c +++ b/VL53L1X_Fonctions.c @@ -6,9 +6,11 @@ #include "SelectionCapteur.h" #include "ws2812.h" -#define DISTANCE_TRES_LOIN_CM 120 -#define DISTANCE_LOIN_CM 80 -#define DISTANCE_PROCHE_CM 14 +#define DISTANCE_TROP_LOIN_CM 200 /* Distance de saturation */ +#define DISTANCE_TRES_LOIN_CM 120 /* Seuil min. pour la couleur bleu*/ +#define DISTANCE_LOIN_CM 80 /* Seuil min. pour la couleur verte*/ +#define DISTANCE_PROCHE_CM 14 /* Seuil entre violet et jaune*/ + #define NB_CAPTEURS 12 // Stock les valeurs lues des capteurs @@ -120,7 +122,11 @@ int continuous_multiple_reading(){ return 0; }else{ printf(">distance%x:%d\n", device, distance_mm); - distance_capteur_cm[device-0x31] = distance_mm / 10; + if(distance_mm < DISTANCE_TROP_LOIN_CM * 10){ + distance_capteur_cm[device-0x31] = distance_mm / 10; + }else{ + distance_capteur_cm[device-0x31] = DISTANCE_TROP_LOIN_CM; + } } status=VL53L1X_ClearInterrupt(device); @@ -159,7 +165,11 @@ int continuous_special_reading(){ return 0; }else{ printf(">distance%x:%d\n", device, distance_mm); - distance_capteur_cm[device-0x31] = distance_mm / 10; + if(distance_mm < DISTANCE_TROP_LOIN_CM * 10){ + distance_capteur_cm[device-0x31] = distance_mm / 10; + }else{ + distance_capteur_cm[device-0x31] = DISTANCE_TROP_LOIN_CM; + } } status=VL53L1X_ClearInterrupt(device); @@ -194,7 +204,6 @@ void affiche_distance_sur_led(){ ws2812_set_buffer_rgb(COULEUR_TROP_PROCHE, capteur); } } - } ws2812_affiche_buffer(); } @@ -204,6 +213,7 @@ void affiche_couleur_sur_led(uint8_t couleur_8bits, uint8_t led){ ws2812_set_buffer_8bits(couleur_8bits, led); } +/// @brief Remet toutes les LEDs en mode d'affichage de la distance void reset_affichage_led(){ for(uint8_t capteur=0; capteur<12; capteur++){ mode_led[capteur] = MODE_DISTANCE; diff --git a/main.c b/main.c index e960ce0..a74f207 100644 --- a/main.c +++ b/main.c @@ -148,22 +148,15 @@ void main(void) uint8_t couleur = tampon_commande_led[0]; uint16_t masque_led = (tampon_commande_led[1] << 8) | tampon_commande_led[2]; - - if (masque_led == 0){ - // Commande pour repasser les led en mode distance - reset_affichage_led(); - }else{ - for(uint8_t led=0; led < 12; led++){ - if((masque_led >> led) & 0x01){ - affiche_couleur_sur_led(couleur, led); - } + + reset_affichage_led(); + for(uint8_t led=0; led < 12; led++){ + if((masque_led >> led) & 0x01){ + affiche_couleur_sur_led(couleur, led); } } } } - - - }