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

Isso eu já fiz, mas não deu certo, preciso de um comando para ler a posição

se não deu certo, é porque perdeu a informação no meio do programa, e isso tu resolve usando programação. Se tu passa o angulo 50 para uma variável ex: motor_9, tanto o motor como a vaariável vai ter esta posição. Se a variável ficar com um valor diferente de 50, é porque no meio do programa teve uma nova atribuição. Como não te conheço, desconheço o que sabe de programação. Se estiver falando uma coisa muito óbvia, esquece. Mas aí não sei como ajudar.

Acho que você não entendeu o que eu quero fazer, quero posicionar o servo em uma angulação e pedir para que me mostre este angulo que está

Olá, Raphael!

Existe uma forma alternativa hackeando cada servo, conectando um fio ao potenciômetro do servo e ligando a uma porta analógica, aí você lê o valor de entrada. Não é difícil de fazer, dá uma olhada: http://letsmakerobots.com/content/sensing-your-servos-position

Olá,

Se puder ajudar a alguém, segue link do vídeo do meu canal.

https://www.youtube.com/watch?v=gg_uEYo9u7I

Abs.

Bom dia Veja as ligações no Proteus que fiz de acordo com as informações do seu projeto. É isso mesmo?


Anexos

Olá José,

Seque PDF da ligação e e arquivo de simulação ambos gerados pelo Proteus.

Compare e tire suas duvidas.

Abs.

CK

Anexos

Veja as ligações que fiz no proteus com as informações que você passou J . Eduard Dickel.

Verifica por favor se é isto mesmo.

Coloquei um zener na entrada da alimentação para tentar proteger os servos na alimentação independente. Será que funciona?

Muito obrigado.

Qual será a alimentação dos servomotores?

Alimentação de 6V para os 16 servos MG996R. coloquei nos conectores para alimentação separada. 

coloquei um zener na entrada para garantir que não passará de 6V.

Podes verificar para mim se as ligações estão corretas?

Você vai utilizar um Arduino como microcontrolador? Não saquei muito bem teu esquema... J5, J6 e J7 são conectores que vão para o Arduino? Não tem como dizer se está correto se eu não vejo aonde estes conectores irão. Siga o esquema que fiz no Fritzing.

De onde virão os 6V? Baterias? Pilhas?

Dica: comece simples em uma protoboard... teste com um canal e depois expanda seu projeto.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço