Arduino - Projeto Braço mecanico


#1

Boa tarde, amigos. Sou estudante de arduino e, estou com uma dificuldade, conto com a ajuda de voces. Estou fazendo um projeto de um braço mecânico usando nodemcu, onde eu controlo ele via navegador. O código esta funcionando normalmente, porem tenho um problema no “while”. Quando eu mando tal comando no navegador, esse “while” é executado, porem quando eu mando outro comando no navegador para esse “while” parar, ele não executa, só é executado apos que termina o while. Gostaria de saber o que devo fazer para que quando eu der outro comando no navegador, esse “while” pare na mesma hora.

Esse é o trecho onde está o problema, tal qual todo trecho que tem while no programa da o mesmo problema.

           // Inicia braço pra traz automatico
           if(code == 8) {
             if(pos2 >= 100 && pos3 <= 163) {
               while (code==8 && pos2 >= 100 && pos3 <= 163) {                          
                 pos2 -= 1.9;
                 pos3 += 2.6;
                 servo2.write(pos2); 
                 servo3.write(pos3); 
                 Serial.println();
                 Serial.print("Angulo do Ante Braço: ");
                 Serial.println(pos2);
                 Serial.print("Angulo do Braço: ");
                 Serial.println(pos3);
                 delay(150);  
               } 
             }               
           }
           // Finaliza braço pra traz automático

Aqui está o codigo inteiro:

#include <ESP8266WiFi.h>
#include<WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;

const char *ssid = "PedroMarcos ";
const char *password = “pedrorafael”;

ESP8266WebServer server(80);
int pos;
float pos2;
float pos3;
int pos4;
int pos5;

void handleRoot() {
server.send(200, “text/html”, “Projeto de Faculdade

Protótipo de Braço Mecânico

<a href=“servo1?code=1”>Chave Esquerda

<a href=“servo1?code=2”>Chave Central

<a href=“servo1?code=3”>Chave Direita

”);
}

void MoveServo(){
for (uint8_t i=0; i<server.args(); i++){
if(server.argName(i) == “code”)
{
unsigned long code = server.arg(i).toInt();

           // Inicia giro a direita
           if(code == 1) {
             if(pos <= 178) {                         
                 pos += 2;
                 servo1.write(pos);
                 Serial.println();
                 Serial.print("Angulo da Base: ");
                 Serial.println(pos);               
                 delay(15);          
               }  
          }
          // Finaliza Giro a Direita


           // Inicia giro a esquerda
           if(code == 2) {
             if(pos >= 2) {                         
                 pos -= 2;
                 servo1.write(pos);  
                 Serial.println();
                 Serial.print("Angulo da Base: ");
                 Serial.println(pos);
                 delay(15);   
               }
         }
         // Finaliza Giro a Esquerda


         // Inicia giro automático a direita
           if(code == 3) {                        
              if(pos <= 178) {                         
                while(code == 3 && pos <= 178){
                      pos += 2;
                      servo1.write(pos);
                      Serial.println();
                      Serial.print("Angulo da Base: ");
                      Serial.println(pos);               
                      delay(100);
                    }
                  }   
                }
         // Finaliza Giro automatico a direita
         

           //Inicia giro automático a esquerda
           if(code == 4) {
             if(pos >= 2) { 
               while (code == 4 && pos >= 2) {                      
                 pos -= 2;
                 servo1.write(pos);  
                 Serial.println();
                 Serial.print("Angulo da Base: ");
                 Serial.println(pos);
                 delay(100);   
                 }
                }           
               }
         // Finaliza giro automático a esquerda

           // Inicia Braço pra frente
           if(code == 5) {
             if(pos2 <= 168 && pos3 >= 2) {                         
                 pos2 += 1.9;
                 pos3 -= 2.6;
                 servo2.write(pos2); 
                 servo3.write(pos3); 
                 Serial.println();
                 Serial.print("Angulo do Ante Braço: ");
                 Serial.println(pos2);
                 Serial.print("Angulo do Braço: ");
                 Serial.println(pos3);
                 delay(15); 
               }               
         }
         // Finaliza Braço pra frente


         // Inicia Braço pra traz  
           if(code == 6) {
             if(pos2 >= 100 && pos3 <= 163) {                         
                 pos2 -= 1.9;
                 pos3 += 2.6;
                 servo2.write(pos2); 
                 servo3.write(pos3); 
                 Serial.println();
                 Serial.print("Angulo do Ante Braço: ");
                 Serial.println(pos2);
                 Serial.print("Angulo do Braço: ");
                 Serial.println(pos3);
                 delay(15);  
               }              
         }
         // Finaliza braço pra traz


         // Inicia braço pra frente automático
           if(code == 7) {
             if(pos2 <= 168 && pos3 >= 2) {                         
                 while (code==7 && pos2 <= 168 && pos3 >= 2 ){
                   pos2 += 1.9;
                   pos3 -= 2.6;
                   servo2.write(pos2); 
                   servo3.write(pos3); 
                   Serial.println();
                   Serial.print("Angulo do Ante Braço: ");
                   Serial.println(pos2);
                   Serial.print("Angulo do Braço: ");
                   Serial.println(pos3);
                   delay(150); 
                 }
               }               
             }
            // Finaliza braço pra frente automático


           // Inicia braço pra traz automatico
           if(code == 8) {
             if(pos2 >= 100 && pos3 <= 163) {
               while (code==8 && pos2 >= 100 && pos3 <= 163) {                          
                 pos2 -= 1.9;
                 pos3 += 2.6;
                 servo2.write(pos2); 
                 servo3.write(pos3); 
                 Serial.println();
                 Serial.print("Angulo do Ante Braço: ");
                 Serial.println(pos2);
                 Serial.print("Angulo do Braço: ");
                 Serial.println(pos3);
                 delay(150);  
               } 
             }               
           }
           // Finaliza braço pra traz automático


           // Inicia Movimento do Punho pra cima
           if(code == 9) {
             if(pos4 >= 2) {                         
                   pos4 -= 2;
                   servo4.write(pos4);  
                   Serial.println();
                   Serial.print("Angulo do Punho: ");
                   Serial.println(pos4);
                   delay(15);   
               }                
           }
           // Finaliza Movimento do Punho pra cima


           // Inicia Movimento do Punho pra baixo
           if(code == 10) {
             if(pos4 >= 0 && pos4 <=118) {                        
                 pos4 += 2;
                 servo4.write(pos4);  
                 Serial.println();
                 Serial.print("Angulo do Punho: ");
                 Serial.println(pos4);
                 delay(15); 
               }                
           }
           // Finaliza Movimento do Punho pra baixo


           //Inicia Garra Aberta
           if(code == 11) {
             if(pos5 == 103) {                         
                 pos5 -= 18;
                 servo5.write(pos5);  
                 Serial.println();
                 Serial.print("Angulo da Garra: ");
                 Serial.println(pos5);
                 Serial.print("Garra Aberta");
                 delay(15);   
               }                
           }
           //Finaliza Garra Aberta

         
           //Inicia Garra Fechada
           if(code == 12) {
             if(pos5 == 85) {                         
                 pos5 += 18;
                 servo5.write(pos5);  
                 Serial.println();
                 Serial.print("Angulo da Garra: ");
                 Serial.println(pos5);
                 Serial.print("Garra Fechada");
                 delay(15);   
               }                
           }
           // Finaliza Garra Fechada

           // Inicia o reset
           if(code == 13) {                        
             pos2 = 92;
             servo2.write(92);
             Serial.println(pos2);
             delay(1000);
             pos4 = 0;
             servo4.write(0);
             Serial.println(pos4);
             delay(1000);
             pos5 = 85;
             servo5.write(85);
             Serial.println(pos5);
             delay(15);
             pos3 = 159;
             servo3.write(159);
             Serial.println(pos3);
             delay(1000);
             pos = 65;
             servo1.write(65);
             Serial.println(pos);
           }
           // Finaliza o Reset
         
      }
 }

handleRoot();
}

void setup(void){
Serial.begin(9600);
WiFi.softAP(ssid, password);
server.on("/", handleRoot);
server.begin();
Serial.print(“Ponto de Acesso Ligado”);

server.on("/servo", MoveServo);

servo1.attach(4);
servo2.attach(14);
servo3.attach(13);
servo4.attach(2);
servo5.attach(5);
servo2.write(98);
delay(1000);
servo4.write(0);
delay(1000);
servo5.write(85);
delay(15);
servo3.write(165);
delay(1000);
servo1.write(65);

pos = servo1.read();
pos2 = servo2.read();
pos3 = servo3.read();
pos4 = servo4.read();
pos5 = servo5.read();
}

void loop(void){
server.handleClient();
}

Grato pela colaboração.


#2

uma opção é ler os valores de posição dentro do while ou Serial.read()


#3

Boa noite Thomaz, então, quando eu faço a requisição para o cliente chamar o código no navegador ele faz uma vez só, e ai quando ele entra no while ele nao chama mais, eu queria uma forma para que quando ele entra dentro do while, ele continue recebendo o comando do navegador, para que eu possa passar o comando e parar o while, pelo navegador.

Por exemplo:

if(code == 8) {
if(pos2 >= 100 && pos3 <= 163) {
while (code==8 && pos2 >= 100 && pos3 <= 163) {
pos2 -= 1.9;
pos3 += 2.6;
servo2.write(pos2);
servo3.write(pos3);
Serial.println();
Serial.print("Angulo do Ante Braço: ");
Serial.println(pos2);
Serial.print("Angulo do Braço: ");
Serial.println(pos3);
delay(150);
}
}
}

Quando eu digito code == 8 no navegador, ele entra nesse while, eu queria que quando eu digitasse por exemplo code == 7, ele saísse desse while e parasse, coisa que não esta acontecendo.


#4

Então dentro do while deverá ser requisitado nova leitura do navegador para confirmar que o valor ainda se mantem ou nao


#5

Exatamente. Mas não consegui fazer isso. Você tem alguma ideia de como faça isso?