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.
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.
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.
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.
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.
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.
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.
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.
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.