Índice:

Braço robótico: Jensen: 4 etapas
Braço robótico: Jensen: 4 etapas

Vídeo: Braço robótico: Jensen: 4 etapas

Vídeo: Braço robótico: Jensen: 4 etapas
Vídeo: Braço robótico de madeira 2024, Outubro
Anonim
Braço Robótico: Jensen
Braço Robótico: Jensen

Jensen é um braço robótico construído na plataforma Arduino com foco no planejamento de movimento intuitivo, feito como um projeto independente de 1 crédito sob orientação de Charles B. Malloch, PhD. Ele pode replicar uma série de movimentos programados movendo o braço manualmente. Tive a inspiração para construí-lo ao ver outros braços robóticos construídos no makerpace UMass Amherst M5. Além disso, eu queria aprender a usar software CAD e fazer um projeto Arduino avançado. Eu vi isso como uma oportunidade de fazer todas essas coisas.

Etapa 1: Projeto e escopo originais

Projeto original e escopo
Projeto original e escopo

O software CAD que escolhi para este projeto foi o OnShape, e a primeira coisa que modelei foi um servo analógico HiTec HS-422. Eu escolhi o servo porque estava disponível para mim localmente e era um preço razoável. Também serviu como uma boa prática para aprender OnShape antes de passar a projetar minhas próprias peças. Neste ponto inicial do projeto, eu tinha uma ideia geral do que eu queria que o braço fosse capaz. Eu queria que ele tivesse uma amplitude de movimento decente e uma pinça para pegar as coisas. Essas especificações gerais informaram o projeto à medida que continuei modelando-o em CAD. Uma outra restrição de design que eu tinha neste momento era o tamanho da mesa de impressão na minha impressora 3D. É por isso que a base que você vê na foto acima é um quadrado relativamente primitivo.

Durante esta fase do projeto, também estava pensando em como queria controlar o braço. Um braço robótico que me inspirou no makerpace usava um braço de marionete para controle. Outro usava um método de programação de caminho intuitivo no qual o braço era movido para várias posições pelo usuário. O braço então voltaria para essas posições.

Meu plano original era terminar a construção do braço e, em seguida, implementar esses dois métodos de controle. Eu também queria fazer um aplicativo de computador para controlá-lo em algum momento depois disso. Como você provavelmente pode perceber, acabei reduzindo o escopo desse aspecto do projeto. Quando comecei a trabalhar nesses dois primeiros métodos de controle, descobri rapidamente que a programação intuitiva de um caminho era mais complicada do que pensei que seria. Foi então que decidi torná-lo meu foco e colocar os outros métodos de controle em espera indefinida.

Etapa 2: controle

Ao controle
Ao controle

O método de controle que escolhi funciona assim: você move o braço com as mãos em várias posições e "salva" essas posições. Cada posição contém informações sobre o ângulo entre cada elo do braço. Depois de salvar as posições, você pressiona um botão de reprodução e o braço retorna para cada uma dessas posições em sequência.

Nesse método de controle, havia muitas coisas a serem descobertas. Para que cada servo retorne a um ângulo salvo, eu tive que de alguma forma "salvar" esses ângulos em primeiro lugar. Isso exigia que o Arduino Uno que eu estava usando fosse capaz de receber o ângulo atual de cada servo. Meu amigo Jeremy Paradie, que fez um braço robótico que usa esse método de controle, me deu uma dica para usar o potenciômetro interno de cada servo de passatempo. Este é o potenciômetro que o servo usa para codificar seu ângulo. Eu escolhi um servo de teste, soldei um fio no pino do meio do potenciômetro interno e fiz um orifício no gabinete para alimentar o fio para fora.

Eu agora podia receber o ângulo da corrente lendo a tensão no pino do meio do potenciômetro. No entanto, havia dois novos problemas. Em primeiro lugar, havia ruído na forma de picos de tensão no sinal vindo do pino do meio. Esse problema se tornou um problema real mais tarde. Em segundo lugar, a faixa de valores para enviar um ângulo e receber um ângulo era diferente.

Dizer aos servo motores de hobby para se moverem para algum ângulo entre 0 e 180 graus envolve o envio de um sinal PWM com um tempo alto correspondente ao ângulo. Ao contrário, usar um pino de entrada analógica do Arduino para ler a tensão no pino do meio do potenciômetro enquanto move a sirene do servo entre 0 e 180 graus retorna uma faixa separada de valores. Portanto, alguma matemática foi necessária para traduzir um valor de entrada salvo no valor de saída PWM correspondente necessário para retornar o servo ao mesmo ângulo.

Meu primeiro pensamento foi usar um mapa de alcance simples para encontrar o PWM de saída correspondente para cada ângulo salvo. Funcionou, mas não foi muito preciso. No caso do meu projeto, a faixa de valores altos de PWM correspondentes a uma faixa de ângulo de 180 graus era muito maior do que a faixa de valores de entrada analógica. Além disso, esses dois intervalos não eram contínuos e eram compostos apenas por números inteiros. Portanto, quando mapeei um valor de entrada salvo para um valor de saída, a precisão foi perdida. Foi neste ponto que percebi que precisava de um loop de controle para colocar meus servos onde eles precisavam estar.

Eu escrevi um código para um loop de controle PID no qual a entrada era a tensão do pino do meio e a saída era a saída PWM, mas rapidamente descobri que eu precisava apenas do controle integral. Nesse cenário, a saída e a entrada representavam ângulos, portanto, adicionar o controle proporcional e derivativo tendia a torná-lo excessivo ou a ter um comportamento indesejável. Depois de ajustar o controle integral, ainda havia dois problemas. Em primeiro lugar, se o erro inicial entre a corrente e o ângulo desejado fosse grande, o servo aceleraria muito rapidamente. Eu poderia reduzir a constante para o controle integral, mas isso tornava o movimento geral muito lento. Em segundo lugar, o movimento foi agitado. Isso era resultado do ruído no sinal de entrada analógico. A malha de controle estava continuamente lendo este sinal, de modo que os picos de tensão causavam um movimento instável. (Neste ponto, eu também mudei de meu servo de teste para o conjunto ilustrado acima. Também fiz um objeto de loop de controle para cada servo no software.)

Resolvi o problema da aceleração excessivamente rápida colocando um filtro de média móvel exponencialmente ponderada (EWMA) na saída. Fazendo a média da saída, os grandes picos de movimento foram reduzidos (incluindo o jitter do ruído). No entanto, o ruído no sinal de entrada ainda era um problema, então a próxima etapa do meu projeto era tentar resolver isso.

Etapa 3: ruído

Barulho
Barulho

Retratado acima

Em vermelho: sinal de entrada original

Em azul: sinal de entrada após o processamento

O primeiro passo para reduzir o ruído no sinal de entrada foi entender sua causa. Sondar o sinal em um osciloscópio revelou que os picos de tensão estavam acontecendo a uma taxa de 50Hz. Acontece que eu sabia que o sinal PWM enviado aos servos também estava a uma taxa de 50 Hz, então imaginei que os picos de tensão tinham algo a ver com isso. Eu imaginei que o movimento dos servos estava de alguma forma causando picos de voltagem no pino V + dos potenciômetros, o que por sua vez estava bagunçando a leitura no pino do meio.

Foi aqui que fiz minha primeira tentativa de reduzir o ruído. Abri cada servo novamente e adicionei um fio vindo do pino V + no potenciômetro. Eu precisava de mais entradas analógicas para lê-los do que o Arduino Uno tinha, então também mudei para um Arduino Mega neste momento. No meu código, mudei o ângulo de entrada de uma leitura analógica da tensão no pino do meio para uma razão entre a tensão no pino do meio e a tensão no pino V +. Minha esperança era que, se houvesse um pico de tensão nos pinos, isso se cancelasse na proporção.

Montei tudo de novo e testei, mas os picos ainda estavam acontecendo. O que eu deveria ter feito neste momento era sondar meu terreno. Em vez disso, minha próxima ideia foi colocar os potenciômetros em uma fonte de alimentação totalmente separada. Desconectei os fios V + das entradas analógicas do Arduino e os conectei a uma fonte de alimentação separada. Eu já tinha sondado os pinos antes, então sabia a que voltagem alimentá-los. Eu também cortei a conexão entre a placa de controle e o pino V + em cada servo. Eu coloquei tudo de volta no lugar, revertei o código de entrada de ângulo para o que era antes e, em seguida, testei. Como esperado, não houve mais picos de tensão no pino de entrada. No entanto, havia um novo problema - colocar os potenciômetros em uma fonte de alimentação separada bagunçou completamente os circuitos de controle interno dos servos. Mesmo que os pinos V + estivessem recebendo a mesma voltagem de antes, o movimento dos servos era irregular e instável.

Eu não entendia por que isso estava acontecendo, então finalmente investiguei minha conexão de aterramento nos servos. Houve uma queda de tensão média de cerca de 0,3 Volts no solo, e ela aumentou ainda mais quando os servos puxaram a corrente. Ficou claro para mim então que aqueles pinos não podiam mais ser considerados "aterrados" e poderiam ser melhor descritos como pinos de "referência". As placas de controle nos servos devem ter medido a tensão no pino do meio do potenciômetro em relação à tensão nos pinos V + e de referência. Ligar os potenciômetros separadamente atrapalhou essa medição relativa porque agora, em vez de um pico de tensão acontecendo em todos os pinos, isso aconteceu apenas no pino de referência.

Meu mentor, Dr. Malloch, me ajudou a depurar tudo isso e sugeriu que eu também medisse a tensão no pino do meio em relação aos outros pinos. Isso é o que fiz em minha terceira e última tentativa de reduzir o ruído da entrada angular. Abri cada servo, recoloquei o fio que havia cortado e adicionei um terceiro fio vindo do pino de referência no potenciômetro. No meu código, fiz a entrada de ângulo equivalente à seguinte expressão: (pino do meio - pino de referência) / (pino V + - pino de referência). Eu testei e reduziu com sucesso os efeitos dos picos de tensão. Além disso, também coloquei um filtro EWMA nesta entrada. Este sinal processado e o sinal original são ilustrados acima.

Etapa 4: Resumindo

Resumindo
Resumindo

Com o problema de ruído resolvido da melhor maneira possível, comecei a consertar e fazer as partes finais do design. O braço estava colocando muito peso no servo na base, então fiz uma nova base que suporta o peso do braço usando um rolamento grande. Também imprimi a pinça e lixei um pouco para fazê-la funcionar.

Estou muito satisfeito com o resultado final. O planejamento de movimento intuitivo funciona de forma consistente e o movimento é suave e preciso, considerando tudo. Se outra pessoa quisesse fazer este projeto, eu primeiro os encorajaria fortemente a fazer uma versão mais simples dele. Em retrospecto, fazer algo assim usando servo motores de hobby era muito ingênuo, e a dificuldade que tive de fazê-lo funcionar mostra isso. Considero um milagre que o braço funcione tão bem. Ainda quero fazer um braço robótico que faça interface com um computador, execute programas mais complexos e se mova com maior precisão, então, no meu próximo projeto, farei isso. Usarei servos de robótica digital de alta qualidade e, com sorte, isso me permitirá evitar muitos dos problemas que encontrei neste projeto.

Documento CAD:

cad.onshape.com/documents/818ea878dda7ca2f…

Recomendado: