O movimento síncrono entre vários atuadores lineares pode ser vital para o sucesso de algumas aplicações do cliente, uma delas comum sendo dois atuadores lineares abrindo um alçapão. Para conseguir isso, recomendamos o uso do Firgelli dedicado caixa de controle síncrono FA-SYNC-2 e FA-SYNC-4. No entanto, alguns DIYers e hackers preferem a liberdade que um microcontrolador como o Arduino oferece e preferem escrever seu próprio programa de controle síncrono. Este tutorial tem como objetivo fornecer uma visão geral sobre como conseguir isso usando o Atuador linear série óptica.
Prefácio
Este tutorial não é um tratamento rigoroso das etapas necessárias para obter o controle síncrono com o Arduino, mas uma ampla visão geral para ajudá-lo a escrever seu próprio programa personalizado. Este tutorial é avançado e presume que você já esteja familiarizado com o hardware e software Arduino e, de preferência, tenha experiência com sinais de modulação por largura de pulso (PWM), rotina de serviço de interrupção (ISR), eliminação de pontos de sensores e codificadores de motor. O exemplo fornecido neste tutorial é um controlador proporcional primitivo. Muitas melhorias podem ser implementadas no exemplo a seguir, incluindo, mas não se limitando a: implementação de uma malha de controle PID e escalonamento para mais de dois atuadores lineares. Esteja ciente de que não temos os recursos para fornecer suporte técnico para aplicativos Arduino e não iremos depurar, editar, fornecer código ou diagramas de fiação fora desses tutoriais disponíveis publicamente.
Visão geral do controle síncrono
O controle síncrono é obtido comparando o comprimento de dois atuadores lineares e ajustando proporcionalmente a velocidade; se um atuador começar a se mover mais rápido do que outro, nós o diminuiremos. Podemos ler a posição do atuador linear por meio do codificador ótico embutido. O codificador óptico é um pequeno disco de plástico com 10 orifícios que é conectado ao motor DC de forma que, quando o motor gira, o disco de plástico também o faz. Um LED infravermelho é direcionado para o disco de plástico para que, à medida que gira a luz, seja transmitida através dos orifícios do disco óptico ou bloqueada pelo plástico do disco. Um sensor infravermelho do outro lado do disco detecta quando a luz é transmitida através do orifício e emite um sinal de onda quadrada. Contando o número de pulsos que o receptor detecta, podemos calcular o RPM do motor e a distância que o atuador linear percorreu. O atuador ótico linear de 35 lb tem 50 (+/- 5) pulsos óticos por polegada de deslocamento, enquanto os atuadores de 200 lb e 400 lb têm 100 (+/- 5) pulsos por polegada. Comparando o quanto cada atuador linear se estendeu, podemos ajustar proporcionalmente a velocidade dos dois atuadores para que eles sempre permaneçam no mesmo comprimento durante a extensão.
Componentes Requeridos
- Dois atuadores ópticos lineares
- Dois drivers de motor IBT-2
- Arduino Uno
- Fonte de alimentação 12V
- 3 botões momentâneos (não vendidos pela Firgelli)
- Fiação adicional
Diagrama de Fiação
Faça as conexões de fiação acima. Sempre verifique as cores dos fios que saem do atuador linear, pois a convenção de cores pode mudar do que é mostrado no diagrama acima.
Tutorial Rápido
Se você deseja apenas que seus dois atuadores lineares se movam em sincronia, basta seguir estas etapas:
- Faça as conexões conforme mostrado no diagrama de fiação.
- Faça upload e execute o primeiro programa abaixo.
- Copie os dois valores produzidos por este programa na linha 23 do segundo programa, abaixo.
- Faça upload e execute o segundo programa.
- Ajuste seu sistema variando a variável K_p (linha 37, segundo programa). Isso é feito mais facilmente anexando um potenciômetro ao pino analógico A0 e modificando o código para ler o potenciômetro e usando a função map (): K_p = map (analogRead (A0), 0, 1023, 0, 20000);
O restante deste tutorial abordará com mais detalhes alguns dos principais recursos dos programas. Novamente, reiteramos que este não é um tutorial exaustivo, mas uma visão geral das coisas a serem consideradas ao criar seu próprio programa.
Visão geral do programa de calibração
Antes que o controle síncrono possa ser alcançado, devemos primeiro calibrar o sistema. Isso envolve a contagem do número de pulsos por ciclo de atuação porque, conforme declarado nas especificações do produto, há uma tolerância de (+/- 5) pulsos por polegada de curso. Faça upload e execute o programa abaixo. Este programa irá retrair totalmente os atuadores (linha 53) e definir a variável do contador de pulso óptico para zero, então ele será totalmente estendido e totalmente retraído (linha 63 e 74, respectivamente). Durante este ciclo de atuação, o número de pulsos será contado pela rotina de serviço de interrupção (ISR), linha 153 e 166. Assim que o ciclo de atuação for concluído, o número médio de pulsos será emitido, linha 88, anote esses valores para mais tarde.
https://gist.github.com/Will-Firgelli/89978da2585a747ef5ff988b2fa53904
Visão geral do programa síncrono
Antes de carregar o programa de controle síncrono, você deve primeiro copiar os valores produzidos pelo programa de calibração na linha 23 e substituir a matriz atual: {908, 906} com seus próprios valores. Além disso, se você estiver usando o atuador linear de 35 lb, você precisará alterar o valor da variável na linha 29 de 20 milissegundos para 8 milissegundos.
Depois de retrair totalmente uma vez (para identificar a origem), você pode mover ambos os atuadores lineares em sincronia pressionando os três botões correspondentes aos comandos de extensão, retração e parada. Os atuadores permanecerão em sincronia mesmo sob cargas desiguais, comparando seus contadores de pulso relativos e ajustando a velocidade entre eles para permanecerem sempre em sincronia. Esteja ciente de que o programa atual implementa um controlador proporcional simples, a linha 93, pois está sujeito a overshoot e oscilação em torno do equilíbrio. Você pode ajustar isso variando a variável K_p, definida na linha 37. Isso é feito mais facilmente anexando um potenciômetro ao pino analógico A0 e modificando o código para ler o potenciômetro e usando a função map (): K_p = map (analogRead (A0), 0, 1023, 0, 20000);
Para obter os melhores resultados, sugerimos fortemente remover o controlador proporcional e implementar uma malha de controle PID; no entanto, isso está além do escopo deste tutorial introdutório e foi omitido deliberadamente.
https://gist.github.com/Will-Firgelli/44a14a4f3cac3209164efe8abe3285b6
Usando Atuadores Bullet 36 e Bullet 50 em Síncrono
Além de nosso atuador linear da série óptica, também oferecemos dois atuadores lineares com codificadores embutidos: o Bullet 36 Cal. e o Bullet 50 Cal, ambos com um codificador de efeito Hall de quadratura interno. O codificador de efeito Hall funciona com o mesmo princípio que o codificador óptico, mas em vez de usar luz, ele utiliza magnetismo. Além disso, sendo um codificador de quadratura, ele tem duas saídas de sinal, cada uma defasada em 90 graus. Assim, você precisa usar uma placa Arduino com 4 ou mais pinos de interrupção (o Arduino Uno tem apenas dois) e modificar o código para processar a entrada de dois sinais por atuador. Além disso, a variável de tempo de debounce, falsepulseDelay, precisará ser ajustada junto com K_p.
Dicas para escrever seu próprio programa
Mais de dois atuadores lineares
Ao usar dois ou mais atuadores lineares, o Arduino Uno não funcionará mais, pois possui apenas dois pinos de interrupção disponíveis. Você precisará usar uma placa Arduino com o número apropriado de pinos de interrupção disponíveis, mais informações: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
Em segundo lugar, no interesse da eficiência, é aconselhável vetorizar sua programação utilizando matrizes e loops for () para iterar em cada atuador.
Debouncing
Tal como acontece com muitos sensores, é importante estar ciente dos sinais que saltam. Tal como acontece com os interruptores mecânicos, os codificadores também podem sofrer oscilações. No exemplo acima, o processo de eliminação de pontos foi tratado por um simples atraso (definido pela variável falsepulseDelay), é importante lidar com isso em qualquer alteração de software que você fizer ou com circuitos físicos para filtrar o ruído de ressalto.
Manipulação de capotamento
Se você modificar o código, esteja ciente do rollover ao lidar com a função millis (). Ambos millis () e o array lastDebounceTime são declarados como variáveis longas sem sinal, o que significa que eles podem armazenar valores de até 4.294.967.295 (32 ^ 2-1). Isso se traduz em aproximadamente um período de rollover de 49,7 dias. O programa atual é projetado para lidar com rollover nas funções ISR (interrupt service rotine): count_0 & count_1, no entanto, se você modificar este programa, certifique-se de lidar corretamente com o rollover variável, caso contrário, seu programa travará após ~ 49,7 dias de uso contínuo. Para obter mais informações, consulte: https://www.norwegiancreations.com/2018/10/arduino-tutorial-avoiding-the-overflow-issue-when-using-millis-and-micros/