#include #include "pico/multicore.h" #include "pico/stdlib.h" #include "pico/stdio.h" #include "hardware/gpio.h" #include "hardware/i2c.h" #include "pico/binary_info.h" #include "math.h" #include "Test.h" #include "APDS_9960.h" #include "gyro.h" #include "Asser_Moteurs.h" #include "Asser_Position.h" #include "Commande_vitesse.h" #include "i2c_maitre.h" #include "Localisation.h" #include "Moteurs.h" #include "QEI.h" #include "Robot_config.h" #include "Servomoteur.h" #include "spi_nb.h" #include "Temps.h" #include "Trajectoire.h" #include "Trajet.h" #define V_INIT -999.0 #define TEST_TIMEOUT_US 10000000 int test_APDS9960(void); int test_moteurs(void); int test_QIE(void); int test_QIE_mm(void); int test_vitesse_moteur(enum t_moteur moteur); int test_asser_moteur(void); int test_localisation(void); int test_avance(void); int test_cde_vitesse_rotation(void); int test_cde_vitesse_rectangle(void); int test_cde_vitesse_cercle(void); int test_asser_position_avance(void); int test_asser_position_avance_et_tourne(int); int test_trajectoire(void); int test_i2c_bus(void); void affiche_localisation(void); int test_i2c_lecture_pico_annex(); int test_i2c_lecture_pico_annex_nb(); int test_i2c_lecture_pico_annex_nb2(); // Mode test : renvoie 0 pour quitter le mode test int mode_test(){ static int iteration = 2; printf("Appuyez sur une touche pour entrer en mode test :\n"); printf("A - pour asser_moteurs (rotation)\n"); printf("B - pour avance (asser_moteur)\n"); printf("C - pour les codeurs\n"); printf("D - pour les codeurs (somme en mm)\n"); printf("E - Commande en vitesse - rotation pure\n"); printf("F - Commande en vitesse - carré\n"); printf("G - Commande en vitesse - cercle\n"); printf("H - Asser Position - avance\n"); printf("I - Asser Position - avance et tourne (gyro)\n"); printf("J - Asser Position - avance et tourne (sans gyro)\n"); printf("M - pour les moteurs\n"); printf("L - pour la localisation\n"); printf("T - Trajectoire\n"); printf("U - Scan du bus i2c\n"); printf("V - APDS_9960\n"); printf("W - Com i2c Pico Annexe\n"); printf("X - Com i2c Pico Annexe - non bloquant\n"); stdio_flush(); int rep = getchar_timeout_us(TEST_TIMEOUT_US); stdio_flush(); switch (rep) { case 'a': case 'A': while(test_asser_moteur()); break; case 'b': case 'B': while(test_avance()); break; case 'C': case 'c': while(test_QIE()); break; case 'D': case 'd': while(test_QIE_mm()); break; case 'E': case 'e': while(test_cde_vitesse_rotation()); break; case 'F': case 'f': while(test_cde_vitesse_rectangle()); break; case 'G': case 'g': while(test_cde_vitesse_cercle()); break; case 'H': case 'h': while(test_asser_position_avance()); break; case 'I': case 'i': while(test_asser_position_avance_et_tourne(1)); break; case 'J': case 'j': while(test_asser_position_avance_et_tourne(0)); break; case 'M': case 'm': while(test_moteurs()); break; case 'L': case 'l': while(test_localisation()); break; case 'T': case 't': while(test_trajectoire()); break; case 'U': case 'u': while(test_i2c_bus()); break; case 'V': case 'v': while(test_APDS9960()); break; case 'W': case 'w': while(test_i2c_lecture_pico_annex()); break; case 'X': case 'x': while(test_i2c_lecture_pico_annex_nb2()); break; case PICO_ERROR_TIMEOUT: iteration--; if(iteration == 0){ //printf("Sortie du mode test\n"); //return 0; } default: printf("Commande inconnue\n"); break; } return 1; } int test_continue_test(){ int lettre; printf("q pour quitter, une autre touche pour un nouveau test.\n"); do{ lettre = getchar_timeout_us(0); }while(lettre == PICO_ERROR_TIMEOUT || lettre == 0); switch(lettre){ case 'q': case 'Q': return 0; default: return 1; } } bool reserved_addr(uint8_t addr) { return (addr & 0x78) == 0 || (addr & 0x78) == 0x78; } int test_APDS9960(){ int lettre; printf("Initialisation\n"); APDS9960_Init(); printf("Lecture...\n"); /* do{ APDS9960_Lire(); lettre = getchar_timeout_us(0); stdio_flush(); }while(lettre == PICO_ERROR_TIMEOUT);*/ while(1){ APDS9960_Lire(); sleep_ms(100); } return 1; } int test_i2c_lecture_pico_annex(){ i2c_maitre_init(); uint8_t tampon[10]; uint8_t registre=0; uint8_t adresse = 0x17; int ret; ret = i2c_write_blocking(i2c0, adresse,®istre, 1, false); if(ret < 0){ printf("Erreur I2C : %d", ret); return 0; } ret = i2c_read_blocking(i2c_default, adresse, tampon, 10, false); if(ret < 0){ printf("Erreur I2C : %d", ret); }else{ for(int i=0; i<10; i++){ printf("%c", tampon[i]); } printf("\n"); for(int i=0; i<10; i++){ printf("%2x ", tampon[i]); } printf("\n"); } return test_continue_test(); } int test_i2c_lecture_pico_annex_nb(){ i2c_maitre_init(); uint8_t tampon[10]; uint8_t registre=0; uint8_t adresse = 0x17; uint32_t time_i2c[5]; const uint8_t T_MAX_I2C = 10; int ret; time_i2c[0] = time_us_32(); // On charge l'adresse de l'escalve i2c0->hw->enable = 0; i2c0->hw->tar = adresse; i2c0->hw->enable = 1; // On envoie l'adresse du registre à lire // Pas de stop, pas de restart, écriture : 0, i2c0->hw->data_cmd = registre; uint8_t first = false; uint8_t last = false; for(int i=0; ihw->data_cmd = bool_to_bit(first) << I2C_IC_DATA_CMD_RESTART_LSB | bool_to_bit(last) << I2C_IC_DATA_CMD_STOP_LSB | I2C_IC_DATA_CMD_CMD_BITS; // -> 1 for read } time_i2c[1] = time_us_32() - time_i2c[0] ; // On attend la fin de la transaction i2c while(i2c0->hw->status & I2C_IC_STATUS_MST_ACTIVITY_BITS); time_i2c[2] = time_us_32() - time_i2c[0] ; // On lit le tampon I2C // uint8_t * dst; // dst = tampon; for(int i=0; ihw->tx_abrt_source){ printf("Erreur I2C: Abort : %4x\n", i2c0->hw->tx_abrt_source); } //On lit la donnée tampon[i] = (uint8_t) i2c0->hw->data_cmd; } time_i2c[3] = time_us_32() - time_i2c[0] ; // Affichage for(int i=0; i