Pplware

Como controlar um motor com o Arduino

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.

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:

Passamos agora para o esquema de ligação:

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!

Exit mobile version