Páginas

Control de Servomotor con dos pulsadores

En este proyecto se muestra la creacion de un control basado en dos botones para control de un servomotor de giro restringido.

Un servomotor es un tipo de motor ocupado ampliamente en aplicaciones robóticas. Las principales características que lo hacen especial son:
Alto torque generado por un sistemas de engranajes integrado
Control angular de la posición, lo que se consigue gracias a un sistema electrónico incorporado.

Con un microcontrolador como Arduino podemos controlar este tipo de motores, generando lo que se conoce como Modulación de Ancho de Pulso o PWM (en ingles).

Mediante el uso de la estructura "while" podemos crear un control para un servomotor de giro restringido. De forma que tendremos un botón que aumenta el ángulo y otro que lo disminuye.
Los materiales necesarios son:
1.- Servomotor de giro restringido
2.- 2 pulsadores
3.- 2 resistencias de 240 Ohm
4.- Protoboard
5.- Cables para conexión
6.- Arduino

A continuación se muestra el diagrama electrónico, que ha sido esquematizado con el software Fritzing.


 

 Luego de montar el circuito, lo que resta es la programación que haga funcionar todo.

El algoritmo tiene que hacer lo siguiente: cuando se apriete un pulsador el motor tiene que incrementar el ángulo de posición, lo que equivale a decir que gire hacia un lado. Al soltar ambos pulsadores el motor debe quedar fijo en la ultima posición  en la que estaba y finalmente al presionar el otro pulsador el motor debe girar en sentido contrario o disminuir el valor del ángulo de posición.

La restricción es que el motor acepta como valor mínimo 0 grados y como valor máximo 180 grados. Esta restricción también debe ser incluida en nuestro algoritmo.

Para ello se debe contar con el software de Arduino instalado. Si no lo tienes lo puedes encontrar aqui.


Luego de abrir el IDE de Arduino debes copiar el código que se muestra a continuación. 


#include <Servo.h>
Servo motor;

int estado1 = 0, angulo = 0, estado2 = 0;

void setup()
{

  Serial.begin(9600);
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
  motor.attach(6);
}

void loop()
{

  digitalWrite(8,HIGH);
  estado1 = digitalRead(7);
  estado2 = digitalRead(4);  
 
  if(estado1 == 1 && estado2 == 0)
  {
    motor.write(angulo);
    angulo = angulo + 1;
    restriccion();  
  }
 
  if(estado1 == 0 && estado2 == 1)
  {
    motor.write(angulo);
    angulo = angulo - 1;
    restriccion();
  }
 
  if(estado1 == 0 && estado2 == 0)
  {
    motor.write(angulo);
  }
}

void restriccion()
{

  if(angulo < 1)
  {
    angulo = 0;
  }
  if(angulo>179)
  {
    angulo = 180;
  }
}

Ya hemos creado un control que puede ser ampliado para controlar mas de un servomotor usando pulsadores. El montaje realizado en protoboard puede ser realizado en una placa PCB, de forma de eliminar los cables y deja todo mas compacto.




11 comentarios:

  1. por que tienes estado2 = digitalRead(4); si no lo estas declarando

    ResponderEliminar
  2. Hola, estoy interesado en hacer funcionar un servo como indicas pero el programa da error. Estaría muy agradecido en saber como tengo que corregirlo, gracias de antemano.

    ResponderEliminar
  3. Aqui les paso uno corregido


    #include
    Servo Servo1;

    int estado1 = 0;
    int angulo = 0;
    int estado2 = 0;
    int const boton1 = 0;
    int const boton2 = 1;
    int const pinServo =9;

    void setup()
    {
    pinMode(boton1,INPUT);
    pinMode(boton2,INPUT);
    Servo1.attach(pinServo);
    }

    void loop()
    {

    estado1 = digitalRead(boton1);
    estado2 = digitalRead(boton2);

    if(estado1 == HIGH && estado2 == LOW)
    {
    Servo1.write(angulo);
    angulo = angulo + 1;
    restriccion();
    }

    if(estado1 == 0 && estado2 == 1)
    {
    Servo1.write(angulo);
    angulo = angulo - 1;
    restriccion();
    }

    if(estado1 == 0 && estado2 == 0)
    {
    Servo1.write(angulo);
    }
    delay(5);
    }

    void restriccion()
    {
    if(angulo < 1)
    {
    angulo = 0;
    }
    if(angulo>179)
    {
    angulo = 180;
    }
    }

    ResponderEliminar
  4. hola buenas el servo se mueve pero al tocar los botones no pasa nada

    ResponderEliminar
  5. sigue sin funcionar el corregido melon

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. Les dejo uno más sencillo, pero sí funciona.
    #include
    Servo myServo;
    int val;
    int estado1 = 0;
    int estado2 = 0;
    int const boton1 = 3;
    int const boton2 = 4;


    void setup()
    {
    pinMode(boton1,INPUT);
    pinMode(boton2,INPUT);
    myServo.attach(2);
    }

    void loop()
    {

    estado1 = digitalRead(boton1);
    estado2 = digitalRead(boton2);

    if(estado1 == HIGH && estado2 == LOW)
    {
    val = 90;
    }

    if(estado1 == LOW && estado2 == HIGH)
    {
    val =180;
    }

    if(estado1 == LOW && estado2 == LOW)
    {
    val= 0;
    }
    myServo.write(val);
    delay(15);
    }

    ResponderEliminar
  8. Para que funcione deves corregir:
    dice: pinMode(8,OUTPUT); deve de decir: pinMode(8,INPUT);
    dice: estado2 = digitalRead(4); deve de decir:estado2 = digitalRead(8);

    ResponderEliminar
  9. no entendi, pero si es un video porno pasenmelo por favor

    ResponderEliminar
  10. Play Live Casino UK | LuckyClub
    Lucky Club luckyclub UK is a unique and online casino offering a wide range of casino games to bet on for real money. Register and get your welcome bonus! Rating: 5 · ‎Review by LuckyClub.live

    ResponderEliminar