Aqueles que pretendem construir um projeto mais complexo (neste caso, quero dizer com mais DOFs, como um bípede humanóide, hexapod, e outros) podem encontrar dificuldades se estiverem usando um Arduino UNO ou similar, a menos que tenham um Mega. Foi o que aconteceu comigo quando eu estava trabalhando no meu projeto bípede.



     Depois de pesquisar várias alternativas, sem mudar a placa, eu encontrei este IC: TLC5940.

 

     Ele é vendido como um LED driver de 16 canais, mas com esta biblioteca pode controlar 16 servo motores, tão fácil quanto o "servo sweep". Mas não só é isso: pode-se conectar vários ICs em série e expandir ainda mais (eu ainda não tentei, mas parece ser muito fácil). O que você perde de sua placa são 5 pinos.

     Você pode encontrar este IC em um breakout e também em um PWM shield, ou fazer o seu próprio com custo muito baixo (menos de R$ 4,00 por chip). Isto significa que você pode comprar 20 chips pelo preço de um PWM shield. :)

     Bem pessoal, o material necessário para fazer este trabalho está abaixo:


Arduino (utilizei o ONU);
• 1x TLC5940 IC (16 canais);
resistores de 2.2k;
jumpers;
alimentação externa para os servos;
protoboard;
servos (quantos você quiser controlar ou sua necessidade de projeto).

 

     No meu exemplo, eu utilizei apenas 6 servos. Mas você pode facilmente adicionar mais nos canais restantes.

 

 

     Que confusão de fios! É um pouco difícil de entender as conexões na foto acima. Devido a isso eu fiz um esquema no Fritzing. Mas, antes disso, vamos dar uma olhada nos pinos do IC.

 

     Agora, vamos às conexões... Siga a sequência de cores e pinos abaixo.

 

     • IC pinos 1 até o 15 e o pino 28: são os canais de saída, onde você conecta o fio de sinal do servo. Você tem que adicionar um resistor pull-up de 2.2k em cada canal e ligar ao 5V, para tornar possível o controle dos servos.
     • IC pino 16 - XERR (não utilizado neste caso).
     • IC pino 17 - SOUT (não utilizado neste caso).
     • IC pino 18 - GSCLK: fio marrom ligado ao pino 3 do Arduino;
     • IC pino 19 - DCPRG: ligado a 5V;
     • IC pino 20 - IREF: colocar nele um resistor de 2,2 k e conectar ao GND;
     • IC pino 21 - VCC: ligado a 5V;
     • IC pino 22 - GND: conectado a GND;
     • IC pino 23 - BLANK: fio laranja ligado ao pino 10 do Arduino;
     • IC pino 24 - XLAT: fio amarelo ligado ao pino 9 do Arduino;
     • IC pino 25 - SCLK: fio azul conectado ao pino 13 do Arduino;
     • IC pino 26 - SIN: fio verde ligado ao pino 11 do Arduino;
     • IC pino 27 - VPRG: conectado a GND.

 

     Como você vai utilizar muitos servos, vai precisar de uma fonte de alimentação externa para eles. Não se esqueça de ligar o GND dos servos ao GND do Arduino, para ter um GND comum.

     Nota: No início eu estava tendo problemas para fazer os servos girarem de 0 a 180 º (eles apenas iam de 0 a 90º). Eu pesquisei em muitos fóruns e encontrei algumas pessoas com o mesmo problema. Mas ninguém tinha a solução. Depois de mudar alguns valores no arquivo tlc_servos.h, eu resolvi este problema. Assim, se alguém tiver o mesmo problema, deve mudar o SERVO_MIN_WIDTH de 204 para 120 e o SERVO_MAX_WIDTH de 410 para 475.

     Por enquanto, é isso aí...

 

     P.s.: o vídeo fiz apenas para mostrar que isto realmente funciona. Realizei os testes apenas com 6 servos de cada vez, mas funcionou perfeitamente em todos os canais.

Exibições: 17049

Responder esta

Respostas a este tópico

OK, entendi.

Gostaria de ajudá-lo a tentar solucionar este problema. Para isso, gostaria de mais algumas informações.

1. Sua fonte de alimentação funciona perfeitamente? Quantos mAh ela fornece?

2. Quais servos (marca/modelo) você utiliza?

3. Poderia mostrar o seu código de programação (ou pelo menos uma parte dele)?

Bah Dickel. Vou ser muito grato se conseguir me ajudar a descobrir o problema. 

A fonte sei que é de de 2A. Achei até bastante para movimentar os 16 servos.

o código é mais ou menos assim:

for int i=0. i > 16; i = i + 1;

     for j=0; j <= i; j = J + 1;

          envia sinal para motor(j);

Os servos são estes: http://produto.mercadolivre.com.br/MLB-587417722-micro-servo-9g-sg9...

Meu projeto está em casa. Tentarei trazer o código exato amanhã. Mas é algo semelhante ao que está acima, ou seja, muto simples. 

Oi Dickel!!

Me desculpa pelo sumiço. Andei tendo uns problemas que me deixaram longe do projeto. Estou retomando ele agora.

O código de teste que fiz, é este. Como tinha te dito, montei 16 motores. Na medida que mais um motor é ativado, ele acaba ficando com menos força. O quinto nem se mexe. Se eu simplesmente desconectar um dos motores (motor 1,2,3 ou 4) do sistema, retirando os 3 fios, o quinto motor passa a participar do loop mas a sequência continua igual. O primeiro forte, o segundo menos o terceiro menos e o quarto menos. 

Se ainda estiver a fim de ajudar, te agradeço.

Abraço.

#include "Tlc5940.h"
#include "tlc_servos.h"

void setup(){
tlc_initServos();
Serial.begin(9600);
}

void loop(){
for (int cont = 0; cont < 16; cont++) {
for (int thisPin = 0; thisPin < cont; thisPin++) {
Serial.print("primeiro");
Serial.println(thisPin);
tlc_setServo(thisPin, 180);
}
Tlc.update();
delay(1000);
for (int thisPin = 0; thisPin < cont; thisPin++) {
Serial.print("segundo");
Serial.println(thisPin);
tlc_setServo(thisPin, 0);
}
Tlc.update();
delay(1000);
}

}

Ae cara, como vai?

Como você está alimentando os servos?

não sei porque a resposta ficou cortada. Vamos de novo. estou usando um conversor de 5V e 2A. Imagino que seja suficiente. Consegui uma fonte de computador. Não sei qtos amperes tem, mas vou fazer uma experiência se vai mexer um número diferente de servos. Quando testar, te aviso o resultado. 

Luiz, tenta este código (todos os servos devem ir de 0 a 180 graus e voltar a 0 ao mesmo tempo).

#include "Tlc5940.h"
#include "tlc_servos.h"


void setup()
{
tlc_initServos(); // Note: this will drop the PWM freqency down to 50Hz.
}

void loop()
{
for (int angle = 0; angle < 180; angle = angle + 3) {
tlc_setServo(0, angle);
tlc_setServo(1, angle);
tlc_setServo(2, angle);
tlc_setServo(3, angle);
tlc_setServo(4, angle);
tlc_setServo(5, angle);
Tlc.update();
delay(20);
}
for (int angle = 180; angle >= 0; angle = angle - 3) {
tlc_setServo(0, angle);
tlc_setServo(1, angle);
tlc_setServo(2, angle);
tlc_setServo(3, angle);
tlc_setServo(4, angle);
tlc_setServo(5, angle);
Tlc.update();
delay(20);
}
}

Para usar o mega precisa fazer alguma alteração? Por exemplo nas portas, a ligação vai ser a mesma?

Para usar com o Mega, os pinos são outros. Se você já instalou a biblioteca do TLC5940 vá na pasta da mesma, depois na subpasta pinouts e dê uma olhada no arquivo Arduino_Mega.h que tem a indicação dos pinos.

Aqui também tem algumas informações (mas não testei), mas deve funcionar: https://code.google.com/p/tlc5940arduino/wiki/ArduinoMegaHardwareSetup

Obrigado.

Estou terminando de montar meu humanoide, queria saber como irei fazer um codigo para ler a posição de cada servo, pois facilitará na programação.

Acho que não tem como ler. Deve montar uma lógica guardando a informação da posição de cada servo. Pelo menos eu faria assim.

Queria saber o comando para ler a posição, pois com a biblioteca desse ci muda tudo

olha só: tu vai ter uma variável para cada servo. ao enviar uma posição, tu vai ter o conteúdo setada nela. Neste caso vai ter a última posição de todos eles. Ajudou?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço