LusoRobótica - Robótica em Português
Robótica => Iniciantes => Tópico iniciado 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.
-
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.
-
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.
-
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.
-
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.
-
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)
-
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?
-
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);
}
?????
-
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..
-
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
-
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)
-
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.
-
Eu tentarei usar a biblioteca Megaservos e verei no que dá.
Por enquanto muito obrigado pela ajuda.
-
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.