Tutorial: Controlando carrinho pelas teclas WASD via comandos Seriais

Adquira estes componentes na Loja do Lab de Garagem

Neste tutorial falaremos como controlar um carrinho atráves das teclas WASD ou via teclado numérico com Arduino. Para isto utilizaremos drivers de motores DC baseados no chip TB6612FNG e em nossa loja você encontra duas opções, uma da Sparkfun e a outra da Pololu e abordaremos a diferença entre eles mais a frente.

 

Lista de Materiais 

1 x Arduino Uno Rev 3 ou Garagino Rev 1

1 x Chassis Zumo

1 x Driver Pololu ou Sparkfun - Motor Driver 1A Dual TB6612FGN

2 x Micro motor com caixa de redução de metal 75:1

1 x Protoboard

Alguns jumpers

 

Drivers baseados no Chip TB6612FGN

Abaixo você vê a imagem dos dois Drivers:

Vista Superior dos drivers - A esquerda driver da Sparkfun e a direita o da Pololu

No Tutorial: Seguidor de linha com plataforma Zumo e Garaginoutilizamos o driver da Pololu para controlar os motores que moviam o carrinho. Neste tutorial vamos dar mais informações sobre estes Drivers.

Estes drivers são versáteis e podem controlar 2 motores DC com consumo de corrente constante máxima de 1,2 A e corrente de pico máxima de até 3,2A. Cada motor é identificado pelas letras A e B e os pinos de saída são respectivamente AO1, AO2, e  BO1, BO2.

Para cada  motor, há 3 pinos de controle, sendo eles: PWMA, AIN1 e AIN2 para o motor A e  PWMB, BIN1 e BIN2 para o motor B.

Há ainda um pino de Standby (STBY) que se estiver em nível lógico 0, para a operação do Driver e desativa os dois motores.

 

Modos de Operação 

Os modos de operação são 5: Sentido Horário (CW), Sentido Anti-horário(CCW) , Freio (Short Brake), Parar (Stop) e Standby.

Estes modos são selecionados conforme a tabela abaixo:

Legenda:

H - Nível lógico 1

L - Nível lógico 0

 

Diferença entre os Drivers

Os dois drivers são praticamente idênticos com relação programação necessária para utiliza-los, mas a pinagem das placas e um circuito de proteção que há no driver da Pololu e é inexistente no da Sparkfun.

A pinagem é diferente entre os dois driver conforme mostra a figura abaixo:

Vista inferior dos drivers - A esquerda driver da Sparkfun e a direita o da Pololu

 

Diferença do circuito de proteção conforme esquemático abaixo:

 

 Esquema elétrico dos Drivers - Na parte inferior driver da Sparkfun e na parte superior o da Pololu

O Circuito
Abaixo você pode ver o esquema de ligação do driver da Sparkfun com o Arduino para controlar o carrinho:

O Controle

Enviamos comandos via comunicação serial para o Arduino através do programa UTF-8 Tera Term (não utilizamos o Serial Monitor  pois ele necessita do Enter para confirmar o envio). Quando as teclas W, A, S, D e  ou as teclas do teclado numérico 8, 4, 2, 6 e 5 são recebidas pelo Arduino, o mesmo executa as seguintes funções:

O Sketch


//Definições para controlar o Motor A
#define PWMA 3 //Controle de Velocidade
#define AIN1 4 //Modo de Operação
#define AIN2 5 //Modo de Operação
#define MOTOR_A 1 //Define motor da Direita com valor 1

//Definições para controlar o Motor B 
#define PWMB  6 //Controle de Velocidade
#define BIN1  7 //Modo de Operação
#define BIN2  8 //Modo de Operação
#define MOTOR_B 2 //Define motor da Direita com valor 2

byte letra;
void setup()
{
  //Define os pinos de controle como pinos de saída
  pinMode(PWMA, OUTPUT);
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

pinMode(PWMB, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  //pinMode(13, OUTPUT);
  Serial.begin(9600);

}

void loop()
{
  if (Serial.available() > 0)
    {
    letra = Serial.read();
    switch(letra)
      {
      case '8'://FRENTE
      case 'w':
      case 'W':
        move(MOTOR_A, 255, 1); //Motor da Esquerda, para o Motor, sentido de rotação
        move(MOTOR_B, 255, 2); //Motor da Direita, a toda velocidade, sentido de rotação
        break;

case '4'://ESQUERDA
      case 'a':
      case 'A':
        move(MOTOR_A, 255, 2); //Motor da Esquerda, baixa velocidade, reverso
        move(MOTOR_B, 255, 2); //Motor da Direita, baixa velocidade, reverso
        break;

case '2'://TRÁS
      case 's':
      case 'S':
        move(MOTOR_A, 255, 2); //Motor da Esquerda, para o Motor, sentido de rotação
        move(MOTOR_B, 255, 1); //Motor da Direita, a toda velocidade, sentido de rotação
        break;

case '6'://DIREITA
      case 'd':
      case 'D':
        move(MOTOR_A, 255, 1); //Motor da Esquerda, para o Motor, sentido de rotação
        move(MOTOR_B, 255, 1); //Motor da Direita, a toda velocidade, sentido de rotação
        break;

      case '5'://PARADO
      case 'p':
      case 'P':
        move(MOTOR_A, 0, 2); //Motor da Esquerda, para o Motor, sentido de rotação
        move(MOTOR_B, 0, 1); //Motor da Direita, a toda velocidade, sentido de rotação
        break;
      }
    letra = Serial.read();
    letra = 0;
    }
}

void move(int motor, int speed, int direction)
{
  boolean inPin1 = LOW;
  boolean inPin2 = HIGH;

if(direction == 1)
  {
    inPin1 = HIGH;
    inPin2 = LOW;
  }

if(motor == 1)
  {
    digitalWrite(AIN1, inPin1);
    digitalWrite(AIN2, inPin2);
    analogWrite(PWMA, speed);
  }
  else
  {
    digitalWrite(BIN1, inPin1);
    digitalWrite(BIN2, inPin2);
    analogWrite(PWMB, speed);
  }
}

 

Então é isto pessoal!!! Espero que tenham gostado do Tutorial pois tem muita gente que procura um modo de controlar carrinhos pelo computador. Se tiverem dúvidas ou opiniões comentem abaixo.

\o/

 

Referências

https://code.google.com/p/fritzing/issues/detail?id=875

http://bildr.org/2012/04/tb6612fng-arduino/

http://www.pololu.com/catalog/product/713

https://www.sparkfun.com/products/9457

Exibições: 13401

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 luciano toloto de souza em 31 agosto 2015 às 18:42

Daria para controlar com joystick  instalando JoyTokey ?

 

Comentário de Alef Carvalho em 3 maio 2015 às 14:50

Gostaria de saber se em vez de um Micro motor com caixa de redução de metal 75:1 e possível usar um servo motor de rotação continua.

Comentário de Andre Correia em 29 julho 2013 às 0:30

Tenho um driver de corrente modelo l9110 e ele não tem todas as conexões como esse usado no exemplo, ele tem vcc, gnd, a-ia, a-ib, b-ia, b-ib. Quero saber como proceder para fazer o robô funcionar plenamente.

Comentário de Laboratório de Garagem em 20 maio 2013 às 11:07

Olá Cristiano,

Você pode se basear neste Sketch para fazer o que você deseja... 

Segurar o W e o não encher o buffer serial esta implementado. Isto já é 90% do caminho.

O que você deve fazer é uma pequena modificação. 

Comentário de Cristiano Lino em 18 maio 2013 às 17:04

Primeiramente parabens pelo Tutorial. Sou iniciante neste mundo dos microcontroladores então ainda tenho dificuldades em adaptar os sketch para minhas necessidades. Pelo que percebi no vídeo, para o tanque ir para frente basta "digitar" o "w" gostaria de saber se é possível fazer com que o tanque vá para frente se o "w" for mantido pressionado e ao ser solto o tanque parar.

ps.: não sei se este é o local pertinente para o questionamento, se não for poderia remolver por gentileza. Abraço

© 2021   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço