terça-feira, 2 de agosto de 2016

Módulo relé de 4 canais como ponte H dupla


 Uma solução simples e ecomímica, para controle de dois motores de corrente continua é o modulo relé de 4 canais. Com ele é possível controlar o sentido de rotação de dois motores o suficiente para construir um robô com três rodas, duas de tração e um rodizio, por exemplo, com controle de direção. O "porém" do modulo relé é que não é possível controle de velocidade sem o uso de um transistor de potencia ou um mosfet adicional.

Um exemplo de modulo rele 4 canais (4 relés). Ele possi 4 relé de 1 polo x 2 posições:
Exemplo de modulo relé 4 canais. Nesse caso 5V




Ponte H
Em um motor de Corrente contínua invertendo a polaridade da alimentação em seus terminais:


Na ponte H essa caracteristica é aproveitada  para controlar do sentido de rotação desses motores











Para facilitar a compreensão considere que montaremos um carrinho com parte de tração como a figura abaixo:



Usaremos o arduino como elemento principal de controle:

O primeiro passo é fazer as ligações necessárias no modulo relé 4 canais para que ele seja utilizado como duas pontes H:



Em seguida ligar os motores. Nesse primeiro momento sem se preocupar com a polarização:




O próximo passo é ligar parcialmente ao arduino para ajustar o sentido de rotação. Nessa etapa não é necessário programa rodando no Arduino:

Ligar como acima sem se preocupar com programação do arduino para ajustar o sentido de rotação nos motores. Por exemplo o sentido indicado na ilustração acima que serve para uso em um robô. Consideremos que girar nesse sentido faz o robô ir para frente.
Se ao ligar o sentido de rotação não for o indicado na figura basta inverter os foi de ligação do motor com giro errado. No desenho acima os fios verdes 

Após os testes, completar as ligações com o arduino:



O código para teste é bastante simples. Segue abaixo comentado. As funções "frete", "re", "direita", "esquerda" e "parar" podem ser aproveitadas para qualquer projeto dessa natureza. Um detalhe importante sobre o módulo que esta sendo usado é que ele deve receber sinal de nível baixo (0V) em um dos pinos IN1, IN2, IN3 ou IN4  para acionar o relé correspondente.



/* funçao teste carrinho:

vai para frete por 2 segundos
vai para tras pro 2 segundos
vai para esquerda por 2 segundos
vai para a direita por 2 segundos
para por 2 segundos
pra repetir é necessario pressionar o botão reset do arduino

*/

int IN1= 5;
int IN2= 4;
int IN3= 3;
int IN4= 2;

void setup() {

  //declara pinos como saida
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);


// chama a funçao frete passando parametro em milesegundos
// anda para frete por 2 segundos
frete(2000); 


// anda para traz por 2 segundos 
re(2000); 

// vira para direita por 2 segundos 
direita(2000); 

// anda para esquerda por 2 segundos 
esquerda(2000); 


// Para por 2 segundos
parar(2000); 

}

void loop() {
// como deve execultar uma apenas uma vez para teste a funçao loop esta vazia
// o programa foi colocado na funçao setup
}



// função frente
void frete(int tmp)
{
 
   // MOTOR ESQUERDO FRETE
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,LOW);
 
  // MOTOR DIREITO FRETE
 digitalWrite(IN3,HIGH );
 digitalWrite(IN4,LOW);

 delay(tmp);

}


// função re
void re(int tmp)
{

  // MOTOR ESQUERDO RE
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,HIGH);
 
  // MOTOR DIREITO RE
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,HIGH);

 delay(tmp);

}

// função esquerda
void esquerda(int tmp)
{

   // MOTOR ESQUERDO RE
 digitalWrite(IN1,LOW);
 digitalWrite(IN2,HIGH);
 
  // MOTOR DIREITO FRETE
 digitalWrite(IN3,HIGH );
 digitalWrite(IN4,LOW);

 delay(tmp);

}


// função direita
void direita(int tmp)
{

   // MOTOR ESQUERDO FRENTE
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,LOW);
 
  // MOTOR DIREITO RE
 digitalWrite(IN3,LOW);
 digitalWrite(IN4,HIGH);

 delay(tmp);

}


// função parar
void parar(int tmp)
{

   // MOTOR ESQUERDO PARADO
 digitalWrite(IN1,HIGH);
 digitalWrite(IN2,HIGH);
 
  // MOTOR DIREITO PARADO
 digitalWrite(IN3,HIGH);
 digitalWrite(IN4,HIGH);

 delay(tmp);

}