×
Ir ao conteúdo
  • Cadastre-se

toigogustavo

Membro Pleno
  • Posts

    36
  • Cadastrado em

  • Última visita

Tudo que toigogustavo postou

  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
  15. Barracuda é a família... mas em fim... Eu testaria antes de fazer qualquer procedimento (possivelmente irreversível) em outro computador, ou mesmo com um case USB... Eu particularmente nunca gostei muito destes testes SMART, já fui enganado algumas vezes, tenho a impressão de que o fabricante (Seagate principalmente) não implementa o sistema SMART de maneira eficiente em todos os modelos de seus discos. Caso não consiga por nenhum meio "simples" solucionar sugiro enviar para uma empresa de recuperação de dados (caso os dados do disco sejam relevantes). Caso contrario não se aventure muito, pois pode piorar a situação e subir o preço da recuperação kkkkk
  16. Olha... Acredito que o seu disco esta com problema de firmware... Qual é o modelo e marca deste HD? Consegue tirar uma foto dele?
  17. O amigo @ederlap está corretíssimo, inclusive em alguns discos (Seagate) por exemplo tranca o disco via firmware quando um numero máximo de setores realocados "estoura um vetor". Não é indicado utilizar este disco!
  18. @souza006, a fonte atualmente no computador está mandando a corrente necessária? Não está com defeito? Verifique se os conectores da fonte do HD estão com defeito, oscilam na conexão...
  19. Só por desencargo vou perguntar... o disco 2 é de 500GB, você não poderia ter trocado os cabos sata em algum momento e está confundindo os disco? Ja vi disto acontecer... Mas perdoe se não for o caso. 😀
  20. Não entendi sua pergunta, explique melhor...
  21. Amigo, Eu suspeitaria do novo SSD estar com defeito. Tente verificar na BIOS se existe alguma configuração para ativar este slot. Caso não tenha troque de slot com o SSD atual e veja se o mesmo é reconhecido pela BIOS, se não for reconhecido, é problema no SSD novo. Em ultimo caso, existem adaptadores de SSD M2 para USB, mas aí voce vai ter que gastar para fazer um teste apenas.
  22. Exato, uma vez na universidade fiz uma análise de desempenho, e a diferença era em torno de 30% na velocidade considerando discos com tecnologias "proximas". Outra questão MUITO importante no quesito desempenho de um disco é o quão cheio o mesmo está. A informação nos HDs começam a serem escritas de fora para dentro na superfície do disco. Ou seja, na extremidade do disco a velocidade linear (cm/s) é maior que na parte mais central do disco. Porém a velocidade angular é a mesma (rpm). Isto nos leva a concluir que quando o disco está cheio (escreveu na parte mais interna do raio do disco) então a taxa de transferência/leitura de dados será menor também para informações nestas áreas. Basicamente um disco limpo tem mais de 50% de ganho do que o mesmo disco cheio.
  23. Neste kit que esta no link caso seu HD antigo seja no padrão IDE, ainda assim poderá conectar normalmente pelo conversor IDE -> USB, caso seja no padrão SATA também. Fique atento na conexão do cabo de força, basicamente não tem como errar na conexão pois os conectores encaixam apenas de uma maneira. O kit conta com uma fonte de alimentação individual apenas para o HD que desejas salvar os dados. Poste foto dos hds aqui e assim posso te ajudar melhor.
  24. Opa! Não chega a ser um projeto aeroespacial, é um sistema de controle um pouco mais simples 😁. Boa dica, vou manter o projeto como estava então. Obrigado pela dica!

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

Como ganhar dinheiro montando computadores!

MINICURSO GRÁTIS!

Como ganhar dinheiro montando computadores!

CLIQUE AQUI E INSCREVA-SE AGORA MESMO!