thumb

Controlando Motores DC com o Arduino


A utilização de motores DC como atuadores em projetos mecatrônicos é muito comum. Estes motores podem ter o sentido de rotação controlado de acordo com o sentido da corrente aplicada em seus terminais. Além disso, utilizando modulação por largura de pulso (PWM) é possível controlar a velocidade de rotação do motor sem que se perca o torque do mesmo.

Um circuito muito útil para controlar o sentido da corrente que alimenta um motor DC é o Circuito Ponte H. Não é o objetivo deste artigo explicar o funcionamento deste circuito, de modo que basta saber que o mesmo é composto por transistores e diodos que, pela sua configuração, permite alterar o sentido da corrente aplicado em um motor DC.

O circuito integrado L293B é um CI que possui em seu interior duas Pontes H, sendo o mesmo capaz de trabalhar com correntes de até 1A. Como neste artigo nosso objetivo é apresentar uma forma de se controlar motores DC utilizando o Arduino, o L293B nos atenderá perfeitamente, pois, além de sua simplicidade, ele nos permite fornecer ao motor uma corrente bastante acima daquela suportada pelo Arduino que é por volta de 40mA.

Para iniciar nosso estudo vamos começar analisando o CI L293B. A figura abaixo apresenta a pinagem do mesmo:

L293B

Figura 1 – Pinagem do CI L293B.

Este circuito contém internamente duas Pontes H que podem controlar o sentido de rotação (esquerda, direita) de dois motores DC. Os pinos 2, 3, 7 e 6 são respectivamente os pinos de entrada, saída, entrada e saída da primeira Ponte H. Os pinos 15, 14, 10 e 11 são respectivamente entrada, saída, entrada e saída da segunda Ponte H. Note que cada ponte possui duas entradas e duas saídas. De acordo com a entrada acionada, sua saída correspondente conectada ao motor ficará ativa, determinando o sentido de rotação do motor ligado à mesma.

OS pinos 1 e 9 são utilizados para ativar tanto a primeira quanto a segunda Ponte H. Quando o pino 1 estiver acionado, a primeira ponte ficará operante, por outro lado, se o pino 9 for acionado, a segunda ponte passa a funcionar. Se tanto o pino 1, quanto o 9 estiverem acionados, as duas pontes passam a funcionar ao mesmo tempo.

Os pinos 4, 5, 12 e 13 devem ser conectados ao terra. Os dois primeiros são correspondentes à primeira ponto e os dois últimos à segunda ponte. O pino 16 deve ser utilizado para alimentar o circuito e a tensão aplicada ao mesmo deve estar entre 4,5V e 36V. Além disso, o pino 8 é utilizado para conectar a alimentação dos motores e também dever ter entre 4,5V e 36V.

É importante ressaltar que deve-se evitar acionar ao mesmo tempo as duas entradas da mesma Ponte H, sob risco de danificar o CI. Deste modo, se o pino 1 estiver acionado, é preciso que o 7 esteja desativado. O mesmo ocorre com os pinos 15 e 10.

Um dica interessante é que podemos controlar a velocidade de rotação dos motores alimentando os pinos 1 e 9 com PWM, de modo que variando a largura de pulso aplicado aos pinos varia-se a velocidade de rotação dos motores 1 e 2 respectivamente.

Agora que já conhecemos o CI L293B, vamos iniciar a montagem do nosso projeto com o Arduino.

OBJETIVO: Controlar o sentido de rotação de um motor DC conectado ao Arduino utilizando-se dois botões. O acionamento de cada botão determinará o sentido de rotação do motor. Desse modo, quando o botão 1 for acionado, o motor deverá girar para a esquerda e quando o botão 2 estiver acionado o sentido de rotação invertera. Em nenhum momento deverá ser permitido o acionamento dos dois botões ao mesmo tempo.

MATERIAIS:

  • 1 Arduino Uno
  • 1 CI L293B (no esquema abaixo é utilizado o L293D, cuja pinagem é a mesma do L293B)
  • 2 Botões
  • 1 Motor DC de 9V
  • 1 Protoboard
  • 1 Bateria de 9V
  • Fios diversos
  • 2 Resistores de 10 kOhm

PROCEDIMENTOS: Montar o circuito conforme apresentado abaixo:

 

motorDC_bb

Figura 2 – Montagem do Projeto em Protoboard.

PSEUDO CÓDIGO PARA O ARDUINO:

definir o pino 4 como input1
definir o pino 2 como enable1
definir o pino 5 como input2
definir o pino 6 como button1
definir o pino 7 como button2
 
rotina rotateLeft:
    acionar enable1
    desativar input2
    acionar input1
fim
 
rotina rotateRight:
    acionar enable1
    desativar input1
    acionar input2
fim
 
rotina parar:
    desativar enable1
    desativar input1
    desativar input2
fim
 
enquanto button1 acionado:
    rotateLeft
fim
 
enquanto button2 acionado:
    rotateRight
fim
 
parar

SKETCH PARA ARDUINO:

int input1 = 4;
int enable1 = 2;
int input2 = 5;
int button1 = 6;
int button2 = 7;
 
void setup(){
  pinMode(input1, OUTPUT);
  pinMode(enable1, OUTPUT);
  pinMode(input2, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
}
 
void rotateLeft(){
  digitalWrite(enable1, HIGH);
  digitalWrite(input2, LOW);
  digitalWrite(input1, HIGH);
}
 
void rotateRight(){
  digitalWrite(enable1, HIGH);
  digitalWrite(input1, LOW);
  digitalWrite(input2, HIGH);
}
 
void parar(){
  digitalWrite(enable1, LOW);
  digitalWrite(input1, LOW);
  digitalWrite(input2, LOW);
}
 
void loop(){
  while(digitalRead(button1) == HIGH){
    rotateLeft();
  }
 
  while(digitalRead(button2) == HIGH){
    rotateRight();
  }
 
  parar();
}

 

Veja a seguir um vídeo com o projeto implementado.

 

Se você gostou do artigo e deseja estimular a continuação do trabalho do Laboratório de Eletrônica, por favor, clique em “Compartilhar” logo abaixo.


Compartilhar
 

Comentários

  • Leandro
    Responder

    Com esse CI ele diminui a potencia do motor?

  • Cássio
    Responder

    Muito bom, Rodrigo! Parabéns! Ficou fácil de entender. Obrigado por compartilhar os conhecimentos.

    • rvertulo

      Fico feliz em poder ajudar.

  • Rodrigo Molgado
    Responder

    Boa noite Rodrigo, amigo eu preciso fazer de um projeto para fazer um motor de vidro elétrico inverter a rotação através de relés, bem parecido com esse teu projeto aí de cima, porém eu preciso também que o projeto considere duas chaves de fim de curso, para que o motor pare

  • ozael
    Responder

    preciso do mesmo eskema do Rodrigo Molgado , porem seria quando dado um toque em um botao X ele rode pra direita ate acionar o final de curso da direita , e quando dado outro toque no botao X ele inverta rodando pra eskerda ate novamente atingir o final de curso da esquerda e assim por diante. quanto q vc me cobra pra fazer isso ?

  • Elias
    Responder

    oi rodrigo , tambem gosto muito de tecnologia , estou querendo criar um computador caseiro para meu robô , que estou desenvolvendo , quero saber se você pode me ajudar ou me informar como criar esse computador para locomoção dele…. fico grato desde já….

  • Edison
    Responder

    Olá amigo, muito legal testei e funcionou, só gostaria de saber se tem como fazer o motor parar mais rápido? pois a desaceleração é muito lenta…