Controle de Servo com Motor Shield L293D 6

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? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

6 Comentários

  1. 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. 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.

    1. 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. 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. 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.

Trackbacks and Pingbacks

  1. […] Um robô móvel autônomo consiste em uma unidade robótica que pode-se locomover (tracionado por rodas) e detectar obstáculos frontais, laterais, no chão, etc. Hoje demonstraremos a parte 1 do desenvolvimento de um robô com motor shield, que é um robô móvel autônomo 4×4, somando os conhecimentos estudados até aqui com o Motor Shield L293D e o controle de servo motores. […]