Ponte H L298N - Controlando a velocidade de um motor DC com PWM
Ponte H L298N - Controlando a velocidade de um motor DC com PWM
No último tutorial vimos como se faz para ligar um motor DC no Arduino com o auxílio de um módulo ponte H L298n, usando suas entradas para variar o sentido de giro. Mas na robótica, é comum termos que controlar, além do sentido, a velocidade do motor. Neste tutorial iremos ensinar, de forma simples e didática, como podemos controlar a velocidade de um motor DC usando o Driver motor com Ponte H L298n com Arduino.
[toc]
Como controlar a velocidade de um motor?
Um motor DC gira baseado em campos magnéticos gerados pela corrente que passa em suas bobinas. Para variar a velocidade do motor podemos alterar essa corrente que é diretamente proporcional a tensão sobre elas.

Dessa forma, com a mudança da tensão em cima do motor, teremos uma alteração de velocidade. mas como podemos fazer isso usando o Arduino e a Ponte H? A solução é simples e eficiente e se chama PWM.
O que é PWM?
PWM (Pulse Width Modulation – Modulação por Largura de Pulso) é uma técnica para obter resultados analógicos por meios digitais (Leia mais sobre Grandezas digitais e analógicas e PWM). Essa técnica consiste na geração de uma onda quadrada em uma frequência muito alta em que pode ser controlada a porcentagem do tempo em que a onda permanece em nível lógico alto. Esse tempo é chamado de Duty Cycle(Ciclo de trabalho) e sua alteração provoca mudança no valor médio da onda, indo desde 0V (0% de Duty Cycle) a 5V (100% de Duty Cycle) no caso do Arduino.
O duty cycle é a razão do tempo em que o sinal permanece na tensão máxima (5V no Arduino) sobre o tempo total de oscilação, como está ilustrado na figura abaixo:

Duty Cycle (%) = (x/x+y)*100% = (x/T)*100%
Vmédio = Vmáx*Duty Cycle(%)
O valor do Duty Cycle usado pelo Arduino é um inteiro armazenado em 8 bits, de forma que seu valor vai de 0 (0%) a 255 (100%).
Exemplo.: Para um sinal PWM de valor 200 temos:
Se 255 é 100%, 200 é aproximadamente 78,4%.
Como a tensão máx de saída do Arduino é 5V a tensão média do sinal PWM será:
Vmédio = Vmax*Duty Cycle(%)
Vmédio=5*78,4%
Vmédio=3,92V
Modulando a ponte H
No módulo Ponte H com CI L298N cada ponte H possui um pino que ativa ou não a ponte H. Caso tenha um sinal de 5V inserido nele, a ponte enta ligada, caso seja 0V a ponte esta desligada. Como temos 2 pontes H, temos o Enable A(Ativa A) e o Enable B (Ativa B).
Normalmente o Enable A e B fica em curto com um sinal de 5V da placa através de um jumper.

Se retiramos esse jumper e inserimos um sinal PWM nessa entrada, modularemos a tensão que é enviada para o motor no mesmo formato. Isso ocorre porque a ponte H só ira "funcionar" enquanto o sinal de Enable estive com 5V.

Sendo assim, a saída para o motor será um sinal PWM com um Duty Cycle igual ao do Enable e terá tensão média calculada pela seguinte formula.
Vmédio = Vmax(tensão PonteH)*Duty Cycle(%)
Com essa modulação, podemos variar a velocidade do motor através de PWM.
Mãos à obra - Controle de velocidade com Módulo Ponte H L298N - Arduino
Neste segundo exemplo, vamos verificar o controle de velocidade dos motores A e B.
Componentes necessários
Para este exemplo, utilizaremos:
- Placa Arduino UNO ou similar
- Módulo Ponte H L298N
- 2x Motores DC (pode ser feito com apenas 1)
- Fonte alimentação de 12V
Montando o projeto
Prossiga com a montagem conforme esquema abaixo(caso você use apenas um motor, basta desconsiderar o motor B:
Garanta que seu Arduino e a fonte externa estejam desligados durante a montagem.

Programando
Crie um programa (sketch) e salve com o nome de “exemplo1_Controle_velocidade”.
Agora vamos à implementação do programa. Dessa forma, dentro da IDE Arduino: escreva o seguinte código e ao final clique em Upload para que o programa seja transferido para seu Arduino.
/*Pinagem do arduino*/
//motor_A
int IN1 = 2 ;
int IN2 = 4 ;
int velocidadeA = 3;
//motor_B
int IN3 = 6 ;
int IN4 = 7 ;
int velocidadeB = 5;
//variavel auxiliar
int velocidade = 0;
//Inicializa Pinos
void setup(){
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(velocidadeA,OUTPUT);
pinMode(velocidadeB,OUTPUT);
}
void loop(){
/*Exemplo de velocidades no motor A*/
//Sentido 2
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
//Alta
analogWrite(velocidadeA,230);
//Intermediaria
analogWrite(velocidadeA,150);
//Baixa
analogWrite(velocidadeA,80);
/*Exemplo de variacao de velocidade no motor B*/
//Sentido 2
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
//velocidade de 0 a 255
while (velocidade < 255){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade + 10;
delay(50);
}
//velocidade de 255 a 0
while (velocidade > 0){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade - 10;
delay(50);
}
}
Colocando para funcionar
Se tudo deu certo, teremos o motores fazendo os seguintes movimentos:
- Motor A gira em velocidade alta
- Motor A gira em velocidade intermediaria
- Motor A gira em velocidade baixa
- Motor B vai de parado para velocidade rápida gradativamente
- Motor B vai da velocidade rápida até totalmente parado gradativamente
Entendendo a fundo
Entendendo o Software
Primeiro definimos as pinos que estão conectados à ponte H para controle de cada motor.
//motor_A int IN1 = 2 ; int IN2 = 4 ; int velocidadeA = 3; //motor_B int IN3 = 6 ; int IN4 = 7 ; int velocidadeB = 5;
Veja que temos 3 pinos para cada motor. 2 para controle de sentido de giro e o terceiro para controle de velocidade.
Movimentando o motor
Para fazer o motor se movimentar, primeiro temos que informar para que direção ele deve girar:
//Motor_A //Sentido 2 digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW);
Aqui vale lembrar da tabela de comandos apresentadas no tutorial Módulo Ponte H L298N – Controlando Motores com Arduino :
Para controlar o sentido, temos as seguintes combinações para o motor A(IN1 e IN2)

É importante ter em mente essas combinações:
//Sentido 1 digitalWrite(IN1,LOW); //0V digitalWrite(IN2,HIGH); //5V //Freia Motor digitalWrite(IN1,HIGH); //5V digitalWrite(IN2,HIGH); //5V //Sentido 2 digitalWrite(IN1,HIGH); //5V digitalWrite(IN2,LOW); //0V
Em seguida definimos a velocidade através de um sinal PWM no pino Enable A. Tal como explicado anteriormente.
//Motor_A //Velocidade Alta analogWrite(velocidadeA,230);

Quando não queremos controlar a velocidade, deixamos esse pinos com um jumper ligado ao 5V da placa. Assim garantimos que a ponte H trabalhe na velocidade máxima.
Como queremos controlar sua velociade, tiramos o Jumper e conectamos a uma porta PWM.
O comando para a saída PWM é:
analogWrite(pino_de_saida,PWM);
Onde PWM , que já foi explicado no inicio do tutorial, é um valor entre 0 à 255. Onde 0 simboliza que o ciclo de trabalho é de 0% (desligado o tempo todo) e 255 simboliza que o ciclo de trabalho é de 100% (ligado o todo).

Ou seja, podemos brincar com a velocidade variando esse valor de PWM.
No exemplo usado temos um pedaço de código onde variamos a velocidade dos motores de parado (PWM=0) até a velocidade mais rápida (PWM=255), subindo de 10 em 10 a velocidade.
//velocidade de 0 a 255
while (velocidadeB < 255){
analogWrite(velocidadeB,velocidade);
velocidade = velocidade + 10;
delay(50);
}
Outra opção de Programa
Caso você queira fazer um código mais enxuto e modularizado, temos este exemplo de implementação um pouco avançado que usa funções. Em breve teremos um tutorial sobre o assunto.
#define MOTOR_A 1
#define MOTOR_B 2
#define HORARIO true
#define ANTIHORARIO false
//inicializa pinos
void setup(){
for (int i = 2; i < 8; i++)
pinMode(i,OUTPUT);
}
void loop(){
acionaMotor(MOTOR_A,HORARIO, 255);
acionaMotor(MOTOR_B,ANTIHORARIO, 255);
}
//funcao para acionamento individual de cada motor
void acionaMotor(int motor, boolean sentido, int velocidade){
if (motor == MOTOR_A){
digitalWrite(2,sentido);
digitalWrite(4,!sentido);
analogWrite(3,velocidade);
}
else if (motor == MOTOR_B){
digitalWrite(6,sentido);
digitalWrite(7,!sentido);
analogWrite(5,velocidade);
}
}
Fechamento
Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!! Compartilhe à vontade.
Editado por Allan Mota e revisado por Ícaro Lobo


