Go Down

Topic: ESP32 Pilotage d'un moteur à partir d'un WebServer. (Read 362 times) previous topic - next topic

simonlere

Bonjour,
J'essaye de piloter un moteur pas à pas à partir d'un Webserveur.
Mais la page web que j'ai programmait Time out,
j'ai essayer de faire un test en enlevant la partie du code pour le moteur et la page fonctionnent normalement.
J'ai donc un problème la partie du code moteur mais je ne sais pas ou.
(J'ai vérifié ce n'est pas les librairies le problème.)

Le code est dans le dossier thing.cpp

Si vous avez des solutions je suis preneur.
Merci bien

J-M-L

combien de temps prends l'exécution de vos commandes ? si c'est trop long (temps de fermeture de porte ?) alors c'est normal d'avoir un timeout (si vous l'avez réglé à pas grand chose). il faudrait répondre au serveur web avant d'avoir lancé la commande ou avoir un traitement asynchrone

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

simonlere

Merci pour la réponse J-M-L  :smiley-wink:, j'ai régler ce problème, par contre j'ai un nouveau problème je voudrais intégrer deux fin de courses (micro-switch), ouverture et fermeture porte.
en piève jointe mon code. J'ai déjà essayer de l'implémenter, mais j'ai des problèmes à intégrer mes deux fins de courses dans mon programme et surement dans le partie web par la suite. Actuellement voilà ce qu'il se passe, je démarre l'ouverture, je simule l'arrivée sur le fin de course, cela arrête le moteur.
Le problème, lorsque j'appui sur la fermeture il ne démarre pas, je suis donc obliger d'ouvrir le fin de course pour qu'il démarre.
je serait pas contre un peu d'aide.

J-M-L

Suis sur smartphone, lisez les recommandations pour bien utiliser le forum, je ne peux pas lire la PJ

Vous avez des événements ou commandes qui arrivent sur votre système, C'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

simonlere

Voila JML ;)

Code: [Select]
#include <Arduino.h>
#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <DHT.h>


int Pin1 = 13;//IN1 is connected to 13
int Pin2 = 12;//IN2 is connected to 12 
int Pin3 = 14;//IN3 is connected to 14
int Pin4 = 27;//IN4 is connected to 27
int finDeCourseOuverte = 26;
int finDeCourseFermer = 25;
boolean fdco = false; // Déclaration variable Fin de Course Haut
boolean fdcf = false; // Déclaration variable Fin de Course Bas
boolean fdc = false;
 
int pole1[] ={0,0,0,0, 0,1,1,1, 0};//pole1, 8 step values
int pole2[] ={0,0,0,1, 1,1,0,0, 0};//pole2, 8 step values
int pole3[] ={0,1,1,1, 0,0,0,0, 0};//pole3, 8 step values
int pole4[] ={1,1,0,0, 0,0,0,1, 0};//pole4, 8 step values


int poleStep = 0;
int dirStatus = 3;// stores direction status 3= stop (do not change)


String buttonTitle1[] ={"OUVERTURE", "FERMETURE"};
String buttonTitle2[] ={"OUVERTURE", "FERMETURE"};
String argId[] ={"ouverture", "fermeture"};


const char *ssid = "xxx";
const char *password = "xxx;

WebServer server(80);

void handleRoot() {
   //Robojax.com ESP32 Relay Motor Control
  String HTML ="<!DOCTYPE html>";
  HTML += "<html>\n<head>\t\n<title>Porte Poulailler</title>\t\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\t<style>\nhtml,body{\t\nwidth:100%;`\nheight:100%;\nmargin:0}\n*{box-sizing:border-box}\n.colorAll{\n\tbackground-color:#90ee90}\n.colorBtn{\n\tbackground-color:#add8e6}\n.angleButtdon,a{\n\tfont-size:30px;\nborder:1px solid #ccc;\ndisplay:table-caption;\npadding:7px 10px;\ntext-decoration:none;\ncursor:pointer;\npadding:5px 6px 7px 10px}a{\n\tdisplay:block}\n.btn{\n\tmargin:5px;\nborder:none;\ndisplay:inline-block;\nvertical-align:middle;\ntext-align:center;\nwhite-space:nowrap}\n";
   
  HTML +="</style>\n\n</head>\n\n<body>\n<h1>Porte Poulailler </h1>\n";

   if(dirStatus ==2){
    HTML +="\n\t<h2><span style=\"background-color: #FFFF00\">Fermeture porte...</span></h2>\n";   
   }else if(dirStatus ==1){
    HTML +="\n<h2><span style=\"background-color: #FFFF00\">Ouverture porte...</span></h2>\n";     
   }else{
    HTML +="\n<h2><span style=\"background-color: #FFFF00\">Moteur eteint</span></h2>\n";   
   }
   
        if(dirStatus ==1){
        HTML += "<div class=\"btn\">\n\t\t<a class=\"angleButton\" style=\"background-color:#f56464\"  href=\"/motor?";
        HTML += argId[0];
        HTML += "=off\">";
        HTML +=buttonTitle1[0]; //motor ON title
      }else{
        HTML += "<div class=\"btn\">\n\t\t<a class=\"angleButton \" style=\"background-color:#90ee90\"  href=\"/motor?"; 
        HTML += argId[0];
        HTML += "=on\">";       
        HTML +=buttonTitle2[0];//motor OFF title   
      }   
        HTML +="</a>\n</div>\n\n"; 
           
      if(dirStatus ==2){
        HTML +="  <div class=\"btn\">\n<a class=\"angleButton\" style=\"background-color:#f56464\"  href=\"/motor?";
        HTML += argId[1];
        HTML += "=off\">";
        HTML +=buttonTitle1[1]; //motor ON title
      }else{
        HTML +="  <div class=\"btn\">\n<a class=\"angleButton \" style=\"background-color:#90ee90\"  href=\"/motor?"; 
        HTML += argId[1];
        HTML += "=on\">";       
        HTML +=buttonTitle2[1];//motor OFF title   
      }   
     HTML +="</a>\n</div>\n";     
   
     HTML +="\n</body>\n</html>\n";
     server.send(200, "text/html", HTML); 
}//handleRoot()

void handleNotFound() {

  String message = "File Not Found";
  message += "URI: ";
  message += server.uri();
  message += "\n Method: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\n Arguments: ";
  message += server.args();
  message += "\n";

for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}

  server.send(404, "text/plain", message);
}

void motorControl() {


    if(server.arg(argId[0]) == "on")
    {
      dirStatus = 1;// CCW
               
    }else if(server.arg(argId[0]) == "off"){
      dirStatus = 3;  // motor OFF
         
    }else if(server.arg(argId[1]) == "on"){
      dirStatus = 2;  // CW 
         
    }else if(server.arg(argId[1]) == "off"){
      dirStatus = 3;  // motor OFF
         
    } 

  handleRoot();
}//motorControl end

void driveStepper(int c)
{
     digitalWrite(Pin1, pole1[c]); 
     digitalWrite(Pin2, pole2[c]);
     digitalWrite(Pin3, pole3[c]);
     digitalWrite(Pin4, pole4[c]);   
}//driveStepper end here

void arretMoteurOuvrir(){
  if (fdco == true){
    digitalWrite(Pin1, LOW); 
    digitalWrite(Pin2, LOW);
    digitalWrite(Pin3, LOW);
    digitalWrite(Pin4, LOW);
  }
}

void arretMoteurFermer(){
  if (fdcf == true){
    digitalWrite(Pin1, LOW); 
    digitalWrite(Pin2, LOW);
    digitalWrite(Pin3, LOW);
    digitalWrite(Pin4, LOW);
  }
}

void etatCourse(){
  if (digitalRead(finDeCourseFermer) == HIGH) // Changement d'état du fin de course haut (front montant ou descendant)
  {
      Serial.println("Porte fermée !"); // Affichage sur le moniteur série du texte
      fdcf = true;
      arretMoteurFermer();
  }
 
  if (digitalRead(finDeCourseOuverte) == HIGH) // Changement d'état du fin de course bas (front montant ou descendant)
  {
      Serial.println("Porte ouverte !"); // Affichage sur le moniteur série du texte
      fdco = true;
      arretMoteurOuvrir();
  }
}

void setup(void) {
  //Robojax.com 28BYJ-48 Steper Motor Control
 
 pinMode(Pin1, OUTPUT);//define pin for ULN2003 in1
 pinMode(Pin2, OUTPUT);//define pin for ULN2003 in2   
 pinMode(Pin3, OUTPUT);//define pin for ULN2003 in3   
 pinMode(Pin4, OUTPUT);//define pin for ULN2003 in4   
 pinMode(finDeCourseFermer, INPUT);
 pinMode(finDeCourseOuverte, INPUT);

  fdcf = false;
  fdco = false;
 
  Serial.begin(115200);//initialize the serial monitor
  Serial.println("Robojax 28BYJ-48 Stepper Motor Control");

  //Robojax.com 28BYJ-48 Steper Motor Control
   
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
 
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: http://");
  Serial.println(WiFi.localIP());

//multicast DNS   //Robojax.com 28BYJ-48 Steper Motor Control
  if (MDNS.begin("robojaxESP32")) {
    Serial.println("MDNS responder started");
    Serial.println("access via http://robojaxESP32");
  }

  server.on("/", handleRoot);
  server.on("/motor", HTTP_GET, motorControl);           
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");

}//end of setup

void loop(void) {
    //Robojax.com 28BYJ-48 Steper Motor Control
  server.handleClient();
if(dirStatus ==1){
   fdco = false;
   fdcf = false;
   poleStep++;
   driveStepper(poleStep);
 }else if(dirStatus ==2){
   fdco = false;
   fdcf = false;
   poleStep--;
   driveStepper(poleStep);
 }else{
   fdco = false;
   fdcf = false;
   driveStepper(8);   
 }
 if(poleStep>7){
   poleStep=0;
 }
 if(poleStep<0){
   poleStep=7;
 }


  etatCourse();

  delay(1);
  //Robojax.com 28BYJ-48 Steper Motor Control
}//end of loop

J-M-L

Votre fonction etatCourse() commence par regarder si vous touchez le contacteur du haut indépendamment de la commande en cours et si oui ça arrête tout... donc une fois collé la haut vous ne pouvez plus vous en sortir.

La fonction doit être un peu plus maline

Si vous êtes en mouvement il faut tester les fins de course, si vous êtes à l'arrêt il faut tester si vous avez reçu une commande qui dit de quitter le détecteur qui est activé.  (S'il y en a un)

C'est pour cela que je mentionnais la machine à états
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

simonlere

Bon je dois pas être assez malin :( je vais continuer a chercher merci plus les pistes

J-M-L

C'est pas vous, c'est la fonction qui doit être maline :)

Définissez les états et transitions possible. Maintenez cet état courant dans une variable. Utilisez la commande reçue comme demande de changement d'état ou quand vous êtes en mouvement écoutez les ordres contraires et les fins de course.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

simonlere

#8
Sep 22, 2020, 08:38 pm Last Edit: Sep 22, 2020, 08:42 pm by CrossRoads
Hello
Well, everything works well except when my motor reaches a limit switch, my motor stops well but the leds of the motor controller remain on, I suppose that it still has a signal always sent to the motor, including my query: will this damage my engine in the long run.
Thank you in advance,
the code :
Code: [Select]

#include <Arduino.h>
#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <DHT.h>

int Pin1 = 13; // IN1 is connected to 13 
int Pin2 = 12; // IN2 is connected to 12  
int Pin3 = 14; // IN3 is connected to 14
int Pin4 = 27; // IN4 is connected to 27
int endOpenTroke = 26;
int endOfCloseCourse = 25;
int fDCOopen = 0;
int fDCClose = 0;
boolean doorOpen = false; // Variable declaration of High limit switch
boolean doorClose = false; // Variable declaration Low Limit Switch

int pole1 [] = {0,0,0,0, 0,1,1,1, 0}; // pole1, 8 step values
int pole2 [] = {0,0,0,1, 1,1,0,0, 0}; // pole2, 8 step values
int pole3 [] = {0,1,1,1, 0,0,0,0, 0}; // pole3, 8 step values
int pole4 [] = {1,1,0,0, 0,0,0,1, 0}; // pole4, 8 step values

int gate status = 0;

int poleStep = 0;
int dirStatus = 3; // stores direction status 3 = stop (do not change)

String buttonTitle1 [] = {"OPEN", "CLOSE"};
String buttonTitle2 [] = {"OPEN", "CLOSE"};
String argId [] = {"opening", "closing"};

const char * ssid = "xxx";
const char * password = "xxx";

WebServer server (80);

void handleRoot () {
  //Robojax.com ESP32 Relay Motor Control
 String HTML = "<! DOCTYPE html>";
 HTML + = "<html> \ n <head> \ t \ n <title> Porte Poulailler </title> \ t \ n <meta name = \" viewport \ "content = \" width = device-width, initial- scale = 1 \ "> \ t <style> \ nhtml, body {\ t \ nwidth: 100%;` \ nheight: 100%; \ nmargin: 0} \ n * {box-sizing: border-box} \ n .colorAll {\ n \ tbackground-color: # 90ee90} \ n.colorBtn {\ n \ tbackground-color: # add8e6} \ n.angleButtdon, a {\ n \ tfont-size: 30px; \ nborder: 1px solid # ccc; \ ndisplay: table-caption; \ npadding: 7px 10px; \ ntext-decoration: none; \ ncursor: pointer; \ npadding: 5px 6px 7px 10px} a {\ n \ tdisplay: block} \ n.btn {\ n \ tmargin: 5px; \ nborder: none; \ ndisplay: inline-block; \ nvertical-align: middle; \ ntext-align: center; \ nwhite-space: nowrap} \ n ";
 
 HTML + = "</style> \ n \ n </head> \ n \ n <body> \ n <h1> Door Chicken Coop </h1> \ n";

  if (dirStatus == 2) {
   HTML + = "\ n \ t <h2> <span style = \" background-color: # FFFF00 \ "> Door closing ... </span> </h2> \ n";    
  } else if (dirStatus == 1) {
   HTML + = "\ n <h2> <span style = \" background-color: # FFFF00 \ "> Door opening ... </span> </h2> \ n";      
  } else {
   HTML + = "\ n <h2> <span style = \" background-color: # FFFF00 \ "> Engine off </span> </h2> \ n";    
  }
  if (gate status == 1) {
    HTML + = "\ n \ t <h2> <span style = \" background-color: # FFFF00 \ "> Door open! </span> </h2> \ n";
  } else if (gate status == 2) {
    HTML + = "\ n \ t <h2> <span style = \" background-color: # FFFF00 \ "> Door close! </span> </h2> \ n";
  } else if (gate status == 0) {
    HTML + = "\ n \ t <h2> <span style = \" background-color: # FFFF00 \ "> Awaiting the end of races ... </span> </h2> \ n";
  }
  
       if (dirStatus == 1) {
       HTML + = "<div class = \" btn \ "> \ n \ t \ t <a class = \" angleButton \ "style = \" background-color: # f56464 \ "href = \" / motor? ";
       HTML + = argId [0];
       HTML + = "= off \"> ";
       HTML + = buttonTitle1 [0]; // motor ON title
     } else {
       HTML + = "<div class = \" btn \ "> \ n \ t \ t <a class = \" angleButton \ "style = \" background-color: # 90ee90 \ "href = \" / motor? ";  
       HTML + = argId [0];
       HTML + = "= on \"> ";      
       HTML + = buttonTitle2 [0]; // motor OFF title  
     }  
       HTML + = "</a> \ n </div> \ n \ n";  
         
     if (dirStatus == 2) {
       HTML + = "<div class = \" btn \ "> \ n <a class = \" angleButton \ "style = \" background-color: # f56464 \ "href = \" / motor? ";
       HTML + = argId [1];
       HTML + = "= off \"> ";
       HTML + = buttonTitle1 [1]; // motor ON title
     } else {
       HTML + = "<div class = \" btn \ "> \ n <a class = \" angleButton \ "style = \" background-color: # 90ee90 \ "href = \" / motor? ";  
       HTML + = argId [1];
       HTML + = "= on \"> ";      
       HTML + = buttonTitle2 [1]; // motor OFF title  
     }
 
    HTML + = "</a> \ n </div> \ n";    
   
    HTML + = "\ n </body> \ n </html> \ n";
    server.send (200, "text / html", HTML);  
} // handleRoot ()

void handleNotFound () {

 String message = "File Not Found";
 message + = "URI:";
 message + = server.uri ();
 message + = "\ n Method:";
 message + = (server.method () == HTTP_GET)? "GET": "POST";
 message + = "\ n Arguments:";
 message + = server.args ();
 message + = "\ n";

for (uint8_t i = 0; i <server.args (); i ++) {
   message + = "" + server.argName (i) + ":" + server.arg (i) + "\ n";
}

 server.send (404, "text / plain", message);
}

void Stop () {
    digitalWrite (Pin1, LOW);  
    digitalWrite (Pin2, LOW);
    digitalWrite (Pin3, LOW);
    digitalWrite (Pin4, LOW);
}

void runStateClose () {
 fDCClose = digitalRead (endOfCloseTrace);
 if (fDCClose == HIGH) // Change of state of the high limit switch (rising or falling edge)
 {
   Serial.println ("Door closed!"); // Display the text on the serial monitor
   gate status = 2;
   Stop();
 } else {
   statusGate = 0;

 }
}

void runOpenState () {
 fDCOopen = digitalRead (endOpenOpen);
 if (fDCOuvert == HIGH) {
   Serial.println ("Door open!");
   gate status = 1;
   Stop();
 } else {
   statusGate = 0;
 }
}

void motorControl () {

   if (server.arg (argId [0]) == "on")
   {
     dirStatus = 1; // CCW
             
   } else if (server.arg (argId [0]) == "off") {
     
     dirStatus = 3; // motor OFF
     
   } else if (server.arg (argId [1]) == "on") {
     
     dirStatus = 2; // CW  
         
   } else if (server.arg (argId [1]) == "off") {
     
     dirStatus = 3; // motor OFF
             
   }  

 handleRoot ();
} // motorControl end

void driveStepper (int c)
{
    digitalWrite (Pin1, pole1 [c]);  
    digitalWrite (Pin2, pole2 [c]);
    digitalWrite (Pin3, pole3 [c]);
    digitalWrite (Pin4, pole4 [c]);
} // driveStepper end here

void setup (void) {
 //Robojax.com 28BYJ-48 Steper Motor Control

pinMode (Pin1, OUTPUT); // define pin for ULN2003 in1
pinMode (Pin2, OUTPUT); // define pin for ULN2003 in2  
pinMode (Pin3, OUTPUT); // define pin for ULN2003 in3  
pinMode (Pin4, OUTPUT); // define pin for ULN2003 in4  
pinMode (endOfCloseTrace, INPUT);
pinMode (endOpenTroke, INPUT);

 Serial.begin (115200); // initialize the serial monitor
 Serial.println ("Robojax 28BYJ-48 Stepper Motor Control");

 //Robojax.com 28BYJ-48 Steper Motor Control
   
 WiFi.mode (WIFI_STA);
 WiFi.begin (ssid, password);
 Serial.println ("");
 
 // Wait for connection
 while (WiFi.status ()! = WL_CONNECTED) {
   delay (500);
   Serial.print (".");
 }

 Serial.println ("");
 Serial.print ("Connected to");
 Serial.println (ssid);
 Serial.print ("IP address: http: //");
 Serial.println (WiFi.localIP ());

// multicast DNS //Robojax.com 28BYJ-48 Steper Motor Control
 if (MDNS.begin ("robojaxESP32")) {
   Serial.println ("MDNS responder started");
   Serial.println ("access via http: // robojaxESP32");
 }

 server.on ("/", handleRoot);
 server.on ("/ motor", HTTP_GET, motorControl);    
 server.onNotFound (handleNotFound);
 server.begin ();
 Serial.println ("HTTP server started");

} // end of setup

void loop (void) {
   //Robojax.com 28BYJ-48 Steper Motor Control
 server.handleClient ();
if (dirStatus == 1) {
  poleStep ++;
  driveStepper (poleStep);
  openRaceState ();
 
} else if (dirStatus == 2) {
  poleStep--;
  driveStepper (poleStep);
  stateTraceClose ();

} else {
  statusGate = 0;
  driveStepper (8);  
}
if (poleStep> 7) {
  poleStep = 0;
}
if (poleStep <0) {
  poleStep = 7;
}

 delay (1);
 //Robojax.com 28BYJ-48 Steper Motor Control
} // end of loop

Code Tags </> on menu!

5_cylindres


simonlere

Re
Oups désolé le message est passé en anglais :(   
Dobc tout fonctionne bien sauf quand mon moteur atteint un  de fin de course, mon moteur s'arrête bien mais les leds du contrôleur de moteur restent allumées fixe, je suppose qu'il a toujours un signal  envoyé au moteur, Ma question: Cela peut endommagerait mon moteur à long terme.
Merci d'avance,

J-M-L

Le mieux pour développer quelque chose d'un peu avancé c'est d'y aller par petit bout.

D'abord lire la doc: Est-ce que ces leds sont significatives de quelque chose dans la doc ?

Si vous faites un petit code de 5 lignes dans le setup où le moteur se déplace jusqu'à une fin de course qui l'arrête -> est-ce que vous voyez ces leds (je ne sais pas desquelles vous parlez) ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up