Neste Lab explicaremos o funcionamento e teste de um encoder industrial de quadratura, muito utilizado na indústria como sistema de posicionamento de eixos, indicação de velocidade de rotação, giro e posicionamento em Magazines ou “castelo” de ferramentas de corte em máquinas operatrizes. Podemos citar também seu uso em aparelhos eletrodomésticos como micro-ondas e aparelhos de som para posicionamento do seletor de volume ou funções do aparelho.
O encoder
Encoders são tipicamente utilizados para determinar posição, velocidade ou sentido de giro de um eixo de motor, fuso ou qualquer outro dispositivo que se movimente. Informações precisas para controle em uma variedade de aplicações como mesas rotativas, máquinas pick and place, máquinas operatrizes, empacotadoras, robótica e outras máquinas são obtidas com a utilização dos encoders.
Um encoder (para aplicações industriais) é um tipo de sensor especial que captura a posição e a transmite para outro dispositivo como comandos numéricos computadorizados (CNC) ou drivers controladores de motor ou servomotor principalmente como sinal de resposta (feed back da malha fechada de controle) ao movimento determinado pelo controlador. A figura abaixo ilustra a aplicação típica de um encoder acoplado a um fuso ou mesa rotativa de uma máquina CNC.
Tipos de Encoders
São dois os tipos básicos de encoders: Lineares e Rotativos. Os dois dispositivos funcionam de maneira similar. Como o nome indica, os encoders do tipo linear medem a posição de um objeto ao longo de um comprimento e os rotativos identificam a posição através do movimento de rotação no eixo. A escolha de qual tipo depende dos requisitos envolvidos na aplicação.
Encoder linear
Um encoder linear, também chamado de régua de medição, consiste de uma escala (fita codificada) e um sensor que lê os espaçamentos entre as escalas da fita. Sua resolução é medida em pulsos por distância. Uma régua que apresenta 100 pulsos por milímetro possui uma resolução de 100 pulsos de contagem das marcas (códigos) pelo sensor a cada 1 milímetro linear na fita do encoder.
Este tipo de encoder é comum em máquinas onde o posicionamento fornecido pelo encoder do motor ou na ponta do fuso não é suficiente para a precisão do processo. Como exemplo temos máquinas para medir dentes de engrenagens, retíficas de dentes de engrenagens dentre outras onde a resolução e precisão de medida podem chegar a 0,0001 mm. A figura abaixo ilustra o modelo de funcionamento deste sensor.
Encoder rotativo
Os encoders rotativos são usados para medir o movimento rotacional de um eixo. A figura abaixo mostra os componentes fundamentais de um encoder rotatório, que é formado por um diodo emissor de luz (LED), um disco que pode ser construído de vidro, metal ou plástico e um detector luminoso colocado do lado oposto do disco.
O disco, que é montado em um eixo rotativo, tem padrões formados por setores opacos e transparentes a luz. Conforme o disco gira, os segmentos opacos bloqueiam a luz e onde o vidro é transparente a luz pode passar. Esse movimento gera pulsos de ondas quadradas, que podem então ser interpretados em posição ou movimento.
Encoder Absoluto
Um encoder absoluto é um dispositivo que mantém a informação de sua posição mesmo quando o mesmo é desligado da fonte de energia. Este possui uma série de anéis codificados (para o tipo rotativo) que representam sua posição absoluta em relação ao ângulo atual. A imagem abaixo mostra os discos de um encoder absoluto fabricado pela empresa alemã HEIDENHAIN.
Um encoder absoluto pode ser codificado de duas maneiras, sendo elas utilizando códigos binários ou por código Gray, ambos fornecidos pela posição absoluta do disco em relação ao fotorreceptor.
Codificação Binária Padrão
Um exemplo de uma codificação binária de um encoder, de uma forma extremamente simplificada para um encoder com somente 3 anéis e 8 posições absolutas, pode ser visto abaixo.
Este tipo de posicionamento pode ser visto nos seletores de multímetros de bancada onde mesmo que o aparelho tenha sua alimentação removida, quando realimentado retorna à função selecionada previamente.
No exemplo anterior, os contatos produzem uma contagem binária ao redor do disco. No entanto, esta montagem apresenta o problema de que se o disco parar entre dois setores adjacentes ou o contato não esteja perfeitamente alinhado, se torna impossível de determinar a posição real do eixo.
A mudança de posição 3 para 4 apresenta um grande problema: normalmente, os contatos nunca são totalmente alinhados. Se o contato 1 mudar seu status seguido do contato 3 e depois do 2 por exemplo, a posição atual do encoder será:
OFF – ON – ON (posição inicial)
ON – ON – ON (primeiro, contato um muda para ON)
ON – ON – OFF (próximo, contato 3 muda para OFF)
ON – OFF – OFF (finalmente, o contato 2 muda para OFF)
Oservando os setores indicados na tabela acima a ordem referente a codificação anterior será 3, 7, 6 e 4, logo aparentemente o eixo do encoder saltou da posição 3 para a 7, 7 para 6 e depois para a posição 4 sequencialmente. Esta situação não é desejada principalmente no feed back de controles automáticos. Para solucionar este problema, temos os encoders que apresentam sua codificação seguindo o código Gray.
Codificação em código Gray
Para evitar o problema descrito anteriormente, a o código Gray é utilizado. Este é um sistema de contagem binária que quaisquer dois contatos adjacentes são diferentes de apenas um bit. O exemplo abaixo ilustra o mesmo encoder com 3 posições apresentado anteriormente codificado em Gray.
Neste exemplo, a transição da seção 3 para a 4 envolveu somente uma transição de contato do estado ON para OFF ou vice-versa. Isto quer dizer que uma interpretação de sequências incorretas não mais ocorrerá.
Encoder incremental
Um encoder incremental fornece sua posição através da contagem de pulsos individuais na escala graduada do disco ou régua. Se for utilizado para indicar posição de deslocamento, seus valores de leitura serão relativos a um ponto, geralmente o ponto inicial após a realimentação. A figura abaixo ilustra os discos de um encoder incremental fabricado pela HEIDENHAIN.
Em máquinas operatrizes industriais, quando este tipo de encoder é aplicado ao sistema de medição da máquina, o eixo ao qual este encoder está acoplado deve ser levado a um ponto de referência conhecido onde a posição do eixo será referenciada e reconhecida pelo sistema de comando CNC.
Um encoder que tivesse um único conjunto de pulsos não seria útil pois não teria como indicar o sentido da rotação do disco. Usando duas faixas de código com setores posicionados com defasagem de 90° entre si, os dois canais de saída do encoder incremental, que neste caso também pode ser chamado de encoder de quadratura, podem indicar a posição e o sentido da rotação. Se A estiver à frente de B, por exemplo, o disco estará girando no sentido horário. Se B estiver à frente de A, o disco estará girando no sentido anti-horário. A figura abaixo ilustra a direção de contagem dos pulsos nas bordas de subida e descida do sinal maximizando a contagem.
Dessa forma, monitorando o número de pulsos e a fase relativa dos sinais A e B, podemos acompanhar a posição e o sentido da rotação do encoder. A figura abaixo ilustra o posicionamento dos canais de um encoder e as tabelas indicam a codificação para ambos os sentidos de rotação.
Além disso, alguns encoders de quadratura têm um terceiro canal de saída denominado sinal zero, ou de referência que fornece um pulso por revolução. Este sinal pode ser utilizado para a determinação precisa de uma posição de referência. Na maior parte dos encoders, esse sinal é denominado Terminal Z, ou índice.
Outro tipo de encoder muito usado é o encoder diferencial, no qual há duas linhas para o sinal A, duas para o sinal B e duas para o sinal Z. As duas linhas do sinal A são A e /A, as duas linhas para o sinal B são B e /B e o sinal Z também possui o Z e /Z. Esse tipo de configuração é também chamada de push-pull pois as seis linhas sempre estão fornecendo uma tensão conhecida (0 V ou Vcc). Quando A estiver com Vcc, /A e vice-versa. No caso de um encoder single-ended que apresenta somente os canais A e B, A terá Vcc ou uma tensão flutuante. Os encoders diferenciais são frequentemente usados em ambientes com muito ruído elétrico, pois as medições diferenciais protegem a integridade do sinal. A figura abaixo ilustra o comportamento dos seis canais do encoder diferencial.
Diagrama de ligação
O diagrama de ligação se encontra na imagem abaixo. Os sinais do encoder foram ligados nos pinos de interrupção do Arduino Mega. No algoritmo proposto, utilizamos somente o canal A, B e Z para determinar a contagem dos pulsos e o número de voltas do eixo do encoder.
O Arduino Mega foi utilizado devido ao grande número de pinos para interrupção externa, que no caso são exatamente 6 pinos. O LCD foi utilizado para indicar os dados lidos pelo encoder. Uma imagem ilustrando o resultado no display está disposta abaixo.
Algoritmo e testes
O algoritmo que determina todo o funcionamento desta aplicação está descrito abaixo e vários comentários estão inseridos no corpo do código para um melhor entendimento.
Através de algumas comparações utilizando if, else conseguimos determinar o sentido de contagem dos pulsos e até mesmo quadruplicar a precisão do encoder.
Como dispomos de 4 mudanças de sinais diferentes em um período de um dos canais, um encoder que possui 1024 pulsos por volta em um canal pode ter sua contagem dobrada se contarmos a borda de subida dos dois canais e quadruplicar se contarmos nas quatro transições dos dois canais (borda de subida e descida dos dois canais).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
/**************************************************************************** Teste de um Encoder Heidenhain de 1024 Pulsos com Arduino **************************************************************************** -- IDE do Arduino Versão 1.6.7 -- Autor: Eduardo Avelar -- Blog: easytromlabs.com -- email: contato@easytromlabs.com -- Dezembro, 2016 ****************************************************************************/ /*////////////////////////////////////////////////////////////////////////////// Deverá ser utilizado o Arduino Mega devido ao numero de pinos de interrupção necessária para este teste, que no caso deverá ser de 6 pinos, sendo eles; A, /A, B, /B, Z, /Z // Arduino Interrupt reference: // // https://www.arduino.cc/en/Reference/AttachInterrupt // // // // Board Digital Pins Usable For Interrupts // // Uno, Nano, Mini, other 328-based 2, 3 // // Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21 // // Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7 // // Zero all digital pins, except 4 // // MKR1000 Rev.1 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 // // Due all digital pins // // 101 all digital pins // // // // Board int.0 int.1 int.2 int.3 int.4 int.5 // // Uno, Ethernet 2 3 // // Mega2560 2 3 21 20 19 18 // // 32u4 based (e.g Leonardo, Micro) 3 2 0 1 7 // // Due, Zero, MKR1000, 101 interrupt number = pin number // ***************************************************************************** Conexão com o Display: LCD RS pin to digital pin 53 LCD Enable pin to digital pin 52 LCD D4 pin to digital pin 51 LCD D5 pin to digital pin 50 LCD D6 pin to digital pin 49 LCD D7 pin to digital pin 48 LCD R/W pin to ground LCD VSS pin to ground LCD VCC pin to 5V 10K resistor: ends to +5V and ground wiper to LCD VO pin (pin 3) ////////////////////////////////////////////////////////////////////////////*/ // include LCD library: #include <LiquidCrystal.h> // Inicia a biblioteca do display com os pinos de dados LiquidCrystal lcd(53, 52, 51, 50, 49, 48); // Variável Volatile devido ao uso em mais de uma fonte de interrupção. // O compilado armazena na memória RAM e não em um registrador. volatile int long counterAB = 0; volatile int laps = 0; uint8_t dir = 0; void setup() { Serial.begin(9600); // Numero de linhas e colunas do LCD lcd.begin(16, 2); // AttachInterrupt0, digital Pin 2, Sinal A // Ativa interrupção em qualquer mudança do sinal attachInterrupt(digitalPinToInterrupt(2), ai0, CHANGE); // AttachInterrupt1, digital pin 3, Sinal B // Ativa interrupção em qualquer mudança do sinal attachInterrupt(digitalPinToInterrupt(3), ai1, CHANGE); /////////////////////////////////////////////////////////////////////////////// //AttachInterrupt2, digital Pin 21, Sinal /A attachInterrupt(digitalPinToInterrupt(21), ai2, FALLING); //AttachInterrupt3, digital pin 20, Sinal /B attachInterrupt(digitalPinToInterrupt(20), ai3, FALLING); //AttachInterrupt4, digital pin 19, Sinal Z attachInterrupt(digitalPinToInterrupt(19), ai4, RISING); //AttachInterrupt5, digital pin 18, Sinal /Z attachInterrupt(digitalPinToInterrupt(18), ai5, FALLING); // Cursor na Coluna 0, linha 1 lcd.setCursor(0, 0); lcd.print("Pulsos: "); // Cursor na Coluna 0, linha 2 lcd.setCursor(0, 1); lcd.print("laps: "); } void loop() { // Cursor na coluna 8, linha 1 lcd.setCursor(8, 0); lcd.print(counterAB); lcd.print(" "); // Cursor na coluna 6, line 2 lcd.setCursor(6, 1); lcd.print(laps); lcd.print(" "); } // AttachInterrupt0, digital Pin 2, Sinal A - Qualquer mudança de borda (CHANGE) void ai0() { // Determina qual o sentido de giro do encoder para o contador de voltas if (digitalRead(3) == LOW) { dir = 1; } else { dir = 0; } // Incrementa ou decrementa o contador de acordo com a condição do sinal no canal B if (digitalRead(3) == HIGH && digitalRead(2) == LOW) { counterAB ++; } else { counterAB --; } if (digitalRead(3) == LOW && digitalRead(2) == HIGH) { counterAB ++; } else { counterAB --; } } // AttachInterrupt1, digital Pin 3, Sinal B - Qualquer mudança de borda (CHANGE) void ai1() { // Determina qual o sentido de giro do encoder para o contador de voltas if (digitalRead(2) == HIGH) { dir = 1; } else { dir = 0; } // Incrementa ou decrementa o contador de acordo com a condição do sinal no canal A if (digitalRead(2) == LOW && digitalRead(3) == HIGH) { counterAB --; } else { counterAB ++; } if (digitalRead(2) == HIGH && digitalRead(3) == LOW) { counterAB --; } else { counterAB ++; } } // AttachInterrupt2, digital Pin 21, Sinal /A void ai2() { // Vazio } // AttachInterrupt3, digital Pin 20, Sinal /B void ai3() { // Vazio } // AttachInterrupt4, digital Pin 19, Sinal Z // Conta numero de voltas do Disco do encoder void ai4() { if (dir) { laps ++; } else { laps --; } } // AttachInterrupt5, digital Pin 18, Sinal /Z void ai5() { // Vazio } |
A imagem abaixo ilustra a montagem final deste protótipo.
Conclusão
Neste Lab descrevemos a implementação de um algoritmo e circuito para a leitura de um encoder industrial. Este dispositivo, como já descrito anteriormente, é muito importante e largamente utilizado em todos os sistemas industriais que necessitem de leitura do posicionamento e seu domínio de funcionamento e formas de interação se torna importante para quem trabalha com dispositivos eletrônicos utilizados na indústria.
19/07/2023 at 12:42
muito legal esse site parabéns pelo conteúdo. Your content is
very good. i like so much all about it
11/11/2021 at 01:33
José Carlos Agostinho
11/11/2021 00:01
Eu eu resolvi estudar me formei 20/06/2018 , eu nasci 21/06/1954 .Eu fiz um uma promessa ao diretor que eu iria fazer uma maquina convencional ( no mínimo dizer ainda da tempo ) etc.
Pena que eu não conheci este canal este canal antes , estaria sofrendo menos .
Se DEUS quiser estarei no apresentando a maquina convencional em video no máximo 5 minutos ,NA LAVE ao VIVO . QUANDO EU ESTAREI AO VIVO APRESENTANDO a 2° parte do protejo que esta em outra parte da minha casa
QUE É O DIVISOR ELECTRÓNICO COM 5 EIXOS feito do zero, no YOUTUBE , como MAQUINA CONVENCIONAL E DIVISOR ELECTRÓNICO .
OBS: POLITICA SÓ FOI MEU VOTO , O RESTANTE É PATRIOTISMO , para eu fazer esta apresentação no dia 15/11/2021 será mais um desafio a enfrentar na minha vida .
ATE O DIA 15/11/2021 20:00 HORAS A AINDA HÁ TEMPO.
11/11/2021 at 08:35
Fico feliz em ter contribuído.
31/07/2021 at 09:11
Olá lindo projeto; você pode me dizer se existe uma maneira de eu desconectar o USB do PC e colocá-lo de volta, as pulsações não reiniciam (ou seja, o ponto zero do codificador fica sempre na mesma posição). Obrigada
02/08/2021 at 08:19
Olá Ramiro.
Existe sim. Voce pode ir salvando os valores em uma memória EEPROM externa ou até mesmo em um cartao de memória.
Elabore uma rotina que faca a escrita na memória somente quando o posicionador pare de contar, ou seja, no final do movimento, pois escritas constantes na memória consomen ainda mais rapidamente o ciclo de escrita das mesmas.
Outra opção é utilizar um encoder absoluto. Estes por sua vez armazenam os valores lidos internamente e o microcontrolador iria apenas consumir estes valores armazenados pelo encoder.
Espero ter ajudado.
Eduardo Avelar
01/04/2020 at 10:19
Bom dia!
você já utilizou encoder MA 704 com arduino?
estou tentando medir a rotação de um motor através desse encoder, só que a variação está um pouco grande.
se poder ajudar fico grato
29/04/2020 at 09:08
Alexandre,
Infelizmente ainda não tive a oportunidade de utilizar este encoder com o arduino.
A limitação de leitura estará relacionado a capacidade do arquino em ler interrupções sucessivas.
Talvez ele esteja tratando uma interrupção enquanto outra é chamada e o valor do incremento no seu tratamento pode não estar correto.
Atente para isso.
03/01/2021 at 13:11
Amigão tudo bem?
com está seu projeto de medição de velocidade?
Encoders não são uma coisa muito trivial de se trabalhar na prática. Existem algumas limitações que não são fáceis de se perceber, normalmente relacionado ao que você quer medir. Trabalhei com duas aplicações que foram desenvolvidas pela equipe de automação na empresa onde eu trabalho (há muito tempo já) e não é fácil acertar.
No seu caso tenho algumas perguntas para que imagino que podem ajudar:
Qual o tempo que seu programa está rodando? (tem grande chance de toda vez que o resultado varia o loop levou um tempo maior para ser concluído)
Qual o tempo que sua saída custa para o processador? (usando interrupções, esse custo poderia afetar o resultado?)
Quanto tempo cada interrupção custa?
eu já tive uma experiência que o Serial.print afetou o resultado. Desculpe a ignorância, se falei alguma besteira, mas a vontade de ver funcionando é maior.
04/01/2021 at 09:00
Olá Tigsan, tudo bem.
Infelizmente eu não evoluí mais com este projeto utilizando o arduino.
Neste mesmo blog, você encontra um protóripo que fiz utilizando FPGA.Trabalhei na industria ppor muitos anos e todos os equipamentos de leitura de encoder que eu abri para dar uma olhada, seja os da Siemens, Heidenhain ou Fagor utilizavam um processador de alta velocidade ou um FPGA para fazer a aquisição dos pulsos do Encoder.
No entanto, tambem não evoluí alem do que foi indicado neste blog no projeto do FPGA.
Com relação ao Arduíno, realmente ele não tem capacidade para tratar todas as interrupções que sao geradas pelos pulsos do encodere e ao mesmo tempo transmitir esses dados para a serial por exemplo. Um microcontrolador de melhor desempenho deve ser escolhido para esta função.
Até mais.
04/01/2021 at 01:41
Gostaria de conhecer seu projeto
04/01/2021 at 09:02
Olá Tiago,
Infelizmente eu não evoluí com este projeto por falta de tempo. Acredito tambem que o Arduino nas plataformas de 8 bits não sejam a melhor escolha para esta aplicação.
Se voce observar, neste blog tambem temos um tutorial para leitura de encoder utilizando um FPGA, que apresenta um desempenho incoparável com o arduino e não apresenta percas de pulsos de posicionamento do encoder.
Aconselho você a utilizar um FPGA ou um outro microcontrolador de mais alto desempenho.
Até mais.
22/02/2020 at 02:14
muito bom seu video.
vou montar o circuito para testes de encoders.
vc tem algum material sobre encoder Linear Heidenhain com arduino tbm?
precisava montar algo para testar as reguas dos centros de usinagem do meu trabalho
grato
29/02/2020 at 16:49
Olá Ede,
Infelizmente não tenho material sobre os lineares (réguas) mais se for as TTL, elas tem o mesmo princípio de funcionamento. Para as que apresentam o padrão de comunicação EnDat, você pode implementar seu próprio sistema de teste pois elas se comunicam com o padrão RS485, como pode ser visto na imagem na página 5 do manual indicado no link https://www.heidenhain.de/fileadmin/pdb/media/img/383942-28_EnDat_2-2_en.pdf. indicado o
A partir da página 7 deste manual é indicado o protocolo de comunicação.
Abraço.
26/11/2019 at 16:21
Boa tarde Eduardo Avelar,
Quero lhe agradecer por ter postado esse tutorial sobre esse encoder rotativo.
O seu tutorial foi extremamente importante para o desenvolvimento de um projeto com um Encoder rotativo incremental da Siemens que eu fiz! (5000 pulsos por rotação). Funcionou perfeitamente, com algumas pequenas mudanças.
Abraços,
Gustavo Murta
30/11/2019 at 09:03
Olá Gustavo.
É um prazer ter você como um seguidor. Também acompanho o seu trabalho e acho fantástico!
E é isso aí, vamos compartilhar.
Grande abraço.
30/11/2019 at 10:00
Bom dia Eduardo,
Acho que temos interesses em comum! Não sabia que conhecia alguns tutoriais meus.
Precisamos conversar.
Abraços
Gustavo Murta
11/06/2019 at 19:54
Boa noite!
Eduardo.
Copiei seu programa , consegui compilar e enviar, usando o display I2C , aparece o texto pulsos e Laps, como meu encoder é de 4 fios A,B mais vcc e gnd, fui retirando \A \Z para ficar compatível usando pinos 2 e 3 do mega pois pinos 20 e 21 usei para I2C pois a saída SCL e SCA fica nos respectivos pinos. Porém eu giro o encoder e não altera nada , mas se eu deligar o pino 2 ou 3 da entrada do encode o display começa a mudar os sinais.
O que pode ser, me dê uma luz, se desejar envio o programa para você.
Abraços.
12/06/2019 at 11:11
Ola Nelson.
Os pinos 2 e 3 são utilizados para a interrupção externa deste microcontrolador.
Algo na mudança que você fez esta ocasionando a constante permanencia do contador de programa do microcontrolador dentro da rotina de interrupção.
Como ela possui umas das maiores prioridades na execução, não irá somar os eventos externos e muito menos atualizar o display.
Tente novamente uma melhor equivalência entre os códigos.
Atenciosamente,
Eduardo Avelar
15/06/2019 at 19:23
Boa noite!
Eduardo.
Consegui fazer funcionar o encoder, agora preciso que me ajude, como acertar a resolução, uma volta apresenta 2400 pulso, como fazer para mostrar outro valor tipo 30.00 mm no display ao invés de 2400, quero fazer a relação mesa polia com display, e como fazer para zerar o valor sem usar o reset do arduino.
Abraços.
15/06/2019 at 19:44
Tente primeiramente implementar uma relação simples entre o número de pulsos que são gastos para movimentar 1mm por exemplo.
Considere o erro de arredondamento dos cálculos.
Para zerar, implemente uma função simples que acesse a variável de contagem e zere ela ao pressionar um botão por exemplo.
Considere também um sistema de debounce seja por software ou por hardware posicionando um capacitor.
13/05/2019 at 21:23
Boa noite!
Eduardo.
Uma pergunta pretendo utilsar encoder de 600 pulsos, numa fresa, quando eu girar uma volta no fuso, o encoder irá contar 600 pulsos, como faria uma tabela para converter 600 pulsos em 3 mm de deslocamento, com pelo menos uma casa decimal?
Grato pela sua resposta, se puder enviar uo sketch eu agradeço.
Abraços.
14/05/2019 at 00:16
Olá Nelson. Como lhe expliquei anteriormente, no momento não estou disponível para realizar outros trabalhos se não os que já tenho contratados, minha pós graduação e o trabalho fixo em uma empresa. Portanto, nos próximos meses não conseguirei lhe ajudar da forma que precisa. Aconselho a montar um protótipo e ir testando os modelos para conversão de rotação e contagem dos pulsos utilizando um relógio comparador decimal ou centesimal para relacionar ao deslocamento do eixo. Lembre-se que também mencionei que dependendo da velocidade de rotação do seu fuso alguns pulsos do encoder poderão ser perdidos na leitura feita pelo Arduíno. Aconselho a adotar um outro microcontrolador com um ciclo de execução menor ou até mesmo um FPGA para realizar uma leitura mais precisa assim como fiz em um dos meus tutoriais. Espero ter ajudado.
14/05/2019 at 07:27
Bom dia!
Eduardo, ok, vou ficar persistindo, meu fuso irá virar manualmente, preciso das coordenadas somente para traçar furações, agradeço sua ajuda, só gostaria de saber se tem como ajustar o ganho do encoder, para ter a mesma leitura do comparador, isto não sei fazer.
Tenha bons trabalhos.
Abraços.
14/05/2019 at 07:45
Olá Nelson. No caso do movimento ser feito manualmente acredito que possa funcionar sim. Já li alguns documentos que mencionam a relação do passo do fuso com diâmetro e outros parâmetros para o cálculo perfeito do deslocamento final em função do número de pulsos. Não tenho estes documentos agora mais lembro que eram em inglês. Pesquisa no Google que suas chances de acertar mais rápido o seu resultado serão melhores.
14/05/2019 at 09:38
OBRIGADO EDUARDO, TENHA UM ÓTIMO DIA
11/05/2019 at 19:36
Olá
Eduardo.
Teria como me passar a ligação usando o Max 7219 com seguimento display tenho um com 8 dígitos
12/05/2019 at 19:14
Ola Nelson. Eu ainda não trabalhei com este módulo mais acredito que o tutorial indicado no link https://www.arduinoecia.com.br/2014/10/display-7-segmentos-8-digitos-max7219.html?m=1 possa te ajudar. Abraço.
11/05/2019 at 12:44
Boa tarde!
Eduardo.
Gostaria de saber se se seria possivel usar um display MAX721 vermelho para visualização melhor, quero adaptar o encoder no fuso de uma fresa, para ter um boa referencia, cada volta dá 3 mm de deslocamento, poderia me ajudar amigo.
11/05/2019 at 13:51
Olá Nelson. O problema de utilizar encoder é a perda de precisão de acordo com a velocidade dos pulsos do encoder. Mais acho válido você realizar os testes com a configuração proposta para ver se lhe atenderá. Quanto a ajuda, infelizmente no momento não será possível pois tenho alguns projetos de cunho comercial em andamento. Espero ter ajudado.
22/10/2018 at 22:51
Boa noite, Eduardo,
Confesso que ainda não entendi o motivo pelo qual não posso utilizar a lógica e os componentes implementados no seu projeto para solucionar o meu problema. Como estou realizando um projeto complexo gostaria de simplificar ao máximo a parte eletrônica. Pelo que pesquisei a tecnologia de FPGA’s é um pouco mais avançada que a lógica para a plataforma arduino. Outro ponto que não ficou claro para mim é qual o limite de rotações por minuto com que a plataforma Arduino consegue trabalhar e interpretar os dados corretamente. Muito obrigado mais uma vez!
Atenciosamente,
22/10/2018 at 23:26
Henrique,
Pode ser que o seu projeto funcione.
Monte um protótipo e faça os testes necessários para validar seu experimento.
Quando me referi a está plataforma Arduino, quiz dizer que a forma como o compilador “mascara” a programação fácil como vemos em relação a programação utilizada no AVR Studio por exemplo nos traz consequências no tempo de execução do programa.
Se tiver condições, faça um simples teste do Blink programando pela interface Arduino comparando a comutação da saída do pino com a programação feita em um AVR Studio por exemplo. A forma de onda será melhor visualizada em um osciloscópio.
Quanto ao limite de rotação que ele ira medir, teria que consultar o datasheet do fabricante quanto a frequência de operação em 16 MHz.
Espero ter concluído
22/10/2018 at 00:27
Boa noite, Eduardo,
Utilizando o código e os componentes utilizados, qual o número máximo de voltas que consigo registrar? Estou trabalhando em um projeto que utilizará entre 18000 e 30000 rpm e devo trabalhar na casa de 10.000.000 de ciclos. Você teria alguma sugestão para o meu caso?
Outra dúvida seria com relação ao Encoder utilizado. Qual foi o modelo? E o código e as ligações podem ser utilizados em outros modelos?
Muito obrigado desde já.
Atenciosamente,
22/10/2018 at 00:55
Olá Henrique.
No protótipo exposto neste tutorial eu utilizei o encoder ROD 486 da empresa Heidenhain com saída TTL em 5V e com a contagem de 1024 pulsos por revolução se utilizar somente a borda de subida do sinal.
As ligações entre o encoder e o Arduino estão indicadas no esquema do tutorial.
Para a sua aplicação, eu aconselho utilizar outra plataforma devido a forma na qual este tutorial foi implementado.
Ainda esta semana eu publicarei uma outra forma de ler pulsos de encoder utilizando um FPGA com execução em paralelo de “tarefa” de aquisição dos pulsos gerados pelo encoder e de indicação em um display.
Utilizar FPGA para este tipo de aplicação é uma prática já adotada pelos equipamentos da Siemens, Fagor, Rexroth Indramat entre outros.
Quanto ao número d voltas em contagem direta, dependerá apenas do tamanho da variável que você escolher para armazenar os pulsos, seja ela um Int, Float, Char out outra qualquer.
Espero ter ajudado e fique a vontade para entrar em contato.
Eduardo Avelar.
28/09/2018 at 02:23
Preciso medir o angulo utilizando encoder e arduino mega 2560 . Por onde eu começo ?
teria alguma dica para isso? obrigado.
28/09/2018 at 06:55
Olá Maurício.
Para medir ângulo utilizando o modelo de encoder por pulsos, você deve contar os pulsos utilizando a porta de interrupção do microcontrolador assim como fiz neste tutorial.
Quando você montar o sistema, deve calibrar o ângulo de posicionamento em função dos pulsos contados. Você deverá encontrar um angulo padrão e toma-lo como referência no momento da calibração.
Espero ter ajudado.
Eduardo Avelar
21/08/2018 at 07:53
Bom dia Qual resistor você esta utilizado
23/08/2018 at 23:30
Olá Leandro,
Pelo que me lembro, o único resistor que estou utilizando é o potenciômetro responsável pelo ajuste de contraste do LCD e este valor é clássico, podendo ser de 10K ou 50K Ohms.
Espero ter ajudado.
02/08/2018 at 17:19
Tenho um transdutor linear de posição (relógio comparador eletrônico) que gostaria de conectar com o arduino.
A conexão é do tipo DB-15 e o protocolo é o TTL.
Tenho 3 canais de comunicação:
Ua0 – Referência
Ua1 – Sentido A
Ua2 – Sentido B
Seria a mesma conexão dos 3 pinos conforme o descrito para o arduino MEGA?
02/08/2018 at 18:52
Olá Fabio.
Na minha opinião, você deveria conectar o seu transdutor em um osciloscópio e analisar a forma de onda do sinal.
TTL significa mais que o sinal é digital e provavelmente em 5vcc.
Se o transdutor liberar pulsos de onda quadrada assim como no encoder você poderá sim conectado como no tutorial e contar os pulsos de acordo e elaborar uma relação dos pulsos e a distância que o transdutor deslocou.
Se não for de onda quadrada e sim um protocolo serial em nível TTL, você deverá descobrir qual é o padrão e interpretalo.
Espero ter ajudado.
Eduardo Avelar.
27/01/2018 at 11:49
Bom dia, teria possibilidade de disponibilizar o código?
28/01/2018 at 22:11
Olá Gabriel,
Talvez você não tenha percebido mais o código está exposto no corpo do tutorial, logo acima deste comentário.
Até.