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:
- 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:
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!