Tutorial: Como Utilizar o Monster Motor Shield

11/04/2013

  • Adicionado: 1.2) Hardware Monster Motor Shield

 

 

Adquira estes componentes na Loja do Lab de Garagem

Olá Garagistas! No tutorial de hoje iremos utilizar o Monster Motor Shield para o controle de um Motor DC 12V que está ligado a uma roda onde iremos controlar o sentido e a velocidade de rotação.

 

 

- Lista de Materiais:


1x Arduino Uno

1x Monster Motor Shield

1x Resistor 110R

1x LED

1x Motor DC 12V

1x Fonte DC 12V

1x Roda Off - Road

Alguns Cabos

 

 

1. Funcionamento

1.1) PWM

      A sigla PWM é uma abreviação para Pulse Width Modulation ou Modulação por Largura de Pulso. Com essa técnica é possível controlar a velocidade dos motores, mantendo o torque ainda que em baixas velocidades, o que garante partidas suaves mesmo quando há uma carga maior sobre os motores, aspectos que  caracterizam o controle PWM como ideal para aplicações em robótica.

      O controle de velocidade de nosso motor será controlado por um PWM que pode ser definido com um valor entre "0" e "255", onde "0" indica que o motor esta parado e "255" que o motor esta em sua velocidade total.

 

1.2) Hardware Monster Motor Shield

 

PinA2 - Pino Analógico 2: Sensor de Corrente para Motor 0 via Hardware >> //cspin[0]

PinA3 - Pino Analógico 3: Sensor de Corrente para Motor 1 via Hardware >> //cspin[1]

OBS: Para definições de valores de corrente limite (CS_THRESHOLD) em seu projeto, consultar o Datasheet do fabricante.

 

PinD7 (D7) - Pino Digital 7: Pino para controle do sentido Horário do Motor 0 (A1) >>        // inApin[0]

PinD8 (D8)Pino Digital 8: Pino para controle do sentido Anti-Horário do Motor 0 (B1) >> // inBpin[0]

 

PinD4 (D4)Pino Digital 4: Pino para controle do sentido Horário do Motor 1 (A2) >>        // inApin[1]

PinD9 (D9)Pino Digital 9: Pino para controle do sentido Anti-Horário do Motor 1 (B2) >> // inBpin[1]

  

PinD5 (D5) - Pino Digital 5: Pino para PWM Motor 0     // pwmpin[0]

PinD6 (D6) - Pino Digital 6: Pino para PWM Motor 1     // pwmpin[1]

 

 

 

 

- Tabelas da Verdade:

 

 

1.3) Monster Shield Exemplo

 

     - O Serial Monitor será utilizado para acompanhar o aumento de velocidade em PWM do motor e o travamento do mesmo se ocorrer.

 

     - O LED e a resistência entre os Pinos 13 e GND são utilizados no exemplo para indicar que o motor travou.     

 

     - A definição "#define CS_THRESHOLD" na quinta linha do programa serve como proteção para o circuito, onde no mesmo você define um valor máximo de corrente antes de o programa desligar seu motor. Pois, por excesso de peso, ou se por qualquer outro motivo o motor travar, o consumo de corrente aumentará, e com essa definição você protege seu circuito, fazendo com que nenhum de seus componentes queimem se a corrente aumentar muito.

- OBS: O valor definido nesse comando não é dado em A (Ampere), o valor é uma amostragem que o circuito faz via hardware, conforme a figura abaixo:

 

 

 

- OBS: Para a definição de corrente usada no comando, consulte o Datasheet.

 

- A função para controle do nosso motor é "motorGo(motor, sentido, pwm);" onde:

 

      motor: É a saída do motor que iremos utilizar: "0" (A1:B1) e/ou "1" (A2:B2)

      sentido: "CW" para sentido horário de rotação e "CCW" para sentido anti-horário de rotação

      pwm: Valor entre "0" e "255" para controle de velocidade do motor

 

Exemplo: "motorGo(0, CW, 255);"

 

No exemplo, o motor 1 irá girar no sentido horário em sua velocidade máxima.     

 

 

2. A Montagem


Esquema da Montagem:

2.1) Conecte seu Monster Motor Shield ao Arduino

2.2) Conecte o LED com a resitência entre o pino 13 e o GND que será utilizado no exemplo para indicar que o motor  foi travado.

2.3) Conecte o motor nos pinos A1:B1 do Shield

2.4) Conecte a fonte 12V nos pinos + e - do Monster Shield

2.5) Circuito Montado

3. O Sketch

#define BRAKEVCC 0
#define CW 1
#define CCW 2
#define BRAKEGND 3
#define CS_THRESHOLD 15   // Definição da corrente de segurança (Consulte: "1.3) Monster Shield Exemplo").

 

int inApin[2] = {7, 4}; // INA: Sentido Horário Motor0 e Motor1 (Consulte:"1.2) Hardware Monster Motor Shield").
int inBpin[2] = {8, 9}; // INB: Sentido Anti-Horário Motor0 e Motor1 (Consulte: "1.2) Hardware Monster Motor Shield").
int pwmpin[2] = {5, 6};            // Entrada do PWM
int cspin[2] = {2, 3};              // Entrada do Sensor de Corrente

int statpin = 13;
int i=0;;
void setup()                         // Faz as configuração para a utilização das funções no Sketch
{
Serial.begin(9600);              // Iniciar a serial para fazer o monitoramento
pinMode(statpin, OUTPUT);
for (int i=0; i<2; i++)
    {
    pinMode(inApin[i], OUTPUT);
    pinMode(inBpin[i], OUTPUT);
    pinMode(pwmpin[i], OUTPUT);
    }
for (int i=0; i<2; i++)
    {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
    }
}

void loop()                          // Programa roda dentro do loop
{
while(i<255)
    {
    motorGo(0, CW, i);             // Aumento do o PWM do motor até 255
    delay(50);                          // Se o motor travar ele desliga o motor e
    i++;                                  // Reinicia o processo de aumento do PWM
    if (analogRead(cspin[0]) > CS_THRESHOLD)
    motorOff(0);
    Serial.println(i);
    digitalWrite(statpin, LOW);
    }
i=1;
while(i!=0)
    {                                      // Mantém o PWM em 255 (Velocidade Máxima do Motor)
    motorGo(0, CW, 255);       // Se o motor travar ele desliga o motor e
    if (analogRead(cspin[0]) > CS_THRESHOLD)              // Reinicia o processo de aumento do PWM
    motorOff(0);
    }
}
void motorOff(int motor)     //Função para desligar o motor se o mesmo travar
{

for (int i=0; i<2; i++)
    {
    digitalWrite(inApin[i], LOW);
    digitalWrite(inBpin[i], LOW);
    }
analogWrite(pwmpin[motor], 0);
i=0;
digitalWrite(13, HIGH);
Serial.println("Motor Travado");
delay(1000);
}
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)         //Função que controla as variáveis: motor(0 ou 1), sentido (cw ou ccw) e pwm (entra 0 e 255);
{
if (motor <= 1)
    {
    if (direct <=4)
        {
        if (direct <=1)
            digitalWrite(inApin[motor], HIGH);
        else
            digitalWrite(inApin[motor], LOW);

        if ((direct==0)||(direct==2))
            digitalWrite(inBpin[motor], HIGH);
        else
            digitalWrite(inBpin[motor], LOW);

        analogWrite(pwmpin[motor], pwm);
        }
    }
}

 

É isso ai Garagistas! Espero que tenham gostado desde tutorial. Até a Próxima!

Referências:

http://www.pnca.com.br/index.php?option=com_content&view=articl...

http://en.wikiversity.org/wiki/Arduino/MonsterMotorShield

http://en.wikiversity.org/wiki/Arduino/MonsterMotorShield/UnoCode

http://www.labdegaragem.org/loja/index.php/31-shields/monster-moto-...

Exibições: 25130

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Valter Despontin em 23 junho 2013 às 23:42

ok Wagner mas como sou meio leigo em Arduíno pode me detalhar o esquema elétrico e código fonte para este tipo de circuito, serei grato, obrigado

Comentário de Wagner Felix Pereira de Souza em 23 junho 2013 às 17:52

Valter, certeza que dá, é só atribuir 2 pinos digitais pra serem os "botoes do fliperama", e alterar o codigo pra quando cada um deles for high, alterar a rotação do motor correspondente...

Comentário de Valter Despontin em 23 junho 2013 às 15:53

parabens pelo cirduito mas minha duvida é saber se da para fazer com este Monster Moto Shield, fazer o motor mover para direita e para esquerda com um controle de fliperama ligado ao Arduíno e este movimento de esquerda e direita que seria uma reversão começar do 0 a 255 quando da o toque no controle, obrigado

Comentário de Wagner Felix Pereira de Souza em 10 abril 2013 às 10:51

Muito bacana... Esse driver parece bacana, estou pensando em utilizar dele no lugar do Wild Thumper Controller. Gostei do seu sketch pra fazer uma progressao de PWM suave :D.
Eu nao entendi  esse pino:
cspin[0]

pra ler a corrente...

o pino 2 ja esta, via hardware, ligado a leitura de corrente?

outra coisa:

int inApin[2] = {7, 4};              // INA: Entrada do Sentido Horário
int inBpin[2] = {8, 9};              // INB: Entrada do Sentido Anti-Horário

O comentário parece estar errado... inApin seriam os pinos do motor A e inBpin os pinos do motor B, nao tem a ver com o sentido em que estao rodando nessa definiçao, vc define isso depois, na execuçao do codigo, mudando os "High"/"Low" pra mudar a direção deles ;)

sobre o "motor travar", tambem nao tenho certeza se isso esta correto, porque tem motores de stall em 6A, por exemplo, se vc definiu no codigo que a corrente maxima é 15A, o motor ja vai estar travado ha bastante tempo e talvez nem execute o codigo de segurança e frite o motor(eu ja queimei 2 motores no WTC por ter definido uma corrente de corte mais alta que a corrente em stall da soma dos motores)


Uma dica de hardware: sobre os dois CIs principais da pra colocar dissipadores (infelizmente nao posso postar o link aqui), o que faz voce poder aumentar a corrente de pra mais de 20A sem problema.

No mais, excelente tutorial, serve demais pra iniciar a brincadeira com esse driver

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço