Poll
Question: Pines
pines de placa
control de servomotores

Pages: [1] 2 3 4   Go Down
Author Topic: Servo motores?¿  (Read 5351 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sabeis de algun sitio donde vendan servomotores que no sean a mas de 10 euros?todos los que encuentro por internet salen a 10 € o por el ebay e visto pack de 4 a 30€ lo que se me va mucho de presupuesto :S
Y otra cosa, segun :
http://www.marlonj.com/blog/2008/11/arduino-multiples-servos/
Se puede manejar multiples servos, alguien sabe si se puede manejar cada motor con un angulo y un tiempo distinto?
Gracias
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

De esos azules, precisamente, tienes por ejemplo en dealxtreme, bastante baratos, todo depende del torque que necesites, pero esos para pequeñas cosas te valen:

http://www.dealextreme.com/details.dx/sku.35764

http://www.dealextreme.com/details.dx/sku.20021

Saludos
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Una duda que tengo sobre los motores, tienen que ser digitales no?
y alguna cosa mas que deban ser/tener?
ah y otra cosa, alguna marca/modelo en especial?
pd: que os parece los de la marca SG-5010?
perdonad por ser tran pregunton pero tengo un proyecto para junio y intento saber todo lo posible en el menor tiempo :S
Saludos y Gracias
« Last Edit: May 14, 2010, 02:45:14 pm by tarmion » Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 341
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A ver, los servos de RC funcionan por medio de impulsos que varían de 1ms a 2ms, con una repetición de 50 veces por segundo. Esto es que si a  un servo le mandas 50 pulsos de 1ms cada segundo se pondrá en la posición minima de recorrido, si le mandas 50 pulsos de 1.5ms cada segundo se quedará en su posición central y si le mandas 50 pulsos por segundo de 2ms avanzará hasta su posición máxima de recorrido.

Según esto que he explicado se pueden controlar tantos servos como salidas digitales tenga la arduino que uses, y naturalmete, de forma independiente. La librería especifica para controlar servos es posible que solo pueda manejar 2 servos a la vez, no lo se, pero ten en cuenta que una librería solo es un conjunto de funciones que alguien programó  quizá a modo de ejemplo.

Que un servo sea digital o analógico solo influye en la forma en que su controladora interna determina en que posición se encuentra. Suelen ser mas caros por ser mas precisos.

El precio de un servo va en función de su calidad y de su potencia expresada en Kilogramos de torque. Si el problema es únicamente el precio busca en ebay, yo he comprado recientemente 6 servos de 3,7g y me han costado 9€ puestos en casa (pero claro, su torque es de apenas 0'7Kg) y son chinos, por lo que su calidad es... mala.

Espero te sirva.

Un saludo.
Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias por contestar ,ahora mismo estoy liado con los servos y no doy como volver el servo a la posicion de inicio :S
Aver si podeis echarle un ojo al codigo e iluminarme


#include <Servo.h>
#undef int
#undef abs
#undef double
#undef float
#undef round
 
Servo myservo0;
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
 


long num =0; //pasadas del loop

void setup()
{
  myservo0.attach(2);
  myservo1.attach(3);
  myservo2.attach(4);
  myservo3.attach(5);
  myservo4.attach(6);
}
 
void loop()
{
  Servo::refresh();  
  num = num + 1;
  adelante(num);
  centrar(num);
  
}
 
void adelante(long num) //avanza las patas
{
if(num%2500 == 0)
    servos1(45);
else if (num%500 ==0)
    servos2(90);


}
void centrar(long num) //las posiciona en el lugar de inicio
{
if(num%500 == 0)
    servos1(myservo0.read()-myservo0.read());
else if (num%2500 ==0)
    servos2(myservo1.read()-myservo1.read());

}
void servos1(int angle)
{
  myservo0.write(angle);
 
  myservo2.write(angle);
  
  myservo4.write(angle);
}
void servos2(int angle)
{
  
  myservo1.write(angle);
 
  myservo3.write(angle);
 
}

pd: estos motores valdrian?
http://shiweihk.en.alibaba.com/product/292729599-209538471/Digital_SG5010_Servo_SG_5010_RC_Airplane_Car_boat_part.html
Gracias de antemano
« Last Edit: May 15, 2010, 06:19:15 am by tarmion » Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Esto valdria para controlar a los servos?
#include <Servo.h>
#include <LCD4Bit.h>
#undef int
#undef abs
#undef double
#undef float
#undef round

int servoPin1= 13;
int servoPin2= 14;       // numero de pin de cada servo
int servoPin3 =15;
int servoPin4= 16;
int servoPin5= 17;
int servoPin6= 18;

LCD4Bit lcd = LCD4Bit(2);

int avanzado= 0;


int angulo = 90;        // Valor inicial de los servos
int ampl = 900;
int pulso = 0;
long tiempo = 0;
int entrado = 0;
void setup()
{
  lcd.init();
      
  pinMode(servoPin1, OUTPUT);
  pinMode(servoPin2, OUTPUT);
  pinMode(servoPin3, OUTPUT);
  pinMode(servoPin4, OUTPUT);
  pinMode(servoPin5, OUTPUT);
  pinMode(servoPin6, OUTPUT);

  digitalWrite(servoPin1,LOW);
  digitalWrite(servoPin2,LOW);
  digitalWrite(servoPin3,LOW);
  digitalWrite(servoPin4,LOW);
  digitalWrite(servoPin5,LOW);
  digitalWrite(servoPin6,LOW);
            

}


void loop()
{
  
  servoAvanza();

 
}

void servoAvanza()
{
  if(avanzado == 0)
  {
  lcd.printIn("Avanza");
  avanzado= 1;
  }
  if(entrado == 0){
      delay(500);
  pulso = 1500;
  digitalWrite(servoPin1,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin1,LOW);
   delay(20);
  digitalWrite(servoPin2,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin2,LOW);
   delay(20);
  digitalWrite(servoPin3,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin3,LOW);
  delay(20);
  delay(500);
   digitalWrite(servoPin4,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin4,LOW);
   delay(20);
    digitalWrite(servoPin5,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin5,LOW);
   delay(20);
    digitalWrite(servoPin6,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin6,LOW);
   delay(20);
  
  
  entrado = 1;
   }
   if(entrado == 1)
   {
      delay(500);
  pulso = 1000;
  digitalWrite(servoPin1,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin1,LOW);
  delay(20);
  digitalWrite(servoPin2,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin2,LOW);
    delay(20);
  digitalWrite(servoPin3,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin3,LOW);
  delay(20);
  delay(500);
    digitalWrite(servoPin4,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin4,LOW);
   delay(20);
    digitalWrite(servoPin5,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin5,LOW);
   delay(20);
    digitalWrite(servoPin6,HIGH);
  delayMicroseconds(pulso);
  digitalWrite(servoPin6,LOW);
   delay(20);
  entrado= 0;
   }

}
Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 341
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Respecto al código lo siento tio, no tengo experiencia suficiente como para saber exactamente que hará de un solo vistazo. Pero te recomiendo el metodo de prueba y error, cargas el código, lo ejecutas y miras a ver que hace, si no funciona corriges y vuelves a probar... supongo que es lo que hacemos todos hasta que la placa haga exactamente lo que queremos.

Ahora que pienso, no has dicho nada sobre tu proyecto, ni cuantos servos quieres hacer funcionar simultaneamente ni que es lo que tienen que hacer. Así no te podrá ayudar nadie.

Los servos del enlace que has puesto son de 3Kg de torque, son los que generalmente se usan para la dirección en los coches de escala 1:10, pero no se si se adaptarán bien a tus propositos.
Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues el proyecto que voy a hacer es un hexapodo  con 12 servos,2 servos por pata(3 servos seria lo suyo pero se me queda corta la placa arduino Duemilanove 328),y lo que queria era simular los movimientos de las patas, levantando una pata ,adelantandola y bajarla,y así sucesivamente con las demas patas, el problema que encuentro ahora esque me gustaria que cada vez que una pata se adelanta me gustaria que la pata anterior se fuera desplazando poco a poco hacia atras,pero no encuentro la forma como no sea haciendo paradas en la pata que se adelanta para mover la anterior.
Valla lio que me he montado ,no se si se me habra entendido xD
El problema tambien esque he comprado la placa en ebay a hong kong por lo que tardara como 2-3 semanas en llegar y el proyecto acaba en junio,asi que estoy con el proteus y el ide de arduino para cuando me llegue solamente me quede cargar el codigo y ajustar algunas cosas.
Pongo el codigo que llevo hasta hoy:

#include <Servo.h>
#include <LCD4Bit.h>
#undef int
#undef abs
#undef double
#undef float
#undef round

int servoPin1 = 13;
int servoPin2 = 14;       // numero de pin de cada servo
int servoPin3 =15;
int servoPin4 = 16;
int servoPin5 = 17;
int servoPin6 = 18;

LCD4Bit lcd = LCD4Bit(1);

int avanzado= 0;

int pulso = 0;

int entrado = 0;
void setup()
{
  lcd.init();
      
  pinMode(servoPin1, OUTPUT);
  pinMode(servoPin2, OUTPUT);
  pinMode(servoPin3, OUTPUT);
  pinMode(servoPin4, OUTPUT);
  pinMode(servoPin5, OUTPUT);
  pinMode(servoPin6, OUTPUT);

  digitalWrite(servoPin1,LOW);
  digitalWrite(servoPin2,LOW);
  digitalWrite(servoPin3,LOW);
  digitalWrite(servoPin4,LOW);
  digitalWrite(servoPin5,LOW);
  digitalWrite(servoPin6,LOW);
            

}

int entradoenbucle= 0;
void loop()
{
  /* lanzar los pulsos que el servo necesita para controlar su posición, teniendo en cuenta que:
   *  90º = 1500us
   *  180º = 1500us + ampl
   *  0º = 1500us -ampl
   */
// if(entradoenbucle== 0){
 // for(int i = 0 ;i<3;i+=1)    anda las veces que le digamos
 //{
   servoAvanza();
 //entradoenbucle= 1;
 //}
 //}
}

void servoAvanza()
{
  if(avanzado == 0)
  {
  lcd.printIn("Avanza");
  avanzado= 1;
  }
  if(entrado == 0){
      delay(250);
  pulso = 1500;
  digitalWrite(servoPin1,HIGH);         //levanta parte pata 1
  delayMicroseconds(pulso);
  digitalWrite(servoPin1,LOW);
   delay(20);
    delay(250);
  digitalWrite(servoPin2,HIGH);        //desplaza pata 1
  delayMicroseconds(pulso);
  digitalWrite(servoPin2,LOW);
   delay(20);
    delay(250);
    pulso= 1000;
      digitalWrite(servoPin1,HIGH);         //baja parte pata 1
  delayMicroseconds(pulso);
  digitalWrite(servoPin1,LOW);
   delay(20);
    delay(250);
    pulso= 1500;
  digitalWrite(servoPin3,HIGH);     //levanta parte pata 2
  delayMicroseconds(pulso);
  digitalWrite(servoPin3,LOW);
  delay(20);
  delay(250);
   digitalWrite(servoPin4,HIGH);     //deslpaza pata 2
  delayMicroseconds(pulso);
  digitalWrite(servoPin4,LOW);
   delay(20);
    delay(250);
    pulso =1000;
      digitalWrite(servoPin3,HIGH);     //baja parte pata 2
  delayMicroseconds(pulso);
  digitalWrite(servoPin3,LOW);
  delay(20);
  delay(250);
  pulso = 1500;
    digitalWrite(servoPin5,HIGH);      //levanta parte pata 3
  delayMicroseconds(pulso);
  digitalWrite(servoPin5,LOW);
   delay(20);
    delay(250);
    digitalWrite(servoPin6,HIGH);      //deslpaza pata 3
  delayMicroseconds(pulso);
  digitalWrite(servoPin6,LOW);
   delay(20);
    delay(250);
    pulso = 1000;
      digitalWrite(servoPin5,HIGH);      //baja parte pata 3
  delayMicroseconds(pulso);
  digitalWrite(servoPin5,LOW);
   delay(20);
    delay(250);
        pulso = 1000;
      digitalWrite(servoPin2,HIGH);      //retorna pata 1
  delayMicroseconds(pulso);
  digitalWrite(servoPin2,LOW);
   delay(20);
    delay(250);
     digitalWrite(servoPin4,HIGH);      //retorna pata 2
  delayMicroseconds(pulso);
  digitalWrite(servoPin4,LOW);
   delay(20);
    delay(250);
     digitalWrite(servoPin6,HIGH);      //retorna  pata 3
  delayMicroseconds(pulso);
  digitalWrite(servoPin6,LOW);
   delay(20);
    delay(250);
  
  
  entrado = 0;
   }

}
« Last Edit: May 16, 2010, 10:41:07 am by tarmion » Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 341
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Jejejeje, comprar una chinduino ha sido una mala idea por el tema del transporte. La placa la deberías tener ya para ir haciendo pruebas y depurando código. Dejarlo para lo último..... uf, que miedo.

Mi consejo es que simplifiques. Mira el primer ejemplo de este enlace:
http://quarkstream.wordpress.com/category/servo/

Ese ejemplo de código tan corto sólo mueve un servo de un extremo a otro una y otra vez. Añade mas servos al codigo y modificalo para que algunos puedan funcionar en sentido inverso (solo hay que atrasar/adelantar el angulo en 90º).

Luego solo es cuestien de sincronización, tres patas suben y tres bajan, tres patas adelantan y tres atrasan. Y el exápodo avanza.

Dos consejos: no pidas los servos a china y montate un comprovador de servos con un 555. Deberías estar montando patas ya, por que te puede pasar una cosa: al montar un servo es muy fácil que el eje se mueva de la posición central y luego a conectarlo la pata no quedará en la posición que debería y si inicias la secuencia será un caos.

Te puedo asegurar por experiencia que puedes estar media hora ajustando un servo dependiendo de donde y como este montado.

Suerte.
Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por contestar,eso antes de todo  smiley-grin
Pues la placa ya esta pedida de hace 1 semana,así que ya no puedo hacer nada salvo esperar , y sobre los motores pues.. no se que es eso del 555 xD
Otra cosa,el codigo ese ya lo he intentado usar pero no me tira en el proteus nose si es por el pin al que lo conecto o por haber cambiado la carpeta Servo para poder manejar mas de 2 motores

pd: otra cosilla,el servo, en principio, será movido por una interfaz grafica hecha en netbeans ,mi idea es poder enchufarle la pantallita lcd 16x2 por 4 bits,los 12 motores y si me queda algun pin libre (que lo dudo) montarle un sensor infrarojos.
Asi que intentaria crear 2 programas para el robot,uno  para manejarlo mediante la interfaz y otra ,si me queda hueco para el sensor infrarojos,para que este en modo autonomo ,moviendose sin que se choque con nada.
« Last Edit: May 17, 2010, 03:46:16 am by tarmion » Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 341
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un 555 es un temporizador.
http://www.rclabujia.com/circuito-control-servo/
Y este es un comprobador de servos sencillo pero eficaz, puedes hacer que un servo realice todo su recorrido para ver que hace lo que tu quieres y puedes centrarlo antes de fijarlo para evitar contratiempos mas tarde.

En cuanto al código no me atrevo a darte mas consejos por si te lio. Mira, yo suelo empezar planteando todo el procedimiento para desglosarlo en partes pequeñas, luego las programo y pruebo de forma independiente, por último, a medida que las partes pequeñas van funcionando como yo quiero las voy uniendo. Quizá sea una forma lenta de trabajar, pero a mi me d buen resultado.

Suerte.
Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Me quieres decir que los servos no se encuentran a 0º cuando vienen de fabrica?
Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 341
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues no tiene por que.

Lo "peligroso" es que al montarles la cruceta o la palanca o lo que sea que uses para transmitir el movimiento es muy fácil mover el eje y eso te puede dar muchos dolores de cabeza.

Las emisorar de RC incorporan una función de trimado para cada canal, con la cual puedes ajustar la posición del servo desde la emisora. Pero implementar eso en tu programa va a ser muy complicado por que son muchos servos.

Es mas sencillo que te montes el comprobador y que antes y despues de montarlos te asegures de que están centrados.

Si solo quieres que te los centre puedes cambiar el potenciometro de 50Koms por dos resistencias fijas de 25Koms (evidentemente una a cada lado del pin7 y el D1) y connectarlo mientras montas cada servo, así si lo mueves accidentalmene retornará a la posicion centras automáticamente.
Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 59
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues ya tengo todo y no se que pasa pero al conectar el servo no hace lo esperado

He probado primero con 1 servo,conecto el cable de control al pin de arduino y tierra y alimentacion a una pila de 4,5v ,el motor ace como que se mueve una mijenilla de na al acer contacto con la pila pero inmediatamente despues se para,he intentado darle voltaje desde la placa arduino y me tira error de coneccion del usb o me hace lo mismo
He probado cambiando el codigo enviandole pulos de diferente amplitud y hace lo mismo ,asi que no tengo idea de que puede ser
he probado varios motores pero todos hacen lo mismo :S
Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 341
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Los servos trabajan de 4'8v a 8'4v y según su tamaño tragan mas o menos miliamperios.

Prueba a alimentarlos desde un paquete de baterías externo de 7.2v, El mas usual en RC está compuesto por 6 celulas de NiMH de 1'2v, por lo que te lo puedes montar tu con 2 portapilas de 3 baterías recargables tamaño AA.

Pones el polo positivo directo a los servos (y si quieres a la toma de alimentación del arduino), el negativo directo a los servos y puenteado con el del arduino. Las tomas de señas directas a pines digitales.

Así tendría que funcionar.
Logged


Pages: [1] 2 3 4   Go Up
Jump to: