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