Relógio de cuco baseado em Lego Mindstorms

Dois anos e meio atrás, comprei o kit Lego Mindstorms EV3 para dar meus primeiros passos na robótica. Depois de colocar o conjunto ev3dev no controlador e jogar o suficiente com o controle SSH do motor e do sensor, eu me refresquei por uma compra por dois anos. A razão era que eu não tinha imaginação suficiente para tornar isso possível: depois de vários modelos montados da Lego Technics (tanto de caixa quanto caseiros), eu já estava acostumada a milagres como brinquedos controlados remotamente e robôs simples como os modelos da Lego apresentados na exposição em Cracóvia, como uma pessoa que trabalhava em um sistema de telemecânica, não inspirava mais inspiração suficiente. Eu realmente não queria repetir a experiência de outra pessoa.

No final, ocorreu-me: um relógio de cuco poderia se tornar um modelo bastante complexo, interessante, prático e não muito estiloso. Inspirado por essa idéia, comecei a trabalhar.

De acordo com minha ideia, o modelo deveria se tornar não apenas um brinquedo, mas um dispositivo totalmente funcional. Isso foi totalmente possível: o relógio trava na minha parede e exibe a hora atual no modo 24/7. Não me propus a tarefa de reproduzir o mecanismo do original com todos os detalhes - por exemplo, as setas são independentes, o som é reproduzido pelo alto-falante do controlador e os pesos e o pêndulo são usados ​​exclusivamente para o ambiente. Tendo transferido, portanto, todo o trabalho principal para a parte do software, montei o mecanismo na versão mais simples possível. Como não documentei todo o processo de montagem, não posso montar o modelo novamente da mesma forma; No entanto, os princípios básicos do emparelhamento de software e mecânica são tais que o programa deve funcionar com modificações mínimas em outros modelos montados de acordo com um princípio semelhante.

Relógios de várias formas são apresentados no vídeo que publiquei no Youtube:


Informações básicas sobre o modelo são apresentadas no vídeo. Abaixo, mostrarei um pouco mais detalhadamente sobre a mecânica, o software e os problemas que surgiram durante a montagem e operação deste projeto.

A mecânica


A montagem da parte mecânica levou 6 dias. Tendo colocado as caixas de Lego em cima da mesa, durante as festas de fim de ano, montei um mecanismo que difere da versão final apenas nas portas atrás das quais o cuco vive (mais sobre isso abaixo). Como não tenho habilidades especiais de design, o relógio é uma caixa retangular com duas mãos e um mostrador marcado com pontos na frente. Na parte superior do relógio, há um compartimento fechado por duas portas nas quais o cuco se assentou; na parte inferior, há um pêndulo esquemático e dois pesos. As peças foram retiradas de vários conjuntos Lego: um Lego Mindstorms EV3 (31313) , duas motoniveladoras Volvo (42030) , um caminhão Mercedes com lança pneumática (42043) e um caminhão guindaste (42009) . Apesar da abundância de conjuntos, quase não havia detalhes suficientes para um modelo desse tamanho - a tampa do relógio é montada a partir de tiras de cores diferentes, o que, no entanto, não chama a atenção, já que, com uma instalação na parede, está acima do nível dos olhos.

Como ponteiro de minuto, é usada a barra Lego Technics padrão para 15 unidades. É colocado no eixo, conectando-o firmemente ao motor. Assim, a precisão de ajustar o ponteiro dos minutos acabou sendo suficiente para que pudesse ser usado para determinar o tempo exato em minutos. O ponteiro das horas é mais curto e montado em um mecanismo giratório. Ele é conectado ao motor através de várias marchas, para que haja uma folga bastante visível - no entanto, não tão grande que cause problemas na determinação do tempo.

As mãos são acionadas por dois grandes motores (LM). Além disso, emparelhado com cada um dos ponteiros externos, outro funciona, o interno - para o ponteiro dos minutos, ele é fixado no mesmo eixo que o primeiro e, para o relógio, o mecanismo rotativo é duplicado na parte interna do relógio. O objetivo das setas internas é pressionar o botão (sensor de toque) enquanto passa as setas externas pela posição superior. Assim, o controlador tem a capacidade de determinar a posição das setas imediatamente após a ativação e definir sua posição correta com base na hora do sistema, evitando que o usuário precise digitar manualmente as setas.

Os pesos têm uma função puramente decorativa. Inicialmente, pensei em fazer um peso, que abaixaria lentamente (como em um relógio normal) e, em seguida, rapidamente subiria para a posição superior (análoga à corda manual de um relógio de pêndulo). Recusei essa opção por vários motivos. Em primeiro lugar, o mecanismo de troca da relação de transmissão entre o motor e o peso acrescentava complexidade extra ao modelo (e a movimentação do pêndulo do mesmo motor apenas o aumentava). Em segundo lugar, um delineador rápido, seja o que for que se diga, será uma operação barulhenta, mas eu queria que o relógio funcionasse o mais silenciosamente possível. Em terceiro lugar, em um relógio de cuco convencional, geralmente existem dois pesos (um fornece o relógio, o segundo - o cuco) e, colocando na parte inferior do relógio imediatamente duas rodas giratórias para a corrente levariam a um aumento ainda maior no tamanho do modelo.

A partir disso, segui um caminho mais simples: na verdade instalei dois pesos no relógio, mas os coloquei em um circuito comum jogado sobre uma única roda motriz. Nesta versão, os pesos sempre se movem em direções anti-climáticas, descendo por sua vez. Esse comportamento tem pouco a ver com relógios de pêndulo reais, mas parece bastante interessante.

A corrente é feita de guarnições comuns de três unidades, usando uma combinação de eixos e pistões: um pistão deslizante é uma peça bastante rara, e eu usei os eixos para dobrar o comprimento da corrente resultante. Não era tão fácil fazer uma roda que movesse essa corrente sem derrapagens e quebras, mas no final era possível.

Quanto a mudar a direção do movimento dos pesos, minha primeira ideia foi torná-la puramente mecânica: ao elevar para a parede inferior da caixa do relógio, o eixo amplo montado diretamente acima do peso pressiona a placa pela qual a corrente é passada e faz com que a roda gire. Eu usaria o elemento de comutação da mesma forma que, por exemplo, o guindaste 42009 : a roda motriz, deslocando-se, entra na embreagem com o vizinho direito ou esquerdo. Essa idéia, no entanto, não se manifestou: a placa de pressão trouxe a peça deslizante para a posição central quando não estava engatada com o vizinho direito ou esquerdo, o torque parou de chegar ao volante e o interruptor congelou na posição central.

Para corrigir essa situação, decidi adicionar um triângulo móvel a esse circuito, cujos dois lados teriam um comprimento fixo e o terceiro seria representado por uma peça deslizante de mola usada na suspensão do mesmo guindaste de caminhão. O significado desse projeto era que o triângulo está sempre do lado do painel de pressão que corresponde ao peso de elevação: quando o peso atinge o topo, o painel pressiona o triângulo, a mola é comprimida, o triângulo passa pela posição de equilíbrio e depois "joga" para o outro lado, liberando energia armazenada por uma mola. Essa energia, de acordo com meu plano, deveria mudar a chave de velocidade pela posição de equilíbrio, traduzindo-a imediatamente para a posição oposta.

No entanto, não consegui estabilizar este sistema. Pelo tamanho do relógio, você pode entender que os mecanismos em miniatura não são a minha cara, mas com um aumento no tamanho do nó, as distorções que surgem nele levam ao atrito, que consome a maior parte da energia de comutação. Tendo sido atormentado com esse mecanismo, finalmente decidi transferir todo o trabalho sujo para o microcontrolador, instalando um botão acima dos painéis de pressão (sensor de toque) em vez de mecânicos complexos.

Um pouco de aritmética simples. O EV3 possui quatro entradas e quatro saídas. Duas entradas e duas saídas já estavam ocupadas por botões e flechas, respectivamente. Adicionando a este circuito um motor que gira a roda da corrente e dois botões, significava que, primeiro, eu não tinha portas livres para conectar o sensor de posição do cuco (pensei em usar um medidor de distância óptico para esse fim) e, em segundo lugar, que os nós restantes (cuco e pêndulo) têm apenas um motor. Eu considerei a opção em que os dois painéis acima dos pesos estariam conectados a um botão comum, mas o recusava, porque se no momento de ligar o relógio um dos pesos estivesse na posição superior, segurando o botão, o relógio não teria informações suficientes para selecionar direção do movimento da corrente.

Como o pêndulo era mais fácil de associar com o mecanismo de movimento da corrente do que com o cuco (tanto em termos de natureza do movimento quanto da localização), coloquei outro grande motor na parte inferior do corpo, que primeiro aciona o pêndulo para frente e para trás (1 revolução do motor traduz-se em um balanço completo do pêndulo) e, em segundo lugar - através de uma engrenagem de redução gira a roda, que aciona a corrente. Esse sistema tem a desvantagem de que, ao reverter a direção do movimento da corrente e, consequentemente, a rotação do motor, o pêndulo também muda a direção do movimento, mesmo que esteja em uma posição intermediária, o que pode parecer feio. No entanto, mudar a direção do movimento dos pesos é uma operação bastante rara, por isso negligenciei esse problema. Outra desvantagem da minha montagem é o jogo bastante substituível no acionamento do pêndulo, e é por isso que, quando se move lentamente, o pêndulo para em um ponto mais baixo por uma fração de segundo para um olho perceptível. Eu estava com preguiça de resolver esse problema.

Falando da velocidade do pêndulo. Depois de experimentar, escolhi um valor de 30 graus do motor por segundo. Isso significa que o pêndulo oscila completamente em 12 segundos. Isso é muito, no entanto, com o aumento da velocidade, o motor começou a uivar, e a perspectiva de ouvir continuamente sua música não sorri para mim. Era muito preguiçoso para percorrer o mecanismo e introduzir um overdrive, então decidi por um formato tão "lunar". As relações de transmissão entre o motor e a roda motriz da corrente são tais que o peso passa da posição inferior para a superior em 40-50 minutos.

Permanecendo livre após todas as manipulações anteriores, a porta EV3 ocupava o motor do meio (motor médio), que aciona o cuco. O próprio cuco é montado a partir de partes das mesmas técnicas de Lego. Em altura, o pássaro chega a 11 unidades e é colocado em uma barra retrátil (nestes, no guindaste de caminhão mencionado acima, foram colocadas paradas remotas). Um mecanismo em miniatura introduz uma transmissão entre as asas do pássaro e sua cauda, ​​através da qual joguei um cabo fixo dentro do relógio. O comprimento do cabo é escolhido de forma que o cuco saia completamente com as asas abaixadas e apenas no final do movimento os afaste levemente. Acabou atmosférico - apenas no nível de mecanização de modelos simples de relógios. A ausência de um sensor de posição é compensada pelo fato de o acionamento do cuco ser ligado pela engrenagem deslizante - ajuda a não danificar o motor, mesmo que tente mover o cuco para além dos pontos de limite. As portas estão bem conectadas à prancha na qual o pássaro está fixo e abrem simultaneamente com a partida do próprio cuco.

Inicialmente, usei 11 por 5 para painéis de 1 unidade como portas, mas isso acabou sendo uma péssima idéia: as bordas não eram arredondadas e as portas, agarradas às partes adjacentes, muitas vezes bloqueadas, deixando o cuco dentro. O vídeo mostra a segunda versão do conjunto da porta - guarnições comuns com bordas arredondadas não causam esse problema. Além disso, a versão “prancha” da porta se abre e fecha muito mais silenciosamente.

O relógio é montado em uma pulseira presa à parede. Toda a estrutura pesa mais de um quilograma.

Sobre isso, a descrição da parte mecânica, em princípio, termina. Resta apenas mencionar que o modelo é 100% montado a partir de Lego Mindstorms e Lego Technics, e a única parte que não se aplica a esses kits é o cabo de alimentação, que soldei no meu EV3, para que eu não tivesse que trocar as baterias o tempo todo. Esse fio vai para a fonte de alimentação conectada à tomada.

O programa


O assembly ev3dev fornece binders para muitas linguagens de programação. Para não ter dificuldades com a montagem, decidi me limitar a um script Python. Este script está disponível no repositório GitLab . Abaixo irei brevemente sobre sua funcionalidade.

O código que move as setas é relativamente simples - recalcula os minutos e as horas nos graus de rotação dos motores usando dados sobre o número de graus do motor por rotação da seta e o deslocamento inicial da seta da posição vertical. Toda a diversão começa quando o programa tenta obter esses dados.

Como eu já disse, foi decidido abandonar a conexão manual do atirador. Em vez disso, na inicialização, o relógio executa a calibração determinando os parâmetros geométricos. A calibração é realizada para as duas mãos, independentemente uma da outra.

O algoritmo de calibração é o seguinte. Primeiro, o motor começa a girar a uma velocidade relativamente alta (eu uso um valor empírico de 180 graus por segundo) até que um sinal de confirmação seja emitido pelo botão que fixa a posição superior da seta. Depois disso, o mecanismo redefine a velocidade para 30 graus por segundo e continua a girar a seta no sentido horário (a direção de rotação do motor é costurada no programa) até que seja separada do ponto da última abertura do botão em 70 graus. Depois disso, a seta passa pela posição superior na direção oposta, fixando o primeiro fechamento e a última abertura dos contatos (o botão pode chocalhar nas posições das bordas). Afastando-se da última abertura pelos mesmos 70 graus, a seta muda novamente a direção do movimento para a linha reta, e o procedimento para registrar o primeiro circuito e o último circuito é repetido.

Acredita-se que a posição superior da seta corresponda à média aritmética entre os quatro valores assim obtidos. A prática mostra que essa aproximação é bastante boa - o desvio da posição de destino do ponteiro dos minutos do atual raramente é superior a 1 passo e quase nunca excede dois passos. (O vídeo mostra desvios mais significativos devido ao fato de que, com o objetivo de fotografar, traduzi a hora do sistema e os ponteiros se moveram mais rápido do que durante a operação normal, aumentando o erro de correção a cada rotação, veja abaixo.) Para uma direção horária, a folga consome precisão, mas o algoritmo, é claro, usa o mesmo.

Após calcular a posição superior da seta e a diferença entre a primeira ligação do sensor e a posição superior da seta (esse valor será necessário para correção, veja abaixo), o algoritmo de calibração aumenta novamente a velocidade do motor para 180 graus por segundo e repete a busca pela posição superior. A diferença entre duas posições superiores consecutivas determina o comprimento de uma volta completa da seta em unidades de rotação do motor. O procedimento de busca da posição superior é repetido cinco vezes, o que permite calcular a média dos valores obtidos e aumentar ligeiramente a precisão.

Após a calibração, os ponteiros entram no modo de exibição da hora atual. Além disso, em cada círculo da seta, o algoritmo fixa a posição em que o disjuntor primeiro foi fechado. A diferença entre os ângulos de rotação reais e esperados do motor neste momento é a quantidade de correção; Portanto, mesmo que o comprimento total do círculo não tenha sido calculado corretamente no estágio de calibração (a saída de depuração mostra que o desvio raramente excede 1 grau), a correção em cada círculo não permite que a seta se desloque devido ao acúmulo de erros.

Observe que a única informação sobre a proporção do motor e a flecha, explicitamente costurada no programa, é a direção da rotação do motor (para frente ou para trás) correspondente ao movimento para frente da seta. Graças aos sensores de posição, a necessidade de dados sobre a relação de marchas e a posição inicial da seta desaparece. Assim, se você coletar um relógio para o qual, além da hora e do minuto, também será apresentado um ponteiro dos segundos, o algoritmo permitirá que você o utilize adicionando apenas algumas linhas, sem perder tempo contando os dentes.

O que está faltando no programa de movimentação de flechas é a proteção contra estouro ou perda de precisão. Não investiguei a questão do que aconteceria anteriormente: a profundidade do bit do ângulo de rotação do motor transbordará ou as setas começarão a mover-se rapidamente devido à partida da precisão nos dígitos mais altos do número de ponto flutuante. No entanto, a prática mostra que, em períodos da ordem de várias semanas, nada disso acontece. Se algum dia eu encontrar esse problema, provavelmente adicionarei um comando de redefinição do motor em cada volta, com a correção de ângulos correspondente no programa.

Se a classe Hand no meu programa é responsável pelo movimento das setas, a classe LedIndication acende e apaga os LEDs no painel frontal do EV3. Sei que o mesmo efeito pode ser alcançado com uma equipe, mas, inicialmente, esse recurso foi projetado para rastrear falhas no programa e permaneceu. Não há nada mais interessante nesta classe.

A classe Pêndulo é responsável pelo movimento de pesos e um pêndulo.O algoritmo simplesmente liga o motor em uma direção e gira a uma velocidade constante até que o botão correspondente ao levantamento completo desse peso seja apertado; depois disso, a direção do movimento do motor é invertida.

Nesta classe, a propósito, é apresentada proteção contra falhas do programa, que consiste no fato de o mecanismo ser ligado por apenas 2 segundos com um período de atualização de comando de 1 segundo. Se eu ligasse o motor no modo de rotação constante, quando o programa travasse, o botão continuaria subindo, o que poderia levar à sobrecarga do motor, ao desgaste das engrenagens ou até a danos ao mecanismo. A proteção permite evitar esse problema.

Por fim, a classe Cuckoo executa o cuco toda vez que um valor de 59 minutos é substituído por um valor de 0 minutos. Primeiro, o cuco é empurrado até o fim, depois o cuco uma vez, reproduzindo o som pelo alto-falante EV3 e, em seguida, novamente se escondendo na caixa do relógio. O movimento é repetido de acordo com a hora atual - de 1 a 12 vezes. O som foi retirado da biblioteca FreeSound gratuita e editado para ter um som melhor no EV3. (Não posso dizer que fiquei satisfeito com o resultado, porque o baixo é quase inaudível quando o martelo é atingido na primavera.)

O atraso entre o comando de remoção do cuco e o comando de reprodução do som é selecionado experimentalmente, para que o som seja ouvido aproximadamente no momento em que o cuco atinge sua posição extrema. No entanto, o ev3dev tem um pequeno problema com isso: devido ao carregamento do sistema, o som fica periodicamente atrasado, especialmente se houver uma conexão SSH com o relógio naquele momento. O atraso pode demorar vários segundos. Não tenho certeza se isso é um problema com meu controlador, a compilação em si ou as atualizações recebidas da rede (depois de instalar o ev3dev, eu costumava usar o comando apt get upgrade, embora provavelmente não devesse ter feito isso), mas, em média, o cuco parece normal, então Não vou depurar esta pergunta.

, , , : , «», «» . , .

, . .

, , . — , , .

, . , , , . , Skype, .

Debian. , , . — EV3 WiFi-. , , , , , .

BSD. , .

Source: https://habr.com/ru/post/pt417255/


All Articles