Giro servomotor en un rango limitado

Buenas tardes, es mi primera vez por aquí, así que espero no liarla mucho. He estado buscando por el foro pero creo no encontrar nada que me ayude o no se buscarlo.

Mi intención es programar un brazo robótico y manejarlo mediante una app desde el movil. Para mis conocimientos es algo demasiado complejo por lo que ire dividiendo mis dudas en pequeñas batallas.

Mi primera duda es a la hora de limitar el rango en el que quiero que trabaje el servomotor de las pinzas, ya que quiero que las pinzas estén abiertas a 90º y cerradas a 125º. Por ahora mi código es sencillo; por el puerto serie introduzco el dato y el servo me responde, por lo cual mientras no introduzca un número fuera de ese rango no tengo problemas.
La cuestión será que al app que controlara el brazo esta formada por botones que se mantendrán pulsados para que funcionen los servos, pero no quiero que por mucho tiempo que se mantengan pulsados, ya sea el botón de abrir o cerrar, el dato que se mande al servo se salga del rango marcado.

Mi código actual:

#include <Servo.h>  //incluir la libreria Servo

Servo servo1;

int angulo = 90;
int pin = 7; 
int Min = 450; //duracion en microsegundos del pulso para girar a 0º
int Max = 2400; //duracion en microsegundos del pulso para girar 180º
String words; 

void setup() {
  Serial.begin(9600); 
  Serial.println("Servos - Arduino"); 
  servo1.attach(pin, Min, Max);
  servo1.write(angulo); 
}
void loop() { 
  while (Serial.available()) { 
    delay(5);
    char c  = Serial.read(); 
    words += c; 
  }
  if (words.length() > 0) {
    angulo = words.toInt(); 
    Serial.print(angulo);
    Serial.println(" Grados");
    delay(5);
    servo1.write(angulo); 
    while (servo1.read() < angulo - 3) {
      Serial.println("Desplazando...");
    }
  }
  words = ""; 
}

Cualquier ayuda se agradece y muchas gracias de antemano.
Saludos!!

Puedes fijar los límites con un par de comparaciones

if (words.length() > 0) {
    angulo = words.toInt(); 

    if (angulo < 90) {
      angulo = 90;
    } else if (angulo > 125) {
        angulo = 125;
    }

    Serial.print(angulo);
    Serial.println(" Grados");

O usando una función

if (words.length() > 0) {
    angulo = words.toInt(); 

    angulo =  constrain(angulo, 90, 125);

    Serial.print(angulo);
    Serial.println(" Grados");

Por otro lado, una aplicación bien diseñada no debería enviar valores por fuera de los límites aunque mantengas el botón pulsado. :wink:

No me queda claro si la app enviará

  1. comando "abrir" y comando "cerrar"
  1. ángulo deseado

Tu descripción parece corresponder a la opción 1, en cuyo caso el sketch deberá aumentar/disminuir gradualmente el ángulo de apertura limitándolo a 90º/125º

El código parece corresponder a la opción 2, en cuyo caso el programa debe asegurarse de que el ángulo recibido de la app está dentro de los límites mencionados.

Así que por favor sé más específico

Gracias por el aporte, intentaré hacerlo mediante función a ver si logro algo.
Con lo de:

una aplicación bien diseñada no debería enviar valores por fuera de los límites aunque mantengas el botón pulsado

me imagino que te refieres que desde el móvil ya lleguen los valores dentro del rango que necesito, no?? si es así lo tendré en cuenta a la hora de crearla.

Siento no haberme explicado bien.

Mi intención es crear una app con flechas (botones que se deberán dejar pulsados para que el brazo se mueva), es decir lo normal de si pulsas :arrow_up: el brazo sube, :arrow_down: el brazo baja..., pero claro mi intención es que el movimiento dure mientras se mantengan el botón pulsado. Como bien dices el movimiento debe ser gradual pero limitado a 90º/125º.

Por lo que he podido investigar desde la app puedo enviar un carácter al robot según el botón que este pulsando, por tanto no sería una valor numérico concreto, de ahí que quiera que el servo trabaje en un rango concreto.

Creo que lo tengo más claro en la cabeza de como lo explico aunque tampoco se si es la mejor manera de hacerlo. El código del primer mensaje era lo poco que había conseguido hacer para que el servo se moviese y las pruebas las hacía desde el monitor serie.

Espero haberme explicado un poco más y muchas gracias por la ayuda.

Exacto, limitas los valores en la aplicación.

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