Arduino na industria com interferencias no sensor - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-28T14:53:48Zhttps://labdegaragem.com/forum/topics/arduino-na-industria-com-interferencias-no-sensor?commentId=6223006%3AComment%3A790582&feed=yes&xn_auth=noOla Mendigo Rasteiro,
Apliqu…tag:labdegaragem.com,2021-01-04:6223006:Comment:8207162021-01-04T16:21:54.522ZRENAN DA MAIAhttps://labdegaragem.com/profile/RENANDAMAIA
<p>Ola Mendigo Rasteiro, </p>
<p>Apliquei o debounce via software e até o momento solucionou o meu problema. </p>
<p>Pretendo agora isolar opticamente as entradas.</p>
<p></p>
<p>Grato.</p>
<p>Ola Mendigo Rasteiro, </p>
<p>Apliquei o debounce via software e até o momento solucionou o meu problema. </p>
<p>Pretendo agora isolar opticamente as entradas.</p>
<p></p>
<p>Grato.</p> Boa tarde Elcids,
Sim, optei…tag:labdegaragem.com,2021-01-04:6223006:Comment:8208162021-01-04T16:20:10.906ZRENAN DA MAIAhttps://labdegaragem.com/profile/RENANDAMAIA
<p>Boa tarde Elcids, </p>
<p>Sim, optei inicialmente por aplicar debounce via código mantendo o mesmo hardware e até o momento não tive mais problemas com interferências, fiz algo parecido que a sua maquina de estados filtrando acionamentos inferiores a 100ms. Quero agora fazer isolamento optoacoplado para aumentar a segurança na entradas.</p>
<p>Boa tarde Elcids, </p>
<p>Sim, optei inicialmente por aplicar debounce via código mantendo o mesmo hardware e até o momento não tive mais problemas com interferências, fiz algo parecido que a sua maquina de estados filtrando acionamentos inferiores a 100ms. Quero agora fazer isolamento optoacoplado para aumentar a segurança na entradas.</p> ola, posso sugerir algumas al…tag:labdegaragem.com,2021-01-04:6223006:Comment:8205362021-01-04T14:45:28.555ZMendigo Rasteirohttps://labdegaragem.com/profile/MendigoRasteiro23
<p>ola, posso sugerir algumas alterações no seu codigo, e no hardware.</p>
<p>no codigo, faça uma rotina que pega somente uma borda de subida ou descida do sensor e coloque um filtro de tempo sem delay, apenas usando ciclos do processamento.</p>
<p>exemplo</p>
<p>boolean FlagCount = false;</p>
<p>void ContaPeca()<br></br>{<br></br> //Contagem de peça<br></br> if (digitalRead(IO_Input) == HIGH)<br></br> {<br></br> // Sensor de Conta peça<br></br> if (!FlagCount)<br></br> {<br></br> FlagCount = true; // Pega a borda de Subida…</p>
<p>ola, posso sugerir algumas alterações no seu codigo, e no hardware.</p>
<p>no codigo, faça uma rotina que pega somente uma borda de subida ou descida do sensor e coloque um filtro de tempo sem delay, apenas usando ciclos do processamento.</p>
<p>exemplo</p>
<p>boolean FlagCount = false;</p>
<p>void ContaPeca()<br/>{<br/> //Contagem de peça<br/> if (digitalRead(IO_Input) == HIGH)<br/> {<br/> // Sensor de Conta peça<br/> if (!FlagCount)<br/> {<br/> FlagCount = true; // Pega a borda de Subida do sensor para incrementar o conta peça.<br/> CountProduction++;<br/> }<br/> FiltroSensorPeca = millis();<br/> }<br/> else<br/> {<br/> if (millis() - FiltroSensorPeca > filtroPeca)<br/> { // Colocar um poteciometro depois para ajustar de acordo com a maquina<br/> // Filtro para não ter problemas com pequenas bordas de descida<br/> FlagCount = false; // Somente apos uma borda de Descida eu retiro a flag.<br/> }<br/>}<br/>}</p>
<p></p>
<p>para o hardware tente usar circuito com debounce de 5 a 6 millis .</p>
<p></p> tente usar um conversor dc dc…tag:labdegaragem.com,2021-01-04:6223006:Comment:8206242021-01-04T14:42:11.230ZMendigo Rasteirohttps://labdegaragem.com/profile/MendigoRasteiro23
<p>tente usar um conversor dc dc isolado, vai retirar o ruido eletromagnetico que vem carregado pela fonte.</p>
<p>tente usar um conversor dc dc isolado, vai retirar o ruido eletromagnetico que vem carregado pela fonte.</p> olá Renan.
Há algum re…tag:labdegaragem.com,2020-12-19:6223006:Comment:8065252020-12-19T19:41:13.605ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá Renan.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Há algum retorno que vc possa compartilhar aqui no <em><strong>LDG</strong></em>?</span></p>
<p><span style="font-size: 12pt;"> (especificamente sobre se vc conseguiu um bom resultado com a <em><strong>contagem de objetos</strong></em>)</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sempre é bom compartilhar resultados, pois certamente isso ajuda outras pessoas que aqui no…</span></p>
<p><span style="font-size: 12pt;">olá Renan.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Há algum retorno que vc possa compartilhar aqui no <em><strong>LDG</strong></em>?</span></p>
<p><span style="font-size: 12pt;"> (especificamente sobre se vc conseguiu um bom resultado com a <em><strong>contagem de objetos</strong></em>)</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sempre é bom compartilhar resultados, pois certamente isso ajuda outras pessoas que aqui no <em><strong>LDG</strong></em> (assim com vc) procuram ajuda.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> Abrçs</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p> Ok.
O código pode ser…tag:labdegaragem.com,2020-12-01:6223006:Comment:7971352020-12-01T17:34:31.797ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">Ok.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> O código pode ser usado com o <em><strong>Wemos</strong></em>.</span></p>
<p><span style="font-size: 12pt;"> Não esqueça de especificar o pino que vc está usando para o Sensor, e os parâmetros relacionados à temporização para detectar um objeto (ou "Peça"). Mas há diversos parâmetros que vc pode especificar e estão descritos no post.…</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;">Ok.</span></p>
<p></p>
<p><span style="font-size: 12pt;"> O código pode ser usado com o <em><strong>Wemos</strong></em>.</span></p>
<p><span style="font-size: 12pt;"> Não esqueça de especificar o pino que vc está usando para o Sensor, e os parâmetros relacionados à temporização para detectar um objeto (ou "Peça"). Mas há diversos parâmetros que vc pode especificar e estão descritos no post.</span></p>
<p></p>
<p><span style="font-size: 16px;"> Abrçs</span></p>
<p><span style="font-size: 16px;">Elcids</span></p> Boa tarde Elcids, muito grato…tag:labdegaragem.com,2020-12-01:6223006:Comment:7972142020-12-01T17:30:34.684ZRENAN DA MAIAhttps://labdegaragem.com/profile/RENANDAMAIA
<p>Boa tarde Elcids, muito grato pelo retorno, a noite estarei estudando sua resposta.</p>
<p></p>
<p>Novamente, muito obrigado!</p>
<p>Boa tarde Elcids, muito grato pelo retorno, a noite estarei estudando sua resposta.</p>
<p></p>
<p>Novamente, muito obrigado!</p> Nota: esta é a continuação d…tag:labdegaragem.com,2020-12-01:6223006:Comment:7971272020-12-01T15:58:40.437ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p></p>
<p><span style="font-size: 14pt;"><span style="text-decoration: underline;"><em><strong>Nota</strong></em></span>: <em>esta é a continuação do post (<span style="font-size: 10pt;"><strong><a href="http://labdegaragem.com/xn/detail/6223006:Comment:797049" rel="nofollow" target="_self">Link</a></strong></span>) :</em></span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre o <em>mecanismo</em> implementado no código para detecção de…</span></p>
<p></p>
<p><span style="font-size: 14pt;"><span style="text-decoration: underline;"><em><strong>Nota</strong></em></span>: <em>esta é a continuação do post (<span style="font-size: 10pt;"><strong><a rel="nofollow" href="http://labdegaragem.com/xn/detail/6223006:Comment:797049" target="_self">Link</a></strong></span>) :</em></span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p></p>
<p><span style="font-size: 12pt;"> Sobre o <em>mecanismo</em> implementado no código para detecção de um objeto via <strong><em>Sensor de Proximidade</em></strong>, há <strong><em>três parâmetros importantes</em></strong> a serem configurados, os quais são mostrados na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237170072?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237170072?profile=RESIZE_710x" class="align-center" width="564" height="371"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Logo que o Sistema percebe que <strong><em>sinal do Sensor de Proximidade</em></strong> teve alguma mudança, inicia-se a contagem do <strong><em>tempo</em></strong> de "<strong><em>debouncing</em></strong>". Esse período de tempo, permite ignorar eventuais instabilidades ou ruídos presentes justamente na transição do sinal do Sensor. Portanto esse tempo tem efeito tanto quando o <strong><em>sinal do Sensor</em></strong> está passando de "<strong>OFF</strong>" para "<strong>ON</strong>", quanto de "<strong>ON</strong>" para "<strong>OFF</strong>" (ou seja: quando um objeto está "<em>entrando na frente</em>" do Sensor e quando ele está "<em>saindo da frente</em>"). No código, o <strong><em>tempo</em></strong> de "<strong><em>debouncing</em></strong>" é especificado pelo <em>parâmetro</em> "<strong><em>debouncing_Prox_ms</em></strong>", em <em>mili-segundos</em>. Mas caso se deseje que o <strong><em>tempo</em></strong> de "<strong><em>debouncing</em></strong>" não tenha efeito, basta especificá-lo como "<strong>0</strong>" (<em>zero</em>).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> E quando o <strong><em>sinal do Sensor</em></strong> está "<strong>ON</strong>" indicando que um objeto está sendo detectado pelo Sensor, logo após o <em>período</em> <em>de</em> "<em>debouncing</em>" o Sistema verifica se o sinal continua "<strong>ON</strong>" por um <strong><em>período mínimo de tempo</em></strong>. Isto confirma que o <strong><em>sinal do Sensor</em></strong> está de fato detectando um objeto (ou seja, garante-se que não foi um acionamento espúrio que durou um tempo maior que o "<em>debouncing</em>"). No código este tempo é especificado pelo <em>parâmetro</em> "<strong><em>tempo_min_Prox_ON_ms</em></strong>", em <em>mili-segundos</em>. Normalmente esse tempo dependente da velocidade da esteira que movimenta os objetos, sendo bem maior que o <em>tempo</em> de "<em>debouncing</em>".</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Depois que o objeto "<em>sai da frente</em>" do Sensor e o sinal deste vai a "OFF", após o <em>período</em> <em>de</em> "<em>debouncing</em>" o Sistema verifica se o sinal continua "OFF" também por um <strong><em>período mínimo de tempo</em></strong>, garantindo-se assim que o <em>desacionamento do Sensor</em> não foi um evento espúrio. No código este tempo é especificado pelo <em>parâmetro</em> "<strong><em>tempo_min_Prox_OFF_ms</em></strong>", em <em>mili-segundos</em>. Esse tempo também dependente da velocidade da esteira que movimenta os objetos, mas também da <strong><em>distância física</em></strong> entre os objetos na esteira, e normalmente é bem maior que o tempo "<strong>ON</strong>".</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Observar que os valores dos <strong><em>tempos</em></strong> de "<strong><em>debouncing</em></strong>", "<strong><em>ON</em></strong>", e "<strong><em>OFF</em></strong>" usados na simulação, são valores hipotéticos, não necessariamente correspondendo a condições reais. Cada implementação deve especificar estes três parâmetros conforme o maquinário usado para a detecção de objetos, além das dimensões físicas dos próprios objetos.</span></p>
<p><span style="font-size: 12pt;"> Para o caso do seu Sistema Renan, onde vc informou que a velocidade é baixa (3 a 10 peças por minuto), e cada peça (objeto) fica entre 2,5 a 3,5 segundos sob o Sensor, eu usaria os seguintes settings para os três parâmetros: <strong><em>tempo de</em></strong> "<strong><em>debouncing</em></strong>" = <strong><em>200ms</em></strong>, <strong><em>tempo mínimo</em></strong> "<strong><em>ON</em></strong>" = <strong><em>1000 ms</em></strong>, e <strong><em>tempo mínimo</em></strong> "<strong><em>OFF</em></strong>" = <strong><em>2000 ms</em></strong>. Com estes valores, acredito que funcionará muito bem. Para outros Sistemas não será difícil escolher valores adequados e confiáveis. Lembre-se que no código os valores estão especificados em <em>mili-segundos</em>, conforme mostrado na figura anterior.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Assim, para a detecção robusta de um objeto usando os três parâmetros anteriores, o código executa um processo sistemático. Primeiro é esperado que o objeto "<em>entre na frente</em>" do Sensor e logo que isso ocorre é aguardado o <em>tempo</em> de "<em>debouncing</em>", e após isso o código confirma que o objeto está de fato "<em>na frente</em>" do Sensor (usando o <em>tempo</em> "<em>ON</em>"). Então o código passa a aguardar que o objeto "<em>saia da frente</em>" do Sensor e logo que isso ocorre é aguardado novamente o <em>tempo</em> de "<em>debouncing</em>". Por fim, o código confirma que o objeto não está mais sendo detectado (usando o <em>tempo</em> "<em>OFF</em>"), para então iniciar o processo de detecção do próximo objeto.</span></p>
<p><span style="font-size: 12pt;"> Observar que independente do ponto que o código esteja no processo descrito, ele sempre conseguirá sozinho reiniciar este processo, assim garantindo sua estabilidade e autonomia.</span></p>
<p><span style="font-size: 12pt;"> O processo pode ser melhor entendido através da figura a seguir, onde mostro também o comportamento do <strong><em>sinal na saída do Sensor</em></strong> nas várias etapas:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"> <strong><em>(clique na figura para "zoom")</em></strong></span><span style="font-size: 12pt;"> <a href="https://storage.ning.com/topology/rest/1.0/file/get/8237171289?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237171289?profile=RESIZE_710x" class="align-center"/></a></span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Para facilitar ver detalhes da figura anterior, o respectivo arquivo <strong><em>PDF</em></strong> está aqui disponível: <a href="https://storage.ning.com/topology/rest/1.0/file/get/8237166287?profile=original" target="_blank" rel="noopener">"<em><strong>temporizacao_Sinal_Prox_01.pdf</strong></em>"</a></span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Mas como implementar este processo de uma forma simples e confiável? Uma <strong><em>Máquina de Estados</em></strong> faz isso com "<em>o pé nas costas</em>". Se seguirmos o processo que foi descrito, iremos facilmente obter os <strong><em>6 estados</em></strong> para detectar um objeto, e que são definidos no código conforme mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237172500?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237172500?profile=RESIZE_710x" class="align-center" width="599" height="264"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> A implementação da <strong><em>Máquina de Estados</em></strong> que controla o <strong><em>processo de detecção</em></strong>, deve ser simples, sem lógicas bizarras, ou seja, uma <em>implementação clássica</em> conforme mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237173658?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237173658?profile=RESIZE_710x" class="align-center" width="492" height="1072"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> Ao seguir a execução do código mostrado na figura anterior, percebe-se quanto é simples a implementação da <strong><em>Máquina de Estados</em></strong>, e que isso resulta em um funcionamento totalmente confiável.</span></p>
<p><span style="font-size: 12pt;"> Claro, a <strong><em>Máquina de Estados</em></strong> deve ser mantida funcionando ciclicamente, e por isso mesmo a <strong><em>função</em></strong> que implementa a mesma (a "<strong><em>exec_MAQ_Sensor_Prox</em></strong>") é chamada a partir do "<strong><em>loop</em></strong>" do <strong><em>Arduino</em></strong>. Isso implica que no "<strong><em>loop</em></strong>" do <strong><em>Arduino</em></strong> não se deve usar <strong><em>códigos</em></strong> "<strong><em>bloqueantes</em></strong>", ou seja, não usar loops quase eternos nem a <strong><em>função</em></strong> "<strong><em>delay</em></strong>", assim como ter cuidado com Bibliotecas escritas sem esses cuidados. Aqui fica um ponto importante: <strong><em><u>sempre</u></em></strong> é possível escrever uma Biblioteca que <em><u>não seja</u></em> "<em>bloqueante</em>". Então quando vc encontrar uma que é "bloqueante", é porque quem a escreveu ou não sabia como fazer, ou não estava interessado em fazer isso, ou então teve uma preguicinha de fazer. Mas é estranho que não se saiba como escrever um código "não bloqueante", uma vez que fazer isso é extremamente simples (e como eu disse, sempre isso é possível de ser feito, e nos meus mais de 35 anos de experiência em Projetos, eu nunca encontrei um caso que não tivesse solução).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> Como dito anteriormente, é possível selecionar no código, qual <strong><em>Interface</em></strong> será usada para o <strong><em>Display LCD</em></strong>: <strong><em>Paralela</em></strong> ou <strong><em>I2C</em></strong>. Esta definição pode ser vista na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237178482?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237178482?profile=RESIZE_710x" class="align-center" width="550" height="134"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Deve ser especificado o "<em>tamanho</em>" do LCD, ou seja o <strong><em>número de colunas e linhas</em></strong>, e caso se esteja usando a <strong><em>Interface I2C</em></strong> deve-se também especificar o <strong><em>endereço I2C</em></strong> do <strong><em>LCD</em></strong>, conforme é mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237179068?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237179068?profile=RESIZE_710x" class="align-center" width="479" height="228"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Mas se a Interface especificada for a <strong><em>Paralela</em></strong>, então o <strong><em>endereço I2C</em></strong> definido na figura anterior não será usado no código (mas também não é necessário deletar nem comentar a linha onde esta definição é feita).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Outros parâmetros devem ser definidos para a <strong><em>Interface de Hardware do LCD</em></strong>, e as duas figuras a seguir mostram isto respectivamente para a <strong><em>Interface Paralela</em></strong> e para <strong><em>I2C</em></strong>:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237180856?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237180856?profile=RESIZE_710x" class="align-center" width="474" height="205"/></a> </span><span style="font-size: 12pt;"> </span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237181085?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237181085?profile=RESIZE_710x" class="align-center" width="570" height="178"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Observar que para a <strong><em>Interface I2C</em></strong>, quando se utiliza o <strong><em>módulo I2C</em></strong> com <em>chip</em> <strong><em>PCF8574</em></strong>, normalmente não é necessário se preocupar com os <strong><em>pinos do módulo</em></strong> que são ligados ao LCD, pois estes pinos coincidem com aqueles mostrados na figura anterior.</span></p>
<p><span style="font-size: 12pt;"> Também não é necessário deletar ou comentar a <strong><em>especificação de Hardware</em></strong> que não corresponda a opção feita para a <strong><em>Interface</em></strong> com o <strong><em>LCD</em></strong>, pois conforme pode ser visto nas duas figuras anteriores, o código só utiliza a especificação que foi selecionada.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> O "<strong><em>setup</em></strong>" do <strong><em>Arduino</em></strong> pode ser visto na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237187089?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237187089?profile=RESIZE_710x" class="align-center" width="508" height="396"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Novamente, no "<strong><em>setup</em></strong>" do <strong><em>Arduino</em></strong> não há nenhuma novidade, mas é sempre bom refrescar a cabeça com alguns pontos, como a importância de observar a <strong><em>sequência</em></strong> em que as coisas vão sendo inicializadas para preparar o Sistema para o pleno funcionamento. Também deve-se notar a "limpeza" do processo executado no "<strong><em>setup</em></strong>", evitando-se deixar ali linhas e linhas de código detalhado (ou talvez melhor dizer "espalhado"). Para conseguir isto, as inicializações são feitas em funções específicas para cada elemento que precisa ser inicializado, deixando claro o que está sendo feito e a sequência em que isto é feito. Isto também facilita futuras alterações no funcionamento do Sistema, devido à melhor organização.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Notar que no final do "<strong><em>setup</em></strong>", a <em>variável</em> "<strong><em>ref_minuto</em></strong>" é setada com o valor do "<strong><em>millis</em></strong>" naquele momento. Esta variável é a <strong><em>referência para a contagem dos minutos</em></strong>, e setando-a ali faz com que a contagem de minutos praticamente se inicie do zero no "<strong><em>loop</em></strong>" do <strong><em>Arduino</em></strong>, fazendo com que qualquer "<strong><em>delay</em></strong>" no "<strong><em>setup</em></strong>" não tenha efeito sobre o <strong><em>primeiro minuto</em></strong>. Particularmente, eu faria isso <em>localmente</em> no próprio "<strong><em>loop</em></strong>" do <strong><em>Arduino</em></strong> (pois isto seria mais "<em>técnico/profissional</em>", evitando que todos se lembrem do caso do "<strong><em>bit assassino</em></strong>" da <strong><em>Toyota</em></strong>), mas para deixar o código mais simples, fiz no "<strong><em>setup</em></strong>" conforme mostrado na figura anterior.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> E finalmente, novamente no "<strong><em>loop</em></strong>" do <strong><em>Arduino</em></strong> graças a toda a metodologia que foi usada na implementação do restante do código, podemos ver facilmente todos os processos que são <strong><em>continuamente executados</em></strong> no Sistema e que o mantém funcionando de forma simples e robusta. Isto pode ser visto na figura a seguir, que mostra <em>quatro processos</em> sendo executados no "<strong><em>loop</em></strong>" do <strong><em>Arduino</em></strong>:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237187684?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237187684?profile=RESIZE_710x" class="align-center" width="524" height="485"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Primeiro, é executada a <strong><em>Máquina de Estados</em></strong> (<em>função</em> "<span style="font-size: 10pt;"><strong><em>exec_MAQ_Sensor_Prox</em></strong></span>") que gerencia a <strong><em>detecção de objetos</em></strong> via <strong><em>Sensor de Proximidade</em></strong>.</span></p>
<p><span style="font-size: 12pt;"> Em seguida é executado o processo que <em>gerencia a exibição de informações no Display LCD</em> (função "<strong><em>gerencia_Display</em></strong>"). Observar que o <em>Display</em> só é atualizado quando necessário. Esta atualização é requisitada através de uma <strong><em>flag</em></strong> (a "<strong><em>Display_update</em></strong>").</span></p>
<p><span style="font-size: 12pt;"> O terceiro processo, <em>verifica se um objeto foi detectado</em>, e caso sim, é atualizado a <strong><em>contagem total de objetos</em></strong> e a <strong><em>contagem parcial</em></strong> (que é a contagem em progresso no <em>minuto atual</em>), sendo então <em><u>requisitado</u></em> que o <strong><em>Display</em></strong> seja atualizado. Adicionalmente, a <strong><em>contagem total</em></strong> também é "<em>printada</em>" via <strong><em>Serial do Arduino</em></strong>. Então as operações neste <em>terceiro processo</em>, <em>são executadas <strong>apenas quando um objeto é de fato detectado</strong></em>.</span></p>
<p><span style="font-size: 12pt;"> O quarto processo, <em>verifica se foi completado um minuto desde a conclusão do minuto anterior</em>, e caso sim, então é iniciada a contagem de mais um minuto (<em>variável</em> "<strong><em>ref_minuto</em></strong>") e atualizado o <strong><em>total de minutos decorridos</em></strong>. Também é registrado o <strong><em>total de objetos neste último minuto concluído</em></strong> (sendo então <em>zerada</em> a <strong><em>contagem parcial</em></strong>), e então <em>calculada</em> a <strong><em>Média de objetos por minuto</em></strong>. Finalizando o processo, as informações sobre a <em>quantidade por minuto</em> são "<em>printadas</em>" via <strong><em>Serial do Arduino</em></strong>, e é <em><u>requisitado</u></em> que o <strong><em>Display</em></strong> <em>seja atualizado</em>. Notar que todas as operações neste <em>quarto processo</em>, <em>são executadas</em> <strong><em>apenas uma vez a cada minuto</em></strong>.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> É interessante notar que mesmo que se altere a <em>sequência de execução dos processos</em> no "<strong><em>loop</em></strong>" do <strong><em>Arduino</em></strong>, ainda assim o Sistema funcionará corretamente. Isto é devido à toda a técnica usada na implementação (como uso de Flags de sinalização, Flags de requisição, Processos "fechados", etc, além da própria <strong><em>Máquina de Estados</em></strong> que gerencia a detecção de objetos). Mas obviamente, há uma <em>sequência lógica</em> que pode ser percebida, e o bom senso nos diz que é melhor deixar a execução seguir conforme esta <em>sequência lógica</em>, pois isto irá facilitar o entendimento do funcionamento do Sistema, o que por sua vez facilitará o nosso trabalho.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> <strong><em>Algumas considerações finais</em></strong>:</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> <span style="font-size: 14pt;"><strong><em>1)</em></strong></span> nesta implementação, observar que apenas no "<strong><em>setup</em></strong>" do <strong><em>Arduino</em></strong> e eventualmente em alguma <strong><em>função de inicialização</em></strong> (chamada no próprio "<strong><em>setup</em></strong>"), é que se utiliza a função "<strong><em>delay</em></strong>" do <strong><em>Arduino</em></strong>. Então <em><u>não utilize</u></em> "<strong><em>delay</em></strong>" fora destas áreas. E cuidado com a enorme quantidade disponível na Internet, de Bibliotecas "mal-escritas", e que fazem uso deliberado do "<strong><em>delay</em></strong>", provocando "<em>travamento</em>" da execução de todo o Sistema (como já mencionei anteriormente quando falei de <strong><em>códigos</em></strong> "<strong><em>bloqueantes</em></strong>").</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> <span style="font-size: 14pt;"><strong><em>2)</em></strong></span> sobre a <em>simulação</em> no <strong><em>Proteus</em></strong>, sempre é bom lembrar que dependendo do Computador, o <strong><em>I2C</em></strong> do <strong><em>PCF8574</em></strong> pode "travar" com mais frequência. Pelas minhas investigações, o problema se restringe realmente ao <strong><em>PCF8574</em></strong>, pois com outros dispositivos <strong><em>I2C</em></strong> isto não ocorre. A performance da simulação no <strong><em>Proteus</em></strong> também cai sensivelmente quando se acessa o <strong><em>PCF8574</em></strong>, e isto afeta a simulação de outros circuitos que não tem relação alguma com o <strong><em>I2C</em></strong>. Assim a simulação do <strong><em>LCD</em></strong> via <strong><em>I2C</em></strong> no <strong><em>Proteus</em></strong> pode exigir uma certa dose de paciência. Então para promover a performance da simulação, usei na mesma o <strong><em>LCD</em></strong> via <strong><em>Interface Paralela</em></strong>. Mas caso a <strong><em>I2C</em></strong> seja desejada, basta compilar o código com essa opção (que é a default), gerar o <em>arquivo</em> "<strong><em>HEX</em></strong>" correspondente e especificar este arquivo nas propriedades do <strong><em>Arduino</em></strong> no <strong><em>Proteus</em></strong> (além é claro de alterar o circuito da Interface para usar o <strong><em>I2C</em></strong> via <em>chip</em> <strong><em>PCF8574</em></strong> conforme mostro neste outro post: <span style="font-size: 10pt;"><em><strong><a rel="nofollow noopener" href="http://labdegaragem.com/forum/topics/led-que-liga-se-tiver-vaz-o-por-muito-tempo" target="_blank">"Interface I2C no Proteus"</a></strong></em></span> ).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> <span style="font-size: 14pt;"><strong><em>3)</em></strong></span> sobre usar junto ao código aqui implementado um <strong><em>Teclado Matricial</em></strong> (seja <strong><em>4x3</em></strong>, <strong><em>4x4</em></strong>, ou com qualquer outra configuração), é algo bem simples, mas precisa ser feito de forma a não ser um <em>código</em> "<em>bloqueante</em>". Para isto o Sistema deve ter dois processos associados: um que <em>executa ciclicamente</em> (e de forma temporizada) fazendo a varredura e decodificação do Teclado, e outro que simplesmente verifica se uma Tecla foi acionada e caso sim então retorna um código correspondente a essa Tecla. Ou seja, é um mecanismo muito semelhante ao implementado para o <strong><em>Sensor de Proximidade</em></strong>. E este mecanismo pode ser aplicado para o uso de uma enormidade de Sensores e dispositivos.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> O download do código para o <strong><em>Arduino</em></strong>, além dos arquivos para simulação estão disponíveis aqui: <em><strong><a href="https://storage.ning.com/topology/rest/1.0/file/get/8237198097?profile=original" target="_blank" rel="noopener">"Cont_Sens_E18_02.zip"</a></strong></em></span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Espero ter ajudado.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Abrçs,</span></p>
<p><span style="font-size: 12pt;"> Elcids</span></p>
<p></p> olá Renan.
Estou publ…tag:labdegaragem.com,2020-12-01:6223006:Comment:7970492020-12-01T15:35:03.154ZElcids Chagashttps://labdegaragem.com/profile/ElcidsChagas
<p><span style="font-size: 12pt;">olá Renan.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Estou publicando uma implementação cujo código aumenta muito a imunidade no processo de detecção de objetos (peças ou itens, conforme preferir designar), usando o <strong><em>Sensor de Proximidade E18-D80NK</em></strong>. Esse design poderá ser utilizado como referência para seu Sistema atual e suas futuras implementações com o <strong><em>E18-D80NK</em></strong>, e inclusive com…</span></p>
<p><span style="font-size: 12pt;">olá Renan.</span></p>
<p></p>
<p></p>
<p><span style="font-size: 12pt;"> Estou publicando uma implementação cujo código aumenta muito a imunidade no processo de detecção de objetos (peças ou itens, conforme preferir designar), usando o <strong><em>Sensor de Proximidade E18-D80NK</em></strong>. Esse design poderá ser utilizado como referência para seu Sistema atual e suas futuras implementações com o <strong><em>E18-D80NK</em></strong>, e inclusive com outros sensores com comportamento similar (e não precisa necessariamente ser de proximidade).</span></p>
<p><span style="font-size: 12pt;"> O ponto mais importante é definir <strong><em>três parâmetros</em></strong> no código, relacionados ao tempo que cada peça (objeto) fica "na frente" do sensor. <span>Renan, c</span>onforme as informações que vc passou, mais à frente no texto eu mostro como podem ser especificados os três parâmetros de forma a atender seu Sistema.</span></p>
<p><span style="font-size: 12pt;"> Mas não deixe de ler todo o texto, pois há considerações importantes nele.</span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Sobre o uso do <strong><em>módulo Relé</em></strong>, aconselho a leitura de um tópico aqui no <strong><em>LDG</em></strong>, onde esclareço alguns pontos importantes sobre isolação e o controle desses módulos. É este aqui: <span style="font-size: 10pt;"><em><strong><a href="http://labdegaragem.com/forum/topics/m-dulo-rel-8-canais-sem-jd-vcc-vcc-gnd?xg_source=activity" target="_blank" rel="noopener">"Módulo Relé sem JD-VCC"</a></strong></em></span></span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> Sobre o uso de um <strong><em>Teclado Matricial</em></strong>, faço algumas observações no final do post.</span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Inicialmente, gostaria de esclarecer melhor a topologia que sugeri no post inicial, a fim de minimizar falhas na detecção usando o <strong><em>Sensor de Proximidade</em></strong>. Para isto, apenas reformulei o desenho da topologia evidenciando como ela é implementada, mostrando o <strong><em>cabo de conexão</em></strong> entre o <strong><em>Sensor</em></strong> e o <strong><em>Arduino</em></strong>. Isto pode ser visto na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span></p>
<p style="text-align: left;"><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/8237086476?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237086476?profile=RESIZE_710x" class="align-center"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Aqui o ponto a ressaltar, é que a alimentação de <strong><em>5V</em></strong> é enviada até o <strong><em>Sensor</em></strong> pela extensão do cabo. Assim, na extremidade do cabo conectada ao <strong><em>Sensor de Proximidade</em></strong>, há a <strong><em>filtragem da alimentação</em></strong> (na área em "verde claro" na figura anterior). Isto é implementado com <strong><em>R7</em></strong>, <strong><em>C5</em></strong>, e <strong><em>C6</em></strong>. As considerações sobre estes componentes (valores e tipo) são as mesmas que já ressaltei no post inicial, e são fundamentais (naquele post há também considerações sobre outros componentes usados no circuito da <strong><em>Interface/Driver</em></strong> que estão na área em "azul claro" na figura anterior).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Não sei qual a extensão do cabo que está sendo usado entre o <strong><em>Sensor</em></strong> e o <strong><em>Wemos</em></strong>. Mas caso esta extensão seja de 10 metros ou mais (até mesmo 50 metros), aconselho usar uma implementação com <strong><em>Módulos RS-485</em></strong>. Estes módulos tem baixo custo e são facilmente encontrados no mercado (basta pesquisar por "<em>modulo rs485</em>" no famoso site de compras "ML"). O uso destes módulos aumenta tremendamente a imunidade a ruídos, pois eles trabalham com <strong><em>Drivers Diferenciais</em></strong> em "<strong><em>loop de corrente</em></strong>". Assim para o caso em questão, dois módulos são necessários: na ponta do lado do Sensor um módulo seria configurado como "transmissor", e na outra ponta no lado do Arduino o outro módulo é configurado como "receptor". Esta configuração é apenas no Hardware, ou seja, apenas com as ligações adequadas (no código nada precisa ser feito). Na figura a seguir mostro essa implementação:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237087477?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237087477?profile=RESIZE_710x" class="align-center"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Observar, que a alimentação ainda está sendo enviada pela extensão do cabo, e por isso há o mesmo <strong><em>circuito de filtragem</em></strong> mostrado anteriormente (agora de uma forma mais "realística" com a imagem dos componentes). Para o cabo, uma boa opção é usar <strong><em>cabo de rede</em></strong> "<strong><em>CAT5</em></strong>", devido à grande disponibilidade no mercado e ao seu baixo custo. Neste caso, observar que para a <strong><em>transmissão do sinal do Sensor</em></strong>, devem ser usados dois fios que constituem um "<strong><em>par-trançado</em></strong>", mostrados na figura como um fio de cor "<em>verde</em>" e "<em>verde-branco</em>". Observar também as ligações desse "<strong><em>par-trançado</em></strong>" aos <strong><em>módulos RS-485</em></strong>: note que o <strong><em>sinal</em></strong> "<strong>A</strong>" de um módulo vai ao <strong><em>sinal</em></strong> "<strong>A</strong>" do outro, o mesmo se aplicando para o <strong><em>sinal</em></strong> "<strong>B</strong>".</span></p>
<p><span style="font-size: 12pt;"> Nesta configuração "<strong>A <==> A</strong>" e "<strong>B <==> B</strong>", a <strong><em>lógica de acionamento</em></strong> do <strong><em>Sensor de Proximidade</em></strong> é mantida, ou seja, quando um objeto é detectado e o <strong><em>sinal de saída</em></strong> do <strong><em>Sensor</em></strong> vai a "<strong><em>LOW</em></strong>", isto também ocorre no sinal que chega ao <strong><em>pino</em></strong> do <strong><em>Arduino</em></strong>. Caso se deseje inverter esta lógica (ou seja, para que quando acionado o Sensor o sinal no pino do Arduino seja "<strong><em>HIGH</em></strong>"), basta trocar a ligação do "par-trançado" fazendo "<strong>A <==> B</strong>" e "<strong>B <==> A</strong>".</span></p>
<p><span style="font-size: 12pt;"> Notar que as ligações aos <strong><em>módulos RS-485</em></strong> são muito simples, mas devem ser feitas com atenção para evitar erros. Para a alimentação, na figura é mostrado o uso dos fios de cor "<em>laranja</em>" (para o <strong><em>5V</em></strong>) e "<em>marrom</em>" (para o <strong><em>GND</em></strong>) do cabo "<strong><em>CAT5</em></strong>", mas pode-se usar qualquer outro "<strong><em>par-trançado</em></strong>" disponível no cabo (com isso aumenta-se a imunidade a ruídos na alimentação, principalmente no lado do próprio Arduino), apenas tomando-se o cuidado para não trocar <strong><em>5V</em></strong> com <strong><em>GND</em></strong> em cada ponta do cabo.</span></p>
<p><span style="font-size: 12pt;"> O <strong><em>Resistor</em></strong> do <strong><em>Filtro da Alimentação</em></strong> no lado do Sensor, foi reduzido para <strong><em>10 Ω</em></strong>, pois o uso está previsto para cabos com grandes extensões.</span></p>
<p><span style="font-size: 12pt;"> No lado do <strong><em>Arduino</em></strong>, o <strong><em>Driver</em></strong> com <strong><em>Transistor</em></strong> que havia antes, foi substituído pelo <strong><em>Módulo RS-485</em></strong> "<strong><em>receptor</em></strong>". Na saída desse módulo (o <strong><em>sinal</em></strong> "<strong>RO</strong>"), apenas um simples <strong><em>Filtro de Sinal</em></strong> é necessário, composto de dois Resistores e um Capacitor. Este filtro é o mesmo usado no post inicial. Mas neste caso, aumentei para <strong><em>1 kΩ</em></strong> o <strong><em>Resistor</em></strong> que vai ao <strong><em>pino de Entrada Digital do Arduino</em></strong>, e com isso eliminei o Diodo "BAT85" que havia anteriormente, simplificando o circuito. Dessa forma, o mesmo circuito pode ser usado tanto para o <em>Arduino</em> convencional a <strong><em>5V</em></strong> (<strong><em>UNO</em></strong>, <strong><em>Mega</em></strong>, etc), como para <em>Arduinos</em> com <em>Processador</em> alimentado a <strong><em>3.3V</em></strong> (como <strong><em>ESP8266</em></strong>, <strong><em>ESP32</em></strong>, <strong><em>Due</em></strong>, <strong><em>STM32</em></strong>, etc). Importante: o <strong><em>Capacitor</em></strong> do <strong><em>Filtro de Sinal</em></strong> deve ser <strong><em><u>obrigatoriamente</u></em></strong> do tipo "<strong><em>Cerâmico</em></strong>".</span></p>
<p><span style="font-size: 12pt;"> Qualquer dúvida sobre esta Implementação com <strong><em>Módulos RS-485</em></strong>, não deixe de perguntar.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Como de costume, quando possível implemento também uma simulação, o que permite que aqueles que não tem o Hardware em mãos, possam testar, fazer experimentações, e aprender com isso. O arquivo para simulação no <strong><em>Proteus</em></strong> está anexado no final do post.</span></p>
<p><span style="font-size: 12pt;"> Mas como no <strong><em>Proteus</em></strong> não há modelo para o <strong><em>ESP8266</em></strong>, fiz a simulação usando um <strong><em>Arduino UNO</em></strong>, mas o código foi escrito de forma que possa ser também usado no <strong><em>ESP8266</em></strong> e em outros Arduinos.</span></p>
<p><span style="font-size: 12pt;"> Para a simulação, utilizei o mesmo circuito com <strong><em>Driver a Transistor</em></strong> que publiquei no post inicial. Já para o <strong><em>Sensor de Proximidade E18-D80NK</em></strong>, utilizei um circuito que gera de forma cíclica o sinal de objeto detectado. Conectei o <strong><em>Display LCD 20x4</em></strong> usando a <strong><em>interface paralela</em></strong>, devido à grande lentidão da simulação da <strong><em>Interface I2C</em></strong> (no final do post falo mais sobre isso). Por isso, no código é possível selecionar qual a Interface será usada com o LCD (<strong><em>paralela</em></strong> ou <strong><em>I2C</em></strong>), sendo esta seleção muito simples (mostro mais adiante). O circuito usado na simulação é mostrado na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><em> <strong>(clique na figura para "zoom")</strong></em></span></p>
<p><span style="font-size: 12pt;"><a href="https://storage.ning.com/topology/rest/1.0/file/get/8237100654?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237100654?profile=RESIZE_710x" class="align-center"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> Na simulação (e no código), algumas informações são "printadas" na <strong><em>Serial do Arduino</em></strong>, e portanto podem ser vistas no <strong><em>Terminal do Arduino</em></strong> no PC. Caso isso não seja desejado, basta comentar as linhas no código referentes a esta "printagem" (o que será mais fácil de fazer no "<em><strong>loop</strong></em>" do <em><strong>Arduino</strong></em>, como pode ser notado mais no final do post).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Notar que a <em>saída</em> <em>do</em> <em>circuito equivalente ao Sensor</em>, é do tipo "<strong><em>Open Collector</em></strong>" (via <strong><em>Transistor</em></strong> "<strong>Q50</strong>"), pois o sensor real <strong><em>E18-D80NK</em></strong> tem uma saída deste tipo.</span></p>
<p><span style="font-size: 12pt;"> E junto ao <em>circuito equivalente ao Sensor de Proximidade</em>, há um <strong><em>contador</em></strong> (o "<strong><em>COUNT1</em></strong>"), o qual conta todos os pulsos ali gerados. Isto nos permite comparar o valor mostrado nesse <strong><em>Contador</em></strong>, com o valor de contagem de objetos mostrado no <strong><em>Display LCD</em></strong>. Neste circuito do Sensor, há também a chave "<strong>SW1</strong>", que atua como se fosse um "liga/desliga" da <strong><em>esteira</em></strong> que transporta os objetos (ou "peças") a serem contados. Uma coisa a lembrar, é que quando o Sistema inicia (após ser ligado ou após um Reset), uma mensagem inicial é exibida no LCD por 2 segundos, e se a chave "<strong>SW1</strong>" já estiver fechada, o contador "<strong><em>COUNT1</em></strong>" iniciará a contagem antes do código executando no Arduino, sendo isso algo equivalente a ligar a esteira 2 segundos antes do Arduino iniciar a contagem de objetos.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Há também um circuito para "<em>emular</em>" uma <strong><em>interferência</em></strong> (ou perturbação) no <strong><em>sinal do Sensor de Proximidade</em></strong>. Neste circuito, ao pressionarmos o <strong><em>Botão</em></strong> de nome "<strong><em>Interferência</em></strong>", será gerada uma forte perturbação no <strong><em>sinal do Sensor</em></strong>, o que nos permite verificar a imunidade do Sistema, já que a perturbação não afeta o <strong><em>contador</em></strong> "<strong><em>COUNT1</em></strong>" (então por comparação podemos verificar visualmente a integridade da contagem no Arduino).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> A figura a seguir, mostra o resultado da simulação após cerca de 1 minuto dela ter sido iniciada (fechei a chave "<strong>SW1</strong>" logo que a mensagem "<strong><em>iniciou o Monitoramento!</em></strong>" apareceu no <strong><em>Terminal do Arduino</em></strong>):</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237109878?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237109878?profile=RESIZE_710x" class="align-center"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span><span style="font-size: 12pt;"> No <strong><em>Osciloscópio virtual</em></strong>, podemos ver dois sinais: em "<em>amarelo</em>" é o <strong><em>sinal de saída do Sensor de Proximidade</em></strong>, e em "<em>azul</em>" o <strong><em>sinal na saída do circuito Driver+Filtro</em></strong> que vai ao <strong><em>pino de Entrada Digital</em></strong> "<strong>3</strong>" do <strong>UNO</strong>. Notar que estes sinais são complementares (conforme já dito no post inicial que fiz neste tópico).</span></p>
<p><span style="font-size: 12pt;"> Pelos sinais no <strong><em>Osciloscópio virtual</em></strong>, é possível ver que cada objeto fica "<em>na frente</em>" do Sensor por cerca de <strong><em>100 ms</em></strong> (<strong><em>0,1 segundo</em></strong>). E a <strong><em>taxa de objetos</em></strong> (ou seja, a velocidade que os objetos passam na frente do Sensor), está em <strong><em>1 objeto por segundo</em></strong>. Na simulação, estas duas características estão definidas no <strong><em>gerador de sinal</em></strong> usado no circuito que equivale ao Sensor (sendo possível alterar as mesmas nas propriedades desse gerador). Conforme explico mais adiante, o conhecimento do <strong><em>tempo mínimo</em></strong> que os objetos ficam "na frente" do sensor, e o conhecimento da <strong><em>taxa máxima</em></strong> de objetos por segundo, é fundamental para o funcionamento correto do mecanismo que permite aumentar a imunidade da detecção dos objetos em relação a perturbações no sinal do Sensor.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Alguns segundos após a captura do resultado da simulação mostrado na figura anterior, acionei repetidas vezes o <strong><em>Botão</em></strong> de "<strong><em>Interferência</em></strong>", para gerar uma perturbação no <strong><em>sinal do Sensor de Proximidade</em></strong>. O resultado disso pode ser visto na figura a seguir, notadamente no <strong><em>Osciloscópio virtual</em></strong>:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"> <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/8237124296?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237124296?profile=RESIZE_710x" class="align-center" width="1148" height="520"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Dois pontos chamam a atenção na figura. Primeiro, a contagem no LCD continua igual à contagem mostrada no <strong><em>contador</em></strong> "<strong><em>COUNT1</em></strong>", mostrando que nenhuma contagem deixou de ser computada. Segundo, o <strong><em>sinal do Sensor</em></strong> em "<em>amarelo</em>" no Osciloscópio, mostra as interferências geradas, enquanto que em "<em>azul</em>" o sinal presente na <strong><em>Entrada Digital do Arduino</em></strong> tem alguns mínimos ruídos mas mantém o "<em>shape</em>" característico do sinal original. O "grosso" da perturbação foi removido pelo <strong><em>Filtro de Sinal</em></strong> composto por <strong>R5</strong> e <strong>C4</strong> no circuito. No entanto, mesmo que ruídos de grande amplitude ainda estivessem presentes no sinal "<em>azul</em>", ainda assim o código conseguiria ignorá-los, devido ao mecanismo implementado para identificar o <strong><em>sinal de detecção de objetos</em></strong> vindo do <strong><em>Sensor de Proximidade</em></strong>. Uma forma de comprovar isso, é remover o <strong><em>Filtro de Sinal</em></strong> (<em>curto-circuitar</em> R5 e <em>desconectar</em> C4) e abrir a <em>chave</em> "<em>SW1</em>", e então acionar o <strong><em>Botão</em></strong> "<strong><em>Interferência</em></strong>" de forma intermitente ou contínua, e verificar que nenhum objeto é contado. Claro que eu fiz isso e comprovei, mas ao invés de postar uma figura mostrando isso aqui, acho interessante que cada um faça a experiência.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Agora falando sobre o código. As funções implementadas são extremamente simples (se vc achar que não, pode ter certeza: sua visão e seus pensamentos estão te enganando), e praticamente não há muito o que dizer sobre elas. O código também está documentado com comentários funcionais, e qualquer um que entenda um mínimo de programação (mas entenda mesmo, sem enganação que alguns insistem em praticar) irá também entender o funcionamento com relativa facilidade.</span></p>
<p><span style="font-size: 12pt;"> Assim inicio a seguir, a descrição das configurações mais significativas das funcionalidades no código.</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> A figura a seguir, mostra a especificação do <strong><em>pino do Arduino</em></strong> a ser usado para a leitura do <strong><em>sinal do Sensor de Proximidade</em></strong>, e que portanto será configurado como uma <strong><em>Entrada Digital</em></strong>:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><strong><em>(clique na figura para "zoom")</em></strong></span><span style="font-size: 12pt;"> <a href="https://storage.ning.com/topology/rest/1.0/file/get/8237143667?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237143667?profile=RESIZE_710x" width="550" height="124"/></a></span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Na simulação foi usado um <strong><em>Arduino UNO</em></strong>, e o pino usado está definido como sendo o "3". Mas qualquer outro pino disponível pode ser usado. Mas é melhor evitar pinos usados para a Serial "padrão" do Arduino, pelos motivos que apresentei em post anterior neste tópico. E pinos usados para o "<strong><em>LED_BUILTIN</em></strong>" (no UNO é o pino "13"), também devem ser evitados, uma vez que no "boot" são configurados como saídas digitais (mas esse problema pode ser desconsiderado se no pino for usado o circuito com <strong><em>Filtro de Sinal</em></strong> mostrado anteriormente).</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Também é preciso especificar qual o <strong><em>Nível Lógico</em></strong> presente no pino, quando um objeto é detectado pelo <strong><em>Sensor</em></strong>. Quando um objeto está "na frente" do <strong><em>Sensor</em></strong> <strong><em>E18-D80NK</em></strong>, o <strong><em>Nível Lógico</em></strong> presente na saída deste é "<strong><em>LOW</em></strong>". Mas observar que estamos falando do <strong><em>Nível Lógico</em></strong> <strong><em>presente no pino do Arduino</em></strong>, e portanto o Nível a ser especificado no código irá depender dos circuitos existentes entre a <strong><em>saída do Sensor</em></strong> e o <strong><em>pino do Arduino</em></strong>. No caso do circuito com <strong><em>Driver+Filtro</em></strong> mostrado na área em "<em>azul claro</em>" da primeira figura neste post (e também usado na simulação), o <strong><em>Nível Lógico</em></strong> será "<strong><em>HIGH</em></strong>" pois o circuito do Driver <strong><em>inverte</em></strong> o sinal vindo do Sensor, e esta especificação pode ser vista na figura a seguir:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237145257?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237145257?profile=RESIZE_710x" class="align-center" width="607" height="128"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Caso seja usado o circuito mostrado no início do post com <strong><em>módulos RS-485</em></strong>, então o <strong><em>Nível Lógico</em></strong> a ser especificado é "<strong><em>LOW</em></strong>", pois aquele circuito <strong><em>não inverte</em></strong> o sinal vindo do Sensor. E claro: se o sinal do Sensor for conectado diretamente ao pino do Arduino, o <em>Nível</em> <em>Lógico</em> a ser especificado também será "<em>LOW</em>".</span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Ainda sobre o pino usado para a leitura do Sensor, este pino só deve ser configurado como "<strong><em>Pullup</em></strong>" <strong><em><u>se</u></em></strong> o Sensor estiver conectado diretamente ao respectivo pino do Arduino. E como a <strong><em>saída do Sensor</em></strong> é do tipo "<strong><em>Open Collector</em></strong>", mesmo que em alguns Processadores (<strong><em>ESP8266</em></strong>, <strong><em>ESP32</em></strong>, etc) exista a opção de ligar um "<strong><em>Pulldown</em></strong>", <em><u>isto não tem sentido.<strong>e</strong> não deve ser feito</u></em>.</span></p>
<p><span style="font-size: 12pt;"> Mas se forem ligados os circuitos mostrados anteriormente neste post, que terminam com o <strong><em>Filtro de Sinal</em></strong>, então o pino deve ser configurado obrigatoriamente com "<strong>INPUT</strong>". Isto porque um <strong><em>Resistor de Pullup</em></strong> "<em>pendurado</em>" ali, irá alterar o funcionamento do Filtro, principalmente em termos da tensão presente no pino, o que impossibilitará detectar corretamente o sinal do <strong><em>Sensor de Proximidade</em></strong>.</span></p>
<p><span style="font-size: 12pt;"> Esta configuração pode ser vista na figura a seguir, onde o pino é configurado apenas como "<strong>INPUT</strong>", uma vez que o <strong><em>Filtro de Sinal</em></strong> está presente no circuito:</span></p>
<p style="text-align: center;"><span style="font-size: 10pt;"><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/8237147097?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8237147097?profile=RESIZE_710x" class="align-center" width="469" height="208"/></a> </span></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 12pt;"> Na figura anterior, é mostrada a <strong><em>função</em></strong> que configura o pino, neste caso como "<strong><em>INPUT</em></strong>", ressaltado na cor "<em>verde claro</em>" na figura. Mas se o <strong><em>Sensor</em></strong> for conectado <strong><em>diretamente ao pino do Arduino</em></strong>, então deve-se mudar a configuração para "<strong><em>INPUT_PULLUP</em></strong>".</span></p>
<p></p>
<p><span style="font-size: 12pt;"> </span></p>
<p><span style="font-size: 14pt;"><span style="text-decoration: underline;"><em><strong>Nota</strong></em></span>: <em>a página do post não comporta o restante do texto, então estou continuando logo a seguir</em>:</span></p>
<p></p>
<p></p> Bom dia Elcids, entendi perfe…tag:labdegaragem.com,2020-11-25:6223006:Comment:7950402020-11-25T11:12:05.471ZRENAN DA MAIAhttps://labdegaragem.com/profile/RENANDAMAIA
<p>Bom dia Elcids, entendi perfeitamente. </p>
<p>Posso deixar de utilizar a GPIO03 e utilizar a D10 ou D11, tanto faz. Pois utilizo a D2 para acionar um relé e do D3 ao D9 um teclado matricial 3x4.</p>
<p>A quantidade de peças por minuto depende da máquina, nas que estou tendo problemas por interferência passam entre 3 e 10 peças por minuto e tempo de permanência da peça em baixo do sensor varia de 2500 a 3500 ms.</p>
<p>Segue foto do esquema de ligação. </p>
<p>Nesta imagem o IR esta ligado…</p>
<p>Bom dia Elcids, entendi perfeitamente. </p>
<p>Posso deixar de utilizar a GPIO03 e utilizar a D10 ou D11, tanto faz. Pois utilizo a D2 para acionar um relé e do D3 ao D9 um teclado matricial 3x4.</p>
<p>A quantidade de peças por minuto depende da máquina, nas que estou tendo problemas por interferência passam entre 3 e 10 peças por minuto e tempo de permanência da peça em baixo do sensor varia de 2500 a 3500 ms.</p>
<p>Segue foto do esquema de ligação. </p>
<p>Nesta imagem o IR esta ligado no D11.</p>
<p><a href="https://storage.ning.com/topology/rest/1.0/file/get/8214051889?profile=original" target="_blank" rel="noopener"><img src="https://storage.ning.com/topology/rest/1.0/file/get/8214051889?profile=RESIZE_710x" width="700" class="align-center"/></a></p>