Menu

Carrinho com o módulo LD293

Controle de motores usando o shield LD293

Códigos (  motoresComShieldLD293 )  –  Versão PDF (  ControleMotoresShieldLD293  ).

Do Inglês, shield quer dizer escudo; no ambiente do Arduino chamamos de shield queles módulos que podem ser encaixados sobre a placa do Arduino. Os mais comuns são aqueles voltados ao Arduino UNO. O que utilizaremos é composto de dois controladores LD293 e um registrador de deslocamento 74HC795. Ele é capaz de controlar 4 motores DC ou 2 motores de passo. E também 2 servo motores. Os circuitos integrados são instalados em soquetes, de forma que podem ser retirados para experiências e circuitos individuais.

O Motor Shield utiliza o circuito integrado ponte H L293D e o circuito integrado 74HC595N para controle de comunicação. As 6 entradas analógicas (A0 a A5) estão disponíveis ara uso na placa (embora nem sempre com conectores – na foto do meu shield soldei conectores para facilitar, incluindo as ligações GND e +5V que são ao lado). Ele utiliza os seguintes pinos do Arduino:

  • Motor 1 (ou motor de passo 1 conexão 1): pino digital 11 do Arduino
  • Motor 2 (ou motor de passo 1 conexão 2): pino digital 3 do Arduino
  • Motor 3 (ou motor de passo 2 conexão 1): pino digital 5 do Arduino
  • Motor 4 (ou motor de passo 2 conexão 2): pino digital 6 do Arduino
  • Servo Motor 1: pino digital 10 do Arduino
  • Servo Motor 2: pino digital 9 do Arduino
  • Os pinos digitais 2 e 13 não são utilizados pelo shield, então você pode usá-los em seus protótipos se precisar.
  • Os pinos digitais 4, 7, 8 e 12 são utilizados para controlar os motores por meio do 74HC795.

Veja a referência do fabricante (fornecedores chineses podem variar a placa, mas seguem as mesmas ligações físicas): https://cdn-learn.adafruit.com/downloads/pdf/adafruit-motor-shield.pdf

Para facilitar a programação, iremos utilizar uma biblioteca pronta, da Adafruit. Para instalar a biblioteca, no ambiente do Arduino clique em Sketch/ Incluir biblioteca / Gerenciar Bibliotecas (vamos ‘buscá-la’ na internet; se você já tiver o arquivo pode clicar em ‘Adicionar biblioteca .zip’):

Na tela de gerenciamento de bibliotecas que se abrirá (pode demorar alguns instantes), vamos instalar a biblioteca ‘Adafruit Motor Shield library’:

Após instalada a biblioteca, podemos colocar o código e testar (se você digitar o código sem ter a biblioteca instalada haverá mensagens de erro, pois os comandos não serão conhecidos).

#include <AFMotor.h> //esta é a biblioteca ‘Adafruit Motor Shield library’ que instalamos

AF_DCMotor mEsq(3); //AF_DCMotor é o objeto; mEsq o nome da variável; '3' foi a porta escolhida 
AF_DCMotor mDir(4); //motor 'mDir' ligado na porta 4

void setup() 
{
//velocidade inicial
mEsq.setSpeed(150);
mDir.setSpeed(150);

//parar os motores
mEsq.run(RELEASE); //'run' controla o motor e o parâmetro 'RELEASE' desliga o motor
mDir.run(RELEASE);

//note que não usamos o 'pinMode', pois a declaração do objeto 'AF_DCMotor' já faz isso
}

void loop() 
{
// Liga os motores - lembre-se que já dissemos no 'setup' a velocidade inicial, 150
mEsq.run(FORWARD); //motor no sentido 'para frente'
mDir.run(FORWARD); //o sentido do movimento depende da ligação do motor e de sua posição

delay(2000); //Aguarda 2 segundos

//parar os motores
mEsq.run(RELEASE); //'run' controla o motor e o parâmetro 'RELEASE' desliga o motor
mDir.run(RELEASE);
delay(100); //aguarda antes de inverter o sentido de rotação

mEsq.run(BACKWARD); //motor no sentido 'para trás'
mDir.run(BACKWARD); //o sentido do movimento depende da ligação do motor e de sua posição

delay(2000); // aguarda 2 segundos

//parar os motores
mEsq.run(RELEASE); //'run' controla o motor e o parâmetro 'RELEASE' desliga o motor
mDir.run(RELEASE);
delay(100); //aguarda antes de inverter o sentido de rotação
}

Explicação:

  • na linha 1 foi incluída a biblioteca de controle;
  • nas linhas 3 e 4 foram declaradas variáveis (escolhi os nomes Mesq e Mdir para referência a um motor esquerdo e um direito em um carrinho), e foi informado em qual porta cada um foi conectado (usei a M3 e a M4, mas poderia ser M1 ou M2 ou qualquer ‘mistura’ de duas portas);
  • entre as linhas 6 e 17 foi declarada a função setup e dentro dela há duas informações para cada um dos dois motores: a velocidade inicial (usei 150, por meio do método setSpeed – pode ser qualquer número entre 0 e 255); e, por meio do método ‘run’, foi informado o argumento ‘RELEASE’, a qual faz os motores desligarem;
  • entre as linhas 19 e 41 temos a função loop; dentro dela foram utilizados os métodos run com os argumentos ‘FORWARD’ e ‘BACKWARD’, além do ‘RELEASE’, intercalados com comandos delay. Isto fará com que os motores girem em um sentido durante 2 segundos (2000 ms), desliguem e permaneçam assim por 0,1s (100ms) e depois liguem girando no sentido oposto por mais 2 segundos (se você testar e os motores não girarem ambos no mesmo sentido, inverta as ligações de um dos motores).

Ligação dos servos:

Preste atenção na polaridade do servo – o pino de controle (laranja) fica ‘para dentro’ da placa; o pino do GND (preto, ou, no meu exemplo, marrom), fica ‘para fora’ da placa. A alimentação foi fornecida por uma bateria de 3,7V ligada em um módulo carregador / step up integrado identificado pelo código J5019 – – veja como em https://tiaplicada.ufpr.br/wp-content/uploads/2024/08/usodomoduloj5019stepupcarregador.pdf.

ATENÇÃO – os servos consomem uma corrente elevada, se puder alimente-os com energia separa daquela da placa do Arduino (também é aconselhável colocar um capacitor eletrolítico de 100uF em paralelo com a alimentação do servo motor).

O código a seguir permite que você digite no monitor serial qual o ângulo desejado para o servo.

O servo começa com um ângulo de 90º. Ligue o monitor serial (Ferramentas/ monitor serial). Digite um valor para o ângulo. Na linha 12 o Arduino vai detectar que há algo na interface serial (por meio do método available do objeto Serial). Na linha seguinte (12) a variável inteira angulo receberá o número lido no monitor serial (parseInt() converte para inteiro o que você digitar – se for possível, se não for, despreza). Na sequência o ângulo escolhido é enviado ao servo (por meio do método write, que tem como parâmetro o valor do ângulo). A linha 15 está lá para resolver uma situação comum: quando você digita algo no monitor serial em geral será enviado também um comando de nova linha; este comando é interpretado como ‘0’, e moverá o servo para o ângulo ‘0’. Para evitarmos isso foi acrescentada a linha 15, que termina (‘end’) a comunicação serial evitando o envio de um caractere extra (se você quiser testar – teste – remova a linha 15 ou comente-a e veja o resultado: o servo irá se movimentar para a posição escolhida e depois retornar).

Universidade Federal do Paraná
TI Aplicada – pesquisa e extensão

Av Pref Lothário Meissner, 632
80210-170 | Curitiba |
simao@ufpr.br
(41) 3360-4420
Universidade Federal do Paraná
TI Aplicada – pesquisa e extensão

Av Pref Lothário Meissner, 632
80210-170 | Curitiba |
simao@ufpr.br
(41) 3360-4420

UFPR nas Redes Sociais


UFPR nas Redes Sociais