LusoRobótica - Robótica em Português

Robótica => Iniciantes => Tópico iniciado por: Nanner em 20 de Novembro de 2010, 19:56

Título: Ligar 5 servos ao arduino
Enviado por: Nanner em 20 de Novembro de 2010, 19:56
Olá a todos,

Andei a procura aqui pelo fórum mas não consegui encontrar, se foi simplesmente uma má busca peço desculpa x.x Precisava de saber como é possível ligar 5 servos ao arduino. É preciso uma fonte de alimentação externa pois o arduino não fornece energia suficiente, certo? Alguém pode explicar-me (duma forma suficientemente detalhada para quem tem conhecimentos quase nulos de electrónica) como poderei faze-lo? De que forma ligar os motores entre si, à alimentação e ao arduino, e etc.


Desculpem novamente se estou a fazer alguma pergunta idiota ou se simplesmente deveria ter procurado melhor.
Obrigado desde já pela ajuda.
Título: Re: Ligar 5 servos ao arduino
Enviado por: microbyte em 21 de Novembro de 2010, 01:56
Boas Nanner.

A questão da alimentação depende dos servos. Dependem da corrente que cada servo consome, porque há servos e Servos.
Era provavelmente do teu interesse dares mais informação acerca do material que pretendes usar para que possas obter respostas mais directas e não tão gerais.

Basicamente, vais precisar de ligar os servos a uma fonte (5v - 6v) que debite corrente suficiente para o que eles precisam. Depois, recebem o PWM do Arduino, gerado pela biblioteca Servo.
Todos os servos analógicos têm 3 fios: vermelho/branco (liga ao positivo da fonte), preto/castanho (liga ao negativo da fonte) e amarelo/laranja (liga ao PWM). As alimentações (+ e -) são partilhadas por todos os servos e os sinais de controlo (PWM) são individuais caso queiras ter comportamentos diferentes para cada um dos servos.

Desculpa se não respondi bem àquilo que perguntaste, se eu não percebi tenta ser um pouco mais claro no que pretendes.
Título: Re: Ligar 5 servos ao arduino
Enviado por: Junior Frota em 12 de Janeiro de 2011, 23:42
Olá amigos, como nosso amigo Nanner, sou iniciante em robótica e estou tentando desenvolver um projeto de um braço robótico e para isso vou precisar controlar cinco servos futaba S3003, no entanto, fiz alguns testes com apenas dois apenas e dois potenciômetros (cada potenciômetro controlará um servo), mas não consegui controlar nem mesmo dois de uma vez, muito menos cinco.  :-\

O código que eu criei é o seguinte:


#include <Servo.h>

Servo servo_1;          // declara o servo 1
Servo servo_2;          // declara o servo 2

int val_1 = 0;          // variavel que recebe o valor de pot_1
int val_2 = 0;          // variavel que recebe o valor de pot_2
int pot_1 = 0;          // pino de entrada analógica do pot_1
int pot_2 = 2;          // pino de entrada analógica do pot_2

void setup(){
  Serial.begin(9600);   // inicia a comunicacao serial
  servo_1.attach(3);    // pino onde esta ligado o servo 1
  servo_2.attach(5);    // pino onde esta ligado o servo 2
}

void loop(){
  val_1 = analogRead(pot_1);   // val_1 armazena valor lido por pot_1
  val_1 = map(val_1, 0, 1023, 5, 175);
  servo_1.write(val_1);        // servo 1 apresenta angulo indicado por val_1
  val_2 = analogRead(pot_2);   // val_2 armazena valor lido por pot_2
  val_2 = map(val_2, 0, 1023, 5, 175);
  servo_2.write(val_2);        // servo 2 apresenta angulo indicado por val_2
  Serial.print(val_1);         // imprime no terminal o valor de val_1
  Serial.print("x");
  Serial.println(val_2);       // imprime no terminal o valor de val_2
}


Então, não sei onde posso estar errando. Alguém que puder me ajudar, ficarei muito agradecido.
Título: Re: Ligar 5 servos ao arduino
Enviado por: senso em 12 de Janeiro de 2011, 23:47
Estás a alimentar os servos com que?
O problema quase de certeza que é falta de corrente, com 5 servos aponta para 2-3A ou mais de pico de corrente se todos se mexerem ao mesmo tempo.
Título: Re: Ligar 5 servos ao arduino
Enviado por: Junior Frota em 12 de Janeiro de 2011, 23:52
Como no momento tenho apenas dois servos, estou alimentando-os externamente com 6 V (4 pilhas AA).
e quanto ao código-fonte, o que achas? Pois penso que, se eu entender a maneira de como controlar dois servos, penso eu que serei capaz de controlar cinco.
Título: Re: Ligar 5 servos ao arduino
Enviado por: ricardo-reis em 12 de Janeiro de 2011, 23:55
se bem me parece falta-te o delay de 15 ms (tempo de resposta dos servos)..

vê este tutorial: http://www.arduino.cc/en/Tutorial/Knob (http://www.arduino.cc/en/Tutorial/Knob)
Título: Re: Ligar 5 servos ao arduino
Enviado por: senso em 12 de Janeiro de 2011, 23:55
Pois, 4 pilhas AA podem não ser suficientes se os servos forem muito grandes, tens as massas partilhadas entre o arduino e as pilhas?
Título: Re: Ligar 5 servos ao arduino
Enviado por: Junior Frota em 13 de Janeiro de 2011, 00:02
Muito bom esses tutoriais do site do Arduino, no entanto, controlar um servo é fácil, mas quando tento controlar mais de um, não dá certo. Em alguns momentos um deles fica com movimento desordenado e o outro nem se quer se move.

Eu devo colocar o comando delay(15) depois do controle de cada servo ou apenas no final:

void loop(){
  val_1 = analogRead(pot_1);   // val_1 armazena valor lido por pot_1
  val_1 = map(val_1, 0, 1023, 5, 175);
  servo_1.write(val_1);        // servo 1 apresenta angulo indicado por val_1
  delay(15);
  val_2 = analogRead(pot_2);   // val_2 armazena valor lido por pot_2
  val_2 = map(val_2, 0, 1023, 5, 175);
  servo_2.write(val_2);        // servo 2 apresenta angulo indicado por val_2
  delay(15);
  Serial.print(val_1);         // imprime no terminal o valor de val_1
  Serial.print("x");
  Serial.println(val_2);       // imprime no terminal o valor de val_2
}


ou

void loop(){
  val_1 = analogRead(pot_1);   // val_1 armazena valor lido por pot_1
  val_1 = map(val_1, 0, 1023, 5, 175);
  servo_1.write(val_1);        // servo 1 apresenta angulo indicado por val_1
  val_2 = analogRead(pot_2);   // val_2 armazena valor lido por pot_2
  val_2 = map(val_2, 0, 1023, 5, 175);
  servo_2.write(val_2);        // servo 2 apresenta angulo indicado por val_2
  Serial.print(val_1);         // imprime no terminal o valor de val_1
  Serial.print("x");
  Serial.println(val_2);       // imprime no terminal o valor de val_2
  delay(15);
}


?????
Título: Re: Ligar 5 servos ao arduino
Enviado por: ricardo-reis em 13 de Janeiro de 2011, 00:07
testaste primeiro os angulos de rotação dos servos, para perceberes se há diferenças entre eles?

em princípio deve chegar no final.. isso é só pra dar tempo ao servo pra ele rodar.. da posição em k tá, até à posição que lhe pediste com o potenciómetro..
Título: Re: Ligar 5 servos ao arduino
Enviado por: amando96 em 13 de Janeiro de 2011, 00:11
Não sei a bilbioteca servo mudou, mas antes só dava para controlar 2 servos nos pinos 9 e 10, passei logo a usar a biblioteca megaservo, se na realidade a bilbioteca servo mudou, é favor ignorar este post...  :-X
Título: Re: Ligar 5 servos ao arduino
Enviado por: ricardo-reis em 13 de Janeiro de 2011, 00:15
Não sei a bilbioteca servo mudou, mas antes só dava para controlar 2 servos nos pinos 9 e 10, passei logo a usar a biblioteca megaservo, se na realidade a bilbioteca servo mudou, é favor ignorar este post...  :-X

segundo eles já dá para controlar até 8..

(eu tenho-a testada com 4 e funciona)
Título: Re: Ligar 5 servos ao arduino
Enviado por: Njay em 13 de Janeiro de 2011, 00:39
Experimenta pôr a condensador de 100uF ou mais ligado entre o + e o - de cada servo, ali mesmo juntinho às fichas deles.

Se estás a usar pilhas alkalinas é capaz de não chegar. Experimenta umas médias ou pilhas AA de NiMH de mais de 1800 mAh.
Título: Re: Ligar 5 servos ao arduino
Enviado por: Junior Frota em 13 de Janeiro de 2011, 00:55
Eu tentarei usar a biblioteca Megaservos e verei no que dá.

Por enquanto muito obrigado pela ajuda.
Título: Re: Ligar 5 servos ao arduino
Enviado por: Junior Frota em 13 de Janeiro de 2011, 01:50
Então meus amigos, problema resolvido, pelo menos por enquanto.  :P

Acho que o problema não era a biblioteca que esta sendo usada, mas sim o fato de eu não ter ligado o negativo da bateria externa no pino GND da placa Arduino, eu acho que foi até ignorância de minha parte, pois manjo pouco de eletrônica, no entanto, assim que conectei o negativo com o GND da placa, os servos funcionaram perfeitamente.

O código ficou assim:

#include <MegaServo.h>

MegaServo servo_1;
MegaServo servo_2;

int pos_1 = 0;
int pos_2 = 0;
int pot_1 = 0;
int pot_2 = 2;

void setup()
{
  servo_1.attach(9);
  servo_2.attach(8);
}
void loop()
{
  pos_1 = analogRead(pot_1);
  pos_1 = map(pos_1, 0,1023,5,170);
  servo_1.write(pos_1);
  delay(15);
  pos_2 = analogRead(pot_2);
  pos_2 = map(pos_2, 0,1023,5,170);
  servo_2.write(pos_2);
  delay(15);
}


Agora irei tentar outro projeto: controlar a posição de um servo usando o analógico de um joystick de PS2.