Curso Arduino – #8 – Controlo de Motores DC

 

 

Neste artigo do Curso Arduino, vamos trabalhar com pequenos motores. Vamos mostrar-lhe como ligá-los ao microcontrolador e como controlar o sentido de rotação e velocidade.

Antes de começarmos a abordar aspetos particulares sobre o funcionamento dos motores DC, deve saber os dois princípios mais importantes:

  1. Nunca ligue o motor diretamente ao Arduino;
  2. É melhor não fazer ligações nenhumas antes de ler as informações seguintes!

Porquê juntar motores ao Arduino?

Controlar o sentido da rotação e a velocidade do motor abre a porta a muitas possibilidades. Com essas novas capacidades, podemos construir um robot móvel simples, que vagueie pela casa e evite obstáculos. Também podemos criar um veículo controlado remotamente através do nosso telemóvel. As possibilidades são, realmente, inúmeras!

Quais são os motores que vamos utilizar?

Neste artigo, abordaremos o princípio de controlar os populares motores DC. Estes são frequentemente utilizados em projetos de robótica. Poderá encontrar uma grande variedade de motores DC na loja online da ElectroFun.

curso arduino - #8 - motores dc
Exemplo de um motor DC.

Ainda é necessário especificar o que são motores DC. De forma geral, os motores DC são dispositivos que convertem energia elétrica em energia mecânica. Para o propósito deste artigo, falaremos de motores que consomem, em média, menos de 1A, quando alimentados por 5-9V. Essas restrições são condicionadas pelo controlador de motor utilizado, mas mais sobre o assunto adiante.

O princípio de controlo de motores é universal: quanto mais potente for o driver, maior poderá ser o motor controlado.

Porque é que não podemos ligar o motor diretamente ao Arduino?

O Arduino, mais especificamente o microcontrolador integrado, controla os sinais. A eficiência de cada saída é relativamente pequena (cerca de 20mA). É fácil supor que, 99,999% dos motores que encontrar, vão precisar de muito mais corrente. Posto isto, ao ligar um motor ao Arduino corre o risco de danificar irreversivelmente a placa.

Porque é que os exercícios práticos não incluem motores?

Tal como em tudo, para começar a controlar motores, terá de praticar (através dos exercícios práticos propostos). Como pode ver, nos exercícios propostos, existe um Arduino, uma bateria, um controlador de motor (L293D), condensadores, mas falta alguma coisa… não existem motores DC.

Mas, porquê? A verdade é que, incluir um conjunto de motores seria um desperdício do seu dinheiro. Sendo que se está a iniciar neste mundo, naturalmente não sabe quais projetos irá desenvolver futuramente. Sem saber isto, não poderá escolher os motores adequados. Porquê investir em algo que, se calhar, nunca irá utilizar?

Portanto, nos exercícios seguintes, os motores vão ser substituídos por LEDs. Será na mesma capaz de observar a mudança de direção da rotação (através do LED que acender) e a mudança da velocidade (através do brilho do LED).

Neste artigo precisará dos seguintes materiais:

Introdução às Pontes H

São necessários componentes intermédios entre o Arduino e os motores. Estes são frequentemente denominados pontes H. Estes drivers podem ser construídos a partir de vários transístores ou pode simplesmente usar um circuito integrado ponte H. Como é iniciante, o melhor é recorrer a um chip já pronto a utilizar.

O principal objetivo das pontes H é ler e converter os sinais enviados pelo microcontrolador em tamanhos compatíveis com o controlo do motor. Por exemplo, o Arduino, cujos sinais podem funcionar a um máximo de 5V/20mA, após a aplicação da ponte H, pode facilmente controlar um motor que requer 12V/1A para funcionar.

A sua primeira ponte H – L293D

No curso, vamos utilizar o chip L293D, que apesar de antigo, é barato e muito comum. A sua principal vantagem é o facto de possuir uma montagem THT, ou seja, podemos conectá-lo diretamente à breadboard.

curso arduino - #8 - motores DC

Este sistema possui 16 pinos. Vejamos a legenda de cada um deles:

curso arduino #8 controlo de motores dc

Uma das principais informações acerca da ponte H que devem ser verificadas é seu desempenho. Especificamente, a corrente que o motor poderá utilizar. O L293D possui uma corrente média por canal de 0,6A-1,2A. O que é que isso significa? Significa que, idealmente, os motores podem consumir até 0.6A, mas se, por um momento, a corrente aumentar para 1.2A, nada de mal irá acontecer. Desde que seja por um período de tempo reduzido!

Vamos agora abordar cada um dos pinos. Primeiro, os pinos de alimentação:

  • Terra (GND) – 4, 5, 12, 13;
  • Alimentação da Parte Lógica 5V (Arduino) – 16;
  • Alimentação para os Motores até 36V – 8.

Lembre-se que cada ponte tem uma queda de tensão. Isso significa que, por exemplo, se fornecer uma alimentação de 9V, o L293D gasta parte dela e, os motores recebem, no máximo, 7V. Este sistema é antigo, por isso possui uma grande queda de tensão. Outras pontes mais recentes (por exemplo: TB6612) possuem uma queda menor.

Pinos de controlo dos motores:

  • Entradas que definem a direção de rotação do 1º motor – 2, 7;
  • Entradas que definem a direção de rotação do 2º motor – 10, 15;
  • Entrada que define a velocidade do 1º motor – 1;
  • Entrada que define a velocidade do 2º motor – 9.

Para parar ou mudar a direção de rotação do motor, deverá definir os sinais de acordo com o diagrama seguinte, denominado tabela verdade:

curso arduino - #8 - controlo motores dc

Pinos dos motores:

  • Saídas do 1º motor – 3, 6;
  • Saídas do 2º motor – 11, 14.

Exercício Prático – Ponte H

Vamos falar da alimentação. Podemos alimentar o sistema com uma ou duas fontes de tensão. Se escolhermos a primeira opção, o Arduino e os motores serão alimentados a partir da mesma fonte – não aconselhamos esta configuração, pois pode levar a interrupções e resets frequentes.

Portanto, é mais seguro escolher a segunda opção, na qual o Arduino será alimentado a partir de uma fonte de alimentação separada. No nosso caso, vamos usar alimentação USB e uma bateria de 9V, a partir da qual alimentaremos os motores diretamente (o Arduino também pode ser alimentado dessa forma, mas através do estabilizador integrado).

O sistema deve ser ligado de forma semelhante ao diagrama apresentado abaixo. Lembre-se que vamos ligar 9V à placa, e não 5V!

curso arduino - #8 - motores dc

Aos cabos jumper laranja será ligado o “motor”. De qualquer das formas, leia o resto do artigo antes de realizar as ligações!

Lembre-se de ligar os condensadores, pois são eles que filtram a tensão fornecida pela bateria de 9V.

O sistema é relativamente complicado, por isso, para tornar o esquema mais organizado, e para economizarmos espaço, conectamos os dois pinos GND de cada lado do chip. Isto pode ser feito da seguinte forma, com as pernas cortadas das resistências:

curso arduino - #8 - controlo de motores DC

Está na hora de ligarmos o motor. Como foi referido anteriormente, vamos simular um motor com LEDs, para não ter de adquiri-lo. Mas como é que fazemos isso? Muito simples!

Simulação do motor

Como sabe, um LED é um elemento semicondutor, que ilumina quando a corrente flui através dele na direção certa. Portanto, se ligarmos dois LEDs em paralelo de forma a estarem conectados de forma oposta, poderemos verificar em qual direção a corrente flui – quando um LED acender e, de seguida, o outro. Por sua vez, a velocidade do motor poderá ser verificada através do brilho do LED.

Posto isto, no lugar do motor, incluímos o seguinte circuito:

curso arduino - #8 - controlo de motores dc

Assim, o esquema de ligação completo é o seguinte:

curso arduino - #8 - controlo motores DC

Programação – Controlo da direção de rotação

Vamos agora programar, tendo por base o esquema ligado anteriormente. No início, vamos abordar o controlo da rotação do motor. Deixaremos a regulação da velocidade para mais tarde. Como pode verificar, os pinos do Arduino responsáveis pelo motor são os seguintes:

  • 6 (PWM) – regulação da velocidade;
  • 7, 8 – controlo do sentido de rotação.

Se não quisermos controlar a velocidade do motor, precisamos de definir o pino 6 como high. Também podiamos ligar o cabo diretamente a 5V. No entanto, como já temos as ligações feitas, vamos usar o Arduino:

void setup() {
pinMode(6, OUTPUT); //Sinal PWM do motor para controlo da velocidade
digitalWrite(6, HIGH); //Definir permanentemente o estado high no pino 6 - velocidade máxima

pinMode(7, OUTPUT); //Pino que controla a direção da rotação do motor
pinMode(8, OUTPUT);
}

void loop() {
//Restante programa
}

Se o sistema foi ligado corretamente, depois de fazer o upload do programa não deverá acontecer nada! Agora é hora de adicionar o restante código à função loop.

Vamos supor que gostaríamos de rodar o motor 3 segundos num sentido e 3 segundos no sentido oposto (velocidade máxima). Para este fim, devemos adicionar uma parte muito simples ao programa:

void setup() {
pinMode(6, OUTPUT); //Sinal PWM do motor para controlo da velocidade
digitalWrite(6, HIGH); //Definir permanentemente o estado high no pino 6 - velocidade máxima

pinMode(7, OUTPUT); //Pino que controla a direção da rotação do motor
pinMode(8, OUTPUT);
}

void loop() {
digitalWrite(7, LOW); //Rodar para a esquerda
digitalWrite(8, HIGH);
delay(3000); //Durante 3 segundos

digitalWrite(7, HIGH); //Rodar para a direita
digitalWrite(8, LOW);
delay(3000); //Durante 3 segundos 
}

De acordo com a tabela verdade apresentada anteriormente, sabemos que o sistema funciona se uma das entradas tiver no estado low “0” e a outra no estado high “1”. O sentido da rotação depende do sinal de entrada.

Depois de fazer o upload do programa para o Arduino, os dois LEDs devem começar a piscar alternadamente. Concentre-se e entenda por que é que isso está a acontecer. Os LEDs brilham alternadamente porque, a corrente flui da saída 1 para a saída 2, e vice-versa. O piscar é possível porque estes foram inseridos inversamente. Para facilitar a compreensão, observe as seguintes imagens, em que, para além dos LEDs, também existe um voltímetro:

Uma vez o resultado é positivo e de outra vez o resultado é negativo. Neste caso, o menos mostra que a corrente flui na direção oposta à inicial.

Como já conseguimos controlar a direção da rotação do motor, é hora de abordarmos a velocidade.

Trabalho de Casa nº24

Adicione mais dois LEDs ao sistema e simule um segundo motor. Escreva um programa que realize a seguinte sequência: os dois para a esquerda, os dois em direções opostas e os dois para a direita. Entre mudanças de direção, deixe um intervalo de 2 segundos.

Programação – Controlo da velocidade

Para poder continuar, é necessário dominar os conteúdos abordados na artigo PWM, Servomecanismos e Bibliotecas. Como pode adivinhar, basta ligar um sinal PWM ao pino ENABLE1 (circuito L293D) para controlar a velocidade do motor!

Vamos agora escrever um programa simples, que rode os motores alternadamente, de forma mais lenta ou mais rápida. Lembre-se que o brilho do LED apenas é visível acima de um certo limite de duty cycle do sinal PWM. O mesmo acontece com os motores. Toda a gente terá um valor diferente. Voltaremos a isso mais tarde.

void setup() {
pinMode(6, OUTPUT); //Sinal PWM do motor para controlo da velocidade

pinMode(7, OUTPUT); //Pino que controla a direção da rotação do motor
pinMode(8, OUTPUT);
}

void loop() {
analogWrite(6, 100); //Baixa velocidade
digitalWrite(7, LOW); //Rodar para a esquerda
digitalWrite(8, HIGH);
delay(3000); //Durante 3 segundos

analogWrite(6, 255); //Velocidade máxima
digitalWrite(7, LOW); //Rodar para a direita
digitalWrite(8, HIGH);
delay(3000); //Durante 3 segundos
}

Deve verificar que um LED muda claramente o seu brilho – mas faz isso rapidamente! Agora inserir uma mudança suave na velocidade do motor.

Função for()

Vamos agora discutir uma função loop extremamente útil. A função for() permite executar uma determinada instrução, um determinado número de vezes. Vamos usá-la quando, por exemplo, pretendermos que escreva 10 números naturais consecutivos, pisque um LED 5 vezes, etc. No entanto, antes passarmos ao exemplo, vamos mostrar a sintaxe:

for (declaração de variável; condição; operação da variável) {
}

Parece complicado, mas felizmente é muito simples. Depois da palavra for, abrimos parênteses e declaramos três aspetos muito importantes. O primeiro é a declaração da variável. Como o código vai ser executado um determinado número de vezes, deverá ser guardado num local o número de vezes que já foi realizado.

Depois do ponto e vírgula, indicamos a condição. O loop é executado até que a condição deixe de ser verificada. Após o ponto e vírgula seguinte, inserimos a operação a ser executada na variável durante cada ciclo. Por fim, fechamos parênteses.

Exercício Prático – Função For()

Vamos utilizar o loop for para escrever uma saudação, 25 vezes, através de UART.

void setup() {
Serial.begin(9600); //Configuração da velocidade de transmissão

for (int i = 0; i < 25; i++) { //Executar ciclo 25 vezes
Serial.println("Bem-Vindo ao Blog ElectroFun!"); //Escrever texto indicado numa nova linha
delay(200); //Atraso de 200ms para melhor efeito
}
}

void loop() {
}

O efeito visível no terminal deverá ser o seguinte:

curso arduino - #8 - controlo motores dc

Vamos agora explicar a seguinte linha do código:

for (int i = 0; i < 25; i++) { //Executar ciclo 25 vezes

O int i = 0 significa que declaramos uma nova variável local denominada “i“, do tipo int, em que o seu valor inicial é 0. Se tiver dificuldades em perceber esta declaração, volte novamente ao artigo #3 do curso.

Neste caso, a condição é i < 25. Ou seja, enquanto a variável for menor do que 25, a instrução será repetida.

O último elemento, i++, é a soma de 1 à variável, de forma a que esta tenha registo do número de vezes que o ciclo foi realizado. Este registo também pode ser substituído por i = i + 1.

Para facilitar a compreensão da função, veja esta versão do programa:

void setup() {
Serial.begin(9600); //Configuração da velocidade de transmissão

for (int i = 0; i < 25; i++) { //Executar ciclo 25 vezes
Serial.print("Valor da variável i: ");
Serial.print(i); //Exibir valor no monitor série
Serial.print("\n"); //Passar para uma nova linha
delay(200); //Atraso para melhor efeito
}
}

void loop() {
}

Agora pode verificar facilmente os valores que a variável (0-24) assume.

Para além desta disposição, existem outras que possuem exatamente o mesmo efeito:

for (int i = 0; i <= 24; i++) { //Executar ciclo 25 vezes

ou

for (int i = 1; i <= 25; i++) { //Executar ciclo 25 vezes

ou

for (int i = 1; i < 26; i++) { //Executar ciclo 25 vezes

ou

for (int i = 0; i < 50; i = i + 2) { //Executar ciclo 25 vezes

ou até:

for (int i = 25; i > 0; i--) { //Executar ciclo 25 vezes

Como pode ver, existem muitas possibilidades! Mas é claro que, a que nós utilizamos no exemplo é a mais frequente. Agora podemos voltar à questão dos motores, isto é, à regulação suave da velocidade.

Trabalho de Casa nº25

Escreva um programa que tenha como objetivo colocar um LED a piscar 5 vezes, com a função for. Tente fazer o mesmo, mas com o uso da função while.

Trabalho de Casa nº26

Escreva um programa que leia um número entre 0 e 9 enviado via UART. Esse número deverá ser posteriormente apresentado com asteriscos “*” no monitor série.

Aceleração suave do motor

Como já conhecemos o ciclo for, podemos usá-lo para acelerar suavemente o motor. É suficiente para alterar o sinal PWM suavemente, por exemplo, a cada 25 ms.

O código é simples e a variável i é responsável pelo duty cycle do sinal PWM:

void setup() {
pinMode(6, OUTPUT); //Sinal PWM do motor para controlo da velocidade

pinMode(7, OUTPUT); //Pino que controla a direção da rotação do motor
pinMode(8, OUTPUT);

digitalWrite(7, LOW); //Rodar para a esquerda
digitalWrite(8, HIGH);
}

void loop() {
for (int i = 0; i <= 255; i++) {
analogWrite(6, i); //Aceleração suave do motor
delay(25);
}
}

Muitas vezes, os iniciantes têm problemas porque o robot não quer andar. Na maioria das vezes, verifica-se que, ou a fonte de alimentação utilizada é muito fraca, ou o sinal PWM tem pouco duty cycle. Se algum dia tiver algum problema, lembre-se de verificar estes dois aspetos!

Trabalho de Casa nº27

Escreva um programa que tenha como objetivo acelerar e parar o motor suavemente, usando duas funções for.

Sumário

Com isto, terminamos o artigo sobre o controlo de motores DC. Devido ao facto de não ter um motor, esta parte um pouco teórica para si. No entanto, achamos ter sido a melhor solução, para não ter de adquirir algo que, provavelmente, não vai voltar a usar. Mesmo sem o motor, consideramos que o assunto ficou claro e esperamos que tenha compreendido tudo. Já sabe, qualquer questão que surja pode fazê-la na secção de comentários abaixo. Até ao próximo artigo!

___________

O que achou deste artigo? Deixe o seu comentário abaixo, e partilhe nas Redes Sociais que certamente será útil e interessante para os seus amigos!

 

 

 

 Curso Arduino – #0 – Introdução

 Curso Arduino – #1 – O Básico do Arduino e o Software de Programação

 Curso Arduino – #2 – O Básico da Programação e as Portas I/O

 Curso Arduino – #3 – UART e Variáveis

 Curso Arduino – #4 – Conversor Analógico-Digital

 Curso Arduino – #5 – PWM, Servomecanismos e Bibliotecas

 Curso Arduino – #6 – UART (continuação) e Servos

 Curso Arduino – #7 – Displays

 Curso Arduino – #8 – Controlo de Motores DC

 Curso Arduino – #9 – Sensor de Distância Ultrassónico HC-SR04 e Novas Funções

 Curso Arduino – #10 – Gráficos, Números Aleatórios e Condições