Amélioration de la vitesse de lecture

This commit is contained in:
Samuel 2023-05-06 16:58:05 +02:00
parent abd9645df0
commit 39fad9c743
4 changed files with 101 additions and 18 deletions

19
Tests.c
View File

@ -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':

View File

@ -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<NB_CAPTEURS; capteur++){
// reset du capteur
Selection_capteur_select(capteur);
Selection_capteur_select(capteur+1);
sleep_ms(1);
Selection_capteur_deselect();
sleep_ms(1);
uint8_t VL53L1X_device = 0x29;
if(change_address(&VL53L1X_device, 0x30 + capteur)){
printf("Erreur change adresse : %x => %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++){

View File

@ -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[];

20
main.c
View File

@ -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++){