Control de velocidad en los Servos. Problema. [SOLUCIONADO]... lo más seguro...

Buenas.

Estoy montando algo pequeño con Arduino Mega 2560 y después de solventar algunos problemas, aun me quedan un par de ellos, de los cuales uno de ellos es el que pongo como Asunto: Control de velocidad en los Servos. Cuando giran los dos servos, de 360º cada uno, me he dado cuenta de que uno gira un poco más rápido que el otro, haciendo que al andar gire en círculos grandes.

Buscando por Google me he fijado en que no hay muchas, por no decir que ninguna en concreto, soluciones al respecto, pero si he leído que se puede controlar la velocidad, solo que no se como. Necesito que giren a la misma velocidad ya que pretendo que en ocasiones hagan recorridos rectos y es imposible tal y como están ahora.

¿Alguien sabe como poder hacerlo? Como ya he dicho la placa arduino usada es la Mega 2560, los motores son los GWS S35/STD de 360º.

El código usado es este:

#include <Servo.h>

//Declaramos dos objetos Servo, uno por cada motor
Servo servo1;
Servo servo2;

//pingPin = 7 para el PING)))
const int pingPin = 7;
long duration, cm;

void setup() 
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  servo1.attach(3);
  servo2.attach(5);
}

void loop()
{ 
  //Este código del ejemplo PING del soft de Arduino 0022
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);

  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);
 
  cm = microsecondsToCentimeters(duration);
  
  //Esta función hace girar los dos servos
  servoDos(servo1, servo2);
  
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  
  delay(150);
}

void servoDos(Servo ser1, Servo ser2)
{
  if(cm >= 20)
  {
    ser1.write(0);
    ser2.write(180);
  }
  if(cm <= 20)
  {
     ser1.write(180);
     ser2.write(0);
  }
}

long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 29 / 2;
}

Alguien ya me ha dicho que si los baudios... que si no se que... no entiendo mucho, pero me han recomendado que los baudios no los toque mucho si no se porque puedo quemar tanto la placa como los puertos USB (como le ha pasado a un amigo), y aunque no sepa mucho, por lógica creo que si los motores son iguales y trabajan con el mismo código no creo que cambiando los baudios, por ejemplo, vayan a solucionar nada.

Pero bueno, ya me diréis si me equivoco, lo que puedo hacer, lo que no debo hacer...

Muchas gracias por adelantado.

Que raro....siendo iguales deberian ir a la misma velocidad....podrias poner un esquema de como los esta conectando...

Hola royyyyyy
Si los servos no giran a la misma velocidad, es que en el proceso de convertirlos a giro continuo no se ha puesto el potenciómetro interno en su posición intermedia (o las resistencias de sustitución no son exactamente iguales). A no ser que quieras desmontarlo y ajustarlo, lo único que puedes hacer es reducir la velocidad del servo que va más rápido.
Puedes crear un valor de ajuste que se sume (o reste) a la velocidad del servo que vaya más rápido para igualarlo al otro:

...
void servoDos(Servo ser1, Servo ser2)
{
int Ajuste=5;  // Valor a modificar 
  if(cm >= 20)
  {
    ser1.write(0+Ajuste);  //Si el ser1 es el mas rapido  
    ser2.write(180);       // Si fuera el ser2 deberas utilizar  ser2.write(180-Ajuste);
  }
  if(cm <= 20)
  {
     ser1.write(180-Ajuste);  //Si el ser1 es el mas rapido
     ser2.write(0);  //Si fuera el ser2 deberas utilizar  ser2.write(0+Ajuste);
  }
}
...

...

Muchas gracias.

Esta noche lo probaré ya que ahora me es imposible.

Por ahora he colgado un vídeo en el que se puede ver como gira el bot cuando avanza y no me refiero a cuando le pongo un obstáculo y gira para no chocarse.

Muchas gracias. Ya comentaré esta noche como me fue haciendo pruebas.

Que bueno!!! El chasis es una carcasa de un router!!! :smiley:

Jajajajaja, si... estoy esperando a solventar los problemas que tengo para poder cerrar la carcasa, modificada y pintada... y como me dé por ahí le pongo un alerón wapo wapo! :stuck_out_tongue:

Jajajajaja eso se llama TUNNING ROBOTICO!!! :smiley: :smiley: :smiley:

Pues creo que está solucionado, gracias a la variable Ajuste, más concrétamente el código es este:

void servoDos(Servo ser1, Servo ser2)
{
int Ajuste=3; 
  if(cm >= 30)
  {
    ser1.write(0+Ajuste);
    ser2.write(180);
  }
  if(cm <= 30)
  {
     ser1.write(180-Ajuste);
     ser2.write(0);
  }
}

Gracias al aporte de Inizul!!! Así me muchísimas gracias!!! Cuando monte todas la piezas de nuevo y vea si va recto o no, ya cambio el asunto a SOLUCIONADO. Por ahora voy a por el último problema que creo que tengo que me estoy hartando de probar... pero esto ya lo abro en otro hilo!!!

Un saludo!