Braço Robótico com Arduino

Braço Robótico com Arduino

Você com certeza já viu, em vídeos ou livros, aqueles robôs com garras que “pegam” os objetos nas fábricas, não é mesmo? Nesse contexto, os braços robóticos ou garras robóticas são equipamentos fundamentais na execução de grandes processos produtivos, em especial nas linhas de produção, onde se deseja manusear uma série de objetos. Sob o mesmo ponto de vista, neste tutorial, você vai aprender a montar e programar um braço robótico semelhante de maneira simples, usando Arduino. do mesmo modo, você poderá utilizar o braço em conjunto com outros projetos, como um carrinho robô, e o que mais a sua criatividade permitir!

 

Braços robóticos industriais em linha de produção
Braços robóticos industriais em linha de produção

 

Braço robótico controlado por Arduino
Braço robótico controlado por Arduino

kit robotica educacional com Arduino ESP ou Microbit

 

Conforme apresentado na introdução, O braço robótico proposto nesse tutorial possui um mecanismo de funcionamento bastante simples. Isso porque ele é composto por quatro partes, cada uma acoplada por um servo motor diferente. Do mesmo modo, o usuário pode controlar esses motores, um a um, de maneira analógica, o que possibilita diversas combinações de movimentos.

Além disso, para montar a estrutura física do braço robótico, siga a sequência de passos disponível no link abaixo.

Manual de Montagem - Braço Robótico.

Partes de um braço robótico: cada uma controlada por um servo motor
Partes de um braço robótico: cada uma controlada por um servo motor

 

Controle e montagem

Com o objetivo de atuar em pequenos projetos de robótica, o braço robótico controlado por Arduino, antes de mais nada, é uma ferramenta de baixo custo e de fácil montagem. Seus movimentos são guiados por 4 servo motores, os quais, por sua vez, podem ser controlados por potenciômetros ou por módulos joystick, através da placa Arduino.

Componentes usados para controle do braço robótico
Componentes usados para controle do braço robótico

 

No nosso caso à primeira vista, usaremos dois módulos joystick do tipo KY-023. Bem como você pode observar, esses componentes são semelhantes àqueles utilizados igualmente em vídeo games, e seu princípio de funcionamento ocorre através da atuação de dois potenciômetros e de um botão interno. Em suma, o dispositivo conta com 5 entradas, sendo duas para alimentação, uma digital para acionamento do botão, e as duas últimas para controle analógico do movimento nos eixos x e y.

 

Entradas do módulo Joystick KY-023
Entradas do módulo Joystick KY-023

 

Mãos à Obra - Braço Robótico com Joystick

Componentes necessários

Montando o circuito de controle do braço robótico

Inicialmente, vamos montar o circuito elétrico (hardware) do projeto.  Porém, antes de tudo, desligue o cabo USB de seu Arduino e faça a montagem seguindo a ligação das figuras abaixo.

 

Parte 1: conexão dos joysticks ao Arduino
Parte 1: conexão dos joysticks ao Arduino

 

Além disso, fique atento à conexão dos pinos de ambos os módulos joysticks, conforme as imagens abaixo:

Joystick 1, para controle dos motores da base e da altura do braço.
Joystick 1, para controle dos motores da base e da altura do braço.

 

Joystick 2, para controle dos motores da garra e do ângulo do braço.
Joystick 2, para controle dos motores da garra e do ângulo do braço.

 

Além da conexão dos joysticks, você deve conectar os servo motores do braço robótico ao Arduino. Sendo assim, utilizando o mesmo Arduino da montagem anterior, faça a seguinte ligação entre os componentes.

Parte 2: esquema de conexão dos servo motores ao Arduino.
Parte 2: esquema de conexão dos servo motores ao Arduino.

Alimentação do projeto

Você deve ter observado, na parte 2 da montagem do circuito, o barramento o positivo dos servo motores está conectado ao "Vin" e não ao pino 5V, como fazemos usualmente. Isso ocorre porque, para alimentar esses motores, precisaremos de uma tensão superior a 5V. Para isso, utilizamos 4 pilhas, cada uma com 1,5V, e fazemos a seguinte conexão dessas pilhas ao Arduino:

Pilha e adaptador conectados ao Arduino.
Pilha e adaptador conectados ao Arduino.

 

Adaptador.
Adaptador.

Ademais, fique atento a essa conexão, verificando sempre se o positivo da pilha está conectado ao positivo do adaptador.

Programando o Arduino para controlar o Braço Robótico

Importação da biblioteca "VarSpeedServo"

Em paralelo à montagem do circuito, você deve implementar o código. Porém, antes disso, instale a biblioteca "VarSpeedServo" em seu computador, clicando no link abaixo:

VarSpeedServo-master

Além disso, para usar essa biblioteca no código, siga a sequência de passos abaixo:

1- Após a criação do sketch, selecione o ícone "sketch" e, em seguida, clique em "Adicionar biblioteca.ZIP".

2- Agora, escolha o local onde você salvou o arquivo .zip da biblioteca. Imediatamente, clique no arquivo e no botão Abrir.

Dessa forma, após seguir os passos acima, você vai receber a mensagem de que a biblioteca está instalada e pode conferir em Sketch/Incluir Biblioteca.

 

 

Com isso, após a instalação da instalação da biblioteca, salve o sketch, de preferência, com o nome de “programa_braco_joystick”. Logo depois de salvar, copie e cole o código abaixo.

#include <VarSpeedServo.h> //biblioteca para controle da velocidade e da posição dos servos

#define servoBase   3  // Porta Digital do Servo da Base
#define servoAltura 4  // Porta Digital do Servo da Altura do Braço
#define servoAngulo 5  // Porta Digital do Servo do Ângulo do Braço
#define servoGarra  6  // Porta Digital do Servo da Garra

#define potBase    A0  // Porta Analógica do Potenciometro para Controle da base
#define potAltura  A1  // Porta Analógica do Potenciometro para Controle da altura do braço
#define potAngulo  A2  // Porta Analógica do Potenciometro para Controle do ângulo do braço
#define potGarra   A3  // Porta Analógica do Potenciometro para Controle da garra

#define botao_trava     8  // Porta Digital do Botao trava
#define botao_destrava  9  // Porta Digital do Botao trava
 
//Instanciação dos Objetos de Controle dos Servos

VarSpeedServo base; 
VarSpeedServo altura;
VarSpeedServo angulo;
VarSpeedServo garra;

//Variaveis para cálculo dos angulos
int leitura_Base;
int valor_Base;
int leitura_altura;
int valor_altura;
int leitura_angulo;
int valor_angulo;
int leitura_garra;
int valor_garra;

//Variaveis para controle dos botões
int estado_trava, estado_destrava;
int anterior_trava = HIGH;
int anterior_destrava = HIGH;
boolean travado = false;

void setup(){
  pinMode(botao_trava, INPUT_PULLUP);
  pinMode(botao_destrava, INPUT_PULLUP);

  //Usa o LED do Arduino para informar estado de congelado
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
    
  //Configuração das Portas dos Servos
  base.attach(servoBase);
  altura.attach(servoAltura);
  angulo.attach(servoAngulo);
  garra.attach(servoGarra); 
}


void loop() {
 
  if (!travado) {
    leitura_Base = analogRead(potBase); //Leitura do Angulo do Potenciometro
    valor_Base = map(leitura_Base, 0, 1023, 0, 180); //Conversão do valor do potenciometro (de 0 até 1024) para o angulo (de 0 até 180)
    base.slowmove(valor_Base, 30); //envio do ângulo para o servo
                          
  
    leitura_altura = analogRead(potAltura);           //Leitura do Angulo do Potenciometro
    valor_altura = map(leitura_altura, 0, 1023, 180, 0); //Conversão do valor do potenciometro (de 0 até 1024) para o angulo (de 0 até 180) 
    altura.slowmove(valor_altura, 40); //envio do ângulo para o servo
    
    leitura_angulo = analogRead(potAngulo);           //Leitura do Angulo do Potenciometro
    valor_angulo = map(leitura_angulo, 0, 1023, 180, 0); //Conversão do valor do potenciometro (de 0 até 1024) para o angulo (de 0 até 180)
    angulo.slowmove(valor_angulo,40);                          //Envio do angulo para o Servo 
    
    leitura_garra = analogRead(potGarra);               //Leitura do Angulo do Potenciometro
    valor_garra = map(leitura_garra, 0, 1023, 0, 50); //Conversão do valor do potenciometro (de 0 até 1024) para o angulo (de 0 até 180)
    garra.slowmove(valor_garra, 40); //envio do ângulo para o servo                    
  }

  //Se o botao de congelar foi apertado
  estado_trava = digitalRead(botao_trava); 
  if (estado_trava != anterior_trava) {
     travado = true;
     digitalWrite(13, HIGH); //Informa o estado de congelado no LED interno do Arduino
  }
  anterior_trava = estado_trava;

  //Se o botao de descongelar foi apertado
  estado_destrava = digitalRead(botao_destrava); 
  if (estado_destrava != anterior_destrava) {
     travado = false;
     digitalWrite(13, LOW); //Informa o estado de congelado no LED interno do Arduino
  }
  estado_destrava = anterior_destrava;

}

Dessa forma, após testar tanto o código quanto a montagem, o resultado deve ser semelhante ao que aparece no gif:

Entendendo a fundo

Software

Vamos agora partir para a análise do código. Nele, podemos encontrar uma série de conceitos, como os de entradas analógicas e digitais, PWM e funções referentes ao controle de servo motores.

Biblioteca VarSpeedServo

Logo no início do programa, podemos observar a inclusão da biblioteca "VarSpeedServo.h".

#include <VarSpeedServo.h> //biblioteca para controle da velocidade e da posição dos servos

Basicamente, essa biblioteca conta com uma série de funções específicas para controlar tanto a posição (em graus) quanto a velocidade de um servo motor.

Configuração dos motores

Neste código, cada um dos quatro servo motores é dado como um objeto. Consequentemente, devemos nomear cada um deles e fazer sua instanciação.

VarSpeedServo base; //servo para controle do motor da base do braço
VarSpeedServo altura; //servo para controle do motor da altura do braço
VarSpeedServo angulo; //servo para controle do motor do ângulo do braço
VarSpeedServo garra; //serve para controle do motor da garra.

Além disso, a partir do método "attach", é feita a configuração das portas dos servos.

//Configuração das Portas dos Servos
  base.attach(servoBase); // servo base localizado no pino 3
  altura.attach(servoAltura); // servo altura localizado no pino 4
  angulo.attach(servoAngulo); //servo angulo localizado no pino 5
  garra.attach(servoGarra); //servo garra localizado no pino 6

Função analogRead()

A função "analogRead", como o nome já indica, tem como objetivo ler o valor de um pino analógico do Arduino. Sendo assim, essa função irá mapear tensões entre 0V e 5V, a partir do potenciômetro, para valores inteiros de 0 a 1023.

leitura_Base = analogRead(potBase); //Leitura do Angulo do Potenciometro

Já a variável "leitura_base", por sua vez,  serve para armazenar esse valor de 0 a 1023, o qual representa a leitura do potenciômetro.

Função map()

A função "map()" é uma função matemática de referência do Arduino. Nesse sentido, ela é tem como objetivo fazer a conversão de valores de um determinado intervalo numérico para o outro.

valor_Base = map(leitura_Base, 0, 1023, 0, 180); //Conversão do valor do potenciometro (de 0 até 1024) para o angulo (de 0 até 180)

Assim, no nosso código, tal função atua da seguinte maneira: o valor lido no potenciômetro, entre 0 e 1023, e armazenado na variável "leitura_base" é convertido para um valor em ângulo, de 0 a 180. Em seguida, esse valor angular obtido é armazenado na variável "valor_base".

Método slowmove

base.slowmove(valor_Base, 30); //envio do ângulo para o servo

Nessa parte do código, o método "slowmove" é aplicado a cada um dos objetos, ou melhor, a cada um dos motores: base, ângulo, altura e garra. Dessa forma, tal método tem como parâmetros a posição angular ("valor_base") e a velocidade (30) com que o motor deve operar.

Controle dos botões

Ambos os joysticks possuem botões: o botão 8, no joystick 2 realiza a tarefa de travar os movimentos dos motores; já o botão 9, no joystick 1, tem a função de destravar esses motores. Dessa forma, a lógica desse mecanismo é apresentada no seguinte trecho de código:

//Se o botao de travar foi apertado
  estado_trava = digitalRead(botao_trava); 
  if (estado_trava != anterior_trava) {
     travado = true;
     digitalWrite(13, HIGH); //Informa o estado de travado no LED interno do Arduino
  }
  anterior_trava = estado_trava;

  //Se o botao de destravar foi apertado
  estado_destrava = digitalRead(botao_destrava); 
  if (estado_destrava != anterior_destrava) {
     travado = false;
     digitalWrite(13, LOW); //Informa o estado de destravado no LED interno do Arduino
  }
  estado_destrava = anterior_destrava;

}

Inicialmente, se a o botão de travamento for pressionado, seu estado é alterado, e, devido a isso, a variável de controle "travado" receberá o valor lógico "true".

//Se o botao de travar foi apertado
  estado_trava = digitalRead(botao_trava); 
  if (estado_trava != anterior_trava) {
     travado = true;
     digitalWrite(13, HIGH); //Informa o estado de congelado no LED interno do Arduino
  }
  anterior_trava = estado_trava;

Do mesmo modo, quando o botão de destravamento estiver pressionado, seu estado também será alterado. No entanto, nesse caso, a variável de controle "travado" receberá o valor lógico "false".

//Se o botao de descongelar foi apertado
estado_destrava = digitalRead(botao_destrava); 
if (estado_destrava != anterior_destrava) {
travado = false;
digitalWrite(13, LOW); //Informa o estado de congelado no LED interno do Arduino
}
estado_destrava = anterior_destrava;

Em paralelo a isso, no início do algoritmo, a condição estabelecida é de que, para que os motores atuem, a variável "travado" deve receber o valor lógico "false". Dessa forma, consequentemente, a condição de acionamento dos motores será satisfeita somente se o botão de destravamento for pressionado.

Fechamento

Enfim, esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto! Compartilhe à vontade.


Como usar o Shield Ponte H L293D com Arduino

Controle de motores DC com o Shield Ponte H L293D e Arduino

Em nossos tutoriais anteriores nós mostramos como você pode controlar motores DC utilizando um CI Ponte H L293D e um módulo driver motor com ponte H L298N. Neste tutorial iremos fazer basicamente a mesma coisa, no entanto, vamos utilizar uma ferramenta diferente para controlar motores DC: o Shield Ponte H L293D.

Você pode conferir os nossos artigos anteriores sobre esse tema aqui:

O que é uma ponte H

De uma maneira bem básica, as pontes H são circuitos que normalmente são utilizados quando queremos inverter a corrente elétrica em uma determinada carga. Muitas vezes esta inversão do sentido da corrente, caracterizada também pela inversão dos potenciais nos terminais da carga, é chamada de inversão de polaridade.

Conforme veremos neste tutorial, este tipo de recurso é muito utilizado no controle do sentido de giro em motores DC. Em linhas gerais, o que uma ponte H precisa fazer é fornecer o caminho para que a corrente possa passar pela carga nos dois sentidos e também, caso necessário, cessar o fornecimento de corrente proveniente da fonte para a carga.

 

Diagrama esquemático de uma ponte H
Ponte H

 

Podemos ver na figura que a ponte H possui quatro espécies de interruptores ou chaves que podem ser controlados de maneira independente. Note que as diversas combinações possíveis entre os estados aberto e fechado de cada uma das chaves fazem com que os caminhos percorridos pela corrente elétrica sejam diferentes.

As configurações disponíveis para o funcionamento adequado de um motor, de acordo com o nosso esquemático, são:

  • S1 e S4 fechadas, S2 e S3 abertas: neste caso, a corrente passa pelo motor em um determinado sentido, fazendo-o girar em uma direção;
  • S1 e S4 abertas, S2 e S3 fechadas: nesta situação, a corrente passará pelo motor no sentido inverso do anterior, fazendo-o girar na direção contrária;
  • S1 e S3 abertas ou S2 e S4 abertas: o motor não irá girar, porque não há corrente elétrica passando por ele.

O Shield L293D

As placas Arduino possuem uma limitação de corrente que pode ser fornecida através das suas portas de saída digital, de modo que componentes que precisam de grande quantidade de corrente não devem ser acionados diretamente, como é o caso de um motor DC. Por este motivo, torna-se necessária a utilização de drivers para motores.

Para realizar o controle de motores você pode utilizar o CI L293D, no entanto, uma outra alternativa é utilizar o Shield Ponte H L293D, que consiste em uma estrutura já pronta, também composta por chips L293D. Com esse shield você consegue controlar até 4 motores DC de maneira independente, e também motores de passo e servomotores.

Podemos citar algumas vantagens de utilizar o Shield L293D no desenvolvimento dos seus projetos:

  • Você não precisa realizar a grande maioria das conexões, pois ao encaixar em cima do seu Arduino, ele estará pronto para ser utilizado;
  • Por se tratar de um componente feito especialmente para o controle de motores, foi adequadamente projetado para desempenhar esta funcionalidade, com os dispositivos eletrônicos de segurança já embutidos na sua estrutura.

Veja os componentes presentes na placa do Shield Ponte H L293D:

Componentes do Shield L293D
Componentes do Shield L293D

Diferenças entre os CI L293D e L298N

Você deve ter percebido na introdução deste tutorial que os elementos que nós mais utilizamos para realizar o acionamento de motores DC com as placas Arduino são os CIs L293D e L298N. Nós abordamos a utilização destes dois componentes nos tutoriais apresentados anteriormente, mas talvez uma pergunta fique no ar: quais são as principais diferenças entre eles?

Bom, a principal diferença entre eles é que o CI L298 possui uma capacidade de condução de corrente de até 2A por canal, suportando uma tensão de até 45V. No caso do CI L293D, esta capacidade de condução de corrente é reduzida para 600mA com uma tensão máxima de operação de 36V.


Mãos à obra - Controlando motores com o Shield Ponte H L293D

Componentes necessários

Para realizar este tutorial, você vai precisar dos seguintes componentes:

Montando o projeto

Para implementar este projeto, primeiramente, você precisa encaixar o Shield Ponte H L293D sobre o Arduino e em seguida ligar os terminais positivo e negativo do seu motor em uma das quatro entradas para motores DC existentes em sua estrutura.

Este shield permite que você utilize uma alimentação externa exclusiva para os motores. Como nós iremos recorrer a esta alimentação, devemos retirar o jumper especificado na figura abaixo para fazer com que o shield controle o motor fazendo o uso da fonte externa citada.

Programando

Para desenvolver esta aplicação, nós utilizamos uma biblioteca chamada AFMotor.h, sendo assim, caso você não tenha esta biblioteca baixada no seu computador, basta clicar aqui para realizar o download dela.

#include <AFMotor.h>

AF_DCMotor motor(1);

void setup() {
  motorDC.setSpeed(255);
  motorDC.run(FORWARD);
  delay(2000);
  motorDC.setSpeed(0);
  motorDC.run(RELEASE);
}

void loop() { }

Colocando para funcionar

Após carregar este código para sua placa Arduino, ele fará com que o motor comece a girar, e após dois segundos, pare.


Entendendo a fundo

Software

Neste ponto, serão demonstrados todos os passos para o desenvolvimento do código que deve ser inserido no Arduino UNO para que seja possível controlarmos um motor DC utilizando o Shield Ponte H L293D.

– Incluindo a biblioteca que será utilizada

O primeiro passo que devemos realizar consiste na inclusão da biblioteca adequada para permitir a interação do Shield Ponte H L293D com o Arduino UNO. Neste tutorial, nós utilizamos uma biblioteca chamada AFMotor.h, que pode ser obtida aqui.

#include <AFMotor.h>

– Criando o objeto da classe AF_DCMotor

Após incluir a biblioteca do shield, devemos criar um objeto chamado motorDC, que está conectado aos terminais referentes ao motor 1 do nosso shield. Caso você queira utilizar mais de um motor, basta criar mais um objeto e utilizar um outro algarismo como argumento do objeto (entre 1 e 4, referente a cada par de terminais de conexão para motores DC).


Considerações finais

Neste tutorial, demonstramos como você deve proceder para realizar acionamentos de motores DC com o Shield Ponte H L293D.

Apenas como uma informação complementar, além dos nossos tutoriais sobre o acionamento dos motores, também temos um conteúdo muito legal sobre o controle de velocidade em motores DC utilizando um Driver Motor com ponte H L298N. Clique aqui embaixo e confira:

Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões. Lembre-se de deixar suas dúvidas nos comentários abaixo.

 


Medindo rotação de motores com osciloscópio

Medindo rotação de motores com osciloscópio

Osciloscópios são instrumentos de medição de sinais elétricos cujos resultados são apresentados como gráficos em dois eixos. Os eixos mais comuns são o de diferença de potencial (eixo vertical) e o eixo da frequência (eixo horizontal). Com o objetivo de medir a rotação de um motor, pode-se fazer o uso de diversos instrumentos de medição, entre eles o osciloscópio. Como comparação, o instrumento de medição mais comum usado em trabalho de instalações elétricas prediais, o multímetro, tem excelente aplicação quando os sinais analisados na medição tem alteração gradual. Todavia, caso a alteração seja dinâmica, ou a variável de interesse seja a própria alteração (crescimento da curva de tensão em um capacitor por exemplo) o osciloscópio se torna um equipamento bem mais interessante que o multímetro.

kit arduino robótica educacional

O osciloscópio

Os osciloscópios são capazes de fornecer valores de amplitude, frequência, largura do impulso, além da forma e do padrão do sinal que está sendo medido. A medida é obtida através de um processo semelhante ao que ocorre no caso dos multímetros, ou seja, são utilizados apenas dois cabos no local onde desejamos obter uma resposta. A vantagem sobre o multímetro é que o tempo de amostragem do osciloscópio é muito superior.

Figura 1: Exemplo de osciloscópio

Neste tutorial, apresento uma forma de utilizar o osciloscópio para medir a rotação de um motor elétrico, utilizando da ideia da taxa de amostragem e frequência de impulsos. Para esse uso é necessário introduzir o conceito de um componente que será utilizado, o sensor hall.

O sensor hall

Um sensor Hall ou sensor de efeito hall é um transdutor, isto é, um dispositivo utilizado em sistemas de medição que recebe um estímulo e responde com um sinal de tensão. No caso do sensor hall, esse estímulo é a presença de um campo magnético. Sensores Hall podem ser tanto analógicos, sendo capazes de enviar diferentes sinais de tensão para diferentes intensidades de campos magnéticos, quanto digitais, que enviam sinal lógico (alto ou baixo) na presença ou não do campo magnético. Por exemplo, um sensor hall digital alimentado com 5 Volts envia constantemente sinal lógico baixo 0 Volts em sua saída, na presença de um campo magnético que  ative o transdutor o sinal passa a ser alto até que o campo não seja mais sentido pelo dispositivo.

Mãos à obra - Medido a rotação com um osciloscópio

A fim de medir a rotação de um motor elétrico, um ímã é fixado em seu rotor. Um sensor hall digital é posicionado de modo que quando o ímã gira, seja possível captar o campo magnético através do sensor. Ademais, o sinal de saída do sensor de efeito hall é  ligado à ponta de prova do osciloscópio. O motor em funcionamento faz com que o ímã fixo no eixo do rotor acompanhe o movimento de rotação do motor e passe a girar também. O movimento do imã provoca uma reação no sensor com certa frequência e esse valor de frequência nos permite calcular a velocidade do motor.

Componentes necessários

  • Osciloscópio
  • Imã (o imã deve ser de tamanho e força de atração que não impossibilite a medição)
  • Sensor hall digital (olhar no datasheet do sensor a necessidade de um resistor entre os terminais do sensor)

Procedimento

Fixe o imã no eixo do motor que deseja medir a rotação. A nossa recomendação é que você utilize uma resina de base epóxi ou fita de alumínio. Uma vez que a alta velocidade do motor  pode forçar o ímã a ser arremessado, a fixação incorreta pode oferecer certo perigo.

 

Figura 2: Detalhe da fixação do ímã com fita de alumínio

 

Com o datasheet do sensor hall digital em mão, verifique a necessidade de um resistor entre os terminais dele. Depois alimente o sensor segundo as especificações do fabricante, através de uma fonte de bancada, baterias ou outros métodos.

 

Figura 3: Montagem do Sensor Hall na Protoboard

 

A ponta de prova do osciloscópio deve ser ligada na saída do sensor hall, e o outro terminal deve ser aterrado junto do GND (ground)  do sensor. Posicione o sensor de efeito hall próximo ao ímã, de modo que quando o motor girar o sensor seja capaz de sentir a presença do campo magnético. Esse procedimento é através de tentativa e erro, pois depende da intensidade do ímã utilizado e de quão sensível é o sensor escolhido.

 

Figura 4: Sensor Hall próximo ao ímã fixo no eixo do motor

 

Para exemplificar, um sensor hall KY_003 é capaz de sentir o campo proveniente de um ímã de neodímio a uma distância média de 1 cm entre eles.

 

Figura 5: Sensor KY_003

 

Ligue o motor, o osciloscópio e certifique que a medida está sendo realizada. Possíveis erros nessa etapa estão relacionados com mal contato dos componentes ou da ponta de prova do osciloscópio. Portanto, certifique que erros não estejam ocorrendo e prossiga . Outro erro possível está nas configurações do osciloscópio, que pode estar exibindo valores de tensão em uma faixa maior ou menor que a necessária. Verifique o manual dos equipamentos  faça os ajustes necessários.

 

Figura 6: Montagem de bancada

Resultados obtidos

Com base em todo o procedimento, observe o valor de frequência com que o pulso do sensor acontece. O valor informado diz quantas vezes o pulso acontece em um segundo, ou seja o número de voltas do motor em um segundo. Utilizando matemática simples é possível determinar o número de voltas por minutos, efetuando a seguinte regra de 3:

 

pulsos em um segundo — 1 segundo

velocidade em rpm — 60 segundos

 

O resultado desse cálculo fornece a velocidade do motor medida em rpm. É possível, conforme aplicação do motor, utilizar do mesmo sistema para medir a rotação e com alguns cálculos obter valores em m/s ou km/h.

Considerações finais

A possibilidade de adaptação do método existe, com a utilização de um Arduíno por exemplo. Os pulsos do sensor podem ser contados, e transformados em velocidade da mesma maneira. Um exemplo de utilização no Arduíno está relacionada ao acionamento e controle do motor utilizado o Arduíno. É possível utilizar o valor da velocidade tanto como feedback para o controlador, quanto para variável de saída.

Figura 7: Gráfico plotado no MatLab com dados adquiridos pelo Arduíno

Saber a velocidade do motor é útil em vários aspectos. Testes de bancadas para melhoria em plantas de controle por exemplo. Com base nos valores de velocidade oferecido pelo método e tensão/corrente pela fonte é possível modificar algum parâmetro da planta de controle. Seguindo esse raciocínio, a utilização do método é útil em um serie de aplicações e seu baixo custo o torna atrativo.


Circuito Integrado Ponte H L293D - Controlando motor DC no Arduino

Controlando motor DC com o CI Ponte H L293D

Neste tutorial, você aprenderá a controlar motores DC utilizando o Circuito Integrado (CI) ponte H L293D. Aqui nós abordaremos a função dos CI's, o uso de uma ponte H e finalizaremos com a utilização do CI ponte H L293D em conjunto com um Arduino UNO.

O que é um CI?

CI é uma abreviação para Circuito Integrado. Hoje em dia, podemos encontrar Os circuitos integrados em quase todos os equipamentos eletrônicos e é inegável que eles revolucionaram o mundo da eletrônica. Os circuitos integrados foram inventados Em meados do século XX, com o avanço da área da computação.Os CI's vieram para reduzir o espaço que os componentes eletrônicos dos computadores ocupavam, incorporando miniaturas de diversos componentes: transistores, diodos, resistores e capacitores, em uma pequena lâmina de silício.

O que é uma ponte H?

Na robótica, para locomoção de robôs, os motores de corrente contínua ou motores DC (direct current), são muito utilizados. Esses motores demandam de uma corrente superior à que as portas do Arduino conseguem fornecer, portanto, se estes forem utilizados usado de forma incorreta, podem acabar danificando a porta em questão e até mesmo a placa como um todo.

As portas do Arduino podem fornecer uma corrente máxima de 40mA nas portas digitais.

Motor DC

O problema da alta corrente poderia facilmente ser resolvido com uso de transistores, porém, no momento em que quiséssemos realizar a inversão do motor teríamos um problema em função da quantidade de transistores requerida. Basicamente, a movimentação de um motor DC ocorre quando este é  submetido a uma corrente contínua, no entanto, caso a polaridade da alimentação do mesmo seja alterada, este passará a se movimentar no sentido contrário. Dessa forma para cumprir este objetivo, nós utilizamos o circuito ponte H, que por sua vez, consiste em quatro transistores necessários para a realização da inversão da polaridade.

Usando uma Ponte H para controlar motores

A ponte H é uma configuração eletrônica que permite controlar a direção e a velocidade de motores DC. É chamada de "ponte" porque, visualmente, se assemelha a uma ponte em esquemas elétricos, e "H" devido à sua forma.

O que pode ser feito com uma Ponte H

Com uma ponte H, podemos controlar a direção de rotação de um motor DC simplesmente invertendo a polaridade de sua alimentação. Além disso, usando modulação por largura de pulso (PWM), podemos controlar a velocidade do motor.

Modelos mais conhecidos de Ponte H

Existem diversos CI's populares que contêm uma ponte H, como o L298 e o L293. O L298 é capaz de controlar motores mais potentes em comparação ao L293D, mas ambos são amplamente usados em projetos de robótica e automação.

Como funciona a ponte H?

Legenda

As pontes H consistem em um conjunto de quatro chaves que são acionadas de forma alternada. De acordo com a configuração entre as chaves, temos o motor se movimentando em um sentido, no sentido contrário, ou desligado.

Quando as quatro chaves estão abertas, o motor está desligado, como mostra o exemplo da esquerda. Quando o par S1-S3 estiver acionado, isto é, quando as chaves em questão estiverem fechadas, o motor girará em um sentido, como mostra o exemplo do centro. Em contrapartida, quando o par S2-S4 estiver acionado, o motor girará em sentido contrário, como mostra o exemplo da direita.

Circuito integrado Ponte H L293D

O CI L293D é utilizado com o propósito de possibilitar o controle de motores e a velocidade dos mesmos. As vantagens do uso desse CI são a baixa complexidade e a presença de dois circuitos ponte H, isto é, pode-se utilizá-lo no controle de dois motores simultaneamente. Na figura abaixo podemos ver a pinagem do CI.

Legenda

Os pinos Enable são utilizados para habilitar as portas de saída e também podem ser utilizados para controle da velocidade do motor. O CI L293D pode suportar dois motores para controle simultâneo, neste caso, liga-se cada porta do motor em uma porta de saída do mesmo lado.

Diferenças entre o L293D e o L298

O L293D e o L298 são dois drivers de motor muito populares. O L293D é mais compacto e possui dois circuitos ponte H, enquanto o L298 é mais robusto e pode lidar com correntes mais altas. Uma vantagem do L293D é que ele possui diodos de proteção internos, enquanto no L298, eles precisam ser adicionados externamente.

Aplicações do L293D

O L293D é versátil e pode ser usado para controlar motores DC e motores de passo. Além disso, ele pode ser encontrado em shields e módulos, tornando sua implementação mais fácil e rápida. Usar um shield ou módulo facilita a conexão com plataformas como o Arduino e também oferece proteções adicionais ao circuito.

Shields e Módulos

Existem shields e módulos disponíveis no mercado que integram o L293D, facilitando a conexão com microcontroladores. Usar esses módulos simplifica o processo de montagem e oferece proteções adicionais, como diodos e capacitores. No entanto, em aplicações específicas, pode ser mais vantajoso criar seu próprio circuito.


Mãos à obra - Controlando motor DC - CI Ponte H L293D

Agora, vamos testar o CI L293D para fazermos a inversão dos motores A e B.

Componentes necessários

Para esse exemplo, utilizaremos:

Montando o projeto

Prossiga com a montagem para os dois motores conforme esquema abaixo. Em seguida, abordaremos a montagem do circuito para uso de um único motor.

Garanta que seu Arduino e a fonte externa estejam desligados durante a montagem.

Esquema de montagem do L293D com Arduino Uno
Esquema de montagem do L293D com Arduino Uno com dois motores

Esquema de montagem do L293D com Arduino Uno com um motor
Esquema de montagem do L293D com Arduino Uno com um motor

Conectando o Arduino ao computador

Conecte seu Arduino ao computador e abra a IDE Arduino.

Primeiramente, selecionaremos qual placa e porta você deseja usar para fazer o upload do programa no Arduino. Dentro do Arduino IDE, clique no menu Ferramentas(tools) e abra o submenu Placa(Board) e selecione a placa que você usará no projeto.

 

Em seguida, no menu Ferramentas(Tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado. Geralmente aparece o nome da placa Arduino: “COM3 (Arduino/Genuino Uno)”.

Programando

Crie um no programa (sketch) e salve com o nome de “controle_motores”.

Para controlarmos os motores é necessário o uso da biblioteca específica.

-Instalando a biblioteca

Para download da biblioteca, clique aqui >> Biblioteca L293D

Descompacte a pasta "Firmware". Em seguida, basta mover a pasta para o local:

Windows: “Meus documentos\Arduino\libraries”

Mac: “Documents/Arduino/libraries”

Depois desse processo, a biblioteca estará disponível em “Sketch -> Incluir Biblioteca” na próxima vez que o IDE for aberto.

-Código exemplo

Com a biblioteca instalada e o programa salvo, escreva o seguinte código nela.

//Controlando motores DC com L293D
#include "Arduino.h"
#include "DCMDriverL293D.h"

#define ENABLE_1  13
#define IN_1  12
#define IN_2  11
#define ENABLE_2  10
#define IN_3  9
#define IN_4  8

DCMDriverL293D Motor(ENABLE_1,IN_1,IN_2,ENABLE_2,IN_3,IN_4);

void setup() 
{
   
}
void loop() 
{
    
    Motor.setMotorA(200,1);//gira um lado em um sentido
    delay(2000);
    Motor.setMotorA(200,0);//gira em sentido contrário
    delay(2000);
    Motor.stopMotors(); //para os motores
    delay(2000);
    Motor.setMotorB(200,1);//gira o outro lado em um sentido
    delay(2000);
    Motor.setMotorB(200,0);//gira em sentido contrário
    delay(2000);
    Motor.stopMotors();
    delay(2000);
    }

Colocando pra funcionar

Se seu projeto está com tudo certo, teremos os motores realizando os movimentos:

  • Motor A gira em um sentido por dois segundos,
  • Motor A gira pelo sentido oposto por dois segundos,
  • Motores param por dois segundos,
  • Motor B gira em um sentido por dois segundos,
  • Motor B gira pelo sentido oposto por dois segundos,
  • Motores param por dois segundos.

Entendendo a fundo

Entendendo o Software

No software, começamos com a inclusão das bibliotecas necessárias.

#include "Arduino.h" 
#include "DCMDriverL293D.h"

Depois definimos os pinos que estão conectados ao CI.

#define ENABLE_1 13 
#define IN_1 12 
#define IN_2 11 
#define ENABLE_2 10 
#define IN_3 9
#define IN_4 8

Então definimos ao Arduino o uso dos motores por:

DCMDriverL293D Motor(ENABLE_1,IN_1,IN_2,ENABLE_2,IN_3,IN_4);

Movimentando os motores

Para fazermos os motores se movimentarem precisamos informar sua direção e sua velocidade:

Motor.setMotorA(200,1);//gira um lado em um sentido 
delay(2000);

Nesta movimentação dos motores, se alterarmos o primeiro parâmetro entre 0 e 255, alteraremos sua velocidade, e se alterarmos o segundo parâmetro entre 0 e 1, alteramos sua direção de giro. Para movimentar o outro motor é necessário apenas trocar setMotorA por setMotorB.

 


Considerações finais

Esperamos que se divirtam com seus motores e seus projetos de robótica. Deixe suas dúvidas, sugestões, ou até mesmo a foto do seu projeto nos comentários.

Mais detalhes em instalação de bibliotecas em DHT11 e DHT22 | Sensor de umidade e Temperatura com Arduino.

Entenda mais sobre protoboard's em Como usar uma Protoboard?


Robô seguidor de linha

Robô seguidor de linha

Neste tutorial vamos aprender a fazer um robô seguidor de linha utilizando o sensor de obstaculo infravermelho (Você poderá usar o Módulo Segue Faixa - TCRT5000) em conjunto com um Arduino.

Robô seguidor de linha em competição

Para melhor entendimento deste tutorial é necessário que você já tenha um conhecimento prévio sobre Arduino e ponte H. Mas não se preocupe pois nossa equipe já produziu outros tutoriais sobre esse assuntos e você pode conferir alguns destes nos seguintes links: Entradas e Saídas Analógicas e Módulo Ponte H L298n .

[toc]

kit robotica educacional com Arduino ESP ou Microbit

A importância do robô seguidor de linha

O robô seguidor de linha, também conhecido como seguidor de faixa, é um projeto bem famoso entre os apaixonados por robótica. Quase sempre é o primeiro projeto de robótica móvel.

Em todo o mundo, competições de robótica possuem modalidades únicas  para o seguidor de linha, o que faz deste projeto algo que nunca irá deixar de ser melhorado.

Seu projeto envolve conceitos de dimensionamento de energia, controle de motores, programação de embarcados, entre outros.

Esses mesmos conceitos são levados para projetos maiores e mais complexos, tanto acadêmicos quanto industriais.

Robô seguidor de linha em uma industria
Exemplo de aplicação industrial de um robô seguidor de linha

Robôs seguidores de linha na industria

As aplicações industriais são bem diversificadas. Os robôs que gerenciam o estoque da grande rede de varejos Alibaba, começaram a funcionar com os princípios do seguidor de linha.

Eles manejavam as prateleiras de produtos dentro do estoque por meio de orientação de faixas no chão. Sua função era transportar os materiais de um lado para outro, seja para reajustar o estoque ou para levar para uma área de exportação.

Atualmente o Alibaba evoluiu os robôs, de forma que eles se comunicam, e se localizam, por meio de IA (Inteligência Artificial).

Centro de distribuição do Alibaba com uso de robô
Centro de distribuição do Alibaba

 


Como um robô seguidor de linha funciona ?

O funcionamento do robô seguidor de linha é simples. Ele deve seguir andando por cima de uma linha de cor preta (fita isolante) ou branca.

Os circuitos podem alternar entre as cores do campo e da faixa, no nosso caso iremos assumir que a pista é branca e a faixa é preta.

Usaremos 2 sensores infravermelho que detectam a presença ou não desta faixa. De acordo com a combinação dos sensores, o carrinho irá para frente ou virar para um dos lados.

Funcionamento do sensor infravermelho

O módulo sensor de obstáculo infravermelho IR é bem simples. Ele emite uma luz infravermelha por um LED negro e capta o reflexo com um LED receptor (LED claro).

Como sabemos, a luz reflete em superfícies claras e é absorvida em superfícies negras, como a fita isolante. Sendo assim o LED receptor irá detectar a luz infravermelha no branco e não detectar no preto.

Para uma melhor eficácia do sensor, a superfície em contraste com a faixa preta deve ser branca. Para ajustar a sensibilidade ao contraste, o modulo possui um potenciômetro de calibração.

sensor infravermelho
Funcionamento do sensor infravermelho

Diferença entre sensores infravermelho obstaculo e o TCRT5000

Você pode usar diferentes sensores infravermelhos para o projeto seguidor de linha, o que você precisa levar em conta é as especificações de cada um.

Um sensor infravermelho amplamente utilizado é o TCRT5000, que tem como vantagem seu tamanho e preço. Porem, ele precisa está próximo ao chão para que seja capaz de identificar a faixa, uma vez que seu alcance é de até 8mm. Entretanto, ele possui a vantagem de sofrer menos interferências de luzes infravermelhas externas.

Sensor de linha TCRT5000
Módulo Sensor de linha TCRT5000

Em contrapartida, a vantagem de usar o sensor de obstaculo é o seu maior alcance possuir ajuste, porem ele é mais suscetível a interferências das luzes ambientes.

Sensor de obstáculo infravermelho
Sensor de obstáculo infravermelho

Nesse tutorial, usaremos o sensor de obstaculo infravermelho. Dessa forma, caso esteja usando o TCRT5000, fique atento com a distância do chão. Ele precisa ficar com uma distância entre 1mm e 8mm para ser capaz de detectar a faixa.

Controlando motores com Ponte H

Quando lidamos com controle de cargas que consomem grande quantidade de energia, é importante que essas cargas sejam controladas com circuitos que separem o circuito de controle do circuito de potência.

Para controlar motores, é comum usarmos um circuito chamado ponte H, ele é capaz por controlar o sentido de giro do motor e a sua velocidade, usando o 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).

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, alterando, assim, a tensão média.

Por exemplo, se a saída é de 5V, porem ela fica apenas 50% do tempo em 5V e outros 50% do tempo em nível lógico baixo, isso resulta em uma tensão média de 2,5V (50% x 5V).

Dessa forma, esta variável de tempo é capaz de controlar de velocidade do nosso carrinho alterando a tensão média aplicada no motor.

Os valores de PWM variam de 0 (parado) até 255 (velocidade máxima ou 5 V).

Controlando a velocidade do motor através da Ponte H

Existem varias opções de Ponte H, nesse tutorial usaremos o módulo Ponte H com CI L298N que dispões de duas pontes H, sendo capaz assim de controlar dois motores.

Cada ponte H possui um pino que ativa ou não a ponte H. Caso tenha um sinal de 5V aplicado nele, a ponte estará ligada, caso seja 0V a ponte estará desligada. Como temos 2 pontes H, temos o Enable A(Ativa A) e o Enable B (Ativa B).

Normalmente os Enables A e B ficam em curto com um sinal de 5V da placa através de um jumper.

Jumpers Enable A e B

Se retiramos esse jumper e inserimos um sinal PWM nessas entradas, modularemos a tensão que é enviada para o motor. Isso ocorre porque a ponte H só ira “funcionar” enquanto o sinal de Enable estiver com 5V, assim teremos o mesmo efeito de tensão média explicado anteriormente.

Apesar de a ponte H ser controlada por um sinal de 5V, elá pode chavear uma tensão diferente. Podemos, por exemplo, controlar uma tensão de 6V, vindo de um conjunto de 4 pilhas AA. Nesse caso, apesar de o sinal PWM ser de 5V ele modulará os 6V nos motores.

A descrição completa sobre como funciona uma ponte H L298N e como controlar a velocidade de um motor usando uma ponte H L298N pode ser visto nos nossos tutoriais sobre os respectivos assuntos.

 


Montado um robô seguidor de linha com sensor infravermelho

A partir de agora iremos mostrar como montar o seu próprio robô seguidor de linha.

Componentes Necessários

Para este projeto iremos utilizar:

 

Montando o projeto do robô seguidor de linha

Abaixo segue um esquema de ligações e montagem ELETRÔNICA do projeto:

Este projeto possui um procedimento de montagem complexo devido ao fato da necessidade de termos que passar vários fios por um espaço limitado ao tamanho do chassi do seu carrinho.

Calibração do Sensor infravermelho

Ao usar o sensor infravermelho, seja o sensor de obstaculo ou o TCRT5000, você precisa calibrar o sensor para que seja capaz de detectar adequadamente a mudança de cor entre preto e branco.

No vídeo a segui eu mostramos como fazer essa calibração.

Programando o controle do Robô seguidor de linha

A programação do projeto é bem simples. O carrinho precisa fazer a leitura dos sensores e definir pra qual  lado ele deve ir, somente isso, até por que um programa muito extenso pode prejudicar o rendimento.

/*DECLARAÇÃO DE VARIAVEIS*/
#define MotorA_sentido1 2
#define MotorA_sentido2 4
#define MotorB_sentido1 8
#define MotorB_sentido2 9
#define MotorA_PWM 3  
#define MotorB_PWM 10  

#define veloc0 0
#define veloc1 80
#define veloc2 180
#define veloc3 255

#define Sensor_direita 6
#define Sensor_esquerda 7

bool direita, esquerda;

void setup() {
  Serial.begin(9600);
  pinMode(MotorA_sentido1, OUTPUT);
  pinMode(MotorA_sentido2, OUTPUT);
  pinMode(MotorB_sentido1, OUTPUT);
  pinMode(MotorB_sentido2, OUTPUT);
  pinMode(MotorA_PWM, OUTPUT);
  pinMode(MotorB_PWM, OUTPUT);
  pinMode(Sensor_direita, INPUT);
  pinMode(Sensor_esquerda, INPUT);
  
}

void loop() {
   //Define o sentido de rotação dos motores
  digitalWrite(MotorA_sentido1, LOW);
  digitalWrite(MotorA_sentido2, HIGH);
  digitalWrite(MotorB_sentido1, HIGH);
  digitalWrite(MotorB_sentido2, LOW);
  
  //Leituras dos Sensores
  direita = digitalRead(Sensor_direita);
  esquerda = digitalRead(Sensor_esquerda);
  Serial.print(direita);
  Serial.print(" || ");
  Serial.println(esquerda);

  //Rodando os motores dependendo das leituras
 if(direita == false && esquerda == false){
 analogWrite(MotorA_PWM, veloc2);
 analogWrite(MotorB_PWM, veloc2);
 } else if(direita == false && esquerda == true){
 delay(400);
 analogWrite(MotorA_PWM, veloc2);
 analogWrite(MotorB_PWM, veloc1);
 delay(400);
 }else if(direita == true && esquerda == false){
 delay(400);
 analogWrite(MotorA_PWM, veloc1);
 analogWrite(MotorB_PWM, veloc2);
 delay(400);
 
 }else if(direita == true && esquerda == true){
 analogWrite(MotorA_PWM, veloc0);
 analogWrite(MotorB_PWM, veloc0);
 }
}

Colocando o Robô seguidor de linha para funcionar

Agora é só por o carrinho pra rodar na pista !

Robô seguidor de linha montado
Robô seguidor de linha montado

 

Problemas comuns e como resolver

Vale notar que ele pode não fazer o percurso de primeira, o que significa que ajustes devem ser feitos no código ou ate mesmo no hardware. Alguns problemas comuns de acontecer:

  • Bateria fraca - Os testes podem ter consumido a bateria e talvez seja necessário o uso de uma nova. Baterias abaixo de 6,5 Volts já começam a diminuir a eficiência do carrinho.
  • Carrinho saindo da pista - Isso pode acontecer por ele estar rápido de mais ou por falha do infravermelho. Em caso de ele estar muito rápido basta trocar a velocidade dos motores em cada situação, o nosso código já possui outras velocidades definidas no cabeçalho. Se o problema for com o contraste da pista (talvez parte dela esteja mais escura) use 2 LEDs de alto brilho na frente do carrinho para iluminar a pista próximo aos sensores. Os LEDs podem ir conectados diretos no 5 V do arduino (lembrando de por um resistor de 300Ohms).
  • Carrinho não roda - Este é um problema complexo, pois podem ser infinitas possibilidades. Tente isolar os componentes e testar 1 por 1, principalmente os motores e a ponte H. Em alguns casos pode ser problemas de aterramento da bateria também.

Entendendo a fundo o Software

Declaração de Variáveis

Na primeira parte do código é feita a declaração das variáveis a serem utilizadas. Nota-se que a existe um grande numero de variáveis utilizando #define, isto é por conta de serem apenas nomes associados a números, não precisamos fazer contas com essas variáveis, portanto elas não precisam ser do tipo INT, FLOAT, entre outras.

O fato de declarar algo por meio de #define ocupa menos espaço de memória, o que dá um ganho na velocidade de execução do programa. As únicas variáveis a serem definidas por um tipo são as que armazenarão os valores lidos dos sensores (direita e esquerda), essas variáveis são do tipo bool e portanto só assumem dois estados (FALSE e TRUE).

/*DECLARAÇÃO DE VARIAVEIS*/
#define MotorA_sentido1 2
#define MotorA_sentido2 4
#define MotorB_sentido1 8
#define MotorB_sentido2 9
#define MotorA_PWM 3  
#define MotorB_PWM 10  

#define veloc0 0
#define veloc1 80
#define veloc2 180
#define veloc3 255

#define Sensor_direita 6
#define Sensor_esquerda 7

bool direita, esquerda;

Cada motor possui 3 pinos: 2 para definir o sentido de rotação da roda (IN1 e IN2 / IN3 e IN4) e 1 pra definir a velocidade de rotação (Enable A / Enable B)por meio de valores PWM. Lembre-se de que os pinos de velocidade devem conter o "~" desenhado ao lado da porta na placa Arduino, caracterizando o pino como PWM.

Declaramos também 4 velocidades de PWM que podem ser interpretadas como PARADO, DEVAGAR, NORMAL e RÁPIDO, respectivamente. Os sensores foram definidos em suas respectivas portas digitais(6 e 7) e por fim, foram declaradas 2 variáveis do tipo BOOL para armazenar os valores dos sensores.

Função Void Setup()

A função void setup, que roda apenas uma vez, defini todas as configurações necessárias para funcionamento do sistema.

void setup() {
  Serial.begin(9600);
  pinMode(MotorA_sentido1, OUTPUT);
  pinMode(MotorA_sentido2, OUTPUT);
  pinMode(MotorB_sentido1, OUTPUT);
  pinMode(MotorB_sentido2, OUTPUT);
  pinMode(MotorA_PWM, OUTPUT);
  pinMode(MotorB_PWM, OUTPUT);
  pinMode(Sensor_direita, INPUT);
  pinMode(Sensor_esquerda, INPUT);
  
}

Nesta função declaramos as variáveis que definem os pinos utilizados no Arduino como sendo Entrada(INPUT) ou Saída(OUTPUT). Além disso colocamos a função Serial.begin() que inicializa a comunicação serial entre o Arduino e o computador.

MAS O CARRINHO NÃO RODA LIGADO NA BATERIA ?!?!?! Sim, porém precisamos fazer testes antes de executar a versão final, para isso utilizamos alguns comandos via serial para poder calibrar sensores, averiguar execução do programa, entre outros.

Função  Void Loop ()

Em seguida temos o loop do nosso programa onde o carrinho ira fazer suas principais funções.

- Definindo sentido de giro dos motores

Primeiro é necessário definir o sentido de rotação das rodas.

//Define o sentido de rotação dos motores
  digitalWrite(MotorA_sentido1, LOW);
  digitalWrite(MotorA_sentido2, HIGH);
  digitalWrite(MotorB_sentido1, HIGH);
  digitalWrite(MotorB_sentido2, LOW);

Nesta parte do código precisamos mandar um sinal alto e um sinal baixo entre os pares de portas IN1/IN2 e IN3/IN4. Como nosso carrinho não anda pra trás nós vamos setar essas configurações para que as rodas girem no mesmo sentido(pra frente no caso).

Veja que os pares no nosso código estão invertidos, isso acontece por que a montagem de hardware foi invertida entre os motores.

É como se os polos fossem trocados de lugar entre os motores, porém lembre-se que motores DC não possuem polaridade definida, logo podemos inverter a ligação + e - sem problemas. Isso altera apenas o sentido para o qual o motor gira. Essa é uma das partes que devem ser testadas antes da montagem final do carrinho.

- Leituras dos Sensores

Adiante, temos as leituras dos sensores infravermelhos e a impressão na serial dos valores lidos. Isso é apenas para verificar se os sensores estão funcionando corretamente, não interferindo no funcionamento final do projeto.

//Leituras dos Sensores
  direita = digitalRead(Sensor_direita);
  esquerda = digitalRead(Sensor_esquerda);
  Serial.print(direita);
  Serial.print(" || ");
  Serial.println(esquerda);

As variáveis do tipo BOOL são utilizadas para armazenar os valores digitais lidos pelos sensores.

- Controlando a direção do robô

Por fim, temos as condições de giro do motor com base no sensores infravermelhos.

//Rodando os motores dependendo das leituras
 if(direita == false && esquerda == false){
 analogWrite(MotorA_PWM, veloc2);
 analogWrite(MotorB_PWM, veloc2);
 } else if(direita == false && esquerda == true){
 delay(400);
 analogWrite(MotorA_PWM, veloc2);
 analogWrite(MotorB_PWM, veloc1);
 delay(400);
 }else if(direita == true && esquerda == false){
 delay(400);
 analogWrite(MotorA_PWM, veloc1);
 analogWrite(MotorB_PWM, veloc2);
 delay(400);
 
 }else if(direita == true && esquerda == true){
 analogWrite(MotorA_PWM, veloc0);
 analogWrite(MotorB_PWM, veloc0);
 }

Para isso, utilizamos as condições IF Else, que são mais comum. São 2 variáveis combinatórias que geram 4 possibilidades, porém a ultima condição é quase "impossível" (true e true), pois seria a leitura dos sensores detectando a faixa preta ao mesmo tempo (como é um erro estranho, o carrinho deve parar).

Os motores estão ligados em portas DIGITAIS mas lembre-se que estamos utilizando valores PWM, logo as funções de comando são do tipo analogWrite(porta, PWM). Para que o carrinho possa ter tempo de verificar o estado dos sensores novamente, alguns delays de curto período são utilizados, mas isso pode variar de projeto para projeto.

Entendendo a fundo o Hardware

O carrinho funciona com uma comunicação entre os sensores, o Arduino e a ponte H controlando os motores.

Através das leituras do sensores enviadas para o Arduino por meio das portas digitais, o controlador irá acionar um motor mais rápido ou mais devagar do que o outro. Os sensores emitem 5 V (faixa preta) ou 0 V(pista branca) para as portas digitais. O Arduino modula os valores de velocidade pelos valores PWM que variam de 0 volts (0) até 5 volts (255), fazendo isso ao longo de todo trajeto.

Observe que utilizamos apenas 1 bateria para todo o sistema. A bateria que alimenta o Arduino pelo pino P4 energiza não somente o controlador como também a ponte H dos motores por meio do pino Vin do Arduino. Esta porta é capaz de emitir valores maiores do que os 5 volts que o regulador de tensão da placa utiliza. Sendo assim a tensão de entrada no pino P4 é a mesma do pino Vin.


Conclusão

Este é um dos projetos mais simples de robótica móvel utilizando Arduino e claro que pode ser melhorando em muitos aspectos.

Algumas sugestões de melhorias são:  controle de velocidade PID, desvio de obstáculos, reconhecimento de pista, machining learning, etc.

Desafio

Crie uma função para o robô desviar de obstáculos e retornar para a pista. O sensor ultrassônico é uma ótima opção para ajudar nesse desafio.


O que é Servomotor? | Controlando um Servo com Arduino

O que é Servomotor? Controlando um Servo com Arduino

Nesse tutorial aprenderemos o que é um servomotor e como controla-lo usando um Arduino, mais especificamente o Arduino Uno, usando a biblioteca nativa da IDE Arduino Servo.h. Para esse tutorial usaremos o Micro Servo motor SG90.

[toc]

O que é um Servomotor e como funciona?

Entre os atuadores temos um motor bem especial. Os servomotores, também chamados de servos, são muito utilizados quando o assunto é robótica. De forma simplificada, um servomotor é um motor na qual podemos controlar sua posição angular através de um sinal PWM.

Microservo servo SG90 9g
Micro servo motor SG90

Dessa forma, um servomotor é um atuador eletromecânico utilizado para posicionar e manter um objeto em uma determinada posição. Para isso, ele conta com um circuito que verifica o sinal de entrada e compara com a posição atual do eixo.

controle via PWM de um servo
controle via PWM de um servo

Como você pode ver na figura anterior, o ângulo do servomotor é proporcional ao Duty Cycle (tempo que o sinal é positivo) do sinal PWM.

Diferentemente dos motores de corrente continua ou motores de passo que podem girar indefinidamente, o eixo de um servo possui a liberdade de apenas 180º. Existem ainda alguns servos que são adaptados para girar indefinidamente, mas não entraremos nesse mérito aqui.

Servomotores geralmente possuem 3 pinos:

  • Alimentação positiva (vermelho) – 5V;
  • Terra (Preto ou Marrom) – GND;
  • (Amarelo, Laranja ou Branco) – Ligado a um pino digital de entrada e saída;

Atenção!!

Servomotores consomem uma corrente significativa ao se movimentarem. A utilização de uma fonte externa pode ser necessária e é recomendada. Lembre-se de conectar o pino GND da fonte externa ao GND do Arduino para que a referência seja a mesma.

Apesar de sua posição ser controlada através do duty cycle de um sinal PWM enviado ao pino de controle não é necessária a conexão do pino de controle a um pino que possua PWM, pois utilizaremos a biblioteca Servo.h.

A utilização de analogWrite produzirá um controle de menor precisão e poderá até danificar alguns servomotores por sua frequência (490 Hz) ser 10 vezes superior a frequência típica de controle de alguns servomotores.

Além de mais preciso e recomendado, o uso da biblioteca Servo.h faz com que o uso do servomotor seja mais fácil. Isso se dá pelo fato de você só precisar definir o ângulo que você deseja, não necessitando o uso dos valores de PWM (0 a 255).


Mãos à obra - Controlando um Servomotor com Arduino - Micro Servo motor SG90

Componentes necessários

Montando o projeto

Agora vamos conectar os componentes do projeto. Para isso, desligue o cabo USB de seu Arduino e monte seu circuito conforme a figura a seguir.

Esquema de montagem de um servo com Arduino Uno
Esquema de montagem de um servomotor com Arduino Uno

O microservo tem três fios saindo dele. Um será vermelho e irá para os +5 V. Outro, preto ou marrom, irá para o GND. O terceiro, branco, amarelo ou laranja, será conectado ao pino digital 8.

Monte o potenciômetro com os seus pinos externos conectados um no +5 V e o outro no GND e o pino do meio ao pino analógico A0.

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 “programa_servo”.

Nesse exemplo utilizaremos a biblioteca Senvo.h que já é nativa da IDE Arduino e deve ser adicionada em: Sketch > Incluir Biblioteca > Servo.

Com o seu programa salvo, escreva nele o código conforme escrito abaixo.

#include <Servo.h>
Servo servo1; // cria um objeto servo1

// Esta função "setup" roda uma vez quando a placa e ligada ou resetada
void setup() {
 servo1.attach(5); // anexa o servomotor (físico), no pino 5, ao objeto servo1 (lógico)
}

void loop() {
 int angulo = analogRead(0); // Lê o valor do potenciômetro
 angulo = map(angulo, 0, 1023, 0, 180); // Mudança de Escala
 servo1.write(angulo); // Escreve o ângulo para o servomotor
 delay(20); // Espera de 20ms, Suficiente para que o servomotor atinja a posição
}

Após escrever o código, salve e depois clique em Carregar (Upload) para que o programa seja transferido para seu Arduino.

Colocando para funcionar

Se tudo deu certo, conforme você variar a resistência do potenciômetro o servomotor irá se mover.


Entendendo a fundo

Entendendo o Software

Biblioteca Servo.h

Na elaboração do software utilizamos a biblioteca Servo.h. Esta biblioteca implementa as funcionalidades de um servomotor tornando sua utilização extremamente simples. Entretanto alguns cuidados devem ser tomados.

Importante:

A biblioteca suporta a ligação de até 12 servomotores na maioria das placas Arduino e 48 no Arduino Mega. O uso da biblioteca desabilita o uso da função analogWrite nos pinos 9 e 10  (*exceto no Arduino Mega). No Mega o uso de 12 a 23 servomotores desabilitará o a função analogWrite nos pinos 11 e 12.

Declarando um Servomotor

Ao usar essa biblioteca trataremos cada servomotor como um objeto, dessa forma precisamos declará-lo no início do código.

Servo servo1; // Cria um objeto servo1

Depois de declarado, sempre que quisermos mexer em alguma função desse servo, devemos usar o nome da função precedida do nome do servo e ponto.

servo1.exemplo(); // chama função exemplo() para o objeto servo1

Você poderá declarar quantos servos for usar, levando em conta a limitação física de sua placa Arduino. Cada servo pode ter qualquer nome, mas é aconselhável que se use nomes intuitivos.

Declarando porta de controle do Servomotor

Agora é preciso definir em que porta esta conectado o fio de controle do servo, para isso usamos a função attach(pino).

servo1.attach(5); // Anexa o servomotor (físico), no pino 5, ao objeto servo1 (lógico)

Controlando a Posição do Servomotor

A função write define em um servomotor padrão o ângulo em graus na qual ele deve se posicionar.

servo1.write(angulo); //angulo: posição em graus para servos comuns

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.

Apostila Arduino Básico

 


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.

Esquema simplificado de um motor DC
Campo magnético motor DC

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.

Módulo ponte H L298n
Jumpers Enable A e B

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.

Sinal PWM entrando no Enable A do módulo Ponte H L298N para controlar velocidade
Sinal PWM entrando no Enable A em vermelho (5V) e a saída para o motor A em preto (12V).

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:

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.

Esquema de montagem da ponte h l298n controlar velocidade
Esquema de montagem exemplo 1

 

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);
Módulo drive motor Ponte H L298n
Pino Enable A e Enable B que são usados para o controle de Velocidade no módulo Ponte H L298N.

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

 

Apostila Arduino Básico

 


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.

Exemplo de motor DC que pode ser controlado por uma ponte H L298n
Exemplo de motor DC

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.

Circuito Ponte H L298n - drive motor
Circuito Ponte H

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

Circuito interno de um CI Ponte H L298n
Circuito interno de um CI L298n

As funções dos principais pinos desse CI são descritas na tabela a seguir:

Driver motor Ponte H L298N
Funções dos principais pinos da Ponte H L298N [1]

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:

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 Ponte H com o CI L298N - driver motor
Módulo Driver motor com Ponte H L298N

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.

Módulo Ponte H com o CI L298N - driver motor
Entradas e saídas do módulo Driver motor com Ponte H L298n

 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)

Tabela de combinações controle ponte h
Tabela de combinações

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:

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.

Esquema de montagem da Ponte H L298N controlando Motores com Arduino
Esquema de montagem exemplo 1

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

Apostila Arduíno básico