Ir ao conteúdo
  • Cadastre-se

Motor DC 12V com transistor e diodo não funciona!!!


Posts recomendados

Fiz um circuito com transistor e diodo para acionar um motor DC 12V através da resposta de um sensor analógico de gás MQ-2. Testei o programa simples abaixo e o motor funcionou bem.

int Pincooler = 8; 
int PinA0 = A0;
 
int leitura_sensor = 30;
void setup() {
  pinMode(PinA0, INPUT); 
  pinMode(Pincooler, OUTPUT); 
  Serial.begin(9600);

}

void loop() {
  int valor_analogico = analogRead(PinA0); 
Serial.print("Leitura: "); 
Serial.println(valor_analogico);
 if (valor_analogico > leitura_sensor){
 Serial.print("Limpando ambiente contaminado\n");
  digitalWrite(Pincooler, HIGH);
 delay(10000); 
 }else{ 
 digitalWrite(Pincooler, LOW);
 }
 delay(100);

}

Quando carreguei outro programa no arduino, com mais linhas de programação, porém com o mesmo princípio de acionamento do motor, ele não funciona. Dá apenas um "click", ou um "passo".

#define PIN_MQ2 (0) 
#define RL (5) 
#define FATOR_AR_LIMPO (9.62) 
                                                     
#define ITERACOES_CALIBRACAO (50)    
#define ITERACOES_LEITURA (5)     

#define PinCooler  (8)

                                                  
                                                    
float CurvaFumaca[3] = {2.3,0.53,-0.44};    
                                          
float Ro = 10; 
int Limiar_Acionamento = 5000;

void setup()
{
  Serial.begin(9600);                             
  Serial.print("Calibrando o sensor MQ2...\n");                
  Ro = Calibracao_Ro(PIN_MQ2);      //calibra o sensor MQ2                                  
  Serial.print("Finalizando a calibracao...\n"); 
  Serial.print("Calibracao concluida...\n"); 
  Serial.print("Valor de Ro=");
  Serial.print(Ro);
  Serial.print("kohm");
  Serial.print("\n");
}

void loop()
{
  
   float PPM = calculaPPMGas(leitura_MQ2(PIN_MQ2)/Ro,CurvaFumaca);    
   Serial.print("Concentracao de Fumaca:"); 
   Serial.print(PPM);
   Serial.print( "ppm    " );
   Serial.println("");
   
   if (PPM > Limiar_Acionamento){
     Serial.print("Ambiente contaminado\n");
     Serial.print("Limpando ambiente contaminado\n");
     digitalWrite(PinCooler, HIGH);
     delay(10000); 
     }else{ 
     digitalWrite(PinCooler, LOW);
     }
   delay(100);
}

float calcularRSArLimpo(int tensao_bits)   //funcao que recebe o tensão (dado cru) e calcula a resistencia efetuada pelo sensor. O sensor e a resistência de carga forma um divisor de tensão. 
{
  return (((float)RL*(1023-tensao_bits)/tensao_bits));
}

float Calibracao_Ro(int mq_pin)   
{
  int i;
  float valor=0;

  for (i=0;i<ITERACOES_CALIBRACAO;i++) {    
    valor += calcularRSArLimpo(analogRead(mq_pin));
    delay(500);
  }
  valor = valor/ITERACOES_CALIBRACAO;        

  valor = valor/FATOR_AR_LIMPO; 
  return valor; 
}

float leitura_MQ2(int mq_pin)
{
  int i;
  float rs=0;

  for (i=0;i<ITERACOES_LEITURA;i++) {
    rs += calcularRSArLimpo(analogRead(mq_pin));
    delay(50);
  }

  rs = rs/ITERACOES_LEITURA;

  return rs;  
}

int  calculaPPMGas(float rs_ro, float *pcurve) 
{
  return (pow(10,( ((log(rs_ro)-pcurve[1])/pcurve[2]) + pcurve[0])));
}

Onde vocês acham que está o erro?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Literalmente vá por partes. Se tens certeza que o problema é o sw e não o hw, vá removendo partes do programa. Também tente avaliar se o mc do seu arduíno tem capacidade pra este processamento. Geralmente [se for] mc de 8 bits "odeia" cálculos complexos e com floats.

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz Que partes eu poderia tirar, sem retirar essas funções e cálculos? diminuir o nome das variáveis e das funções ajudaria?

Eu tenho certeza que não é problema de hardware, porque o circuito funciona com o primeiro programa. Testei os dois programas algumas vezes e quando o primeiro está carregado no microcontrolador, sempre funciona.

Estou usando arduíno uno e o microcontrolador é o ATMega 328P, que tem 8 bits. Que placa de arduíno suportaria meu programa? 

adicionado 5 minutos depois

@BloodCeltics Lopes  Construí um protótipo de exaustor com cano PVC e um cooler de computador(motor DC de 12V), que é brushless, sem escova.

Esse exaustor servirá para "sugar", dissipar o fumaça (fumo) resultante da solda Sn-Pb, usada em placas de circuito. O chumbo é muito prejudicial a nossa saúde.

Sim, você não leu errado, o sensor reage a fumaça também e é ela que estou medindo. No datasheet tem lá a curva de sensibilidade a "smoke".  A fumaça não é inflamável.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Amigo você deve analisar o código e definir o que pode retirar (caso seja a questão apenas de tamanho do cód gerado). Mas o buraco é mais em baixo. Você pode tentar algo como reduzir a otimização do compilador (não me pergunte como fazer isso no arduíno). Em C quando otimiza demais, o cód gerado fica meio perdido.

 

49 minutos atrás, Thalysson Santana disse:

diminuir o nome das variáveis

Sim. Mas entenda que não o NOME literal. O que você deve fazer é "diminuir" o "tipo" das variáveis. Use no máximo int : 16 bits. Vai ter problemas no lance de valores fracionários e tem como contornar mas acho que não vou conseguir te explicar com palavras humanas e rápidas. Tenta as outras opções mesmo...

Link para o comentário
Compartilhar em outros sites

6 horas atrás, Isadora Ferraz disse:

Também tente avaliar se o mc do seu arduíno tem capacidade pra este processamento. Geralmente [se for] mc de 8 bits "odeia" cálculos complexos e com floats.

 

Os Avr's possuem multiplicação no hardware, e isso ajuda bastante nos tempos.

 

Eu tenho uma sequência de cálculos de ponto flutuante bem complexa no sistema de calibração do meu rotor de antenas, e toda a sequência é feita em pouco mais de 2 milissegundo, usando um Atmega328 a 18,432 Mhz.

 

No Arduíno rodando a 16 Mhz o aumento de tempo seria pequeno, cerca de 15% , e ainda assim não chegaria nem em 3 milissegundos.

 

A menos que o desempenho do compilador do Arduíno seja sofrível, não creio que existe nenhum problema em fazer os cálculos.

 

Já se for fazer as contas com dupla precisão em ponto flutuante, aí sim os tempos podem aumentar, mas eu diria que é um preciosismo sem necessidade a menos que seja projeto com componentes de precisão absoluta.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Thalysson Santana

Tempos atrás fiz um medidor de temperatura com termopar.

O uC era um P16F873A de 8 bits. A função da tensão no termopar com a temperatura não era linear, era uma função polinomial, bem complexa, que o uC não tinha memória para resolver. Precisava de cálculo com variáveis em ponto flutuante.

Optei por pegar a curva da relação tensão x temperatura e dividi em vários trechos de retas. Essas retas coincidiam com a curva com um erro mínimo. Com isso troquei a equação polinomial por umas 7 retas. Deixei de precisar calcular funções complicadas como x elevado a 1, 2, 3, ... e passei a usar apenas as 4 operações (+, -, x e /)    . e usei apenas variáveis inteiras.

Tente essa opção, que vai reduzir bastante a necessidade de memória do uC.

MOR_AL

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Moris & Paulão tmj

Ha alguns anos linearizei e converti pra ºC uma saída de termopar de um caríssimo max31855jasa assim

unsigned const int g16[]= //16 ajustes para 16 faixas com base em 1024
{
1024,1058,1071,1082,1090,1095,1102,1107,1110,1113,1115,1117,1118,1118,1119,1120
};
...
templinear=((unsigned long int)temp_saida_do_max*g16[temp_saida_do_max/128])/4096;

Nem sei como cheguei à esta fórmula mas só sei que me deu o maior trabalho aff... como foi 100% original e deu certo, me deu vontade registrar. Era só pra faixa de temperatura exigida pelo projeto. Mas logo em seguida consegui amostras lançamento do mcp9600... mais barato, serve pra varios tipos de termopar, faixa toda, já sai compensada a junta fria, sai em ºC etc ou seja,  já faz o trabalho sujo.

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

olá de novo, pessoal. 

Levando em consideração a possibilidade de que o microcontrolador de 8 bits não teria capacidade de processar o programa, peguei emprestado um arduíno mega que tem um microcontrolador de 16 bits. Testei o primeiro programa(mais simples) e como sempre, funcionou; testei o segundo programa, mais complexo e dessa vez quando entrou no laço IF o motor deu um "passo" no sentido antihorário, e na saída do laço IF, ele deu um "passo" no sentido horário. Quando você clica no botão carregar da IDE ele mostra o quanto de memória está sendo consumida:

"O sketch usa 5832 bytes (2%) de espaço de armazenamento para programas. O máximo são 253952 bytes.
Variáveis globais usam 400 bytes (4%) de memória dinâmica, deixando 7792 bytes para variáveis locais. O máximo são 8192 bytes."

Será que realmente o problema é processamento?

Link para o comentário
Compartilhar em outros sites

15 horas atrás, Thalysson Santana disse:

peguei emprestado um arduíno mega que tem um microcontrolador de 16 bits.

 

??????

Desde quando o Arduino Mega tem 16 bits ???? 

Continua sendo de 8 bits, é um Atmega2560 ! Só tem muito mais memória  e muito mais pinos kkkkkk !

 

Não, seu problema não é processamento, esquece isso, é alguma coisa no seu código mesmo.

Infelizmente não posso te ajudar nessa linguagem ....

 

Paulo

 

 

Link para o comentário
Compartilhar em outros sites

Quando se depara com um problema muito difícil de resolver, deve-se usar uma outra técnica.

 

Faça o seguinte:

 

1 - Divida o problema em partes ou blocos. Cada bloco tendo uma função específica.

 

2 - Se puder, faça um programa exclusivo para cada bloco e, como entradas, coloque os dados de modo a que se saiba, de antemão, o que esperar na saída. Com esse método você vai identificar onde está o problema.

 

OU

 

2 - Coloque paradas de processamento ao final de cada bloco e exteriorize os dados de saída, para ver se estão corretos. Ao final de cada verificação, introduza uma "continuação do programa", por meio de um clicar de um botão que você deve introduzir.

 

Espero que isso lhe auxilie.

Bons programas.

MOR_AL

  • Curtir 5
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!