Bom dia

Estou tentando desenvolver um projeto de seguidor solar (Solar Tracker) com 2 eixos (Horizontal e vertical), utilizando a plataforma Arduino UNO os componentes específicos;

-> 4 Sensor LDR

-> 2 Motores NEMA 17 (4 fios)

-> Drive A4988

Há inúmeros projetos parecidos porém com Micro Servo motores SG90 e outros pequenos, que não tem força suficiente para suportar uma placa (somente exemplo).
Eu não consegui fazer a alteração no código para usar os motores NEMA 17 que tenho e que suporta até 3,5Kg.

Alguém poderio me ajudar na elaboração deste código?

Segue abaixo um código bacana com combinação (fazendo a média) da luminosidade dos 4 LDR, mas infelizmente não consegui altera-lo para meus motores NEMA 17 .

Solar_Tracker.zip

Segue também um código, exemplo de como Controlar Passos e Revoluções para o motor NEMA 17, que estava tentando fazer a união dos dois, mas não consegui.

Motor_NEMA_17.zip

Segue link de um vídeo: https://www.youtube.com/watch?v=wIzwv6LcriA

Exibições: 465

Responder esta

Respostas a este tópico

Olá Ruyter!

   O código postado é um bom exemplo de como controlar um motor de passo, o que está ali é suficiente para implementar o que precisas, mas posso te dizer que uma das grandes diferenças dos servos de curso limitado ( 90º, 180º ou 360º ) é que eles sempre "sabem" a posição em que estão, enquanto os motores de rotação contínua, como os steppers que você está usando, precisam ser referenciados ao ligar o equipamento.

   Isto quer dizer que, ao ligar o equipamento, é necessário utilizar uma rotina de referenciamento, que chamamos HOME, e que coloca o motor em uma posição conhecida.

   Ela consiste em girar lentamente o motor em em sentido, até que um sensor especialmente montado para esta tarefa diga que o motor chegou na posição de referência.

   Neste momento, uma variável interna é inicializada com esta referência ( pode ser usada a função stepper.setCurrentPosition() do código ) e, a partir daí, passa a rastrear a posição.

   Sempre que você aciona o motor para atingir nova posição, esta variável é atualizada para esta nova posição.

   Digo isto porque esta é, em linhas gerais, a maior dificuldade encontrada por quem se depara com este problema pela primeira vez.

   Mas, como não conheço detalhes do projeto, pode ser que você não precise saber realmente a posição em que os motores estão, fazendo simplesmente um movimento de seguir a máxima saída do painel solar. Neste caso, talvez a rotina HOME não seja necessária. 

Sucesso.

D. T. Ribeiro.

Bom dia amigos LG

Hoje consegui desenvolver uma lógica do projeto, mais ainda parece não funcioar adquadamente.

- Após sincronização do ponto inicial dos motores, algumas vezes parece obedecer corretamente as instruções de ângulo de funcionamento, porém outras vezes não funciona, vai para uma posição totalmente diferente.

Por isso ainda não montei um protótipo (aparência real), porque poderia quebrar..., apenas estou visualizando o funcionamento dos motores.


Segue abaixo a lógica desenvolvida e vídeo

RastreadorSolar.zip

Rastreador_Solar.mp4

Neste vídeo inicia sincronizando os motores, primeiramento o horizontal e depois o vertical, em seguida aperto o botão reset do arduino para rainicializar novamente então os motores fazem nova sincronização.
- Percebemos que há comportamentos diferentes
- Porque está acontecendo isso?
- Quais seriam as alternativas de solução?

Algumas dúvidas:
- Os drives A4988 parece esquentar muito, como implementar sem a utilização do drive e biblioteca?
- Pensando em SERVO MOTORES (não de passo), quais seriam os motores ideasis que suportaria 3 a 5Kg de força?
- Já vi em uns vídeos pessoas usando motores de vidro de porta de carro, funciona?

Conto com a colaboração dos amigos LG.

Olá Ruyter:

   Em primeiro lugar, não consegui abrir o teu vídeo pois reclama que está faltando um codec aqui na minha máquina.

   Mesmo assim, pensei em algumas coisas:

   Se você faz a sincronização total de um dos motores e depois faz a do outro, provavelmente não é problema de interferência cruzada. Isto já é um bom sinal.

   Então, tente fazer várias sincronizações da forma como você descreveu, mas desligando o arduino e os motores e retirando-os manualmente de sincroniosmo antes de religar. Se funcionar, poderá estar indicando que a rotina de sincronização não está sabendo lidar com o motor já sincronizado.

   Sobre o uso de outros tipos de motores, não há problema, desde que os motores tenham as características necessárias para a execução da tarefa, a saber, torque, potência, velocidade e controlabilidade.

   Tenho um conhecido que fez uma pequena máquina para uma fábrica de chocolate com motor de limpador de para-brisas de automóvel. Ele usou uma ponte H com controle por PWM.

   Também é evidente que, qualquer que seja o motor utilizado, seu drive tem que ser adequado.

   Quanto ao uso do drive, não há muito o que fazer. Para motores de passo, o mínimo que você vai precisar é de uma ponte H para cada bobina. Os drives tem isto e mais: Decodificadores que transformam sinais de pulso e direção em comandos para as pontes H, proteção contra "punch-through", controle de corrente, micropasso etc.

   Se usar outros tipos de motores, por exemplo de corrente contínua, terá de ter coisas semelhantes, desta feita adequadas ao motor CC.

   No link a seguir há uma boa explicação de como funcionam estes drives que você usa e uma coisa que notei foi o uso de dissipadores de calor. Você os está usando?

   LINK-> A4988 Tutorial - Last minute engineers <-LINK

   Você informa que os drives estão esquentando muito. Isto pode ou não ser problema. Se "esquentar muito" ainda os mantiver dentro da faixa de temperatura aceitável, segundo o fabricante, então não é problema.  É só colar uma etiqueta de "CUIDADO - QUENTE" e o problema está resolvido.   :-)

Bons testes!

D. T. Ribeiro.

Bom dia

Sr. D. T. Ribeiro

Não conseguir entender direito sua sugestão:

"Então, tente fazer várias sincronizações da forma como você descreveu, mas desligando o arduino e os motores e retirando-os manualmente de sincronismo antes de religar. Se funcionar, poderá estar indicando que a rotina de sincronização não está sabendo lidar com o motor já sincronizado"

Veja se consegue me explicar de outra forma, se possível.

Converti o vídeo para outro formato, veja se consegue executar: RastreadorSolar.ts

Estou utilizando o VLC Media Player.

Olá Ruyter:

   Agora sim consegui ver o vídeo. Obrigado.

   Quanto à minha sugestão, desculpe por não ter sido claro.

   O que imaginei, era que você fazia a sincronização e o motor parava no sensor. E depois pedia outra sincronização com o motor já sincronizado, isto é, parado no sensor e isto não acontecia como deveria.

   Mas agora, vendo o vídeo, acho que entendi. Corrija se eu estiver errado: Você faz o sincronismo e depois solicita um novo posicionamento baseado nos sensores LDR, que tira o motor da posição 'home'.

   Parece que o problema está neste posicionamento que, segundo entendi, é errático, i. e., não faz sempre a mesma coisa apesar dos sinais dos sensores LDR serem sempre os mesmos.

   Depois, um novo sincronismo é executado corretamente.

   Então, diferente do que imaginei, o problema não é no sincronismo, mas nos posicionamentos.

   Isto me leva a crer que o problema está no tratamento dos sensores LDR.

   Uma dica para se certificar disto é, primeiramente, substituir as leituras dos sensores por valores fixos e verificar se o comportamento errático se repete. Caso se repetir, o problema está nas rotinas de leitura e tratamento dos sinais dos sensores LDR. Caso contrário, estará nos próprios sensores em si.

   Caso o problema não se repita, indicando que as rotinas de tratamento dos sensores estão OK, o processo segue substituindo os sensores LDR por divisores de tensão com potenciômetros, para simulá-los. Isto dirá se o problema é na leitura dos sensores ou nos próprios.

   Normalmente, é esta a abordagem 'step by step' que eu uso para debugar um problema como este.

   Caso eu ainda não tenha entendido o problema, sinta-se à vontade para dizê-lo e fornecer esclarecimentos adicionais.

D. T. Ribeiro.

Olá ( novamente ) Ruyter!

   Não tenho aqui os materiais para reproduzir o teu experimento, mas revendo a documentação da biblioteca, se eu não estiver errado, ao final de cada referenciamento, acho que é necessário informar que esta é a posição 'ZERO' ( ou HOME ) para a biblioteca, através da instrução

         setCurrentPosition( 0 ) ;

   No final do referenciamento você poderia dar um Serial.print() usando a função currentPosition() para verificar se esta é a posição esperada. Antes de usar setCurrentPosition( 0 ) provavelmente você terá um valor aleatório.

   Depois de usar setCurrentPosition( 0 ) provavelmente você terá posição 'ZERO'.

D. T. Ribeiro.

A questão da sincronização do ponto zero parece que foi solucionado com a função setCurrentPosition(0); , obrigado!

Agora acho que já posso fazer um protótipo para continuar com ajustes.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço