343 lines
8.5 KiB
C
343 lines
8.5 KiB
C
#include <stdio.h>
|
|
#include "pico/multicore.h"
|
|
|
|
#include "QEI.h"
|
|
#include "Moteurs.h"
|
|
#include "Asser_Moteurs.h"
|
|
#include "Localisation.h"
|
|
#include "i2c_maitre.h"
|
|
#include "i2c_annexe.h"
|
|
#include "Robot_config.h"
|
|
#include "gyro.h"
|
|
#include "Temps.h"
|
|
|
|
#include "Test_gyro.h"
|
|
|
|
|
|
#define TEST_TIMEOUT_US 10000000
|
|
|
|
int test_QIE(void);
|
|
int test_QIE_mm(void);
|
|
int test_asser_moteur(void);
|
|
int test_vitesse_moteur(enum t_moteur moteur);
|
|
int test_moteurs(void);
|
|
void affiche_localisation();
|
|
int test_localisation();
|
|
|
|
|
|
// Mode test : renvoie 0 pour quitter le mode test
|
|
int mode_test_unitaire(){
|
|
static int iteration = 2;
|
|
printf("Appuyez sur une touche pour entrer en mode test :\n");
|
|
printf("A - pour les codeurs\n");
|
|
printf("B - pour les codeurs (somme en mm)\n");
|
|
printf("C - pour les moteurs\n");
|
|
printf("D - pour asser_moteurs (rotation)\n");
|
|
printf("E - pour le gyroscope\n");
|
|
printf("F - pour la localisation\n");
|
|
|
|
|
|
stdio_flush();
|
|
int rep = getchar_timeout_us(TEST_TIMEOUT_US);
|
|
stdio_flush();
|
|
switch (rep)
|
|
{
|
|
case 'a':
|
|
case 'A':
|
|
while(test_QIE());
|
|
break;
|
|
case 'b':
|
|
case 'B':
|
|
while(test_QIE_mm());
|
|
break;
|
|
|
|
case 'C':
|
|
case 'c':
|
|
while(test_moteurs());
|
|
break;
|
|
|
|
case 'D':
|
|
case 'd':
|
|
while(test_asser_moteur());
|
|
break;
|
|
|
|
case 'E':
|
|
case 'e':
|
|
while(test_gyro());
|
|
break;
|
|
|
|
|
|
case 'F':
|
|
case 'f':
|
|
while(test_localisation());
|
|
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_QIE(){
|
|
int lettre;
|
|
printf("Affichage des QEI :\nAppuyez sur une touche pour quitter\n");
|
|
QEI_init();
|
|
do{
|
|
QEI_update();
|
|
printf("Codeur A : %d (%3.2f mm), codeur B : %d (%3.2f mm), codeur C : %d (%3.2f mm)\n",
|
|
QEI_get(QEI_A_NAME), QEI_get_mm(QEI_A_NAME),
|
|
QEI_get(QEI_B_NAME), QEI_get_mm(QEI_B_NAME),
|
|
QEI_get(QEI_C_NAME), QEI_get_mm(QEI_C_NAME));
|
|
printf(">CodeurA:%.3f\n>CodeurB:%.3f\n>CodeurC:%.3f\n", QEI_get_mm(QEI_A_NAME), QEI_get_mm(QEI_B_NAME), QEI_get_mm(QEI_C_NAME));
|
|
sleep_ms(100);
|
|
|
|
lettre = getchar_timeout_us(0);
|
|
}while(lettre == PICO_ERROR_TIMEOUT);
|
|
return 0;
|
|
}
|
|
|
|
int test_QIE_mm(){
|
|
int lettre;
|
|
printf("Affichage des QEI :\nAppuyez sur une touche pour quitter\n");
|
|
QEI_init();
|
|
float a_mm=0, b_mm=0, c_mm=0;
|
|
do{
|
|
QEI_update();
|
|
a_mm += QEI_get_mm(QEI_A_NAME);
|
|
b_mm += QEI_get_mm(QEI_B_NAME);
|
|
c_mm += QEI_get_mm(QEI_C_NAME);
|
|
printf("Codeur A : %3.2f mm, codeur B : %3.2f mm, codeur C : %3.2f mm\n", a_mm, b_mm, c_mm);
|
|
printf(">CodeurA:%.3f\n>CodeurB:%.3f\n>CodeurC:%.3f\n", a_mm, b_mm, c_mm);
|
|
sleep_ms(100);
|
|
|
|
lettre = getchar_timeout_us(0);
|
|
}while(lettre == PICO_ERROR_TIMEOUT);
|
|
return 0;
|
|
|
|
}
|
|
|
|
int test_moteurs(){
|
|
int lettre_moteur;
|
|
Moteur_Init();
|
|
|
|
printf("Indiquez le moteurs à tester (A, B ou C):\n");
|
|
do{
|
|
lettre_moteur = getchar_timeout_us(TEST_TIMEOUT_US);
|
|
stdio_flush();
|
|
}while(lettre_moteur == PICO_ERROR_TIMEOUT);
|
|
printf("Moteur choisi : %c %d %x\n", lettre_moteur, lettre_moteur, lettre_moteur);
|
|
|
|
switch (lettre_moteur)
|
|
{
|
|
case 'A':
|
|
case 'a':
|
|
while(test_vitesse_moteur(MOTEUR_A));
|
|
break;
|
|
|
|
case 'B':
|
|
case 'b':
|
|
while(test_vitesse_moteur(MOTEUR_B));
|
|
break;
|
|
|
|
case 'C':
|
|
case 'c':
|
|
while(test_vitesse_moteur(MOTEUR_C));
|
|
break;
|
|
|
|
case 'Q':
|
|
case 'q':
|
|
return 0;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int test_vitesse_moteur(enum t_moteur moteur){
|
|
printf("Vitesse souhaitée :\n0 - 0%%\n1 - 10%%\n2 - 20%%\n...\n9 - 90%%\nA - 100%%\n");
|
|
|
|
int vitesse_moteur;
|
|
do{
|
|
vitesse_moteur = getchar_timeout_us(0);
|
|
stdio_flush();
|
|
|
|
}while(vitesse_moteur == PICO_ERROR_TIMEOUT);
|
|
|
|
switch (vitesse_moteur)
|
|
{
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
printf("Vitesse choisie : %c0%%\n", vitesse_moteur);
|
|
Moteur_SetVitesse(moteur, (vitesse_moteur - '0') * 32767.0 / 10.);
|
|
break;
|
|
|
|
case 'A':
|
|
case 'a':
|
|
printf("Vitesse choisie : 100%%\n");
|
|
Moteur_SetVitesse(moteur, (int16_t) 32766.0);
|
|
break;
|
|
|
|
case 'b':
|
|
case 'B':
|
|
printf("Vitesse choisie : -50%%\n");
|
|
Moteur_SetVitesse(moteur, (int16_t) -32766.0/2);
|
|
break;
|
|
|
|
case 'q':
|
|
case 'Q':
|
|
return 0;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void test_asser_moteur_printf(){
|
|
int _step_ms = 1;
|
|
while(1){
|
|
printf(">Vitesse_A:%.0f\n>Vitesse_B:%.0f\n>Vitesse_C:%.0f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, _step_ms),
|
|
AsserMoteur_getVitesse_mm_s(MOTEUR_B, _step_ms), AsserMoteur_getVitesse_mm_s(MOTEUR_C, _step_ms));
|
|
|
|
//sleep_ms(5);
|
|
}
|
|
}
|
|
|
|
int test_asser_moteur(){
|
|
int lettre;
|
|
int _step_ms = 1;
|
|
AsserMoteur_Init();
|
|
printf("Asservissement des moteurs :\nAppuyez sur une touche pour quitter\n");
|
|
AsserMoteur_setConsigne_mm_s(MOTEUR_A, 100);
|
|
AsserMoteur_setConsigne_mm_s(MOTEUR_B, 100);
|
|
AsserMoteur_setConsigne_mm_s(MOTEUR_C, 100);
|
|
multicore_launch_core1(test_asser_moteur_printf);
|
|
do{
|
|
QEI_update();
|
|
AsserMoteur_Gestion(_step_ms);
|
|
sleep_ms(_step_ms);
|
|
//printf("Vitesse A : %d, codeur B : %d, codeur C : %d\n", QEI_get(QEI_A_NAME), QEI_get(QEI_B_NAME), QEI_get(QEI_C_NAME));
|
|
//printf("Vitesse A : %.0f, vitesse B : %.0f, vitesse C : %.0f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, _step_ms),
|
|
// AsserMoteur_getVitesse_mm_s(MOTEUR_B, _step_ms), AsserMoteur_getVitesse_mm_s(MOTEUR_C, _step_ms));
|
|
lettre = getchar_timeout_us(0);
|
|
}while(lettre == PICO_ERROR_TIMEOUT);
|
|
Moteur_SetVitesse(MOTEUR_A, 0);
|
|
Moteur_SetVitesse(MOTEUR_B, 0);
|
|
Moteur_SetVitesse(MOTEUR_C, 0);
|
|
multicore_reset_core1();
|
|
return 0;
|
|
}
|
|
|
|
void affiche_localisation(){
|
|
struct position_t position;
|
|
while(1){
|
|
position = Localisation_get();
|
|
printf(">X:%f\n>Y:%f\n>angle:%f\n", position.x_mm, position.y_mm, position.angle_radian *180. / 3.141592654);
|
|
printf(">v_bat:%2.2f\n", i2c_annexe_get_tension_batterie());
|
|
}
|
|
}
|
|
|
|
|
|
int test_localisation(){
|
|
int lettre;
|
|
int moteurs = 0;
|
|
struct position_t position;
|
|
uint32_t temps_ms;
|
|
uint32_t _step_ms_gyro = 2, _step_ms=1, tempo_moteur=0;
|
|
uint32_t m_gyro = 0;
|
|
int16_t vitesse;
|
|
|
|
Localisation_init();
|
|
|
|
printf("A - Sans gyroscope\n");
|
|
printf("B - Avec Gyroscope\n");
|
|
printf("C - Avec Gyroscope + moteurs\n");
|
|
do{
|
|
lettre = getchar_timeout_us(TEST_TIMEOUT_US);
|
|
stdio_flush();
|
|
}while(lettre == PICO_ERROR_TIMEOUT);
|
|
|
|
switch(lettre){
|
|
case 'A':
|
|
case 'a':
|
|
set_position_avec_gyroscope(0);
|
|
printf("Sans gyroscope\n");
|
|
break;
|
|
case 'c':
|
|
case 'C':
|
|
moteurs = 1;
|
|
i2c_maitre_init();
|
|
case 'B':
|
|
case 'b':
|
|
set_position_avec_gyroscope(1);
|
|
printf("Avec gyroscope, initialisation...\n");
|
|
m_gyro=1;
|
|
Gyro_Init();
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
|
|
temps_ms = Temps_get_temps_ms();
|
|
|
|
multicore_launch_core1(affiche_localisation);
|
|
|
|
vitesse = (int16_t) 32766.0;
|
|
|
|
printf("Affichage de la position du robot.\nAppuyez sur une touche pour quitter\n");
|
|
do{
|
|
i2c_gestion(i2c0);
|
|
i2c_annexe_gestion();
|
|
while(temps_ms == Temps_get_temps_ms());
|
|
QEI_update();
|
|
if(m_gyro){
|
|
if(temps_ms % _step_ms_gyro == 0){
|
|
Gyro_Read(_step_ms_gyro);
|
|
}
|
|
}
|
|
Localisation_gestion();
|
|
position = Localisation_get();
|
|
if(moteurs){
|
|
tempo_moteur++;
|
|
if(tempo_moteur > 1000){
|
|
tempo_moteur = 0;
|
|
vitesse = -vitesse;
|
|
Moteur_SetVitesse(MOTEUR_A ,vitesse);
|
|
Moteur_SetVitesse(MOTEUR_B ,vitesse);
|
|
Moteur_SetVitesse(MOTEUR_C ,vitesse);
|
|
}
|
|
}
|
|
|
|
|
|
lettre = getchar_timeout_us(0);
|
|
|
|
temps_ms += _step_ms;
|
|
}while(lettre == PICO_ERROR_TIMEOUT || lettre == 0);
|
|
|
|
multicore_reset_core1();
|
|
|
|
return 0;
|
|
|
|
} |