Leitura irregular do encoder com attachInterrupt() - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-28T17:37:09Zhttps://labdegaragem.com/forum/topics/leitura-irregular-do-encoder-com-attachinterrupt?commentId=6223006%3AComment%3A880057&x=1&feed=yes&xn_auth=noOlá, Cleiton! Se o objetivo…tag:labdegaragem.com,2022-01-18:6223006:Comment:8800572022-01-18T01:45:28.238ZD. T. Ribeirohttps://labdegaragem.com/profile/DanielTozziRibeiro
<p>Olá, Cleiton!<br></br><br></br> Se o objetivo é apenas detectar quando a cortina está aberta ( totalmente ) ou fechada ( totalmente ) , isto pode ser feito com dois fins-de-curso, da mesma forma que são os portões de garagem.</p>
<p></p>
<p> Claro, como não conheço a cortina em que você quer aplicar este controle, talvez haja impeditivos de ordem prática para esta abordagem, tipo não ter espaço para colocar os sensores etc.</p>
<p></p>
<p> De qualquer forma, achei que valia a pena…</p>
<p>Olá, Cleiton!<br/><br/> Se o objetivo é apenas detectar quando a cortina está aberta ( totalmente ) ou fechada ( totalmente ) , isto pode ser feito com dois fins-de-curso, da mesma forma que são os portões de garagem.</p>
<p></p>
<p> Claro, como não conheço a cortina em que você quer aplicar este controle, talvez haja impeditivos de ordem prática para esta abordagem, tipo não ter espaço para colocar os sensores etc.</p>
<p></p>
<p> De qualquer forma, achei que valia a pena mencionar.</p>
<p></p>
<p>Sucesso!</p>
<p></p>
<p>D.T. Ribeiro.</p> Olá, Cleiton!
Em primeiro…tag:labdegaragem.com,2022-01-16:6223006:Comment:8802292022-01-16T00:52:23.643ZD. T. Ribeirohttps://labdegaragem.com/profile/DanielTozziRibeiro
<p>Olá, Cleiton!</p>
<p></p>
<p> Em primeiro lugar, se o objetivo é leitura de posição, não se faz isto com encoders de um único canal ( ou fase como costumamos chamar na indústria ).</p>
<p></p>
<p> Normalmente usam-se encoders de 3 fases: A, B e Índice.</p>
<p></p>
<p> As fases A e B servem para medir a posição e o índice garante que a contagem sempre comece no mesmo ponto. Se a energia falhar no meio do movimento, o usuário pode executar uma rotina que chamamos "HOME" e que coloca a…</p>
<p>Olá, Cleiton!</p>
<p></p>
<p> Em primeiro lugar, se o objetivo é leitura de posição, não se faz isto com encoders de um único canal ( ou fase como costumamos chamar na indústria ).</p>
<p></p>
<p> Normalmente usam-se encoders de 3 fases: A, B e Índice.</p>
<p></p>
<p> As fases A e B servem para medir a posição e o índice garante que a contagem sempre comece no mesmo ponto. Se a energia falhar no meio do movimento, o usuário pode executar uma rotina que chamamos "HOME" e que coloca a cortina em uma posição conhecida pelo controlador.</p>
<p></p>
<p> Se é uma aplicação profissional, veja encoders industriais em:</p>
<p></p>
<p> <a href="https://hohner.com.br" target="_blank" rel="noopener">Hohner - Encoders</a></p>
<p></p>
<p> Espero ter ajudado.</p>
<p></p>
<p>D.T. Ribeiro.</p> Nossa, adorei sua explicação…tag:labdegaragem.com,2022-01-15:6223006:Comment:8799922022-01-15T16:46:20.053ZCleiton Alveshttps://labdegaragem.com/profile/CleitonAlves
<p>Nossa, adorei sua explicação e faz todo o sentido! </p>
<p></p>
<p>Na verdade minha aplicação é controlar o número de voltas de um motor de corrente contínua que será aplicado em uma persiana de rolo. Você recomendaria usar algum outro tipo de sensor? </p>
<p></p>
<p>porque no meu hardware, o usuário grava via botão a posição máxima e a posição mínima da cortina. Ao longo do uso, caso algumas leituras sejam "engolidas" ou contadas em falso, a persiana pode extrapolar o ponto máximo ou o…</p>
<p>Nossa, adorei sua explicação e faz todo o sentido! </p>
<p></p>
<p>Na verdade minha aplicação é controlar o número de voltas de um motor de corrente contínua que será aplicado em uma persiana de rolo. Você recomendaria usar algum outro tipo de sensor? </p>
<p></p>
<p>porque no meu hardware, o usuário grava via botão a posição máxima e a posição mínima da cortina. Ao longo do uso, caso algumas leituras sejam "engolidas" ou contadas em falso, a persiana pode extrapolar o ponto máximo ou o mínimo. </p> ah esqueci disso:
No s…tag:labdegaragem.com,2022-01-12:6223006:Comment:8801122022-01-12T23:48:48.556ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">ah esqueci disso:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> No seu post inicial, quando vc fez a leitura do <em><strong>sinal do Encoder</strong></em> via <strong><em>"digitalRead"</em></strong> dentro do <em><strong>"loop"</strong></em> do <em><strong>Arduino</strong></em>, vc fez também uma filtragem semelhante a um <strong>FPB</strong>, já que a leitura estava cadenciada pelo <em><strong>"delay(2)"</strong></em> (ou seja: vc estava…</span></p>
<p><span style="font-size: 12pt;">ah esqueci disso:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> No seu post inicial, quando vc fez a leitura do <em><strong>sinal do Encoder</strong></em> via <strong><em>"digitalRead"</em></strong> dentro do <em><strong>"loop"</strong></em> do <em><strong>Arduino</strong></em>, vc fez também uma filtragem semelhante a um <strong>FPB</strong>, já que a leitura estava cadenciada pelo <em><strong>"delay(2)"</strong></em> (ou seja: vc estava amostrando o sinal aproximadamente a cada <em><strong>2 ms</strong></em>). Assim praticamente vc acabava ignorando os pulsos mais rápidos e estreitos resultantes da vibração do Disco (mas eventualmente, em algum momento, vc poderia também ler um "falso" pulso).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> <em><span style="text-decoration: underline;">E não se esqueça</span></em>: se vc <em><span style="text-decoration: underline;">alterar</span></em> uma variável <em><strong>dentro de uma ISR</strong></em>, e essa mesma variável também estiver sendo acessada <strong><em>fora da ISR</em></strong>, ela deve ser obrigatoriamente declarada com o <em>atributo</em> <strong><em>"volatile"</em></strong> (como foi o caso da variável <strong><em>"signal_encoder"</em></strong>).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> olá Cleiton.
Sim, vc…tag:labdegaragem.com,2022-01-12:6223006:Comment:8800222022-01-12T22:33:29.532ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá Cleiton.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sim, vc pode ver isto como um <strong>FPB</strong> (Filtro Passa Baixas) implementado no código.</span></p>
<p><span style="font-size: 12pt;"> Mas está mais para um <strong><em>"anti-bouncing"</em></strong> (ou <strong><em>"debouncing"</em></strong>, se vc preferir). Veja porquê:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> <em><strong>1)</strong></em> todos os Motores…</span></p>
<p><span style="font-size: 12pt;">olá Cleiton.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sim, vc pode ver isto como um <strong>FPB</strong> (Filtro Passa Baixas) implementado no código.</span></p>
<p><span style="font-size: 12pt;"> Mas está mais para um <strong><em>"anti-bouncing"</em></strong> (ou <strong><em>"debouncing"</em></strong>, se vc preferir). Veja porquê:</span></p>
<p></p>
<p><span style="font-size: 12pt;"> <em><strong>1)</strong></em> todos os Motores quando em funcionamento, além de girar, sempre tem uma <strong><em>vibração no eixo</em></strong>. Assim, o <strong><em>Disco</em></strong> usado no <strong><em>Sensor Encoder</em></strong>, também terá uma vibração (seja este Disco acoplado direto no eixo, seja acoplado via engrenagens).</span></p>
<p></p>
<p><span style="font-size: 12pt;"> <em><strong>2)</strong></em> quando um <strong><em>furo</em></strong> do <strong><em>Disco</em> </strong><span style="text-decoration: underline;"><em>está entrando</em></span> na <strong><em>região ótica</em></strong> do <em><strong>Sensor Encoder</strong></em>, a vibração transmitida pelo Motor faz com que esta "entrada" ocorra diversas vezes. Ou seja, o limiar físico do furo deixa passar e interrompe a luz do Sensor várias vezes, devido à vibração do Disco. Isto ocorre também quando um furo do Disco <span style="text-decoration: underline;"><em>está saindo</em></span> da <strong><em>região ótica</em></strong> do <strong><em>Sensor Encoder</em></strong>. Como o <em><strong>Opto-acoplador</strong></em> do Sensor é rápido o suficiente (chaveia em torno de alguns <em><strong>micro-segundos</strong></em>), ele consegue detectar estas várias entradas e saídas, resultantes da vibração do Disco, e assim gera diversos pulsos no "sinal" do Encoder. E estes diversos pulsos "falsos" do Encoder também geram <em><strong>IRQ</strong></em> (Interrupt Request), levando a uma detecção errônea caso nenhum tratamento seja feito.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Vc pode impedir o problema por <strong><em>Hardware</em></strong> também, usando um circuito de um <strong>FPB</strong> (adequadamente calculado). Mas claro, isso ocupa espaço, tem custo, e não tem a mesma versatilidade que uma implementação no código.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> A <strong>ISR</strong> (Interrupt Service Routine) que trata as <strong>IRQs</strong>, é bastante simples, e mostrada na figura a seguir:</span></p>
<p></p>
<p style="text-align: center;"><span style="font-size: 8pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/10006825062?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/10006825062?profile=RESIZE_710x" class="align-center" width="550" height="273"/></a></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Observe que a parte que marquei em verde, é uma constante, que é resolvida no <strong><em>tempo de compilação</em></strong>. Ou seja, esta parte não é calculada durante a execução do código, e portanto <em><span style="text-decoration: underline;">não consome tempo de processamento</span></em>.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Caso tenha alguma dúvida, fique à vontade para perguntar.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Mas fiquei com uma curiosidade sobre seu Sistema: por que vc precisa "ver" estes pulsos via <em><strong>Terminal do Arduino</strong></em> ?</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Oi EC, vc vez um "filtro pass…tag:labdegaragem.com,2022-01-12:6223006:Comment:8800212022-01-12T21:41:48.522ZCleiton Alveshttps://labdegaragem.com/profile/CleitonAlves
<p>Oi EC, vc vez um "filtro passa baixa" via código ne. Dentro da função de interrupção são selecionados apenas os pulsos dentro do intervalo de tempo especificado.</p>
<p></p>
<p>Estou testando aqui e aparentemente funcionou sim! Vou continuar os testes e ajustar o melhor valor de debouncing para evitar que algum ruído indesejado seja contabilizado. </p>
<p></p>
<p>Gostei muito também da forma que vc comentou e organizou o código. Vou adotar essa forma em próximas dúvidas que eu postar…</p>
<p>Oi EC, vc vez um "filtro passa baixa" via código ne. Dentro da função de interrupção são selecionados apenas os pulsos dentro do intervalo de tempo especificado.</p>
<p></p>
<p>Estou testando aqui e aparentemente funcionou sim! Vou continuar os testes e ajustar o melhor valor de debouncing para evitar que algum ruído indesejado seja contabilizado. </p>
<p></p>
<p>Gostei muito também da forma que vc comentou e organizou o código. Vou adotar essa forma em próximas dúvidas que eu postar aqui. </p>
<p></p>
<p>Muito obrigado mesmo! Tirou um pesadelo da minha cabeça!</p> olá novamente Cleiton.
…tag:labdegaragem.com,2022-01-12:6223006:Comment:8800192022-01-12T16:40:12.270ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá novamente Cleiton.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Alterei o código que postei antes, para que o valor de <em><strong>"debouncing_ms"</strong></em> possa também ser <em><strong>fracionário</strong></em>, caso isso seja necessário.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> O código alterado é este: …</span></p>
<p><span style="font-size: 12pt;">olá novamente Cleiton.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Alterei o código que postei antes, para que o valor de <em><strong>"debouncing_ms"</strong></em> possa também ser <em><strong>fracionário</strong></em>, caso isso seja necessário.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> O código alterado é este: <span style="font-size: 10pt;"><strong><em><a href="https://storage.ning.com/topology/rest/1.0/file/get/10006136882?profile=original" target="_blank" rel="noopener">"<span style="text-decoration: underline;">Encoder_IRQ_Wemos_D1_02a.zip</span>"</a></em></strong></span></span></p>
<p></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Neste "novo" código, veja por exemplo como ficaria a definição para que o <strong><em>"debouncing_ms"</em></strong> seja de <em><strong>1.6</strong></em> <em><strong>mili-segundos</strong>:</em></span></p>
<p></p>
<p style="text-align: center;"><span style="font-size: 8pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/10006134469?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/10006134469?profile=RESIZE_710x" class="align-center" width="496" height="139"/></a></span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Fique à vontade para perguntar, caso tenha alguma dúvida sobre isto.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> olá Cleiton.
Por favo…tag:labdegaragem.com,2022-01-12:6223006:Comment:8801032022-01-12T15:47:49.713ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p></p>
<p><span style="font-size: 12pt;">olá Cleiton.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Por favor, teste este código: <span style="font-size: 10pt;"><strong><em><a href="https://storage.ning.com/topology/rest/1.0/file/get/10005636082?profile=original" rel="noopener" target="_blank">"<span style="text-decoration: underline;">Encoder_IRQ_Wemos_D1_02.zip</span>"</a></em></strong></span></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Eu testei aqui e…</span></p>
<p></p>
<p><span style="font-size: 12pt;">olá Cleiton.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Por favor, teste este código: <span style="font-size: 10pt;"><strong><em><a href="https://storage.ning.com/topology/rest/1.0/file/get/10005636082?profile=original" target="_blank" rel="noopener">"<span style="text-decoration: underline;">Encoder_IRQ_Wemos_D1_02.zip</span>"</a></em></strong></span></span></p>
<p></p>
<p><span style="font-size: 12pt;"> Eu testei aqui e funcionou.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Depois que vc confirmar o funcionamento, eu explicarei o que estava ocorrendo de "errado" no seu Sistema, caso vc precise de alguma instrução sobre isto.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Pela velocidade do seu <strong><em>Motor</em></strong> e pelas características do disco usado no seu <strong><em>Encoder</em></strong>, o valor que deixei para a constante <em><strong>"debouncing_ms"</strong></em> foi de <strong><em>2 ms</em></strong> (<em>dois mili-segundos</em>), e me parece ok. Esta definição vc pode ver na figura a seguir, onde marquei em verde o valor:</span></p>
<p></p>
<p style="text-align: center;"><span style="font-size: 8pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/10005634680?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/10005634680?profile=RESIZE_710x" class="align-center" width="519" height="134"/></a></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Mas caso deseje, vc pode mudar esse valor, e pode ser que tenha que colocar um valor fracionário tipo 1.5 ms (se isso for realmente necessário, eu te mostrarei como fazê-lo).</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Bom dia CA,
Vou montar aqui u…tag:labdegaragem.com,2022-01-12:6223006:Comment:8798752022-01-12T14:29:26.227Zmineirin RVhttps://labdegaragem.com/profile/RuiViana
<p>Bom dia CA,</p>
<p>Vou montar aqui usando um ESP8266 normal.</p>
<p>Manda uma foto do que tem montado no eixo do motor gerando os pulsos.</p>
<p></p>
<p>RV mineirin</p>
<p>Bom dia CA,</p>
<p>Vou montar aqui usando um ESP8266 normal.</p>
<p>Manda uma foto do que tem montado no eixo do motor gerando os pulsos.</p>
<p></p>
<p>RV mineirin</p> tentei aqui, mas nao houve mu…tag:labdegaragem.com,2022-01-12:6223006:Comment:8798742022-01-12T11:56:05.925ZCleiton Alveshttps://labdegaragem.com/profile/CleitonAlves
<p>tentei aqui, mas nao houve mudança</p>
<p>tentei aqui, mas nao houve mudança</p>