Comando Bimanual com ARDUINO

Comando bimanual feito com arduino para ser utilizado em prensas, guilhotinas, rebitadeiras, dobradeiras, etc...

o programa consiste em monitorar dois botoes e ligar uma saida em caso de acionamento simultaneo e em até 0,5 segundos de diferença, em caso de desacionamento de um dos botões a saida desliga ou em caso de ser acionado com uma diferença maior que 0,5 segundos a saida não aciona.

o programa é descrito abaixo:


#define botao1 2
#define botao2 3
#define saida 4

boolean aguarda_botao1 = false;
boolean aguarda_botao2 = false;

byte estado_botao1 = 0;
byte estado_botao2 = 0;
byte ultimo_estado_botao1 = 0;
byte ultimo_estado_botao2 = 0;

long unsigned int tempo1 = 0;
long unsigned int tempo2 = 0;


void setup(){
  Serial.begin(9600);
  Serial.println("Start");

  pinMode(botao1,INPUT_PULLUP);
  pinMode(botao2,INPUT_PULLUP);
  pinMode(saida,OUTPUT);

  estado_botao1 = HIGH;
  ultimo_estado_botao1 = HIGH;
  estado_botao2 = HIGH;
  ultimo_estado_botao2 = HIGH;
  digitalWrite(saida,LOW);
}

void loop(){
//---------------------------------------se apertar o botao 1 primeiro-----------------------------------------------

  estado_botao1 = digitalRead(botao1);            //recebe o estado do botao
  if((estado_botao1 == LOW)&& (ultimo_estado_botao1 == HIGH) && (aguarda_botao1 == false))
  {
    tempo1 = millis();                            //guarda o tempo do botao
    aguarda_botao2 = true;                        //ativa a espera o botao 2
    ultimo_estado_botao1 = estado_botao1;         //atualiza o estado do botao
    Serial.println("botao 1 pressionado");   
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao
  }
  estado_botao1 = digitalRead(botao1);            //recebe o estado do botao
  if((estado_botao1 == HIGH) && (ultimo_estado_botao1 == LOW))
  {
    aguarda_botao2 = false;                       //desativa a espera o botao 2
    ultimo_estado_botao1 = estado_botao1;         //atualiza o estado do botao
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao
  }
  estado_botao2 = digitalRead(botao2);            //recebe o estado do botao
  if((estado_botao2 == LOW) &&(ultimo_estado_botao2 == HIGH) && (aguarda_botao2 == true))
  {

    tempo2 = millis();                            //guarda o tempo do botao
    ultimo_estado_botao2 = estado_botao2;         //atualiza o estado do botao
    Serial.println("botao 2 pressionado");
    aguarda_botao2 = false;                       //desativa a espera o botao 2
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao


    if(tempo2 - tempo1 <= 500)
    {
      Serial.println(tempo2-tempo1);
      digitalWrite(saida,HIGH);
    }


  }
  estado_botao2 = digitalRead(botao2);            //recebe o estado do botao
  if((estado_botao2 == HIGH) && (ultimo_estado_botao2 == LOW))
  {
    ultimo_estado_botao2 = estado_botao2;          //atualiza o estado do botao
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao
  }
//---------------------------------------se apertar o botao 2 primeiro-----------------------------------------------

  estado_botao2 = digitalRead(botao2);            //recebe o estado do botao
  if((estado_botao2 == LOW)&& (ultimo_estado_botao2 == HIGH) && (aguarda_botao2 == false))
  {
    tempo2 = millis();                            //guarda o tempo do botao
    aguarda_botao1 = true;                        //ativa a espera o botao 2
    ultimo_estado_botao2 = estado_botao2;         //atualiza o estado do botao
    Serial.println("botao 2 pressionado");   
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao
  }
  estado_botao2 = digitalRead(botao2);            //recebe o estado do botao
  if((estado_botao2 == HIGH) && (ultimo_estado_botao2 == LOW))
  {
    aguarda_botao1 = false;                       //desativa a espera o botao 2
    ultimo_estado_botao2 = estado_botao2;         //atualiza o estado do botao
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao
  }
  estado_botao1 = digitalRead(botao1);            //recebe o estado do botao
  if((estado_botao1 == LOW) &&(ultimo_estado_botao1 == HIGH) && (aguarda_botao1 == true))
  {

    tempo1 = millis();                            //guarda o tempo do botao
    ultimo_estado_botao1 = estado_botao1;         //atualiza o estado do botao
    Serial.println("botao 1 pressionado");
    aguarda_botao1 = false;                       //desativa a espera o botao 1
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao


    if(tempo1 - tempo2 <= 500)
    {
      Serial.println(tempo1-tempo2);
      digitalWrite(saida,HIGH);
    }


  }
  estado_botao1 = digitalRead(botao1);            //recebe o estado do botao
  if((estado_botao1 == HIGH) && (ultimo_estado_botao1 == LOW))
  {
    ultimo_estado_botao1 = estado_botao1;          //atualiza o estado do botao
    delay(10);                                    //aguarda um tempo para eliminar o ruido do botao
  }


  //-----------------------------------------Se soltar um dos dois botoes ou os dois botoes----------------------


  estado_botao1 = digitalRead(botao1);
  estado_botao2 = digitalRead(botao2);
  if ((( estado_botao1 == HIGH) &&(estado_botao2 == HIGH))||(( estado_botao1 == LOW) &&(estado_botao2 == HIGH))||(( estado_botao1 == HIGH) &&(estado_botao2 == LOW)))
  {
    digitalWrite(saida,LOW);
  }

}//fim loop




Comentários

  1. Qual software você usou para simular esse código?

    ResponderExcluir
  2. não simulei, apenas fiz o código e o upload no arduino, coloquei dois botões (pinos 2 e 3) e um rele (pino 4)... já instalei em duas maquinas e está funcionando perfeitamente, mas vc pode simular no ISIS Proteus...
    qualquer duvida posta ai.

    ResponderExcluir
  3. Achei legal. Estou querendo fazer uma dobradeira para chapas de inox. Consigo utilizar o arduino para diversos graus e espessuras de chapas?

    ResponderExcluir
  4. pode sim, não sei como é a tua dobradeira mas pode com o arduino movimentar um motor de passo para regular a espessura ou o grau

    ResponderExcluir
    Respostas
    1. Boa tarde Felipe, estou montado um parecido, e queria saber como eu faço para quando acionar os dois eu ligo a saída e quando eu solto algum eu desligo a saída. Pode me ajudar?

      Excluir
    2. Leandro, este codigo que postei eh para arduino e faz o que tu precisa, ou seja, quando pressionar os dois botoes simultaneamente ou um depois do outro num tempo menor que 0,5 segundos como manda a NR12 ele aciona a saída e se qualquer um dos botões forem soltos a saida desaciona, claro que pode ser aperfeiçoado se usares interrupçoes ou melhorado, mas este codigo acima funciona realmente desta forma pois ja instalei em uma máquina ja fazem quase 2 anos.

      Excluir
    3. Entendi Felipe, você pode me chamar no facebook para tirarmos algumas dúvidas?

      https://www.facebook.com/leandroejessica.oliveira

      Muito obrigado amigo.

      Excluir
    4. OK,conseguiu? montei um para PIC16F628A programado em C# usando o MikroC com botao de Emergencia e Reset, se tiveres a fim te consigo.

      Excluir
    5. Felipe, estou tentando fazer uma programação sobre a NR12 com o comando bimanual, botão reset e de emergência, porém estou com algumas dúvidas. tem como me chamar no facebook para conversar:

      https://www.facebook.com/WalmirCristiano

      Excluir
  5. Posteriormente vou aperfeiçoar o código para um pequeno microcontrolador e disponibilizar o código

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog