Pages: [1]   Go Down
Author Topic: motor servo ayuda  (Read 593 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!
Logged

Madrid
Offline Offline
Full Member
***
Karma: 0
Posts: 217
¡¡ Siempre aprendiendo !!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Madrid
Offline Offline
Full Member
***
Karma: 0
Posts: 217
¡¡ Siempre aprendiendo !!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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) ...

Code:

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 ...

Code:

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
  }
Logged

Madrid
Offline Offline
Full Member
***
Karma: 0
Posts: 217
¡¡ Siempre aprendiendo !!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Quote
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 .... [glow]para que veas el porqué súbele el delay a 200 milisegundos[/glow].

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:

Quote
  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 [glow]para que cada motor gire en un sentido contrario al otro[/glow]:

Code:

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Madrid
Offline Offline
Full Member
***
Karma: 0
Posts: 217
¡¡ Siempre aprendiendo !!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: