Brazo robótico con servos

Hola, buenas noches a todos. Este es mi primer tema en el foro de arduino y bueno, necesito ayuda.

Estoy haciendo un brazo robótico para el TFG del superior compuesto por 3 servos. Aquí hay una pequeña representación del mismo:

El servo de la base es “servo1”, el de en medio “servo2” y el de la punta “servo3”

Mi intención es que el servo1 esté en 90 grados (es decir hacia arriba, estático), que servo2 se mueva de 0 a 180 grados y de 180 a 0 , y que servo3 haga justo lo contrario al mismo tiempo, que se mueva de 180 a 0 y luego de 0 a 180, así sucesivamente.

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;

void setup() {

  servo1.attach(3);
  servo2.attach(5);
  servo3.attach(6);

  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
}

void loop() {

//sentido positivo 

  for (int x = 0; x <= 180; x++)
  for (int i = 179; i > 0; i--)
  {

    servo2.write(x);
    servo3.write(i);
    delay(25);
  }

//sentido negativo

  for (int x = 179; x > 0; x--)
    for (int i = 0; i <= 180; i++)
  {

    servo2.write(x);
    servo3.write(i);
    
    delay(25);
  }
}

He usado el bucle “for” para esto, ya que usando directamente la funcion “servo.write” el servo se mueve a gran velocidad, y me gustaría que fuese un movimiento lento.

Dado que quiero que ambos servos (2 y 3) se muevan con movimientos contrarios, he pensado en usar un bucle for con variable “x” y luego otro que vaya al contrario con variable “i” y que cada servo escriba con una variable diferente.

El problema es que no funciona, con ese código lo único que hace es mantener el servo1 en 90 grados (correcto), el servo 2 se queda fijo en 0 grados (deberia moverse de 0 a 180 y volver) y el servo 3 se mueve de 180 a 0 grados lentamente (bien) pero luego vuelve a 180 grados instantaneamente. No se que estoy haciendo mal.

Espero que me haya explicado correctamente, y agradezco a cualquiera que se haya molestado al menos en leerlo. Gracias!

Hola, pues lo que estas haciendo mal es que para el servo 2 si tienes un for de retorno, pero para el tres solo pones el de ida,

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;

void setup() {

  servo1.attach(3);
  servo2.attach(5);
  servo3.attach(6);

  servo1.write(90);
  servo2.write(90);
  servo3.write(90);
}

void loop() {

//sentido positivo 

  for (int x = 0; x <= 180; x++){
      for (int i = 180; i >= 0; i--){
          servo2.write(x);
          servo3.write(i);
          delay(25);
          }
      for (int i = 0; i <= 180; i++){
          servo2.write(x);
          servo3.write(i);
          delay(25);
          }         
      }

//sentido negativo

  for (int x = 180; x >= 0; x--){
      for (int i = 180; i >= 0; i--){
          servo2.write(x);
          servo3.write(i);
          delay(25);
          }
      for (int i = 0; i <= 180; i++){
          servo2.write(x);
          servo3.write(i);
          delay(25);
          }         
      }
}

Saludos.

Bueno creo que hay una discrepancia entre la consigna y el código.
Hacer que un servo vaya en un sentido y el otro en el opuesto no significa que uno lo haga servo3 de 180 a 0 180 veces como esta ocurriendo.
Lo que se debe hacer es que se mueve un contador por ejemplo x y el otro se maneja de modo opuesto. i = 180 - x y mientras uno se mueve en un sentido el otro lo hacen el en sentido opuesto.
Así:

void loop() {

//sentido positivo 

  for (int x = 0; x <= 180; x++){
      i = 180-x;
      servo2.write(x);
      servo3.write(i);
      delay(25);
  }
//sentido negativo

  for (int x = 180; x >= 0; x--){
      i = 180-x;
      servo2.write(x);
      servo3.write(i);
      delay(25);
  }
}

Esta ha sido mi interpretación de la consigna.

hola, muchas gracias por tu respuesta. ha funcionado lo que mencionas, el servo ya va y vuelve correctamente. el problema es que el servo 2 sigue sin moverse, se queda quieto en 0 grados.

Hola, ha funcionado. Al principio me daba un error (“i” was not declared in this scope) pero tras delcarar la variable antes del setup (no lo habia hecho, ni con la x ni con la i) ya funciona exactamente como quería. muchas gracias!

Ahh claro, pero esos errores yo dejo que los resuelvan Uds para aprender a entenderlos.
Yo no uso casi, declaraciones a lo largo del programa.

Y te pregunto: era asi como debe moverse? Porque el código que TU hiciste, movía 180 veces o sea repetía 180 veces los movimientos para uno y otro sentido.

1 Like

sí, era exactamente como quería que se moviera. ten en cuenta que el servo parte del grado 0 y gira 1 solo grado por cada repetición hasta llegar a 180 grados. de esta manera logro que se mueva lentamente.

usando la función servo.write el servo gira instantaneamente a la posición y no se puede controlar la velocidad del mismo, en este programa ajustando el delay puedo elegir a que velocidad gira.

no se si es eso a lo que te referías

Extraigo este fragmento del código para poder explicarte.

Lo que hace el primer for es variar x de 0 a 180. Eso lo sabes porque tu lo programaste.
El segundo hace lo mismo para i. Pero el anidamiento o sea al estar uno dentro del otro, hace que el ciclo para i se repita por cada x por lo que terminas teniendo 180x180 pasos i o sea en el servo3. Algo que debiste haber apreciado. Servo2 se queda detenido por cada ciclo completo de servo3.
Por eso mi sugerencia de que cuando x se mueve de 0 a 180, i haga lo inverso entonces cumples el objetivo correctamente.