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: 13659

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 Mark Pind em 12 julho 2015 às 3:03

Você poderia explicar como obter o valor de CS_THRESHOLD, tente ler a folha de dados, mas não conseguiu encontrar qualquer coisa relacionada a este valor. Muito obrigado.

Comentário de Victor Augusto dos Santos em 6 agosto 2014 às 1:23

Alguém aqui conseguiu calcular este valor CS_THRESHOULD?

Não consigo conseguí entender como calcular corretamente este valor, lendo o datasheet.

Muito Obrigado.

Comentário de Diogo Assiz Menon em 11 agosto 2013 às 13:48

Acho que o problema esta no meu Arduino Mega 2560, tirei ele e tentei fazer o upload do exemplo Blink apenas com a placa do Arduino Mega conectado e o mesmo deu a mensagem de timeout.

Conectei os dois shields Ethernet e Monster Motor Shield em um Arduino Uno que tenho em casa e parece que funcionou perfeitamente, agora preciso ver o que aconteceu com meu Mega.

Comentário de Diogo Assiz Menon em 11 agosto 2013 às 13:41

Como eu faço para utilizar o Monster Motor Shield junto com um Ethernet Shield?

Fiz a ligação dos dois shields mas quando tento fazer upload do código da a mensagem de timeout.

Comentário de Valter Despontin em 28 junho 2013 às 17:48

Este Monster Motor Shield aguenta o tranco para um motor de partida de moto da 250, obrigado

Comentário de Valter Despontin em 28 junho 2013 às 17:32

tentei este código mas sem sucesso, os leds verde e vermelho da saída do motor ficam acesos direto bem fraquinho e quando coloco um motor eles apagam, o potenciometro não atua em nada tanto para a esquerda como para direita, segue o código:

#include <Stepper.h>
#define BRAKEVCC 0
#define CW 1
#define CCW 2
#define BRAKEGND 3
#define CS_THRESHOLD 15

int preview = 0;//variavel usada para contar a rotacao do motor
const int rotacao = 100;//quantidade de rotacao do potenciometro
Stepper stepper(rotacao, 7,8,4,9);//pinos do motor

int INA[2] = {7, 4};
int INB[2] = {8, 9};
int pwm[2] = {5, 6};
int cs[2] = {2, 3};
int analog = 5;

void setup(){
stepper.setSpeed(200);//aceleracao do motor - velocidade
//colocando o potenciomentro como elemento de entrada de dados
pinMode(analog, INPUT);
//colocando o motor e os sensores como elementos de saída de dados
pinMode(INA[0], OUTPUT);
pinMode(INB[0], OUTPUT);
pinMode(pwm[0], OUTPUT);
//iniciando o motor com valor baixo para ele ficar parado.
digitalWrite(INA[0], LOW);
digitalWrite(INB[0], LOW);
}

void loop(){
int leituraSensor = analogRead(analog);//leitura do sensor

preview = leituraSensor - preview;//decrementação da leitura do sensor

stepper.step(preview);//colocando valores no motor de acordo com a leitura do potenciometro

digitalWrite(INA[0], preview);//colocando o valor do potenciometro no motor

digitalWrite(INB[0], LOW);//colocando o valor do potenciometro no motor
}

não sei o que esta errado que não funciona, com o potenciometro no centro e com com um toque no potenciometro para esquerda o motor era para virar para esquerda e quando vai girando o potenciometro a velocidade vai aumentando, girando o potenciometro do centro para direita era para ter o mermo e efeito que no primeiro caso da esquerda, preciso de ajuda os garagistas, obrigado

segue o esquema abaixo:

Comentário de Valter Despontin em 24 junho 2013 às 16:05

obrigado Wagner vou tentar

Comentário de Wagner Felix Pereira de Souza em 24 junho 2013 às 11:55

Não, nao precisa alterar nada no hardware :P, é um shield.
Agora, eu aconselho voce olhar esse codigo de exemplo, se vc teve algum contato com programação, vai sacar o que faz o que, e ai é só alterar os comandos de "disparo" de acordo com o que vc precisa.

Acho que pra começar qualquer projeto assim, é muito importante começar com o "Hello World", blink led, mudar led de acordo com switch, essas coisas, assim vc percebe melhor que isso tudo não é esse monstro que vc esta achando que é, é questao de perspectiva ;).

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

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço