Ir ao conteúdo
  • Cadastre-se
Elias Augusto Farias

Arduino Mudar delays por interrupções(timers)

Posts recomendados

Boa noite galera, estou realizando a implementação de um programa que irá acionar dois motores em tempos diferentes e ambos sentidos utilizando ponte h. Esse esquema é de uma máquina que personaliza copos, canecas, entre outros. Explicando melhor a sequencia que eles irão funcionar: primeiramente o motor 1 liga sentindo horário normal, esse motor tem um eixo com uma resistência, após ele ligar, ligara o motor 2 por 0,5s +ou-, que fará outro eixo onde estará o copo subir e prensar contra o eixo do motor 1. No copo terá um adesivo, que será aplicado através do aquecimento da resistência presente no eixo do motor 1. Estipulei um tempo até ele chegar no fim do adesivo e inverter a rotação do motor 1 para passar mais uma vez e garantir que o produto foi bem aplicado. Quando ele voltar até o começo, irá parar de girar, e acionará o motor 2 para descer o eixo com o copo. Ele inicia a partir de um botão, e quando o ciclo chegar ao final, o botão terá que ser apertado novamente para começar outro vez, e assim sucessivamente. Tenho um código base que fiz até agora, tenho muitas alterações para realizar. porém o problema que encontrei e também pelo que andei lendo em alguns fóruns, a função "delay" não seria uma boa escolha, pois ela dá um pequeno atraso no microcontrolador, e se eu tiver alguma prioridade (exp. interrupção), ele dá um "stop" no "delay" para atender a prioridade, o certo seria utilizar interrupções com "timers" (por ser uma das prioridades e também por ser mais preciso comparando com a função "delay"). Essa parte de "timers" eu não tenho muito conhecimento ainda, alguém poderia me passar algumas dicas de como utilizar? Tentei também implementar uma parada de emergência, mas não consegui interromper o loop. Desde já agradeço pelas dicas!

OBS:  quanto a vida útil da memória EEPROM, no mesmo fórum que li este assunto relatava que se o delay for muito grande ou executado muitas vezes diariamente, pode acabar escrevendo demais na memória EEPROM, que tem vida útil de aproximadamente 100000 escritas. A funcao dos timers não amenizariam este problema? Isso é um pouco confuso para mim, peço até desculpas se não entenderem direito, qualquer coisa tento me explicar melhor. 

 

Código base:

//Programa : Projeto Arduino
//Autor : Elias A. Farias
 
//Sentido horário
int horario = 3;
//Sentido anti-horário
int anti = 4;
//Eixo sobe
int sobe = 5;
//Eixo desce
int desce = 6;
//Acionamento por botao
int botao = 2;
//Armazena o valor lido do botao
int leitura1 = 0;
  
void setup()
{
  //Define pinos para o motor como saida
  pinMode(horario, OUTPUT); 
  pinMode(anti, OUTPUT);
  pinMode(sobe, OUTPUT);
  pinMode(desce, OUTPUT);
  //Define pino do botao como entrada
  pinMode(botao, INPUT); 
}

void motorA(int mode)
  {
    switch(mode)
    {
      case 0: //Desliga
      digitalWrite(horario, LOW);
      digitalWrite(anti, LOW);
      break;
      
      case 1: //sentido horario
      digitalWrite(horario, HIGH);
      digitalWrite(anti, LOW);
      break;

      case 2: //sentido anti-horario
      digitalWrite(horario, LOW);
      digitalWrite(anti, HIGH);
      break;
    }
  }

  void motorB(int mode)
  {
    switch(mode)
    {
      case 0: //Desliga
      digitalWrite(sobe, LOW);
      digitalWrite(desce, LOW);
      break;

      case 1:  //Sentido horario
      digitalWrite(sobe, HIGH);
      digitalWrite(desce, LOW);
      break;

      case 2:  //Sentido anti-horario
      digitalWrite(sobe, LOW);
      digitalWrite(desce, HIGH);
      break;
    }
  }
 
void loop()
{
  //Verifica o acionamento do botao 
  leitura1 = digitalRead(botao);
  if (leitura1 != 0)
  {
    while(digitalRead(botao) != 0)
    {
      motorA(1, HIGH);
      delay(500);
      motorB(1, HIGH);
      delay(500);
      motorB(0, LOW);
      delay(9000);
      motorA(0, LOW);
      delay(500);
      motorA(2, HIGH);
      delay(9000);
      motorA(0, LOW);
      delay(500);
      motorB(2, HIGH);
      delay(500);
      motorB(0, LOW);
      break;
    } 
  }  
} 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apesar do irritante 'galera'...

Sim, uma interrupçao por timer é uma opção inteligente ao delay(). 1º entenda como ela funciona e como programá-la. (não explico). Uma entre várias opções: faça (ou aproveite) uma que interrompa p.ex. a cada 100mS (0.1S). Nela incremente variáveis e as use pra comparação no loop principal. Algo como

char t;

interrupt_100mS()
{
t++;
}

rotina_a_cada_5S()
{
led^=1;
t=0;
}

loop()
{
rotina_principal(); //ou sequencia de funções
if (t>=50) rotina_a_cada_5S();
}

Sobre a gravação da eeprom:

Uma técnica 100% original que usei a loooong time ago era só gravar no desligamento do equipamento. O 1º pulo do gato é contar com a alimentação pelo capacitor por alguns instantes. O 2º pulo é ficar comparando a alimentação da entrada antes do regulador. Se ela cai, dá-lhe interrupção (p.ex. do comparador do mc.. não explico) pra cair na rotina de gravação na eeprom. O 3º e derradeiro pulo é ler o valor pregravado na eeprom e só gravar se for diferente. Alguns macetinhos da rotina seria minimizar o consumo dos periféricos pra que o capacitor alimente quase que somente o mc. Geralmente um capacitor de 1000uF dá-lhe tempo mais que suficiente pra fazer as operações supramencionadas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...