Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Calibrando Meus Servos

Componentes e suprimentos

Arduino UNO
× 1
Adafruit PWM Servo Driver Shield
× 1
Parafuso M3
× 8
Arruela M3
× 8
LM2596 DC-DC Conversor de tensão redutor
× 1
PLA vermelho
× 1
PLA branco
× 1
Transferidor matemático claro de 180 graus
× 1
Potenciômetro rotativo (genérico)
× 1
servo motor 9g
× 1

Ferramentas e máquinas necessárias

Impressora 3D (genérica)

Aplicativos e serviços online

Arduino IDE
Autodesk Fusion 360

Sobre este projeto


Em um post anterior no Hackster, eu escrevi sobre como criei um rig para comparar como diferentes servos do mesmo lote giram e mostrei que enviar os mesmos sinais PWM para diferentes servos resulta em algumas diferenças significativas - a imagem abaixo mostra servos que todos começaram em sua posição mais extrema no sentido anti-horário e receberam o mesmo sinal PWM - todos eles têm um comportamento ligeiramente diferente.





Por que não usar as servo-bibliotecas existentes para o Arduino?


Eu uso o servo driver Adafruit PWM para acionar vários servos, e isso me permite enviar um sinal PWM diferente para cada servo. Eu poderia usar a biblioteca Servo que está embutida em minha instalação do Arduino - mas tenho alguns motivos para não fazer isso:
  • Com o driver de servo PWM da Adafruit, posso controlar meus servos usando apenas dois pinos sobre I2C, em vez de dedicar um pino em meu Arduino para cada servo.
  • Às vezes, descobri com a biblioteca Arduino Servo que, quando me conecto a um servo e envio um sinal para que ele gire para a posição de grau zero, ele gira até o limite do curso e tritura as engrenagens dentro do servo.

É claro que os servos 9g que estou usando são baratos e não foram projetados para serem precisos - mas acho que posso extrair mais valor deles. Quero usá-los como robôs ambulantes e preciso que seu comportamento seja um pouco mais preciso e previsível.





Como posso controlar meus servos hobby com mais precisão?


Confirmar que todos os meus servos se comportam de maneira ligeiramente diferente me fez querer construir um dispositivo que me permitiria calibrar um servo - quais valores PWM eu preciso enviar um servo para mover para uma posição de 0 grau? Ou o ponto central de 90 graus? Como evito enviar um valor PWM que leva o servo a uma posição extrema com muita trituração e moagem de engrenagens?

Decidi combinar alguns conceitos simples.
  • Alinhe meu servo com o centro de um transferidor simples, de modo que, à medida que o limpador do servo gira, eu posso medir sua posição.
  • Conecte um potenciômetro a uma entrada analógica do Arduino, para que eu possa controlar a posição do limpador do servo ajustando o valor PWM enquanto ajusto a posição do eixo do potenciômetro.

Para esta versão, fiquei feliz em usar o Serial Monitor do meu Arduino IDE para me dizer o valor do sinal PWM, que posso registrar manualmente.

Usei o Autodesk 123D para projetar um equipamento simples que conteria o potenciômetro, o transferidor, um único servo, meu Arduino e o servo driver Adafruit PWM junto com uma fonte de alimentação.

Quero continuar usando o servo driver Adafruit PWM para minha calibração, pois é o que provavelmente usarei em meu projeto final. Se eu fosse controlar o servo diretamente de um pino no Arduino, replicaria isso no dispositivo e calibraria o servo com relação ao PWM do Arduino.





Construindo o dispositivo


Imprimi cada uma das peças e as conectei usando os parafusos e arruelas M3.

Os orifícios de montagem no design do meu dispositivo são ajustados para caber nos meus componentes - diferentes componentes podem ter variações nos diâmetros e posições dos orifícios.

Para eletrônicos, conectei o pino central do potenciômetro ao pino A0 do Arduino e os outros pinos a 0v e 5v do Arduino. Eu conectei o driver do servo motor PWM ao Arduino e, em seguida, conectei o conversor DC-DC Buck (eu ajustei para converter a entrada da fonte de alimentação de 9 V em uma saída de 5 V). Eu conectei o servo 9g ao primeiro slot no escudo do driver do servo motor e, em seguida, carreguei meu esboço para o Arduino.

O resultado final é mostrado nas fotos abaixo. Girando o botão no canto superior esquerdo do dispositivo, posso controlar a posição do servo e, usando o Serial Monitor no IDE do Arduino, posso ler o sinal PWM enviado ao servo motor para qualquer ângulo determinado.






Então, o que o dispositivo me diz?


Para o meu servo, girei-o até o limite máximo no sentido horário e coloquei o limpador no servo de modo que ficasse posicionado um pouco além da marca de 180 graus no transferidor do meu dispositivo de calibração.

Eu conectei a alimentação ao dispositivo e girei o botão do potenciômetro até que a agulha do servo ficasse alinhada com a marca de 0 grau no transferidor e anotei o valor PWM escrito na saída serial do IDE do Arduino. Então girei o potenciômetro até que a agulha do servo apontasse para 10 graus e observei o valor PWM novamente. Continuei esse processo a cada 10 graus até atingir 180 graus e compartilhei os resultados na tabela abaixo.

Eu criei um gráfico dos resultados (mostrado abaixo) e, como você esperava, é óbvio que há uma relação fortemente linear entre o PWM e o ângulo do servo.

Agora eu tenho alguns valores de PWM e ângulos que são característicos deste servo em particular - outros servos podem ter características semelhantes, mas não serão idênticos.

Tenho algumas opções agora para um desempenho mais preciso do servo:
  • Registre esses pares de valores e mantenha-os em uma matriz em meu esboço do Arduino, e quando eu quiser mover o servo limpador para 90 graus (por exemplo), apenas consulte qual valor PWM está relacionado a este ângulo e envie esse valor PWM para o servo. Isso tem a desvantagem de que só posso girar em ângulos múltiplos de 10.
  • Ou se eu quiser o controle completo do ângulo para o qual envio, posso usar a regressão linear no conjunto de dados para descobrir que fórmula relaciona o ângulo e o valor PWM (para este servo, PWM =2,35 * Ângulo + 159,4). Assim, posso passar o ângulo para o qual desejo virar como parâmetro e calcular programaticamente o PWM necessário para girar este servo específico para essa posição.

De qualquer forma, sou capaz de controlar este servo com mais precisão e confiança do que antes. É um pouco mais trabalhoso calibrar cada servo com precisão, mas para o meu projeto, vale a pena pela precisão adicional.

Claro, quando eu removo o servo do dispositivo, eu mantenho o servo limpador conectado, pois as medições se relacionam a como o limpador é conectado enquanto está sendo calibrado.





Melhorias para a próxima versão


Depois de calibrar alguns servos, pensei em algumas melhorias que irei incorporar na próxima versão.
  • O servo precisa ter um mecanismo de liberação rápida - talvez prendendo o servo no lugar usando um clipe com ímãs de neodímio, em vez de prendê-lo com parafusos M3.
  • Eu quero diminuir isso - talvez eu possa reorientar o Arduino e a fonte de alimentação para conseguir isso.
  • Preciso de um botão liga / desliga entre a bateria 9v e o conversor de buck, então não preciso desconectar totalmente a bateria toda vez que quero desligar a máquina.
  • Eu gostaria de poder imprimir a plataforma em menos peças.
  • Em vez de ler manualmente os valores do transferidor, seria melhor se um sensor pudesse detectar quando o servo está em posições angulares específicas e enviar isso de volta para o Arduino - isso poderia eliminar alguns erros de paralaxe.
  • Finalmente, um display LCD para mostrar os resultados ajudaria muito, pois eu não precisaria de meu computador conectado ao dispositivo.





Concluindo


Então é isso - meus servos de hobby são baratos e não foram projetados para serem precisos - e para muitas aplicações, eles estão perfeitamente bem. No entanto, gostaria de obter um pouco mais de precisão e desempenho repetível do meu, e o equipamento deste post me ajuda a conseguir isso.

Código

  • Sketch para dispositivo servo calibrador
Esboço para dispositivo servo calibrador C / C ++
 #include  #define analogIn A0Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver (); int inputValue =0; int tmpPwmValue =0; configuração void () {Serial.begin (9600); pwm.begin (); pwm.setPWMFreq (60);} void loop () {inputValue =analogRead (analogIn); // inputValue estará entre 0 e 1024 // Por observação, os valores PWM mínimo e máximo do servo são geralmente entre 100 e 612 // A fórmula abaixo nos permite simplesmente converter a entrada analógica para PWM int pwmValue =(int) (100 + ( inputValue / 2)); pwm.setPWM (0, 0, pwmValue); // Certifique-se de que não estamos exibindo dados duplicados desnecessariamente if (pwmValue! =TmpPwmValue) {Serial.print ("Potentiometer Input ="); Serial.print (inputValue); Serial.print (", PWM ="); Serial.println (pwmValue); } tmpPwmValue =pwmValue; atraso (15);} 

Peças personalizadas e gabinetes

Repo para peças do Servo Calibrador
https://github.com/jeremylindsayni/ServoCalibrator

Processo de manufatura

  1. Impressão PLA 3D:Tudo o que você precisa saber
  2. Acompanhamento de rotação horizontal / vertical com o pi de framboesa
  3. PLA vs ABS vs Nylon
  4. Walbi, o Bípede Caminhante
  5. Arduino IoT Robotic Arm
  6. Impressão 3D com PLA vs. ABS:Qual a diferença?
  7. Inversores CC como substitutos para servos CA
  8. O PLA é reciclável ou mesmo biodegradável?
  9. O PLA se dissolve na água e se decompõe?
  10. O filamento PLA é condutor (algum filamento é condutor)?