Ayuda doble servo

Hola a a todos!

Acabo de descubrir la plataforma Arduino, pequeña pero matona, y estaba montando un pequeño proyecto con ella. Desgraciadamente mi habilidad en este campo no es mucha; en la uni tenian un "trato" con una empresa local y haciamos los proyectos de electronica y PICs siempre con los productos de ellos, y mejor no os mento la dichosa empresa porque todos mis compañeros y yo le acabamos cogiendo asco.

A ver si me podeis echar un cable para iniciarme con Arduino:

Quiero controlar dos servomotores con el Arduino a traves de un pulsador. Digamos que seria como las puertas de un bar del oeste automaticas, accionar el pulsador y se abren (girar dos motores en sentido inverso, mismo angulo). Volver a pulsar y se cierren. Asi continuamente.

Os pego el codigo del programa que tengo:

//pines de entrada
int pulsador = 8; // pin de control para pulsador

//pines de salida
int controlServoIzq = 9; // pin de control para servo izquierdo
int controlServoDer = 10; // pin de control para servo derecho

//variables
int semaforo1 = 0; // Semaforo bloqueante para apertura
int semaforo2 = 0; // Semaforo bloqueante para cierre

int minPulse = 500; // Posicion MIN del servo
int maxPulse = 2500; // Posicion MAX del servo

int desplazamiento = 0; //variable de 0 a MAX-MIN para controlar el angulo de los motores

int pulsoServoIzq = 0; // Amount to pulse the servoL
int pulsoServoDer = 0; // Amount to pulse the servoR

void setup() {

//inicializar pines E/S
pinMode(pulsador,INPUT); //Entrada pulsador
pinMode(controlServoIzq, OUTPUT); //Salida servo izquierdo
pinMode(controlServoDer, OUTPUT); //Salida servo derecho

//inicializar variables
pulsoServoIzq = minPulse; // Set the motor position values to the minimum
pulsoServoDer = maxPulse;
}

void loop() {

while(semaforo1==0) { //bloqueo el loop hasta accionar el pulsador
if(digitalRead(pulsador)==HIGH) {
semaforo1 = semaforo1 + 1;
}
}

pulsoServoIzq = desplazamiento + minPulse; // Pulso para motor izquierdo
pulsoServoDer = maxPulse - desplazamiento; // Pulso para motor derecho (inverso al izquierdo)

digitalWrite(controlServoIzq, HIGH); // Encender motor izquierdo
delayMicroseconds(pulsoServoIzq); // La duracion del delay marca el giro
digitalWrite(controlServoIzq, LOW); // apagar motor izquierdo

digitalWrite(controlServoDer, HIGH); // Encender motor derecho
delayMicroseconds(pulsoServoDer); // La duracion del delay marca el giro
digitalWrite(controlServoDer, LOW); // apagar motor derecho

while(semaforo2==0) {
if(digitalRead(pulsador)==HIGH) {
semaforo2 = semaforo2 + 1;
}
}

pulsoServoIzq = maxPulse - desplazamiento; // Pulso para motor izquierdo
pulsoServoDer = desplazamiento + minPulse; // Pulso para motor derecho (inverso al izquierdo)

digitalWrite(controlServoDer, HIGH); // Encender motor derecho
delayMicroseconds(pulsoServoDer); // La duracion del delay marca el giro
digitalWrite(controlServoDer, LOW); // apagar motor derecho

digitalWrite(controlServoIzq, HIGH); // Encender motor izquierdo
delayMicroseconds(pulsoServoIzq); // La duracion del delay marca el giro
digitalWrite(controlServoIzq, LOW); // apagar motor izquierdo

semaforo1=0; //bloqueo de nuevo los semaforos
semaforo2=0;
}

Al hacer compile/verify con el IDE me dice Binary sketch size: 1440 bytes (of a 14336 byte maximum)

Este codigo está medio sacado de la web, medio montado por mi. He montado un par de "semaforos" para bloquear el bucle, es lo unico que se me ocurria. Y lo de los motores esta sacado de la web y adaptado a mis necesidades.

Ahora bien, lo he montado todo sobre una placa, soldando y haciendo lo que buenamente he podido:

Los cables azules que salen hacia arriba son para otro pulsador.

Y el resultado es que nada se mueve, y no se si es mi montaje electrico (soy un poquito patas) o algo en el programa.

Bueno, primera correccion que hago, si no se puede ser tan genial... voy y monto el pulsador al reves, con lo que la continuidad del pulsador siempre me daba HIGH :-[

Ahora una desoldadita, un giro de 90º y ya tengo el circuito correcto.

Eso si, sigue todo muerto. Los motores hacen una suerte de espasmos debiles y se paran.

Se me ocurre: podria ser porque el puerto USB no tenga intensidad para alimentar todo??? Tendre que pillar un transformador?

Has comprobado que esos servos funcionan con esos valores de pwm? A mi me tocó calibrar y ir probando bastantes valores máximos y mínimos hasta que funcionó perfecto. Es lo que tiene no usar servos futaba o hitec, sino unos de hongkong que valen la cuarta parte..

Saludos

Los Sanwa estos, me vinieron dados, en la uni usamos Futabas. No se lo que costarian pero no deben de ser malos, los usa mucha gente para temas de aeromodelismo. Eso si, no he tenido forma de hallar la datasheet por lo que estos valores son al tuntun...

¿Alguna guia de valores tipo?

De todas formas he usado los pines 9 y 10 por si acabo teniendo que usar esa libreria ServoTimer1.

Por cierto, son Sanwa SW112 por si alguien sabe algo de ellos.

Hola,

Los servo-motores funcionan mediante señales PWM (salida analógica). La técnica PWM consiste en simular una salida analógica mediante una digital. Para ello se juega con el valor medio en función del tipo pulso y de la frecuencia con la que se escribe una salida digital. Échale un vistazo a esto en la parte de salida analógica:

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

Puedes hacer dos cosas:

  • Intentar sincronizar los pulsos digitales que envías a ambos motores, y la frecuencia, jugando con los delays. Para mi es complicado de hacer.
  • Utilizar la instrucción analogWrite, que genera directamente el PWM y lo mantiene.

Salu2,

Igor

Yo lo que veo es que empiezas con desplazamiento=0, luego desplazamiento lo vas sumando y restando a la posicion de cada servo, pero si no me equivoco, desplazamiento siempre sigue siendo 0, con lo que nunca mueves los servos, no???