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
Qual software você usou para simular esse código?
ResponderExcluirnã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...
ResponderExcluirqualquer duvida posta ai.
Achei legal. Estou querendo fazer uma dobradeira para chapas de inox. Consigo utilizar o arduino para diversos graus e espessuras de chapas?
ResponderExcluirpode 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
ResponderExcluirBoa 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?
ExcluirLeandro, 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.
ExcluirEntendi Felipe, você pode me chamar no facebook para tirarmos algumas dúvidas?
Excluirhttps://www.facebook.com/leandroejessica.oliveira
Muito obrigado amigo.
OK,conseguiu? montei um para PIC16F628A programado em C# usando o MikroC com botao de Emergencia e Reset, se tiveres a fim te consigo.
ExcluirFelipe, 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:
Excluirhttps://www.facebook.com/WalmirCristiano
Posteriormente vou aperfeiçoar o código para um pequeno microcontrolador e disponibilizar o código
ResponderExcluir