No post anterior sobre o assunto já exploramos a utilização do Motor Shield L293D com a biblioteca AF Motor e já conhecemos também um pouco do seu hardware. Hoje o utilizaremos sem a biblioteca. Para controlar o motor shield L293D sem biblioteca, o conhecimento do hardware é fundamental.
Motor Shield L293D – análise do hardware
Na análise do hardware do motor shield L293D, verificou-se que os bits de controle dos motores são originados na saída de um registrador de deslocamento, o 74HC595 (Figura 2).
Figura 2 – Registrador de Deslocamento 74HC595
O funcionamento elementar deste circuito integrado é gerar uma saída paralelo de 8 bits (1 byte) a partir de uma entrada serial. A entrada serial consiste em 3 pinos: clock (pino 11), latch (pino 12) e data (pino 14).
O pino 14 é o responsável por enviar os 8 bits que serão gerados na saída do 74HC595, o pino 11 é o clock, onde a cada borda de descida carrega um novo bit de dado e o pino 12 libera estes 8 bits na saída (Q0 a Q7). Sendo estes 8 bits aplicados ao controle dos drivers, o segredo consiste em desenvolver uma função na própria IDE do Arduino, onde o parâmetro é o dado que se deseja enviar para a saída e, por conseguinte, controlará os motores.
Programa motor shield L293D sem biblioteca
O código completo, demonstrando a função e o teste utilizado pode ser visto abaixo.
/* Aula 69 - Controle do Motor Shield L293D sem Biblioteca 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 // --- Protótipo das Funções Auxiliares --- void sendCommand(unsigned char value); //Função para enviar o byte para saída do registrador // --- 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 digitalWrite(dir_en, LOW); analogWrite(pwm2a, 0xFF); analogWrite(pwm2b, 0xFF); analogWrite(pwm0a, 0xFF); analogWrite(pwm0b, 0xFF); } //end setup // --- Loop Infinito --- void loop() { sendCommand(0b10101100); delay(2000); sendCommand(0b01010011); delay(2000); } //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
Para mais detalhes, assista ao vídeo mostrado no início deste post e para download completo dos arquivos utilizados, acesse este link.
Gostou? Deixe seu comentário logo abaixo.
Olá Felipe, estou tentando simular este projeto no isis proteus , contudo não estou conseguindo , pois não
sei como construir a label que alimenta o pino 8 do L293D. Poderia me explicar como construir essa label
no proteus. Desde já agradeço.