Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
Tendo adquirido um grande número de codificadores ópticos rotativos descartados em meu local de trabalho, finalmente decidi fazer algo divertido / útil com eles.
Recentemente comprei uma nova impressora 3D para minha casa e o que poderia complementá-la melhor do que um scanner 3D! Este projeto também me deu a oportunidade perfeita de empregar minha impressora 3D para fabricar as peças necessárias.
Suprimentos
Codificadores óticos e sensores óticos correspondentes
Arduino UNO
escudo de prototipagem opcional
trilhos de barra de aço
acesso a uma impressora 3D
Etapa 1: os codificadores óticos
Quase qualquer codificador rotativo poderia ser usado para este projeto, desde que fornecesse um número relativamente alto de 'cliques' por mm. Obviamente, codificadores diferentes exigirão uma solução de montagem adequada.
Usei um medidor de continuidade para traçar o diagrama de fiação dos fotossensores.
Etapa 2: peças impressas em 3D
Essas peças alojam os codificadores rotativos e fornecem um slide para o trilho. O invólucro do codificador único tem dois orifícios na parte traseira para os trilhos transversais serem montados. A caixa do codificador duplo é simplesmente duas caixas simples fundidas em ângulos retos.
Eu projetei esses suportes no fusion360 para se adequar à minha escolha de codificadores e trilhos, o eixo do codificador tem um pedaço curto de bainha de borracha de estilingue, para ajudar a segurar melhor o eixo de aço inoxidável.
Você deseja que o eixo deslize livremente e caia através do alojamento quando segurado verticalmente, mas deve exercer pressão suficiente no codificador para não escorregar. O que funcionou para mim foi permitir que o cursor do eixo se sobrepusesse ao eixo do codificador em 0,5 mm. A borracha do estilingue é macia o suficiente para deformar nessa quantidade e fornecer boa tração.
Etapa 3: Diagrama de fiação
O circuito é muito simples. Os opto-sensores requerem alguma corrente para os diodos emissores de IV, um aterramento e resistores pull-up para os fotodiodos.
Decidi usar 5mA para os diodos emissores em série; neste codificador em particular, a queda de tensão entre os diodos é de 3,65V. Estou usando uma fonte de 5 V do Arduino, que deixa 1,35 V para o resistor, em 5 mA isso dá 270 ohms.
10k ohm foi selecionado para os pull-ups, pois os fotodiodos só podem absorver uma pequena corrente, 10k ohm também foi usado para o botão de pressão. Há um botão disponível para uso na placa protótipo já conectada ao terra, basta fornecer um resistor pull-up e conectá-lo ao pino de entrada desejado.
Etapa 4: Código Arduino
O código precisa de uma pequena explicação, pois sua operação pode não ser imediatamente óbvia, mas teve que ser otimizado dessa forma para ser capaz de processar 3 codificadores com rapidez suficiente.
Em primeiro lugar, só queremos processar os dados de direção SE houver uma mudança na posição do codificador.
alterações = novo_valor ^ valor armazenado;
Para obter mais resolução de meus codificadores, tive que processar as bordas ascendentes e descendentes.
Na minha configuração, minha resolução é de 24 cliques por 1 cm.
Isso nos deixa com alguns cenários.
S1 é constante 0 e S2 alternado de 0 a 1
S1 é constante 0 e S2 alternado de 1 a 0
S1 é constante 1 e S2 alterna de 0 a 1
S1 é constante 1 e S2 alterna de 1 a 0
S2 é constante 0 e S1 alternado de 0 a 1
S2 é constante 0 e S1 alternado de 1 a 0
S2 é constante 1 e S1 alterna de 0 a 1
S2 é constante 1 e S1 alterna de 1 a 0
Essas condições são melhor compreendidas nas tabelas de verdade acima, também cada condição produz uma 'direção', arbitrariamente denominada 0 ou 1.
Os gráficos nos dão duas pistas vitais:
1) um gráfico é o inverso completo do outro, portanto, se tivermos um, podemos calcular facilmente o outro simplesmente invertendo a saída. Invertemos a saída apenas se um pino estiver mudando e o outro não, podemos escolher um arbitrariamente.
2) o gráfico em si é simplesmente o XOR dos sinais S1 e S2. (o outro gráfico é o NÃO deste).
Agora, entender o código é simples.
// ler na PORTA em paralelo // lembrar que os pares adjacentes pertencem ao mesmo codificador state = PINB & 0x3f; // quais pinos foram alterados se algum diff = hold ^ state; // Sinais XOR adjacentes S1 e S2 para obter a tabela verdade // A maneira mais fácil é fazer uma cópia do estado atual // e deslocá-lo para a direita por um bit lookup = state >> 1; // agora os bits estão alinhados para XOR dir = lookup ^ state; // lembre-se, a tabela precisa ser invertida se uma // das entradas permanecer constante, não precisamos de uma instrução IF // para isso. Atualmente o bit de direção desejada // é o bit do lado direito de cada par na variável 'dir' // o bit do lado esquerdo não tem sentido // a variável 'diff' tem o bit que mudou de 'set' // então nós temos '01' ou '10' // XOR com o byte 'dir' // inverterá ou não o bit significativo. dir ^ = diff; // agora atualiza a variável hold hold = state; // se algum dos bits mudou para este codificador if (diff & 0x03) {// determina a direção if (dir & 0x01) {// com base em seu hadware e fiação ++ ou - --z; } else {++ z; }} // idem para o resto if (diff & 0x0c) {if (dir & 0x04) {++ y; } else {--y; }} if (diff & 0x30) {if (dir & 0x10) {--x; } else {++ x; }}
Quando o botão é pressionado, enviamos o valor XYZ atual para um programa de terminal.
Os dados seriais são lentos, mas durante a operação normal, as posições dos codificadores não serão alteradas durante esse tempo.
Os dados são enviados como contagens brutas. Você poderia fazer as contas e enviar os dados em mm ou polegadas, etc. Acho que os valores brutos são tão bons porque podemos dimensionar o objeto posteriormente no software.
Etapa 5: primeira varredura
Reunir os pontos é um processo lento, eu piso a sonda no canto superior esquerdo e reinicio o Arduino.
Isso zera a posição inicial.
Em seguida, mova a sonda para o local no alvo, segure-o com firmeza e pressione o botão 'instantâneo'.
Para esta amostra bastante grande, peguei apenas ~ 140 pontos, então os detalhes não são bons no produto final.
Salve os dados em um arquivo. PCD e adicione o cabeçalho
#. PCD v.7 - Formato de arquivo de dados de nuvem de pontosVERSÃO.7 CAMPOS x y z TAMANHO 4 4 4 TIPO F F F COUNT 1 1 1 LARGURA (sua contagem de pontos) ALTURA 1 PONTO DE VISTA 0 0 0 1 0 0 0 PONTOS (sua contagem de pontos)
Coloque sua contagem de pontos no cabeçalho, isso é fácil em qualquer editor que forneça números de linha.
Acima dos pontos podem ser vistos no freeCad, eles são exportados do freeCad como um arquivo. PLY.
Abra o. PLY no MeshLab e coloque o objeto na superfície. Feito!!