Vídeo: Controle de Servo com Motor Shield L293D

Vídeo: Controle de Servo com Motor Shield L293D

Para você que pensou que já havíamos explorado todos os recursos do Motor Shield L293D, enganou-se! Neste artigo você aprenderá a controlar um servo com motor shield L293D, e verá mais detalhes sobre essa incrível placa!

Conexão servo com motor shield L293D

O Motor Shield L293D apresenta barramento para ligar até dois servo motores, se você observar na Figura 2, os mesmos estão destacados.

servo com motor shield L293d

Figura 2 – Barramento para os servos

Os pinos de sinal dos servo motores (indicado com S na placa) vão ligados diretamente nos pinos digitais 9 e 10 do Arduino. Sendo o 9 responsável pelo SERVO_2 e o 10 responsável pelo SERVO_1. É assim que o servo 2 e o servo 1 estão designados na máscara de componentes da placa, respectivamente.

Motor Shield com 2 servo motores

O hardware do projeto não é novidade, encaixe o Motor Shield em cima da placa Arduino. No software, decidimos mapear todo hardware do Motor Shield, já possibilitando o controle independente de motores DC, caso o usuário julgue necessário.

Programa de controle servo motor com motor shield

Para gerar os pulsos de sinal, utilizamos as funções já desenvolvidas anteriormente para o controle de servos sem biblioteca, como vimos no post Usando Motor Shield L293D sem biblioteca.

O código completo de exemplo de controle de servo com motor shield l293d pode ser conferido a seguir.

/*
   Aula 70 - Controle de Servo com Motor Shield L293D
    
   Autor: Eng. Wagner Rambo  Data: Junho de 2016
*/

// --- Mapeamento de Hardware ---
#define   dir_clk      4     //clock do registrador no digital  4
#define   dir_ser      8     //dados do registrador no digital  8
#define   dir_latch   12     //latch do registrador no digital 12
#define   dir_en       7     //enable do registrador no digital 7
#define   pwm2a       11     //pwm motor1
#define   pwm2b        3     //pwm motor2
#define   pwm0a        6     //pwm motor3
#define   pwm0b        5     //pwm motor4
#define   servo2       9     //controle do Servo 2
#define   servo1      10     //controle do Servo 1


// --- Protótipo das Funções Auxiliares ---
void sendCommand(unsigned char value);   //Função para enviar o byte para saída do registrador
void servo0graus();
void servo90graus();
void servo180graus();


// --- Configurações Iniciais ---
void setup() 
{
  pinMode(dir_clk,   OUTPUT);    //saída para clock
  pinMode(dir_ser,   OUTPUT);    //saída para dados
  pinMode(dir_latch, OUTPUT);    //saída para latch
  pinMode(dir_en,    OUTPUT);    //saída para enable
  pinMode(pwm2a,     OUTPUT);    //saída para pwm motor1
  pinMode(pwm2b,     OUTPUT);    //saída para pwm motor2
  pinMode(pwm0a,     OUTPUT);    //saída para pwm motor3
  pinMode(pwm0b,     OUTPUT);    //saída para pwm motor4
  pinMode(servo2,    OUTPUT);    //saída para Servo 2
  pinMode(servo1,    OUTPUT);    //saída para Servo 1
  
  digitalWrite(dir_en, LOW);
  analogWrite(pwm2a, 0xFF);
  analogWrite(pwm2b, 0xFF);
  analogWrite(pwm0a, 0xFF);
  analogWrite(pwm0b, 0xFF);
  


} //end setup


// --- Loop Infinito ---
void loop() 
{
  
  for(char i=0;i<100;i++) servo0graus();    //move o servo para a posição 0º por 2 segundos
  
  for(char i=0;i<100;i++) servo90graus();    //move o servo para a posição 90º por 2 segundos

  for(char i=0;i<100;i++) servo180graus();    //move o servo para a posição 180º por 2 segundos
  
  for(char i=0;i<100;i++) servo90graus();    //move o servo para a posição 90º por 2 segundos


} //end loop


// --- Desenvolvimento das Funções Auxiliares ---
void sendCommand(unsigned char value)
{
  
    boolean verify;                  //bit de controle

    digitalWrite(dir_latch, LOW);    //desliga latch
    digitalWrite(dir_clk,   LOW);    //desabilita o clock
    
    for(unsigned char i=0x0; i<0x08; i++)    //loop finito para enviar os 8 bits
    {
       digitalWrite(dir_clk, LOW);   //clock em low
       
       if(value & (1<<i)) verify = HIGH;
       else verify = LOW;
       
       digitalWrite(dir_ser, verify); //Habilita saída de dados conforme condição acima
       digitalWrite(dir_clk, HIGH);
    
    } //end for
    
    
    digitalWrite(dir_clk, LOW);
    
    digitalWrite(dir_latch, HIGH);


} //end sendCommand



void servo0graus()              //Posiciona o servo em 0 graus
{
   digitalWrite(servo1, HIGH);  //pulso do servo
   delayMicroseconds(600);      //0.6ms
   digitalWrite(servo1, LOW);   //completa periodo do servo
   for(int i=0;i<32;i++)delayMicroseconds(600);
                               // 20ms = 20000us
                               // 20000us - 600us = 19400us
                               // 19400/600 = ~~32

} //end servo0graus


void servo90graus()             //Posiciona o servo em 90 graus
{
   digitalWrite(servo1, HIGH);  //pulso do servo
   delayMicroseconds(1500);     //1.5ms
   digitalWrite(servo1, LOW);   //completa periodo do servo
   for(int i=0;i<12;i++)delayMicroseconds(1500);
                               // 20ms = 20000us
                               // 20000us - 1500us = 18500us
                               // 18500/1500 = ~~12 

} //end servo0graus


void servo180graus()             //Posiciona o servo em 180 graus
{
   digitalWrite(servo1, HIGH);  //pulso do servo
   delayMicroseconds(2400);     //2.4ms
   digitalWrite(servo1, LOW);   //completa periodo do servo
   for(int i=0;i<7;i++)delayMicroseconds(2400);
                               // 20ms = 20000us
                               // 20000us - 2400us = 17600us
                               // 17600/2400 = ~~7

} //end servo0graus

Para mais detalhes, assista ao vídeo mostrado no início deste post, e para download dos arquivos utilizados nos testes acesse este link.

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota aos posts (estrelas no final do artigo) e visite nossa loja FILIPEFLOP !

1
Vídeo: Controle de Servo com Motor Shield L293D
8 votos, 5.00 classificação média (100% pontuação)

Wagner Rambo é bacharel em Engenharia Eletrônica, Computadores e Telecomunicações, e colaborador do site FILIPEFLOP.

Compartilhe este Post

5 Comentários

  1. David - 10 de novembro de 2016

    Olá, estou usando o shield L293D para controlar 2 motores dc, e um servo motor.
    Os motores dc estão sendo alimentados por 4 pilhas que totalizam 6V, e o arduino está sendo alimentado por uma bateria de 9V, mas pelo que eu entendi o servo motor é alimentado pelo arduino e não pela shield, o problema é que toda vez que o programa chega na parte de mover o servo o arduino reinicia, como se a bateria de 9V não fosse suficiente… mas ela está novinha.
    alguém teria alguma sugestão?

  2. guilherme pg - 20 de agosto de 2016

    Boa noite,estou montando um projeto aonde controlo pelo Bluetooth 2 servo motor e 2 motores DC e utilizo a MOTOR SHIELD L293D,mas quando eu aciono os servos meu modulo Bluetooth desliga.o que pode estar causando esse problema?Agradeço a ajuda.
    OBS.: não utilizo os 5v do Arduíno mas sim uma bateria de 7v 500mAh para alimentar a MOTOR SHIELD L293D.

    • Andre Nicodemo - 23 de maio de 2017

      Fala ae brother. Tranquilo?
      To com um projeto aqui que controla 4 motores DC via porta COM.
      Só que eu comprei a placa RUMPS 1.4,
      Vendo sua pergunta me surgiu uma dúvida:
      Será que consigo controlar ela via bluethooth tbm?
      Vou pesquisar sobre. rs Abraço!

  3. SERGIO FARIAS ALVES - 18 de junho de 2016

    BOA NOITE AMIGOS TRABALHO COM MINE LANCHAS DE RC COMO ROBI. GOSTARIA DE UM ARDOINO QUE CONTROLASSE UM MOTOR NO VAI E VEM COMO SE FOSSE UM SERVO PARA QUE EU POSSA COLOCAR NO LEME E NO ACELERADOR. NO LUGAR DO SERVO. AGRADEÇO .

  4. geilson - 16 de junho de 2016

    Ola pessoal blz?
    Gostaria de uma ajuda dos parceiros aqui do blog. Eu trabalho com geradores de energia e estou montado um um qta (quadro de transferência para geradores) com o arduino e estou tendo um pouco de dificuldade com os comandos. Agradeço a ajuda.

Deixe uma resposta