Detener loop con bucle

Buenas
hace unos dias, escribi por un problemilla al controlar los servos, atraves de php y serial, ya voy avanzando ( me he leido como medio internet ya )

el problema lo tengo en detener el loop con una condicion, eh intentado hacer otro bucle principal, pero no me lo hace, y se me quedan aveces los servos como “temblando”, como si se quisieran mover y no pudieran.

el codigo que tengo hasta ahora es este:

un HTML o PHP para enviar los datos

<body id="main_body" >
	
	<img id="top" src="top.png" alt="">
	<div id="form_container">
	
		<h1><a>Untitled Form</a></h1>
		
		
			<a href="index.php?valor=1">1<a>
			<a href="index.php?valor=2">2<a>
            <a href="index.php?valor=3">3<a>
			


	</div>
	
	</body>

EL PHP que los recibe y envia a arduino

<?php
//La siguiente linea configura el modo de conexion a el com3 y 9600 baudios
exec("mode COM3 BAUD=9600 PARITY=N data=8 stop=1 xon=off");
 
$fp = @fopen ("COM3", "w");
if (!$fp) {
   $status = "No conectado";
} else {
   $status = "Conectado";
}

echo $status;



if($_GET["valor"] == 1)
	{
		$datos = 1;
	}elseif($_GET["valor"] == 2)
	{
		$datos = 2;
	}elseif($_GET["valor"] == 3)
	{
		$datos = 3;
	}
	

fwrite($fp, $datos);
sleep(1); 
fclose($fp);
?>

y el codigo arduino que los interpreta, yo creo que es aqui donde esta el fallo.

#include <Servo.h>

Servo myservo1;  // crea el objeto servo
Servo myservo2;  // crea el objeto servo
Servo myservo3;  // crea el objeto servo
int numero;
int pos = 0;
int bucle = 0;



void setup()
{
  Serial.begin(9600);
  myservo1.attach(9);  // vincula el servo al pin digital 9
  myservo2.attach(11);  // vincula el servo al pin digital 9
  myservo3.attach(22);  // vincula el servo al pin digital 9

}


void loop()
{
  if (Serial.available() > 0)
  {
    numero = Serial.read();
  }

  for (bucle = 0; bucle <= 2; bucle ++)
  {
    if (numero == '1')
    {
      for (pos = 0; pos <= 180; pos += 1)
      {
        myservo1.write(pos);

      }
      for (pos = 180; pos >= 0; pos -= 1)
      {
        myservo1.write(pos);
        delay(15);

      }
    }
    if (numero == '2')
    {
      for (pos = 0; pos <= 180; pos += 1)
      {

        myservo2.write(pos);
        delay(15);
      }
      for (pos = 180; pos >= 0; pos -= 1)
      {

        myservo2.write(pos);
        delay(15);
      }
    }
    if (numero == '3')
    {
      for (pos = 0; pos <= 180; pos += 1)
      {

        myservo3.write(pos);
        delay(15);
      }
      for (pos = 180; pos >= 0; pos -= 1)
      {

        myservo3.write(pos);
        delay(15);
      }
    }
  }
}

alguien sabria decirme cual es el problema? realmente tan solo quiero mover un servo a la vez, segun que opcion le envie, si es un 1, el servo 1, un 2 el servo 2 y asi… y me gustaria que se moviesen solo 1 vez, es decir un ciclo que vaya desde la posicion origen hasta 180º y vuelva al origen y se detenga el loop, pero creo que tengo mal mi bucle for:

for (bucle = 0; bucle <= 2; bucle ++)

Gracias

La variable numero tiene que ser char no int.
Y el primer for está de más.
Prueba y lo seguimos viendo.

Saludos

Buenas

ya lo cambie, pero ahora ni siquiera me hace nada cuando mando la orden desde el php :frowning:

#include <Servo.h>

Servo myservo1;  // crea el objeto servo
Servo myservo2;  // crea el objeto servo
Servo myservo3;  // crea el objeto servo
char numero = 0;
int pos = 0;
int bucle = 0;



void setup()
{
  Serial.begin(9600);
  myservo1.attach(9);  // vincula el servo al pin digital 9
  myservo2.attach(11);  // vincula el servo al pin digital 9
  myservo3.attach(22);  // vincula el servo al pin digital 9

}


void loop()
{
  if (Serial.available() > 0)
  {
    numero = Serial.read();
  }


    if (numero == '1')
    {
      for (pos = 0; pos <= 180; pos += 1)
      {
        myservo1.write(pos);

      }
      for (pos = 180; pos >= 0; pos -= 1)
      {
        myservo1.write(pos);
        delay(15);

      }
    }
    if (numero == '2')
    {
      for (pos = 0; pos <= 180; pos += 1)
      {

        myservo2.write(pos);
        delay(15);
      }
      for (pos = 180; pos >= 0; pos -= 1)
      {

        myservo2.write(pos);
        delay(15);
      }
    }
    if (numero == '3')
    {
      for (pos = 0; pos <= 180; pos += 1)
      {

        myservo3.write(pos);
        delay(15);
      }
      for (pos = 180; pos >= 0; pos -= 1)
      {

        myservo3.write(pos);
        delay(15);
      }
    }
}

Edito parece que ahora si que va, quizas haya fallado algo en el localhost y este tardando mas de lo normal en enviar las variables, aunque siendo un solo digito no deberia tardar demasiado

Pone

Serial.print(numero);

después de

Serial.read...

a ver si está recibiendo bien los comandos.
Y ahora que me doy cuenta, al final poné

numero = '\0';

Sino cuando tome un comando lo va a repetir indefinidamente hasta que reciba otro.

sip, se imprime bien en la consola, pero me suele fallar bastante el enviar desde el localhost, no se si sera porque es un metodo mas lento o que..
y luego aveces el tembleque ese creo que es porque no da mas de si el giro, eh intenta seguir, aunque le tengo a 180º, en realidad lo que necesito es moverlo solo 90, osea de estas el servo tumbado moverse 90º y regresar, pero sera cuestion de ir jugando un poco con los grados hasta dar la posicion y movimientos correctos

Ahí ya no te puedo ayudar… :-[

na muchas gracias, me has ayudado bastante, ahora me voy hasta el carreful que hay que comer y eso jaja

Muy bien, energía para seguir pensando! Jejé

Saludos

El primer error en este programa luego de que no funciona aclaro es insistir con el código que involucra los servos.
Hazlos a un lado y simplemente prueba la comunicación serie.

char numero;

void setup() {
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)  {
      numero = Serial.read();
      Serial.print(numero);
  }
}

Esto debe mostrarte en tu monitor serie los datos enviados. No uses el php, primero usa un terminal cualquier de la PC enviando por el COMX que corresponda.

Cuando eso funcione, repite con tu código en php, cuando eso funcione, ya podrás agregar los servos.

Siempre simplifica, no agregues dudas.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.