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
Driver motor com Ponte H L298N - Controle de Motor DC com Arduino
Driver motor com Ponte H L298N - Controlando Motor DC com Arduino
Se você curte robótica, provavelmente deve estar louco para montar seu próprio robô. A ponte H é uma peça chave quando o assunto é robótica. Neste tutorial você aprenderá como controlar um motor DC usando o Driver motor L298n com um Arduino Uno. Esse tutorial é essencial para quem quer montar seu robô com Arduino.
[toc]
O que é uma Ponte H?
Na maioria das abordagens em robótica faz-se necessária a utilização de motores DC em diversos tipos de locomoção de robôs, movimentação de braços mecânicos, etc. Os motores DC (direct current ou corrente continua) são cargas indutivas que, em geral, demandam uma quantidade de corrente superior à que as portas do Arduino conseguem fornecer.
Sendo assim, não devemos ligar estes motores diretamente nas portas do Arduino pois se o motor demandar uma corrente acima de 40mA nas portas digitais (máxima fornecida pelo Arduino) pode queimar a porta e danificar a placa.
Para solucionar a questão da alta corrente poderíamos usar transistores, porem é importante que seja possível controlar o sentido de giro do motor, função que não se faz possível usando apenas um transistor já que para inverter o sentido de giro devemos inverter a polaridade da alimentação do motor (onde era positivo se põe negativo e vice versa). Um transistor só seria suficiente para ligar e desligar o motor.
Para resolver nosso problema utilizamos um famoso circuito conhecido como Ponte H que nada mais é que um arranjo de 4 transistores. Este circuito é uma elegante solução por ser capaz de acionar simultaneamente dois motores controlando não apenas seus sentidos, como também suas velocidades. Além de seu uso ser simples no Arduino.
Mas como funciona a Ponte H? Porque este nome?
As pontes H em possuem este nome devido ao formato que é montado o circuito, semelhante a letra H. O circuito utiliza quarto chaves (S1, S2, S3 e S4) que são acionadas de forma alternada, ou seja, (S1-S3) ou (S2-S4), veja as figuras abaixo. Dependendo da configuração entre as chaves teremos a corrente percorrendo o motor hora por um sentido, hora por outro.
Quando nenhum par de chaves está acionado, o motor está desligado (a). Quando o par S1-S3 é acionado a corrente percorre S1-S3 fazendo com que o motor gire em um sentido (b). Já quando o par S2-S4 é acionado a corrente percorre por outro caminho fazendo com que o motor gire no sentido contrário (c).
Circuito integrado Ponte H L2398N
O CI L298N é muito utilizado para o propósito de controle de motores, ele nada mais é que uma ponte H em um componente integrado. Uma das vantagens do uso desse CI é o menor espaço ocupado, a baixa complexidade do circuito e o fato de ele já possuir dois circuitos H, podendo assim, controlar dois motores. Na figura a seguir você pode conferir o diagrama de blocos do CI L298N retirado de sua folha de dados (folha de dados L298N) :
As funções dos principais pinos desse CI são descritas na tabela a seguir:
Outra vantagem do L298N é a resposta a sinais de PWM. Se no lugar de usar sinais lógicos TTL for usado sinais de PWM, é possível regular a tensão de saída, e dessa forma regular a velocidade dos motores.
O PWM, Pulse Width Modulation (Modulação por Largura de Pulso), consiste basicamente em aplicar uma onda quadrada de amplitude Vcc e frequência alta no lugar da tensão continua Vcc. Leia mais sobre PWM na postagem Grandezas digitais e analógicas e PWM.
Ao usar um sinal de PWM nas entradas IN1 e IN2, por exemplo, teremos uma tensão de saída nos pinos OUT1 e OUT2 em PWM que será igual à Duty Cycle*Vcc. Dessa forma, podemos regular a diferença de potencial média aplicada nos motores, controlando as suas velocidades.
Existem outras opções de CI's de ponte H no mercado, é importante consultar as especificações deles em suas folhas de dados(Datasheet) para saber qual irá lhe atender melhor. Veja algumas opções de ponte H:
- L293D Folha de Dados;
- LMD18200 Folha de dados.
Módulos Driver motor com Ponte H
Esses módulos são muito utilizados em aplicações de robótica. Esses módulos possuem dimensões pequenas e já possuem o circuito básico para o uso do CI, o que facilita na acomodação do módulo no robô ou em outros projetos e a sua utilização.
Existem varias opções disponíveis no mercado, com tamanhos e especificações diferentes. Algumas especificações são importantes ao escolher seu módulo, são elas:
- Especificação de potência máxima fornecida;
- Tensão máxima suportada;
- Corrente máxima suportada;
- Tensão lógica.
Um exemplo desses módulos é o oferecido em nossa loja, sua características são:
- Ci L298N;
- Tensão para os motores: 5 – 35V;
- Corrente máxima para os motores: 2A;
- Potencia máxima: 25W;
- Tensão lógica: 5V;
- Corrente lógica: 0-36mA;
- Dimensões: 43x43x27 mm
- Peso: 30g.
Módulo Driver motor com Ponte H L298N
Agora que já sabemos como a Ponte H funciona, vamos entender na prática como podemos usá-las em conjunto com o Arduino. Para isso iremos usar o Driver motor com Ponte H L298N.
Entradas e saídas
Para começa vamos entender função de cada pino bem como deve ser utilizado.
Motor A e Motor B: Conectores para os dois motores
-
- 6-35V: Porta para alimentação da placa com tensão entre 6 a 35V.
-
- Ativa 5V: Quando jumpeado, a placa utilizará o regulador de tensão integrado para fornecer 5v (na porta 5v) quando a porta 6-35V estiver sendo alimentada por uma tensão entre 6 e 35V. Neste caso, não se deve alimentar a porta 5V pois pode danificar os componentes. A tensão fornecida na porta 5V pode ser usada para alimentar o Arduino, por exemplo.
-
- 5v: Em casos de não haver fonte de alimentação com mais de 6V podemos alimentar a placa com 5V por esta porta.
-
- Ativa MA: Quando jumpeado aciona o motor A com velocidade máxima. Para controlar a velocidade do motor A basta remover o jumper e alimentar o pino com uma tensão entre 0 e 5v, onde 0V é a velocidade mínima (parado) e 5V a velocidade máxima.
-
- Ativa MB: Quando jumpeado aciona o motor B com velocidade máxima. Para controlar a velocidade do motor B basta remover o jumper e alimentar o pino com uma tensão entre 0 e 5v, onde 0V é a velocidade mínima (parado) e 5V a velocidade máxima.
-
- IN1 e IN2:são utilizados para controlar o sentido do motor A;
- IN3 e IN4: são utilizados para controlar o sentido do motor B;
Veja que agora, no lugar das chaves S1-S3 e S2-S4 temos os pinos IN1 e IN2. Onde IN1 corresponde às chaves S1-S3 e a IN2 às chaves S3-S4.
Para controlar o sentido, temos as seguintes combinações para o motor A(IN1 e IN2)
Para o motor B (IN3 e IN4), a tabela funciona da mesma forma.
Mãos à obra – Driver motor com Ponte H L298N - Controlando Motores com Arduino
Vamos fazer um exemplo para testar na pratica a ponte h. Neste primeiro exercício queremos testar o controle do sentido de giro dos motores A e B através do Arduino.
Componentes necessários
Para este exemplo, utilizaremos:
- Placa Arduino UNO ou similar
- Ponte H L298N - driver motor
- 2x Motores DC (pode ser feito com apenas 1)
- Fonte alimentação de 12V ou Fonte alimentação de 9V
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.
Conectando o Arduino ao computador
Conecte seu Arduino ao computador e abra a IDE Arduino.
Antes de carregar um programa, você precisa selecionar qual porta você deseja usar para fazer carregar o programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.
Você também precisa garantir que o tipo de placa apropriado está selecionado em Ferramentas(Tools) no submenu Placa (Board).
Programando
Crie um programa (sketch) e salve com o nome de “exemplo1_ponteh”.
Em seguida, insira nele o código conforme escrito abaixo:
/*Pinagem do arduino*/ //motor_A int IN1 = 2 ; int IN2 = 3 ; //motor_B int IN3 = 4 ; int IN4 = 5 ; //Inicializa Pinos void setup(){ pinMode(IN1,OUTPUT); pinMode(IN2,OUTPUT); pinMode(IN3,OUTPUT); pinMode(IN4,OUTPUT); } void loop(){ /*Inicio dos Estados do motor A*/ //Sentido 1 digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); delay(5000); //Freia Motor_A digitalWrite(IN1,HIGH); digitalWrite(IN2,HIGH); delay(5000); //Sentido 2 digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); delay(5000); //Freia Motor_A digitalWrite(IN1,HIGH); digitalWrite(IN2,HIGH); delay(5000); /*Fim dos Estados do motor A*/ /*Inicio dos Estados do motor B*/ //Sentido 1 digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); delay(5000); //Freia Motor_B digitalWrite(IN3,HIGH); digitalWrite(IN4,HIGH); delay(5000); //Sentido 2 digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); delay(5000); //Freia Motor_B digitalWrite(IN3,HIGH); digitalWrite(IN4,HIGH); delay(5000); /*Fim dos Estados do motor_B*/ }
Após escrever o código, clique em Carregar (Upload) para que o programa seja transferido para seu Arduino.
Colocando para funcionar
Se tudo deu certo, teremos o motores fazendo os seguintes movimentos:
- Motor A gira em um sentido
- Motor A freia
- Motor A gira no sentido contrario
- Motor A freia
- Motor B gira em um sentido
- Motor B freia
- Motor B gira no sentido contrario
- Motor B freia
Entendendo a fundo
Entendendo o Software
Primeiro definimos os pinos que estão conectados à ponte H para controle de cada motor.
//motor_A int IN1 = 2 ; int IN2 = 4 ; //motor_B int IN3 = 6 ; int IN4 = 7 ;
Veja que temos 2 pinos para cada moto para controle de sentido de giro.
Movimentando o motor
Para fazer o motor se movimentar, primeiro temos que informar para que direção ele deve girar:
//Motor_A //Sentido 1 digitalWrite(IN1,LOW); //0V digitalWrite(IN2,HIGH); //5V
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_A digitalWrite(IN1,HIGH); //5V digitalWrite(IN2,HIGH); //5V //Sentido 2 digitalWrite(IN1,HIGH); //5V digitalWrite(IN2,LOW); //0V
Fechamento
Que tal agora aprender a controlar a velocidade de um motor DC usando um módulo de Ponte H?
Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!! Compartilhe à vontade.
Referências Bibliográficas
[1] Guimarães, F. A. Desenvolvimento de Robô Móvel Utilizando para a Exploração de Ambientes Hostis – Dissertação de Mestrado em Engenharia de Processos Químicos e Bioquímicos, Escola de Engenharia Mauá do Centro Universitário do Instituto Mauá de Tecnologia, São Caetano do Sul, SP, Brasil, 2007.
Editado por Allan Mota e revisado por Ícaro Lobo