Go Down

Topic: Controlar un servomotor con un pulsador (editado) (Read 200 times) previous topic - next topic

fefesaa

May 01, 2015, 02:04 am Last Edit: May 01, 2015, 04:06 am by fefesaa
Hola Arduinos, no se casi nada de programación y estoy tratando de aprovechar las bondades del arduino para combinarlo con el mundo del ferromodelismo. Mi idea es controlar los desvíos con un servomotor. La idea es que al presionar un pulsador el motor vaya de A hacia B y al presionarlo nuevamente, vaya de B hacia A y así sucesivamente.

El código que he escrito, luego de muchas horas en foros y videos, es el siguiente:

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

Servo myservo;

int pos = 30;
int pinBoton = 2;
int anterior = 0;
int estado = 0;
int encender = 0;

void setup()
{
  myservo.attach(12);

  pinMode(pinBoton, INPUT);
}

void loop()
{
estado = digitalRead(pinBoton);


if(estado && anterior == 0)
{
  encender = 1 - encender;
  delay(50);
}
anterior = estado;

  if(encender)
  {
    for(pos = 30; pos <= 60; pos++)  
                                      
    myservo.write(pos);              
    delay(100);    
  }
    else
   {
    for(pos = 60; pos>=30; pos--)    
                                  
    myservo.write(pos);              
    delay(100);                      
}
}


El problema que tengo es que queda el motor "bailando", es decir, hay rebote y a pesar de buscar y buscar, no logro evitar esto. Las repito que no se casi nada de programación, así es que si me dan una mano les estaré eternamente agradecido.

Por favor AYUDA!!!!

Gracias desde ya.

Saludos

surbyte

si comparas por HIGH es porque tienes una resistencia pull down. Es así. Tienes el pulsador conectado con una R de 10k a gnd y del otro lado esta conectado a +5V
En el punto en que se unen pulsador y R lo conectas a tu Pin 2.

Es correcto?
Si eso está bien, sigamos con tu programa.
Evidentemente tienes rebote, pero tu código

implementa este código que usa debounce

La diferencia esta en que arranca con un cambio 0 a 1 como en tu caso pero luego espera a confirmar el 1 50 mseg despues.
O sea sin rebotes.

fefesaa

Hola, gracias por la respuesta, como decía en el post, no se casi nada de programación y esperaba una respuesta mas concreta (se que es un abuso pero en el pedir no hay engaño). He revisado el código que me sugeriste y estoy haciendo el intento para que me funcione. Mas tarde comento como me ha ido.

Saludos y gracias nuevamente

surbyte

bien, voy a ser mas concreto entonces.
1. baja esta librería Bounce2 (github)

Esto hace la librería

Intervalo Estable

Por defecto la librería usa un intervalo estable para procesar los rebotes. Es simple de entender y puede cancelar el ruido no deseado.




2. Usando esta librería asi queda tu programa.

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

Servo myservo;
// Inicializo el objeto Bounce
Bounce debouncer = Bounce();

const byte pinBoton = 2;

int pos;
int estado;
bool encender  = false;

void setup()
{
  myservo.attach(12);

  pinMode(pinBoton, INPUT);
  debouncer.attach(pinBoton);
  debouncer.interval(5); // interval in ms Si ves que no sirven 5 incrementa hasta 20 mseg
}

void loop() {

    // actualiza la instancia Bounce
  debouncer.update();

  // obtiene el valor actualizado
  int estado = debouncer.read();

  if(estado)   {
    encender = !encender;
  }


  if(encender) {

    for (pos = 30; pos <= 60; pos++)                         
        myservo.write(pos);               
        delay(100);   
    }
    else {
        for (pos = 60; pos>=30; pos--)     
            myservo.write(pos);               
        delay(100);                       
    }
  }
}

Go Up