Approche Gradin + amélioration du Wifi

L'algorythme d'approche du gradin prend forme. Les capteurs sont bien lus et interprétés.
Côté Wifi :
- Les identifiants sont renseignés dans un fichier qui n'est pas suivi par Git.
- Début d'une page statu pour le cerveau
This commit is contained in:
Samuel 2025-04-13 20:30:21 +02:00
parent 09579d31bd
commit 2513404cfd
7 changed files with 96 additions and 28 deletions

1
Cerveau/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
Wifi_settings.ino

View File

@ -27,14 +27,16 @@
#define gst_server;
extern const char *ssid;
extern const char *password;
struct triangulation_reception_t {
int pos_x_mm, pos_y_mm;
float angle_rad;
bool validite;
};
const char* ssid = "riombotique";
const char* password = "password";
// adresse du >Pi qui gere le serveur : 192.168.99.100
IPAddress local_IP(192, 168, 99, 101);
IPAddress gateway(192, 168, 99, 1);
@ -187,7 +189,7 @@ void Initialisation_wifi(){
//Initialisation wifi
//------------WIFI------------
//Initialisation wifi
WiFi.config(local_IP, gateway, subnet);
//WiFi.config(local_IP, gateway, subnet);
WiFi.begin(ssid, password);
int test_wifi = 0;
while (WiFi.status() != WL_CONNECTED){
@ -205,9 +207,13 @@ void Initialisation_wifi(){
M5.Lcd.print("Connecte au reseau ;-)");
M5.Lcd.setCursor(10,30);
M5.Lcd.print(ssid);
M5.Lcd.setCursor(10,50);
M5.Lcd.print(WiFi.localIP());
delay(3000);
return;
}
else {
// le routeur riombotique n'a pas été trouvé - création d'un point d'accès
WiFi.config(local_IP, gateway, subnet);
WiFi.mode(WIFI_OFF);
if (!WiFi.softAP("cerveau", "ilestsecret")) {
log_e("Soft AP creation failed.");
@ -221,7 +227,7 @@ void Initialisation_wifi(){
M5.Lcd.print("cerveau 192.168.4.1");
M5.Lcd.setCursor(10,50);
M5.Lcd.print("mdp : ilestsecret");
}
delay(1500);
}
@ -388,8 +394,9 @@ void gestion_match(){
}while(fabs(detect_gradin.angle_rad / M_PI * 180) > 0.5);
//index_Maitre = ATTENTE_ORDRE;
//affichage_standard_init();
break;
*/
break;
}
}
@ -497,10 +504,11 @@ enum etat_action_t gradin_approche(void){
GA_CHERCHE_GAUCHE,
GA_CHERCHE_DROIT,
GA_GOTO_LARGE,
GA_TOURNE_LARGE,
GA_GOTO_PROCHE,
GA_GOTO_PREND
} statu_approche_gradin = GA_INIT;
static float angle_parcouru;
static float angle_parcouru, angle_mem;
static int nb_erreur;
int translation_x, translation_y;
struct detect_gradin_t detect_gradin;
@ -521,9 +529,11 @@ enum etat_action_t gradin_approche(void){
if(detect_gradin.status == 2){
// On a trouvé !
statu_approche_gradin = GA_GOTO_LARGE;
angle_mem = detect_gradin.angle_rad;
nb_erreur = 0;
}else if(detect_gradin.status == 0){
// On a perdu la détection
while(deplacement_relatif(0, 0, -3. * M_PI / 180., 0) == ACTION_EN_COURS);
statu_approche_gradin = GA_CHERCHE_DROIT;
}else{
// On tourne à gauche de quelques degrés
@ -535,6 +545,7 @@ enum etat_action_t gradin_approche(void){
if(detect_gradin.status == 2){
// On a trouvé !
statu_approche_gradin = GA_GOTO_LARGE;
angle_mem = detect_gradin.angle_rad;
nb_erreur = 0;
}else if(detect_gradin.status == 0){
// On a perdu la détection
@ -555,9 +566,29 @@ enum etat_action_t gradin_approche(void){
while(1);
}
}
translation_x = detect_gradin.centre_y_mm - 400 * cos(detect_gradin.angle_rad);
translation_y = -400 * sin(detect_gradin.angle_rad);
translation_x = (detect_gradin.centre_y_mm + 150) * tan(detect_gradin.angle_rad);
translation_y = -(detect_gradin.centre_y_mm + 150) * sin(detect_gradin.angle_rad) - detect_gradin.centre_x_mm;
if(deplacement_relatif(translation_x, translation_y, 0, 0) == ACTION_TERMINEE){
statu_approche_gradin = GA_TOURNE_LARGE;
}
break;
case GA_TOURNE_LARGE:
if(deplacement_relatif(0, 0, -angle_mem, 0) == ACTION_TERMINEE){
Detect_gradin(&detect_gradin);
if(detect_gradin.status != 2 || fabs(detect_gradin.angle_rad) > 0.009){
statu_approche_gradin = GA_CHERCHE_GAUCHE;
}else{
statu_approche_gradin = GA_GOTO_PROCHE;
}
}
break;
case GA_GOTO_PROCHE:
Detect_gradin(&detect_gradin);
if(deplacement_relatif((detect_gradin.centre_y_mm - 20), 0, 0, 0) == ACTION_TERMINEE){
statu_approche_gradin = GA_INIT;
return ACTION_TERMINEE;
}

View File

@ -14,7 +14,7 @@ struct chassis_emission_t {
int vitesse, acceleration;
};
void Scan_chassis(struct chassis_reception_t * chassis_reception);
int Scan_chassis(struct chassis_reception_t * chassis_reception);
void send_Chassis(struct chassis_emission_t * chassis_emission);
void send_Chassis_RAZ(void);

View File

@ -4,7 +4,7 @@
/// @brief Lit l'état du chassis en I2C
void Scan_chassis(struct chassis_reception_t * chassis_reception){
int Scan_chassis(struct chassis_reception_t * chassis_reception){
unsigned char tampon2[14];
//(Adresse I2c, Adresse dans le registre, tampon, longueur de donnée)
error = I2C_lire_registre(I2C_SLAVE_chassi, 0, tampon2, 12);
@ -19,6 +19,7 @@ void Scan_chassis(struct chassis_reception_t * chassis_reception){
Mvt_finit = (MOUVEMENT_FINI == tampon2[0]);
chassis_reception->status = tampon2[0];
}
return error;
}
void send_Chassis(struct chassis_emission_t * chassis_emission){

View File

@ -57,6 +57,7 @@ WebServer server(80);
void Web_init(){
server.begin();
server.on("/form", handleForm);
server.on("/statu", showStatus);
}
bool Web_nouveau_message(){
@ -99,3 +100,27 @@ void handleForm() {
Web_nouvelle_entree=1;
}
void showStatus() {
char chassis[50], gradin[50], triangulation[50], detection_adversaire[50];
char message_statu[500];
const char message_statu_tmplt[] = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><title>A simple form</title></head>\
<body>\n<h1>Statu du robot</h1>\n\
<p>Chassis: %s</p><p>Gradin: %d</p><p>Triangulation: %d</p><p>Detection_adversaire: %d</p>";
struct chassis_reception_t chassis_reception;
statu_to_string(chassis, !Scan_chassis(&chassis_reception) );
sprintf(message_statu, message_statu_tmplt, chassis, 0, 0, 0);
server.send(200, "text/html", message_statu);
}
/// @brief convertir un statu boolean en message web.
/// @param statu 0 NOK, 1 OK
void statu_to_string(char * statu_str, bool statu){
if(!statu){
strcpy(statu_str, "<span style=\"color:red;\">NOK</span>");
}else{
strcpy(statu_str, "<span style=\"color:green;\">OK</span>");
}
}

View File

@ -0,0 +1,3 @@
const char *ssid = "Mon SSID";
const char *password = "Ma clé WiFi";

View File

@ -1,3 +1,14 @@
WiFi
====
Pour compiler le code du "Cerveau", il est nécessaire de copier le fichier Wifi_settings.ino.example en Wifi_settings.ino.
Vous pouvez ensuite éditer le fichier Wifi_settings pour indiquer les identifiants Wifi.
Communication I2C
=================
La documentation de notre protocole I2C est [disponible sous forme de PDF ici](Doc/Communication%20I2C.pdf).
Déplacement fonctionnel
=======================
@ -10,7 +21,3 @@ Vidéo réalisée le 24 février 2024, paramètres :
- vitesse : 2000
- acceleration : 1500
Communication I2C
=================
La documentation de notre protocole I2C est [disponible sous forme de PDF ici](Doc/Communication%20I2C.pdf).