motor servo ayuda

utilizo este codigo

int servoPin = 7; // R/C Servo connected to digital pin
int myAngle; // angle of the servo (roughly in degrees) 0-180
int pulseWidth; // function variable

void servoPulse(int servoPin, int myAngle) {
pulseWidth = (myAngle * 9) + 700; // converts angle to microseconds
digitalWrite(servoPin, HIGH); // set servo high
delayMicroseconds(pulseWidth); // wait a very small amount
digitalWrite(servoPin, LOW); // set servo low
Serial.print("pulseWidth: "); Serial.println(pulseWidth);
delay(20); // refresh cycle of typical servos (20 ms)
}

void setup() {
pinMode(servoPin, OUTPUT); // set servoPin pin as output
Serial.begin(19200);
}

void loop() {
// cycle through every angle (rotate the servo 180 slowly)
for (myAngle=0; myAngle<=180; myAngle++) {
servoPulse(servoPin, myAngle);
}
delay(1000);
}


utiliza el pin 7 como arriba dice para controlar el motor(pwm)
lo que necesito saber es como hago para conectar un segundo motor
y que tenga su propio movimiento pero en otro ritmo, ya que al conectarlo al pin 7 (ambos motores) quedan funcionando sincronizados,
talves designar otro pin?... necesito ayuda lo mas completa posible para sacar este proyecto adelante

gracias!!

Hola,

No digo que no se pueda hacer, pero ... ¿porqué no utilizas dos salidas PWM directamente?. Una para cada motor.

Es más fácil que intentar sincronizar los pulsos en el tiempo de dos motores.

Salu2,

Igor

ok y como quedaria el codigo?

parece que no entendiste lo que te queria decir.
resulta que tengo 2 motores servos y quiero que muevan 2 objetos pero cuando los conecto los 2 se mueven a la par, necesito que no pase eso, he intentado modificar el codigo pero no se muy bien cuales son los pin pwm y como agregar esa nuevo pin al codigo sin que me de error

gracias

Hola,

La idea es la siguiente ... usar dos pines PWM ... uno para cada motor/servo.

Para probar cómo se comporta el motor con las salidas PWM (puedes escribir un valor de 0 a 255) ...

int valor = 0;    // variable que contiene el valor
int motor = 10;  // motor conectado al PIN 10 

void setup() { } // No es necesario  

void loop() { 
  for(valor = 0 ; valor <= 255; valor +=5) {
    analogWrite(motor, valor); 
    delay(30);
  } 
  for(valor = 255; valor >=0; valor -=5) {
   analogWrite(motor, valor);
   delay(30); 
  }
}

Y ahora ... con los dos motores ...

int valor1 = 0;
int valor2 = 0;
int motor1 = 9;   // motor conectado al PIN 10 
int motor2 = 10; // motor conectado al PIN 10 


void setup() { }  // No es necesario  

void loop() { 

/*

Aquí metes el código que calcula el valor de cada motor (valor1 y valor2)

*/

   analogWrite(motor1, valor1);
   delay(30); 
   analogWrite(motor2, valor2);
   delay(30); 
  }
}

Esa es la idea ...

Salu2,

Igor

me dices que los 2 motores al pin 10?

no entendi eso
lo probe pero funcionan igual
modifique un poco el codigo pero ahora tengo dos motores moviendose a la par y si control haha
ayuda mira este es el codigo que termine de compilar esta bien?


int valor1 = 0;
int valor2 = 0;
int motor1 = 7; // motor conectado al PIN 10
int motor2 = 10; // motor conectado al PIN 10

void setup() { }

void loop() {
for(valor1 = 0 ; valor1 <= 80; valor1 +=5) {
analogWrite(motor1, valor1);
delay(30);
}
for(valor2 = 120; valor2 >=0; valor2 -=5) {
analogWrite(motor2, valor2);
delay(30);
}
analogWrite(motor1, valor1);
delay(30);
analogWrite(motor2, valor2);
delay(30);
}

Hola,

me dices que los 2 motores al pin 10?

Noooo ... uno a un pin PWM y otro al otro pin PWM ... para controlar cada motor por separado.

En cuanto al código ... está mal .... para que veas el porqué súbele el delay a 200 milisegundos.

Lo que haces es "secuencialmente":

1.- Mover el motor 1 mediante un bucle (30 ms * 16 iteraciones = 480 milisegundos)
2.- Mover el motor 2 mediante un bucle (30 ms * 16 iteraciones = 480 milisegundos)
3.- Volver a escribir en los pines PWM despues de los bucles -->Este código te sobra ... ya que lo usas arriba:

analogWrite(motor1, valor1);
delay(30);
analogWrite(motor2, valor2);
delay(30);

La idea es mover los dos motores independientemente, no uno y luego el otro ... para ello:

1.- ¿En función de que valores quieres mover los servos?, ¿el valor de un sensor?, ¿un parámetro modificado por un bucle?
2.- Progamar el código que calcula los dos valores.
3.- Escribir los valores en los motores uno detrás de otro sin delay ... y justo después el delay.

En caso de que fuese un bucle lo que controla los dos motores deberías hacer algo pareceido a esto para que cada motor gire en un sentido contrario al otro:

for(valor1 = 0; valor1 >=255; valor1 +=5) {
  analogWrite(motor1, valor1);
  for(valor2 = 255; valor2 >=0; valor2 -=5) {
    analogWrite(motor2, valor2);
    delay(30); 
  }
}

El tema es que tienes que ver como funciona el código ... es un bucle (loop) que repite instrucciones a 16 MHz ... va muy rápido.

Salu2,

Igor

Una pregunta. Veo que aqui los motores los controlas con analogWrite (int, int); y yo en un pryecto intento hacerlo con digitalWrite (int, HIGH/LOW); y programando un delayMicroseconds(); en medio. ¿Cual es el medio mas practico?

Hola,

Se pueden controlar servo-motores de muchas formas. Si sólo tienes uno, es fácil controlarlo simulando el PWM con el digitalWrite. Si tienes más de uno, lo mejor, en mi opinión, es que utilices el analogWrite. Sincronizar más de un motor usando digitalWrite es complicado de programar. Al menos para mi.

Las señales PWM sirven para simular, mediante una salida digital, una analógica. Explicar aquí la teoría es un engorro, más teniendo en cuenta que yo no soy un profe. Échale un vistazo a estas transparencias en la parte de salidas analógicas:

http://jaigor.net/files/electronica/Electronica_para_usos_creativos_%20dia2.pdf
http://jaigor.net/files/electronica/Electronica_para_usos_creativos_%20dia3.pdf

El resto:

http://www.interactivos.org/electronica/

Salu2,

Igor