Go Down

Topic: Problema con motores pap y Ethernet Shield (Read 154 times) previous topic - next topic

Topor2016

Hola a todos.

Estoy haciendo un proyecto que consiste en controlar remotamente unos prismaticos o binoculares utilizando un Ethernet Shield, Arduino mega, dos motores nema17 y dos driver TB6600.

Para los movimientos laterales y verticales he creado cuatro botones y mi idea es poder seleccionar entre avance normal o avance rapido, para ello he añadido un checkbox:




El problema es que cuando le doy a los botones Arriba o Abajo (son los unicos botones que he programado de momento para hacer pruebas) el motor hace como un intento de moverse pero se queda clavado.

Este es el codigo que estoy utiizando:

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <AccelStepper.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);
EthernetServer servidor(80);

String readString = String(30);
//boolean MaxSpeed = false;

#define StepVertDirPin 22
#define StepVertPulPin 24

AccelStepper StepVert(AccelStepper::DRIVER, StepVertPulPin, StepVertDirPin);

#define StepMaxSpeed 1000.0
#define StepMinSpeed 100.0

void setup()
{
  Ethernet.begin(mac, ip);
  servidor.begin();

  StepVert.setMaxSpeed(StepMaxSpeed);
  StepVert.setAcceleration(100.0);
  StepVert.setMinPulseWidth(10.0);
  StepVert.setSpeed(StepMinSpeed); // lo pongo a 0

}

void loop()
{

  EthernetClient cliente = servidor.available();

  if (cliente)
  {

    boolean lineaenblanco = true;

    while (cliente.connected()) //Cliente conectado
    {
      if (cliente.available())
      {

        char c = cliente.read();

        if (readString.length() < 30) //Leemos petición HTTP caracter a caracter
        {
          readString.concat(c); //Almacena los caracteres en la variable readString
        }

        if (c == '\n' && lineaenblanco) //Si la petición HTTP ha finalizado
        {

          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          cliente.println();
          cliente.print  ("<body style=background-color:green>"); //set background to white
          cliente.println("<html>");
          cliente.println("<head>");
          cliente.println("<title>Arduino Remote Control</title>");
          cliente.println("</head>");
          cliente.println("<body width=100% height=100%>");
          cliente.println("<center>");
          cliente.println("<h1>Arduino Remote Control</h1>");
          cliente.print("<br><br>");
          cliente.print("Movimientos: ");

          cliente.print("<br><br>");
          cliente.println("<input type=submit value=Arriba style=width:200px;height:75px onClick=location.href='./?VER=U\'>");

          cliente.print("<br><br>");
          cliente.println("<input type=submit value=Izquierda style=width:200px;height:75px onClick=location.href='./?HOR=I\'>");
          cliente.println("<input type=submit value=Derecha style=width:200px;height:75px onClick=location.href='./?HOR=D\'>");

          cliente.print("<br><br>");
          cliente.println("<input type=submit value=Abajo style=width:200px;height:75px onClick=location.href='./?VER=A\'>");

          cliente.print("<br><br><br><br>");
          cliente.println("<form method=\"get\">");

          int Status = readString.indexOf("Avance=");
          if (readString.substring(Status, Status + 8) == "Avance=2") {
            cliente.println("<input type=\"checkbox\" name=\"Avance\" value=\"1\" \\ onclick=\"submit();\" checked>Avance rapido");
            //            MaxSpeed = true;
          } else {
            cliente.println("<input type=\"checkbox\" name=\"Avance\" value=\"2\" \\  onclick=\"submit();\">Avance rapido");
            //            MaxSpeed = false;
          }

          cliente.println("</form>");
          cliente.println("</center>");
          cliente.println("</body>");
          cliente.println("</html>");

          cliente.stop();//Cierro conexión con el cliente

          //Boton Arriba
          if (readString.indexOf("VER=U") > 0)
          {
            StepVert.setSpeed(StepMaxSpeed);
            StepVert.runSpeed();
          }

          //Boton Abajo
          if (readString.indexOf("VER=A") > 0)
          {
            StepVert.setSpeed(-StepMaxSpeed);
            StepVert.runSpeed();
          }

          readString = "";

        }
      }
    }
  }
}


Para descartar problemas de cableado, configuracion de pasos del driver y otros posibles fallos, he probado solo este codigo y el motor gira perfectamente:

Code: [Select]
#include <AccelStepper.h>

AccelStepper stepper(1, 24, 22);

void setup() { 
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(550);
  stepper.setSpeed(1000);
}

void loop() {
    stepper.setSpeed(1000);   
    stepper.runSpeed();
}


Otro problema que tengo y que no he sabido resolver es que si marco la opcion "Avance rapido" al pulsar cuanquier boton, esta se desmarca sola..

Gracias.

Topor2016

Pues nada, a base de pruebas he podido solucionar ambos problemas. No se si seran las mejores soluciones ya que no controlo mucho la programacion de arduino y menos aun la parte html del ethernet shield, pero bueno, es lo que me ha funcionado..

Me habia currado un post explicando todos los cambios, pero habia excedido los 9000 caracteres del foro de arduino, asi que dejo el codigo y listo:

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <AccelStepper.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 100);
EthernetServer servidor(80);
String HTTP_req;

boolean MaxSpeed = false;
boolean MaxSpeedStatus = 0;

#define StepVertDirPin 22
#define StepVertPulPin 24
#define StepHorDirPin 26
#define StepHorPulPin 28

AccelStepper StepVert(AccelStepper::DRIVER, StepVertPulPin, StepVertDirPin);
AccelStepper StepHor(AccelStepper::DRIVER, StepHorPulPin, StepHorDirPin);

#define StepVertMaxSpeed 1000
#define StepVertMinSpeed 500
#define StepHorMaxSpeed 1000
#define StepHorMinSpeed 500

boolean arriba = false;
boolean abajo = false;
boolean der = false;
boolean izq = false;
boolean stoper = false;

void setup()
{
  Ethernet.begin(mac, ip);
  servidor.begin();

  StepVert.setMaxSpeed(StepVertMaxSpeed);
  StepVert.setAcceleration(100);
  StepVert.setSpeed(StepVertMinSpeed);
  StepHor.setMaxSpeed(StepHorMaxSpeed);
  StepHor.setAcceleration(100);
  StepHor.setSpeed(StepHorMinSpeed);
}

void loop()
{

  EthernetClient cliente = servidor.available();

  if (cliente)
  {

    boolean currentLineIsBlank = true;

    while (cliente.connected()) //Cliente conectado
    {
      if (cliente.available())
      {
        char c = cliente.read();
        HTTP_req += c;

        if (c == '\n' && currentLineIsBlank) {

          if (HTTP_req.indexOf("?VER=U") > 0) {
            arriba = true;
            abajo = false;
            der = false;
            izq = false;
            stoper = false;

          } else if (HTTP_req.indexOf("?VER=A") > 0) {
            abajo = true;
            arriba = false;
            der = false;
            izq = false;
            stoper = false;

          } else if (HTTP_req.indexOf("?HOR=D") > 0) {
            der = true;
            abajo = false;
            arriba = false;
            izq = false;
            stoper = false;

          } else if (HTTP_req.indexOf("?HOR=I") > 0) {
            izq = true;
            abajo = false;
            arriba = false;
            der = false;
            stoper = false;

          } else if (HTTP_req.indexOf("?STO=P") > 0) {
            stoper = true;
            abajo = false;
            arriba = false;
            der = false;
            izq = false;
          }

          cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");
          cliente.println();
          cliente.print  ("<body style=background-color:green>"); //set background to white
          cliente.println("<html>");
          cliente.println("<head>");
          cliente.println("<title>Movimientos: </title>");
          cliente.println("</head>");
          cliente.println("<body width=100% height=100%>");
          cliente.println("<center>");
          cliente.println("<div>");
          cliente.println("<h1>Movimientos: </h1>");
          cliente.print("<br><br>");
          cliente.println("<input type=submit value=Arriba style=width:200px;height:75px onClick=location.href='./?VER=U\'>");
          cliente.print("<br><br>");
          cliente.println("<input type=submit value=Izquierda style=width:200px;height:75px onClick=location.href='./?HOR=I\'>");
          cliente.println("<input type=submit value=Derecha style=width:200px;height:75px onClick=location.href='./?HOR=D\'>");
          cliente.print("<br><br>");
          cliente.println("<input type=submit value=Abajo style=width:200px;height:75px onClick=location.href='./?VER=A\'>");
          cliente.print("<br><br><br><br>");
          cliente.println("<input type=submit value=Stop style=width:100px;height:45px onClick=location.href='./?STO=P\'>");
          cliente.print("<br><br>");
          cliente.println("<form method=\"get\">");
          cliente.println("<input type=\"hidden\" name=\"ChangeStatus\">");
          ProcessCheckbox(cliente);
          cliente.println("</form>");
          cliente.println("</div>");
          cliente.println("</center>");
          cliente.println("</body>");
          cliente.println("</html>");

          HTTP_req = "";
          break;
        }

        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }

      }
    }
    delay(1);
    cliente.stop();
  }

  if (arriba) {
    if (MaxSpeed) {
      StepVert.setSpeed(StepVertMaxSpeed);
      StepVert.runSpeed();
    } else {
      StepVert.setSpeed(StepVertMinSpeed);
      StepVert.runSpeed();
    }


  } else if (abajo) {
    if (MaxSpeed) {
      StepVert.setSpeed(-StepVertMaxSpeed);
      StepVert.runSpeed();
    } else {
      StepVert.setSpeed(-StepVertMinSpeed);
      StepVert.runSpeed();
    }

  } else if (der) {
    if (MaxSpeed) {
      StepHor.setSpeed(StepHorMaxSpeed);
      StepHor.runSpeed();
    } else {
      StepHor.setSpeed(StepHorMinSpeed);
      StepHor.runSpeed();
    }

  } else if (izq) {
    if (MaxSpeed) {
      StepHor.setSpeed(-StepHorMaxSpeed);
      StepHor.runSpeed();
    } else {
      StepHor.setSpeed(-StepHorMinSpeed);
      StepHor.runSpeed();
    }

  } else if (stoper) {
    StepVert.stop();
    StepHor.stop();
  }

}

void ProcessCheckbox(EthernetClient cl)
{
  if (HTTP_req.indexOf("ChangeStatus") > -1) {
    if (HTTP_req.indexOf("?ChangeStatus=&Avance=2") > -1) {
      MaxSpeedStatus = 1;
    } else {
      MaxSpeedStatus = 0;
    }
  }

  if (MaxSpeedStatus) {
    cl.println("<input type=\"checkbox\" name=\"Avance\" value=\"2\" \onclick=\"submit();\" checked>Avance rapido");
    MaxSpeed = true;
  } else {
    cl.println("<input type=\"checkbox\" name=\"Avance\" value=\"2\" \onclick=\"submit();\">Avance rapido");
    MaxSpeed = false;
  }
}

Go Up