Arduino + USB + Interferência, como resolver

Bom, vou explicar o que estou fazendo e depois qual é o problema.
Estou criando um projeto para monitorar temperaturas em uma fabricadora de Gelo, por enquanto tenho 2 LM35 (sim, sensor de temperatura), e um water flow control (hidrômetro), o projeto está indo bem, mas como a fabricadora tem 4 motores tri-fásicos (um deles de 30hp), como o projeto ainda é um experimento, estou alimentando o arduino através da USB de um netbook ACE ONE.
Os problemas que encontro são os seguintes.

  1. As vezes a leitura do LM35 vária bruscamente, as vezes mostrando -11º e dá um pico para 20º (esse é o menor dos problemas), pois no software de monitoramento que desenvolvi, ele elimina valores fora da curva.
  2. A comunicação via USB com o computador simplesmente para, não envia mais nenhum dado para o PC, coloquei um LED na porta digital 2 (quase não dá para enchergar se os LEDs SMD estão acendendo ou não), como o envio dos dados é a cada 1 segundo, então consigo ver que está havendo transmissão de dados do arduino pela serial, mas parece q o chip USB não envia os dados para o PC.
    Alguém tem alguma idéia do que pode ser?

PS. Infelizmente, a unica fonte AC que tenho disponível no local é compartilhanda com todo o painel que controla os motores.

Essa é a imagem do sistema de monitoramento.

Qualquer sinal de comunicação induz interferência em sinais analógicos. Podes tentar trocar o LM35 por um sensor digital e cortas esse problema. Um DS1620 ou 21, faz isso. Ou então um DS18B20, que tem o mesmo footprint do LM e é digital. Isto livrava-te dos problemas de interferência.

No entanto, uma fonte de alimentação é sempre preferível à porta USB. Tu precisas de uma fonte DC e não AC. Até um carregador de telemóvel te fornece a tensão que precisas para o Arduino. Experimenta com uma, mas verifica com um osciloscópio a qualidade da tensão, uma vez que esses carregadores são feitos para funcionar com uma carga relativamente especifica.

Quanto à comunicação parar... implementa um heartbeat no teu código do Arduino. Ou seja, dentro do loop(), coloca um led a piscar. Se quando a comunicação parar, o led também parar, algo está mal com o teu programa dentro do Arduino. Se o LED e o programa continuarem como se nada fosse, experimenta ver no computador.

Como é que lês os dados vindos da porta série no computador? A que velocidade lês os dados do buffer de entrada do computador? Estás a usar a biblioteca de comunicação Java, ou uma linguagem tipo C ou Visual Basic?

Eu li algures que a biblioteca de comunicação java introduz um delay na leitura da porta série. Isso faz com que o buffer encha ao fim de algum tempo dependendo da velocidade a que envias dados. E claro, qual a quantidade de dados que envias...

ok, obrigado bubulindo.
Eu já coloquei um led entre o pino de TX serial do duelmilaenove (com resistor 220R), este continua a piscar a cada 1s que quando os dados são enviados, a comunicação parece q para entre o chip USB e o computador, hoje vou colocar um display 16x2 para poder continuar monitorando.
Sobre a fonte AC eu me referia a fonte onde eu posso ligar o cabo AC do computador e posteriormente onde vou ter que ligar a fonte do circuito quando o projeto estiver terminado.
Outra coisa que percebi, que tenho também um clic02 da WEG que se comunica via serial RS232 com o PC, e utilizo um cabo serial <-> USB e outro dia ocorreu o mesmo problema, deu falha de comunicação.

Eu diria que o problema está então no lado do computador com o USB. Que driver USB estás a usar?

O chip USB só envia para o computador se o computador estiver a ouvir. Daí o problema que podes estar a ter.

Mas no final do projecto, a placa vai ser alimentada com uma fonte, certo?

O teu software no computador pode fechar a porta USB e reabri-la automaticamente? Já verificaste se a recepção é feita de segundo a segundo no computador? Para ver se existe um stress no buffer de entrada.

Lembra-te que se o computador reabrir a porta, pode fazer reset ao Arduino e deitar o controlo por água abaixo.

O programa funciona normal, pois fiz os testes de leitura de temp negativas em casa com minha geladeira/freezer, e funcionou durante uma horas, mas quando estou na fábrica, o arduino para de enviar os dados aleatóriamente (não consegui determinar o que faz ele parar).
Não adianta abrir ou fechar a porta de comunicação, mesmo depois de ter travado, e o botão de reset do arduino também não tem efeito, somente desligando da USB, e abrindo novamente a porta serial ele passa a receber dados, fiz o teste com o hiperterminal e também não recebe dados.
Amanhã 16/12 vou tentar usando uma fonte externa 12V.

Será que se usar um estabilizador pro seu Note, n iria ajudar? So uma idéia q me passou aqui.

abs

Já estou usando um estabilizador antes do notebook, trarei outro notebook para testar também.
Vou tentar algum modo de resetar o USB por software, ai se passar mais que 5 segundos sem receber informações eu reseto.

Por enquanto não é critico o problema, somente preciso ter certeza que não travou o arduino, pois o projeto vai se estender para substituir o PLC clic02, e controlar a fabricação de gelo através dos sensores de temperatura, pressão e de consumo de água da máquina, porque percebi que uma diferença de 5 graus na temperatura ambiente afeta demasiadamente a produtividade da fabricadora de gelo.
Estou pensando em usar um ATM para fazer a monitoria comunicando via USB com um PC que receberia as informações de outro ATM que rodaria o programa de controle da geradora de gelo, assim eu reseto apenas um dos ATM e não afetaria o controle.

O estabilizador para o netbook não vai resolver problemas que tenhas com a alimentação USB.

É muito difícil implementar o que tens agora num computador velho que tenha uma porta série? Porque o protocolo USB não é propriamente feito para portas série e é mais uma camada de complicação no que toca ao hardware e ao software enquanto que uma porta série nativa não tem nenhum desses problemas. É só uma ideia...

Para saberes se não travou o Arduino, coloca um LEDzinho a piscar ou um LED que liga quando o Arduino é resetado e carregando num botão volta a 0. Assim podes deixar durante algum tempo e vês se o programa fez um reset.

Substituir um PLC com um Arduino é correr um risco grande. Como não foste tu que criaste as bibliotecas... então, sabes que funciona, mas nunca sabes exactamente como ou o que pode correr mal com elas. E muitas vezes as bibliotecas não são a melhor implementação possível. Por exemplo, a comunicação série é seriamente limitante para qualquer tipo de controlo que necessite de transmissão de dados. O mesmo se passa com as saídas digitais... ou entradas analógicas. Mas tudo isso é possível de fazer bypass se quiseres.

Já pensaste em usar uma ligação ethernet? Pelo que leio o chip Ethernet também bloqueia, mas é possível incluir no programa uma função que se não receber uma ligação Ethernet, ele faz reset ao chip e o computador tem de tentar fazer a ligação de novo.

Ter outro chip só para a comunicação é um desperdício, não resolve verdadeiramente o teu problema e adiciona mais um ponto onde podes ter problemas com o sistema.

Quando estiver terminado, vou colocar uma placa PCI com conexão serial no PC, se isso resolver o problema é ótimo.
A parte da comunicação serial, não é essencial, pois todas as regras estarão no ATM, é apenas para mostrar como anda a produção, vou implementar no projeto 4 botões para configurações bastante essenciais.
Em vez de colocar um LED eu coloquei um Display 16x2 para mostrar as informações básicas, assim, saberei se travou a USB ou não.
A substituição é necessária, pois meu PLC tem apenas 4 reles, e se fosse pegar um PLC com a quantidade de reles que preciso, gastaria muito mais, não vou utilizar bibliotecas exóticas, apenas comparação entre valores e dois ou três timers que criarei no sketch.
Na verdade meu projeto vai ser bastante simples, pois não vou precisar nem de 16Mhz, vou utilizar o esquema mais simples para utilizar o ATM, sem cristal (ressonador). Pois tudo acontece em questão de minutos, nada que demande grande processamento ou rapidez, então outro ATM e alguns componentes, não vai impactar.

Eu pensava que fosses usar uma libraria PID... mas realmente para controlo de temperatura com tempos de estabilização na ordem dos minutos, não é preciso tanto.

Garante que algo está a mudar no display... talvez um pontinho ou um cursor...

É claro que é possível trocar um plc por um microcontrolador... eu apenas quis apontar que é preciso ter mais cuidado com o código e adicionar algumas seguranças no caso de bloquear a execução do programa, fazer um reset ou isso. Talvez um watchdog?

Depois de colocares uma porta série acho que não vais ter problemas. :slight_smile:

Vais montar uma placa propositadamente para isto? Ou vais aproveitar um arduino?

Vou fazer uma placa mesmo.
Vai ter q ter muitos componentes, vou implementar uns 10 reles (deixando expansível), e utilizar um ATM sem cristal, colocar o MAX232, um lcd 16x2, Botões (Ok, Cancel, cima, baixo, direira, esquerda), todos em um módulo separado.
Umas 5 entradas para controle com tensão 110v/220v (o motor de 30hp usa uma softstarter que monitora a pressão de óleo e pressão da máquina), então esse equipamento vai ficar em paralelo ao PLC ATM, para mais segurança, pois para qualquer situação ele controla a parada do motor.

Interessante...

Se quiseres evitar os condensadores no RS232, procura por DS275. Não é simples de encontrar, mas facilita imenso o desenho da placa. :wink:

Bom, coloquei o LCD para monitorar o "estado" do arduino, e continuou funcionando normal, quando tentei mandar uma modificação para ele, a COM esta indisponível, então suponho que alguma interferência realmente travava o chip RS-232 - USB.
Estou usando o adaptador de energia do IPHONE para alimentar via USB por enquanto.

Alguém sabe onde posso comprar no brasil esse acoplador óptico PS2505L?
Que agora vou ter que colocar o PLC arduino em paralelo ao PLC e todas as entradas para o PLC são 220V
Vou montar esse circuito, mas o essencial é esse optoisolador PS2505L
Esse é o tópico no forum que encontrei para usa-lo.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235146158/2

Interessante esse acoplador...

http://sistemacomponentes.com.br/lista.asp?page=38&grupo=2

http://www.mastercomponentes.com.br/loja/produtos_descricao.asp?codigo_produto=915

Agradeço muito, a parte do acoplador, era a que estava mais me preocupando, pois sem ela não poderia deixar o PLC clic02 como backup do projeto.

Bom, hoje montei o circuito com o PS2505 (não tá bonito, pois era para se estoura-se não estragar muita coisa).
Em 110V ele foi beleza, mas quando taquei no 220V torrou os resistores, eles são de 1/8W.
Mas estava vendo que isso é basicamente uma "fonte sem trafo", será que torrou os resistores porque o capacitor é para 250V e não para 400V?
O circuito continuou funcionando, mas não é para fazer churrasco de resistor...
Comprei os resistores de 1W mas acho que isso não é a forma correta de evitar isso.
Se alguêm puder ajudar.

Tens o esquema desta montagem?

Talvez resistências de valor maior? Mantendo a mesma razão entre elas, claro.

Eu ja aumentei, coloquei 2 resistores de 1M para conseguir os 2M em paralelo ao capacitor.
Bom, vou tentar um capacitor um pouco maior 1uF por 400V e ver se não torra, pois mesmo em 110V o resistor de 1M esquentou bem.