Go Down

Topic: ¡Necesito ayuda con un pulsador! (RESUELTO) (Read 483 times) previous topic - next topic

Fredogodofredo

Apr 21, 2014, 11:36 pm Last Edit: Apr 24, 2014, 04:21 am by Fredogodofredo Reason: 1
Saludos desde Guatemala, la cosa es:
Casi termino mi proyecto de una mano con servos pero el problema es que la presentaré como una maqueta interactiva entonces necesito que al presionar el pulsador los servos se muevan, y consigo, la mano. Pero no logro hacerlo, tengo pocos conocimientos de programación y he probado con ejemplos que he leído en el foro pero nada de nada  :(

Éste es mi código y lo que esta en el loop es lo que necesito que haga al presionar el pulsador, cuando termine vuelva a caer en posición normal y así sucesivamente.

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

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

void setup()
{
 servo1.attach(3);
 servo2.attach(5);
 servo3.attach(6);
 servo4.attach(9);
 servo5.attach(10);
 
}

void loop()
{
 servo2.write(155);
 servo4.write(155);
 servo5.write(155);
 servo3.write(0);
 servo1.write(0);

 delay(2000);
 
 servo2.write(0);    //contracción cascada
 delay(250);
 servo4.write(0);
 delay(250);
 servo5.write(0);
 delay(250);
 servo3.write(135);
 delay(250);
 servo1.write(135);
 
 delay(2000);
 
 servo2.write(155);//posición normal
 servo4.write(155);
 servo5.write(155);
 servo3.write(0);
 servo1.write(0);
 
 delay(4000);
 
 servo2.write(0);
 servo4.write(0);
 servo1.write(135);
 
 delay(4000);
 
 
}

tifilus

buenas!

échale un vistazo a este post:

http://forum.arduino.cc/index.php?topic=228044.0

ahí tienes la solución al pulsador + servo

Entiendo que son 5 servos los que usas, verdad?

Fredogodofredo

#2
Apr 23, 2014, 02:46 am Last Edit: Apr 23, 2014, 02:51 am by Fredogodofredo Reason: 1
Gracias por el link pero no resuelve mi duda totalmente, pues sí puedo conectar el servo a un pulsador y manejarlo así en sólo 2 posiciones. El problema radica en que al finalizar la acción que se realiza al presionar el botón regrese a como estaba antes de presionarlo (como un reset) y así al volver a presionarlo haga lo mismo y regrese, lo mismo y regrese.

Y sí, utilizo 5 microservos.

tifilus

Es decir, quieres dar a  un pulsador y que el servo vaya a una posicion y vuelva a la original? en cuanto tiempo?

si es así y por ejemplo inicializas el servo en una posicion (la que tu quieras) con una variable (por ejemplo "pos") y vuelves a esa posicion despues:

Code: [Select]


int pos1=90;
Servo servo1;

void setup(){
servo1.attach (3);
servo1.write(pos1)
}

void loop(){
//despues de pulsar el boton
servo1.write (180);//o a la posicion que lo quieras mover. Tambien puedes llegar hasta ahi poco a poco con un "for"
servo1.write (pos1);
}



como ves, puedes evitar el "pos1", pero al tener 5 servos puede ser interesante que guardes las posiciones de origen con estas variables para que no te confundas..

no se si esto te ayuda.. espero que si.. sino es que no te he entendido muy bien, jeje  XD

Fredogodofredo

¡Hey! Muchas gracias me has dado una idea de como arreglarlo

Code: [Select]

#include <Servo.h>

int buttonPin =2;

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

int pos1=90;
int buttonState = 0;
boolean state;

void setup(){
  Serial.begin(9600);
  servo1.attach(3);
  servo2.attach(5);
  servo3.attach(6);
  servo4.attach(9);
  servo5.attach(10);
  servo1.write(pos1);
  servo2.write(pos1);
  servo3.write(pos1);
  servo4.write(pos1);
  servo5.write(pos1);
  pinMode(buttonPin, INPUT);
}

void loop(){
  buttonState = digitalRead(buttonPin);
  delay(200);
  if (buttonState == HIGH ){
    state = !state;
  }
  Serial.print(buttonState);
  Serial.println(state);

  if (state==true){
  servo2.write(0);    //contracción cascada
  delay(250);
  servo4.write(0);
  delay(250);
  servo5.write(0);
  delay(250);
  servo3.write(135);
  delay(250);
  servo1.write(135);
  delay(2000);
  servo2.write(165);   
  delay(250);
  servo4.write(165);
  delay(250);
  servo5.write(165);
  delay(250);
  servo3.write(0);
  delay(250);
  servo1.write(0);
  }
  else{
  servo2.write(155);//posición normal
  servo4.write(155);
  servo5.write(155);
  servo3.write(0);
  servo1.write(0);
  }
}


el problema ahora es que al presionar el botón se inicia el loop de //contracción cascada pero vuelve y vuelve a iniciar de manera que no me deja volver a presionar el botón para que suceda el "else //posición normal"
¿como puedo hacer para que se detenga?

Fredogodofredo

¡La que me he liado!

Bueno, al fin lo he resuelto (luego de 4 largos días  :smiley-sad-blue:)
les comparto el código por si alguna vez lo necesitan para algún proyecto. Utilicé un código que encontré en otro post que lo que hacia era mover el servo hasta una posición mientras se mantenía el pulsador presionado. Lo que hice fue modificarlo e incluir más funciones dentro del "single servo function" al final resultó ser justo como quería y no sé como  :smiley-eek-blue: :smiley-yell: :smiley-yell:

Code: [Select]

#include <Servo.h>

int currState = HIGH;
int prevState = HIGH;
int buttonPin = 2;

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

void setup ()
{
  Serial.begin(9600);
  servo1.attach(3);
  servo2.attach(5);
  servo3.attach(6);
  servo4.attach(9);
  servo5.attach(10);
  pinMode(buttonPin, INPUT);
}



void loop()
{
   currState = digitalRead(buttonPin);
   if(currState != prevState)
   {
      // A transition occurred
      if(currState == LOW)
      {
  servo1.write(0);
  delay(250);
  servo2.write(165);   
  delay(250);
  servo4.write(165);
  delay(250);
  servo5.write(165);
  delay(250);
  servo3.write(0);
  delay(250);

  // Switch is now pressed
      }
      else
      {
        servo1.write(135);
        delay(250);
        servo2.write(0);    //contracción cascada
        delay(250);
        servo4.write(0);
        delay(250);
        servo5.write(0);
        delay(250);
        servo3.write(135);
        delay(250);
        servo1.write(0);
  delay(250);
  servo2.write(165);   
  delay(250);
  servo4.write(165);
  delay(250);
  servo5.write(165);
  delay(250);
  servo3.write(0);
  delay(250);
           servo2.write(0);
           servo4.write(0);
           servo1.write(135);
           delay(2000);
       
  // Switch is now released
      }
   }
   prevState = currState;
}

Go Up