Tutoriais

Como controlar um motor com o Arduino

17 Comentários

Por Daniel Costa para o pplware.com

Depois de termos visto um fantástico projecto com um robô conduzido por um telemóvel, vamos agora abordar um componente em particular, um módulo muito importante na estrutura do robô e que faz este mover-se.

O artigo de hoje é dedicado a quem se inicia no mundo da robótica, mais concretamente ao controlo de motores recorrendo a uma placa arduino.

imagem_motor_arduino00_small


Mas como podemos nós controlar um motor com o “pequeno” Arduino ? Essa é a parte em que nós entramos para explicar 😉

Material necessário:

  • 1 Arduino
  • 2 motores DC de 5v/12v
  • 1 board com l298
  • 1 fonte de alimentação regulável/bateria/pilhas com a voltagem dos Motores (5v/12v)

Passamos agora para o esquema de ligação:

imagem_motor_arduino01_small

E agora o código:

//Este programa controla dois motores DC.

//motorA(modo, velocidade)
// Substitua o A por B para controlar o motor B

//O modo vai do número 0 até 3 que determina o que o motor vai fazer.
//0 = desativa a ponte H
//1 = o motor gira no sentido horário
//2 = o motor gira no sentido anti horário
//3 = trava o motor

/* A velocidade vai do 0 até 100 que representa a percentagem da velocidade do motor.
0 = desligado
50 = 50% de velocidade
100 = 100% de velocidade

Exemplo
Se tu precisares de meter o motor A a girar no sentido horario a 33% de velocidade.
A subrotina será assim...

motorA(1, 33);

Este código é de dominio público.
*/

#define ENA 5 //enable A no pino 5 (tem de ser um pino PWM)
#define ENB 3 //enable B no pino 3 (tem de ser um pino PWM)
#define IN1 2 //IN1 no pino 2 controla 1 lado da ponte A
#define IN2 4 //IN2 no pino 4 controla o outro lado da ponte A
#define IN3 6 //IN3 no pino 6 controla 1 lado da ponte B
#define IN4 7 //IN4 no pino 7 controla o outro lado da ponte B

void setup()
{
//Definir todos as saídas
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}

void loop()
{
motorA(1, 15); //temos o Motor A no sentido horário com 15% de velocidade

delay(5000); //o motor gira por 5 segundos

motorA(3, 100); //O motor A vai parar totalmente

motorB(1, 15); //O motor B vai girar no sentido horário com 15% de velocidade.

delay(5000); //o motor B gira por 5 segundos

motorA(2, 15); //o motor A gira no sentido anti horario com 15% de velocidade

delay(5000); //O motor A e B vão continuar a girar

motorB(3, 50); //Trava o motor B a 50%

motorA(0, 100); //O motor A vai parar

delay(5000); //Espera 5 segundos

}

//****************** Controlo do Motor A *******************
void motorA(int mode, int percent)
{

//muda a percentagem de 0 até 100 no PWM

int duty = map(percent, 0, 100, 0, 255);

switch(mode)
{
case 0: //desativa o motor
digitalWrite(ENA, LOW); //define o enable a LOW para desativar o A
break;

case 1: //define o sentido horario

digitalWrite(IN1, HIGH); //define IN1 a HIGH

digitalWrite(IN2, LOW); //define IN2 a LOW

analogWrite(ENA, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable

break;

case 2: //define o sentido anti horario

digitalWrite(IN1, LOW); //define IN1 a LOW

digitalWrite(IN2, HIGH); //define IN2 a HIGH

analogWrite(ENA, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable

break;

case 3: //Travar o motor

digitalWrite(IN1, LOW); //define IN1 a LOW

digitalWrite(IN2, LOW); //define IN2 a LOW

analogWrite(ENA, duty); //usa o PWM para travar o motor através do pin do enable

break;
}
}
//**********************************************************

//****************** Controlo Motor B *******************
void motorB(int mode, int percent)
{

//muda a percentagem de 0 até 100 no PWM

int duty = map(percent, 0, 100, 0, 255);

switch(mode)
{
case 0: //desativa o motor
digitalWrite(ENB, LOW); //define INB a LOW
break;

case 1: //define o sentido horario

digitalWrite(IN3, HIGH); //define IN3 a HIGH

digitalWrite(IN4, LOW); //define IN4 a LOW

analogWrite(ENB, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable

break;

case 2: //define o sentido anti horario

digitalWrite(IN3, LOW); //define IN3 a LOW

digitalWrite(IN4, HIGH); //define IN4 a HIGH

analogWrite(ENB, duty); //usa o PWM para controlar a velocidade do motor através do pin do enable

break;

case 3: //trava o motor B

digitalWrite(IN3, LOW); //define IN3 a LOW

digitalWrite(IN4, LOW); //define IN4 a LOW

analogWrite(ENB, duty); //usa o PWM para travar o motor através do pin do enable

break;
}
}
//*****

Este mini tutorial resume-se a controlar 2 motores com diversas velocidades e sentidos giratórios em sequência, mostrando as possibilidades que temos com o Arduino de controlar diferentes motores através de uma placa controladora ou uma ponte H.

Nota: Nunca se deve ligar um motor directamente ao Arduino mesmo que seja de 5v, pois eles tem um consumo elevado e podem queimar o Arduino, para isso é que se usa a ponte H, que além do controlo, fornece potência quando alimentada a uma fonte/bateria.

Podemos ver como funciona de seguida:

Esperamos que este artigo seja útil, principalmente para quem gosta/gostaria de fazer pequenos robôs!

Também pode gostar

Comentários

17

Responder a Pedro Lopes & Ciro Cancelar resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Diogo Aleixo
    Diogo Aleixo

    Mais publicidade que filme. Agora é juntar o sonar e tá um robot funcional.Era interessante fazerem isso com ponte-h que fica mais barato e envolve mais conhecimento.

  2. Avatar de Cristiano Alves
    Cristiano Alves

    Aqui está o que nunca se deve fazer com nada de electrónico e um macbook pro…

    Tirar fotos com um Arduino em cima do macbook que é constituído por aluminio, é simplesmente impudente.
    Mesmo que aleguem que seja nas teclas…

    1. Avatar de Paulo
      Paulo

      Se reparares muito bem o arruinou não tem alimentação nenhuma ligada… ou seja foi mesmo só para a foto.

    2. Avatar de Daniel
      Daniel

      Bom dia, mesmo que aleguem? não é alegar, está em cima das teclas, que são de plástico…

      1. Avatar de Cristiano Alves
        Cristiano Alves

        como é que eu nao adivinho os numeros do euro milhoes? 😀

        Desculpe, é imprudente na mesma. Principalmente no post de gente que supostamente se está a iniciar com estas coisas. Meter o arduino na parte livre do macbook é o mais comum dentro dos iniciados.

        Esqueci-me do comentário ao tutorial, e penso que so faltaria referir o porque do pwm para controlo dos motores e uma breve explicação do l298.
        Mas é um bom tutorial!

        1. Avatar de Daniel
          Daniel

          Eu gosto de criticas construtivas e plausiveis, que não acho que foi o seu primeiro comentário mas sim o segundo, sim agora que reparo deveria ter mencionado uma breve explicação do PWM e secalhar a constituição do l298 para ficar mais completo, mas a electrónica e mesmo assim, há sempre mais por onde se pegar e soluções que possívelmente são menos conhecidas e melhores 😉

          1. Avatar de Cristiano Alves
            Cristiano Alves

            O que escrevi no segundo comentário pensei que tinha incluído no primeiro.
            Porque por habito não tenho essa postura de fazer comentários apenas destrutivos.
            Peço desculpa por realmente ter feito o comentário no inicio de forma a que fosse destrutivo do seu trabalho.
            Ate porque estive a ver o seu blog e tem coisas bastante interessantes 😀

  3. Avatar de Guilherme Lawless
    Guilherme Lawless

    Um tutorial assim devia explicar, ou pelo menos fazer referência a algo que explique, as portas PWM, que são a essência do controlo de servos.

    Numa outra nota, acho que as funções motorA e motorB podiam facilmente ser adaptadas para criar uma única função. Bastaria ter algumas linhas no início da função que atribuíssem a variáveis quais os pinos referentes a esse motor e ao controlo da ponte H desse lado.

    Bom trabalho 🙂

    1. Avatar de Daniel
      Daniel

      Guilherme, como respondi ao Cristiano, sim deveria ter mencionado o funcionamento do PWM 🙂 Quanto às funções, eu não sou um expert em programação, é ainda uma área que tenho de melhorar, e ao ler o comentário, sim agora pensando melhor, podia ter criado uma única função, pouparia algum trabalho 🙂

  4. Avatar de Pedro Lopes & Ciro
    Pedro Lopes & Ciro

    Boas, vi o post, comprei tudo, e fizemos acontecer. Tenho video 🙂
    Obrigado pelo post e tuturial, maquina de linha de montagem incomng.

    Mais uma vez, obrigado PPlWare.

  5. Avatar de diogo silveira

    Ru já vi tutoriais sobre servos e motores . uma coisa que nunca explicam é o porque das pilhas. Porque e que e necessário ligar o motor a um suporte de uma fonte de alimentação secundaria. Nos não podemos ligar ao Arduino ? Ele não tem a sua própria alimentação ? Obrigado e bom tutorial

  6. Avatar de Daniel Fernandes
    Daniel Fernandes

    Olá amigo!
    Tenho um módulo igual a esse; gostaria, portanto, de saber como usá-lo com Arduino ou NÃO para fazer rodar um motor de passo bipolar, usando dois botões (push-buton) para determinar o sentido de rotação do motor (esquerda/direita).
    Se for possível, por favor, responder direto no meu email,
    Muito obrigado

  7. Avatar de carlos
    carlos

    Primeiramente parabéns pelo site.
    Gostaria de saber se num seguidor de linha, posso colocar um sensor de obstáculo sendo que ao avistar este obstáculo terá que parar por 10 segundos e depois retornar ao percurso normal. Como faço isso.
    Preciso de uma força aí.
    Obrigado
    Carlos

  8. Avatar de Sinezio
    Sinezio

    Muito bom!!!

    Daniel, tenho uma duvida… Como faço para parar os motores depois de um tempo programado para que eles NÃO voltem mais a girar. Tentei mudar algumas linhas do programa mas não consegui, percebi que depois de rodar os motores e fazer para-los, o laço se repete. Obrigado.

    1. Avatar de Matheus
      Matheus

      Bota um break no sinal do programa que contem o LOOP.

  9. Avatar de Marcio
    Marcio

    Muito boa essa programação para colocar um botão para iniciar a partida do motor como ficaria os comando estou aprendendo agora deste já muito Obrigado

  10. Avatar de Thiago César
    Thiago César

    Olá amigo, gostara de utilizar este programa com o bluetooth, poderia me ajudar?
    Utilizar estes motores para abrir e fechar o portão de uma maquete que estou fazendo.