×
Ir ao conteúdo
  • Cadastre-se

toigogustavo

Membro Pleno
  • Posts

    36
  • Cadastrado em

  • Última visita

  • Qualificações

    0%
  1. Olá pessoal, Estou com um pequeno problema com o Arduino, na verdade já tinha notado este comportamento antes, mas nunca foi muito prejudicial, até eu precisar lidar com um sistema mais critico. Estou fazendo um sistema para ligar e desligar computadores a partir de um servidor, onde neste servidor terá um programa em C# comunicando via porta serial com o Arduino e este envia sinais (digitais) para um módulo de reles com as saídas conectadas nas conexões ON/OFF de cada computador. Até então está tudo funcionando, porém caso eu desconecte a força do Arduino (acidentalmente por exemplo) ou desligue e ligue este servidor (que irá desligar e ligar o Arduino também), caso isto ocorra ao religar o Arduino antes do programa gravado nele iniciar, as portas digitais do Arduino fazem uma comutação ao reiniciar o arduino. Isto gera um grave problema, pois a ideia é que isto somente ocorra quando um usuário ordene pelo software de controle. Alguém sabe por qual motivo esta comutação ao iniciar o arduino ocorre? Ou alguma maneira de mitigar isto? Caso precise de mais informações a respeito posso enviar um diagrama (não tenho em mãos no momento) Agradecido
  2. @aphawk Boa ideia, vou fazer um tutorial aqui, melhorar o código antes para deixar mais modular, ainda está no rabisco hehehe... Assim que fizer posto aqui e talvez crie um tópico de tutorial
  3. Pois é, porém parece que nao fui o unico com este problema, o colega neste forum tambem teve exatamente o mesmo problema: https://forum.arduino.cc/index.php?topic=243721.0 Mas em fim, resolvido!
  4. @Isadora Ferraz, parece que desta vez resolvi com software mesmo hehehe Por curiosidade fui pesquisar sobre o tipo "volatile" na referencia do arduino, no seguinte link: https://www.arduino.cc/reference/pt/language/variables/variable-scope-qualifiers/volatile/ onde é recomendado que use breakpoints para evitar que a interrupção ocorra em determinado trexo do código, pois bem... Inseri "noInterrupts()" ...código... "interrupts()" isto fez com que a interrupção não fosse chamada neste intervalo de operação, dando assim prioridade para esta operação, em resumo o valor da variavel global consultada pela funcao de interrupção agora esta sendo atualizado de forma correta em todos os ciclos, nao gerando mais problemas. O PID funcionou perfeitamente, chega a zerar o erro bem rapidamente, ainda tem um problema de precisao por conta dos tipos de variaveis, mas isto é outra historia. modifiquei o código da seguinte forma: void loop() { original = analogRead(PINO_LM35); //LE O VALOR DO SENSOR DE TEMPERATURA (0-1023) filtrado = MovingAverage(); //CALCULA A TEMPERATURA FILTRADA temp = (float(filtrado)*5/(1023))/0.01; //TRANSOFORMA VALOR PARA TEMPERATURA (0-100) temp2 = (float(original)*5/(1023))/0.01; error = SetPoint - temp; //CALCULA O ERRO DO CICLO float deltaTime = (millis() - lastProcess) / 1000.0; //CALCULA O VALOR DO DELTA DE TEMPO E CONVERTE PRA SEGUNDOS lastProcess = millis(); //ARMAZENA O VALOR DO INSTANTE P = error*kP; //CALCULA O VALOR DE P I = I + (error*kI) * deltaTime; //CALCULA O VALOR DE I D = (lastRPM - temp)*kD*deltaTime; //CALCULA O VALOR DE D lastRPM = temp; PID = P + I + D; //SOMA PID noInterrupts(); lumm = map(PID, -10000, 10000, 0, 85); //lumm = PID*(85/4); //lum = PID; if(lumm < 4){ lum = 4; }else{ lum = lumm; } noInterrupts(); if(lum > 85) lum = 85; interrupts(); Serial.print(lum); Serial.print(" "); Serial.print(error); Serial.print(" "); Serial.print(PID); Serial.print(" "); Serial.println(temp); //delay(100); PID = 0; }
  5. HAHAHAHAHAH Bela observação!!! Vou testar suas dicas. thanks
  6. @Isadora Ferraz Ontem fiz testes isoladamente, desativei a interrupção e mantive apenas a parte de PID ativa, e monitorei o sinal de controle da variável "PID" do código, para minha surpresta o sinal respondia conforme esperado, o sinal de controle aumenta na medida que a temperatura sobe, e reduz caso a temperatura aumente... Isto me leva a conclusao de que o problema está na interrupção da função ZeroCrossing() quando operada em conjunto com o PID. A partir deste ponto não fiz mais testes... porém é bem estranho a interrupção falhar isto ainda está fora do meu entendimento. adicionado 3 minutos depois Outra observação importante e que colabora com o que citei acima, é que o arduino "destrava" quando o módulo de potencia AC é desligado da rede, acredito eu que isto aconteça devido ao fato de que a interrupcao do código nao é mais chamada, pois nao havendo energia nao há detecção da passagem por zero.
  7. Eai pessoal, Estou montando uma pequena estufa, gostaria de controlar e temperatura da mesma utilizando uma lampada no centro dela, para isto estou usando um módulo de controle de potencia AC, um arduino e um sensor LM35. Vamos ao problema... Inicialmente testei o módulo isoladamente (sem controle) apenas regulando o setpoint por um potenciometro, até aqui ocorreu tudo ok, a luminosidade é regulada perfeitamente, porém a ideia é regular a temperatura e nao a luminosidade, por isso resolvi incluir um controlador PID em um arduino, e aqui começaram os problemas, desenvolvi o código que está abaixo e realmente nao sei o que pode estar ocorrendo, pois o arduino trava com este código a ponto de nem mesmo a serial funcionar mais. Lembrando que ja utilizei este codigo anteriormente para controlar um motor, e funcionou... porém algo esta me escapando. Se alguem puder dar uma segunda opiniao agradeço. Segue código #define PINO_ZC 2 #define PINO_DIM 9 #define PINO_LM35 A0 #define N 20 volatile long lum; double error = 0, lastRPM; double kP = 0.5, kI = 0.5, kD = 0; int controlSignal = 0; double P = 0, //Proporcional I = 0, //integral D = 0, //derivativa PID; //soma P+I+D float SetPoint = 50; //Alterar aqui o setpoint float lastProcess = 0, deltaTime = 0; void ZeroCross(){ if(lum > 100) lum = 100; if(lum < 0) lum = 0; long t1 = 8200 * (100 - lum) / 100; delayMicroseconds(t1); digitalWrite(PINO_DIM, HIGH); delayMicroseconds(6); digitalWrite(PINO_DIM, LOW); } void setup() { pinMode(PINO_DIM, OUTPUT); pinMode(PINO_ZC, INPUT); pinMode(PINO_LM35, INPUT); Serial.begin(9600); attachInterrupt(0, ZeroCross, RISING); } float temp, temp2; int original, filtrado; int numbers[N]; void loop() { original = analogRead(PINO_LM35); //LE O VALOR DO SENSOR DE TEMPERATURA (0-1023) filtrado = MovingAverage(); //CALCULA A TEMPERATURA FILTRADA temp = (float(filtrado)*5/(1023))/0.01; //TRANSOFORMA VALOR PARA TEMPERATURA (0-100) temp2 = (float(original)*5/(1023))/0.01; error = SetPoint - temp2; //CALCULA O ERRO DO CICLO float deltaTime = (millis() - lastProcess) / 1000.0; //CALCULA O VALOR DO DELTA DE TEMPO E CONVERTE PRA SEGUNDOS lastProcess = millis(); //ARMAZENA O VALOR DO INSTANTE P = error*kP; //CALCULA O VALOR DE P I = I + (error*kI) * deltaTime; //CALCULA O VALOR DE I D = (lastRPM - temp2)*kD*deltaTime; //CALCULA O VALOR DE D lastRPM = temp2; PID = P + I + D; //SOMA PID lum = map(PID, 0, 5000, 0, 85); //lum = PID; //Serial.println(temp); //Serial.print(" "); //Serial.println(temp2); Serial.print(lum); Serial.print(" "); Serial.println(temp2); delay(20); } long MovingAverage(){ for(int i = N-1; i > 0; i--) numbers = numbers[i-1]; numbers[0] = original; long acc = 0; for(int i = 0; i < N; i++) acc += numbers; return acc/N; }
  8. Obrigado pelas dicas, na sequencia irei testar.
  9. Muito boa sugestão! Assim que der irei testar este também.
  10. Então, já vi em alguns projetos de comunicação por portas ópticas que era utilizado optos mais rápidos como o 6N137A. E se eu utilizar um ampop não inversor?
  11. Não mencionei antes... Mas a comunicação é USB. Interessante este diagrama... adicionado 4 minutos depois Na realidade seria justamente esta minha dúvida, pois seria exatamente esta ligação a qual temo que não dará um bom resultado. Irei testar mesmo assim.
  12. Ligar em cadeia que você diz seria o arduino "no meio do caminho"? Enviando tudo o que receber?
  13. Boa tarde pessoal, Estou necessitando clonar os dados de uma porta serial entre a comunicação de dois dispositivos, para isto estou utilizando um arduino, onde este através de um "split" em cada Rx e Tx reproduz o mesmo sinal lido na serial nativa (envia para o PC). Porém acredito que o sinal da comunicação entre os dois dispositivos vai ficar muito atenuado em decorrência da corrente drenada pela "ponte". Pensei em utilizar um optoacoplador com um divisor de tensão na entrada ou mesmo um amplificador operacional não inversor, desta maneira não haverá muito consumo de corrente. Gostaria de sugestões
  14. @Loja Play Sérgio Não recomendo abrir o disco caso não tenha condicões de recuperar o mesmo no instante de abertura, eu trabalhei 6 anos em uma empresa de recuperação de dados e 95% dos casos onde os discos chegavam abertos não era mais possivel recuperar, pois muitas vezes o fato de abrir o disco em um ambiente sujo (o correto é abrir em uma sala REALMENTE limpa) causa outros problemas. voce se arriscou muito meu amigo, pois mesmo agora sabendo do problema, nao tera como recuperar por si mesmo, para trocar esta cabeca de leitura tera que ter ferramentas importadas, sem contar as ferramentas de acesso ao firmware caso o dano nao seja apenas fisico (muito comum isto). Boa sorte

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!