No último tutorial vimos como ligar um motor DC no Arduino com o auxilio de um módulo Ponte H, usando as suas entradas para variar o sentido de giro. Mas na robótica é comum termos de 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.
Como controlar a velocidade de um motor?
Um motor DC gira baseado em campos magnéticos gerados pela corrente que passa em suas bobinas. Pode 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.
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). Esta técnica consiste na geração de uma onda quadrada em uma frequência muito alta em que pode ser controlada a percentagem 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áxima 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 esta 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.
Exemplo de Código 1 – Controle de velocidade
Neste segundo exemplo, vamos verificar o controle de velocidade dos motores A e B.
Para este exemplo, utilizaremos:
- Arduino UNO
- Ponte H
- 2 Motores DC 12V (pode ser feito com apenas 1)
- Fonte alimentação de 12V
Prossiga com a montagem conforme esquema abaixo(caso use apenas um motor, basta desconsiderar o motor B:
Garanta que seu Arduino e a fonte externa estejam desligados durante a montagem.
5Agora 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 Horario 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 Horario digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); //velocidade de 0 a 255 while (velocidadeB < 255){ analogWrite(velocidadeB,velocidade); velocidade = velocidade + 10; delay(50); } //velocidade de 255 a 0 while (velocidadeB > 0){ analogWrite(velocidadeB,velocidade); velocidade = velocidade - 10; delay(50); } }
Exemplo de Código 2 – Controlo de velocidade
Caso queira fazer um código mais compacto e modularizado, temos este exemplo de implementação um pouco avançado que usa funções.
#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); } //função 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); } }
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.
Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?