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.
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.
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.
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?
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.
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!
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 .
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.