Ir ao conteúdo
  • Cadastre-se

Controlar servo motor com pic 18F4520


Posts recomendados

Boa tarde, estou montando um braço robótico com 4 servo motores 9g, usando o pic 18f4520, ele só possui 2 portas PWM, então estou usando portas normais dele, mandando um sinal de nível alto de 700us e 19300us em nível baixo, para o servo ficar em 0º, e um sinal alto de 2200us, e 17800 em nível baixo, para o servo rodar 180º. Não consegui fazer funcionar através de um potenciometro, então estou apenas tentando programar movimentos e ele ficar repetindo, o conjunto está funcionando, porém a garra  não consegue pegar praticamente nada além de um algodão, porque quando o servo motor atua na garra e faz ela fechar, se o objeto for muito grande ela fica "loca" e tenta fechar e abre de novo, se o objeto for muito pequeno, ela fecha e afrouxa depois, e o objeto não acompanha a garra. Estou ligando o pino PWM do servo direto na porta RB7 do pic, alguém tem alguma sugestão do que fazer para melhorar essa garra? Poderia ser que a corrente está muito baixa? Mas acredito que o problema seja na programação mesmo. Estou utilizando o MikroC for pic, para programar.

Obrigado,

         Fabio.

Braço robótico.mp4

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Bacanina. Mas no video não vi tal problema o que me impele a chutar... quando você define 0 ou 180º o servo vai tentar posicionar neste ângulo a "qualquer custo" mesmo se achar um "obstáculo" aos 30º. O preço principal: corrente alta o que traz resultados aleatórios mas tecnicamente previsíveis. Seu momento de refletir sobre...

 

Ah.. você consegue sim variar com um pot: leia o resultado do ad e coloque-o como setup do pwm

 

abç

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz

Muito obrigado pela resposta, então, eu fiz um teste com a garra pegando um algodão, e funcionou perfeitamente, porque ela amassa o algodão e fecha a garra por completo, mas com um Halls por exemplo que ela não fecharia ate o limite, não da certo, porque ela fecha ate o Halls, e para por ai, ai ela acaba "afrouxando" e o Halls cai, teria um jeito de eu mandar o sinal para ela fechar e o sinal ficar enviando toda hora, mesmo enquanto ele atua nos outros servos, eu tentei colocar o sinal entre os outros, mas mesmo assim não funcionou.

 

O esquema de controlar pelo pot, eu teria que usar as duas portas PWM pra fazer do jeito que você disse né? Como eu faria com 4 servo motores se o pic que estou usando so tem duas portas PWM? 

 

Não entendi muito bem o lance da corrente que você disse, desculpe a ignorância, estou começando agora a mexer com isso e estou apanhando um pouco.

 

Muito obrigado pelas dicas.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O lance do pot é apenas pra testar suas habilidades no controle absoluto sobre a funcionalidade do mc e não necessariamente sobre seu problema. você pode usar uma porta só por vez. Não vi seu fonte mas algo como:

a=adcread(0);

setduttycycle(a);

Varie o pot e veja o sinal pwm.

 

Se seu mc só tem 2 pwm, a solução seria fazer por sw p.ex. usando interrupção de um timer qualquer. Hás de pesquisá-lo pois com poucas letras (meu limite) teremos dificuldades em nos sintonizar.

 

Sobre a corrente, tente colocar um resistor (chute 33...220R) em serie com o motor. Se o motor travar, a tensão vcc não cairá. Momento entender o porquê...

Link para o comentário
Compartilhar em outros sites

@test man*~  Bacana esse Pca9685, entrei pra ver na internet, não conhecia, parece ser uma alternativa mesmo. Muito obrigado pela dica, vou tentar um pouco mais sem usar esse driver ai, mas se não rolar mesmo vou partir pra ele. 

Muito obrigado.

adicionado 9 minutos depois

@Isadora FerrazAinda estou tentando melhorar a garra por comandos prontos antes de mexer com o potenciometro, e descobri que o servo tem força sim para fazer a garra ter mais pressão, colocando no programa apenas o comando para fechar a garra, ela fica sempre forçando a garra para fechar, e ela funciona perfeitamente. Então tentei colocar como uma interrupção apenas o comando de fechar a garra, para que rapidamente ela força o objeto para que não caia. Funcionou legal, porém quando add no programa no loop normal, outro comando em outro servo, ele não reproduz, porque parece que fica o tempo inteiro na interrupção forcando a garra, diminui o tempo do timer para a interrupção, porém mesmo assim não funciona.

 

Vi que o servo que estou usando, precisa do sinal de pwm em uma frequências de 50Hz, 20 ms. Então no programa para enviar um comando para que o servo gire, fica algo assim:

 

void girar0(){

unsigned int i;

for(i=0,i<50,i++)

{

PORTB.RB0 = 1;

Delay_us(1500);

PORTB.RB0 = 0;

Delay_us(18500);

}

}

 

Pelo o que eu entendi essa função for é necessária, para que o comando seja enviado 50 vezes, por causa da frequências de 50Hz. 

 

Acho que o esquema da interrupção não deu certo, pelo fato de esse comando para o outro servo girar demorar muito, 1 segundo aparentemente, pois seria 50*20ms, certo? e a interrupção sempre interrompera o comando para o outro servo girar, e assim ele nunca vai girar.

 

Não sei se estou certo, é o que eu acho, alguma sugestão?

Muito obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

De fato você deve criar uma interrupçao de 50Hz e dentro dela usar o valor de 4 variáveis pra manter o nível alto de 4 pinos do mc

algo como:
 

unsigned char dca,dcb,dcc,dcd;//dutty cycle
unsigned char da,db,dc,dd;//a incrementar
void interrupt50Hz() //
{
//..setup do hw, reload e etc
if (da++>dca) RB0=0;else RB0=1; //4
if (db++>dcb) RB1=0;else RB1=1;//canais
if (dc++>dcc) RB2=0;else RB2=1;//de
if (dd++>dcd) RB3=0;else RB3=1;//pwm
}

E no main() você controla os valores do dcd...a pra controlar o dutty cycle

De fato é só conceitual (pode não estar certo) e a ideia é fazer você ter a sua. Talvez (talvez algum dia) algum dia eu faça uma simulação do conceito acima pois você não é o primeiro (e não será o último) que precisa de vários canais de pwm num mc. Duvida? Dúvida...

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!