Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

domingo, 25 de agosto de 2013

Automação no Parque, 24/08/2013 - Projeto Rover 5

Nesse sabadão lidamos com dois projetos: um carrinho de esteiras, o Rover 5, muito popular nos EUA para diversão com o Arduino. O outro fiu um tacômetro baseado em dois encoders, visando determinar a velocidade e a direção de giro de um disco. Nesse projeto a único resultado que obtivemos foi queimar os dois encoders, graças à minha teimosia em ligar LED sem resistor. Semana que vem tem mais...

Já no outro projeto tivemos bastante sucesso.


Esse é o Rover 5. Fabricado pela Dagu, é vendido em muitas lojas on-line dos EUA. Você o acha por aqui, também, mas prá variar custa uma grana.

Tem duas versões: uma com dois motores CC e a outra com quatro. Cada motor tem seu próprio encoder, o que deve possibilitar um controle muito preciso de posicionamento. Esse que estamos hackeando tem quatro motores. É de um ex-aluno da FATESF o Ângelo, que vai comandá-lo a partir de um celular.

Ele comprou o jipinho nos EUA. Quando chegou aqui descobriu que um dos eixos estava completamente empenado, o que fazia com que a esteira simplesmente saísse fora quando os motores eram acionados. Nada complicado prá um sujeito que trabalha na Embraer.

Nesse sábado a ideia ela simplesmente acionar os motores através do driver, já ele só havia sido testado ligando-se os motores direto na bateria.

O Ângelo comprou esse driver de acionamento de motores aqui:


Ele funciona com até quatro motores CC, cada um com seu encoder. As conexões estão descritas no diagrama acima. Basicamente,à esquerda são ligados os pinos do Arduino que comandam os motores, respectivamente:

- Pino terra (GND)

- Pino PWM: ligado a um pino PWM do Arduino, controla a velocidade do motor.

- Pino Direction: controla a direção de giro, sinal do Arduino HIGH roda numa direção, LOW na outra. Uma coisa interessante no carrinho é que os motores são montados em oposição em termos de giro. Isso significa que se vc aplicar HIGH num motor da parte dianteira do carrinho e ele girar prum lado, ao aplicar o mesmo HIGH a um motor da parte traseira (ou na parte oposta, já que ele é simétrico, então vc tem que escolher a frente) ele vai girar na direção contrária. Nada que não possa ser corrigido por software.

- Pino Current: é conectado a um sensor de corrente, com sensibilidade de 1V/A, até o máximo de 5V. isso significa que vc pode legá-lo diretamente a um pino analógico do Arduino e monitorar a corrente, de modo a ver se tem algo errado. Esses motores não devem operar acima de 1,5A, ou menos até.

À direita são conectados os encoders, suas entradas e alimentação (pinos que vem dos encoders) na parte externa da placa e as saídas na parte interna. São dois encoders, que juntos permitem que a gente determine não só a velocidade e consequentemente a distância mas também a direção de giro. Como fazer isso? Fica para um próximo post. Por agora, a tarefa é acionar os motores na mesma direção, controlando a velocidade.

No mais, tem a conexão para a fonte de alimentação dos motores. Já que o Arduino não consegue prover a corrente necessária, é preciso ter uma outra fonte para isso. Essa pode ser seis pilhas AA, ligadas em série de maneira a prover 9Vcc. Tem também uma conexão para alimentação da parte eletrônica da placa, que vc pode "pegar" da saída Vcc do Arduino. E por fim, as conexões para os quatro motores.

Os camaradas já trouxeram o carrinho com s conexões elétricas prontas entre motores, encoders, driver e Arduino, então foi fazer um "pograminha" de teste e botar prá rodar.

À esquerda, o  driver conectado.











E abaixo, o carrinho montado. Dá prá ver as seis baterias dos motores e uma de 9V para alimentação do Arduino.


/*************************************************************
Automação no Parque - 25/08/2013
Controle do Dagu Rover 5
assismauro@hotmail.com
**************************************************************/

#define FRENTE 1
#define RE 0

// O array abaixo define o controle dos  motores
// Indica onde está ligado cada pino do Arduino
// correspondente a um motor (0,1,2,3)
//                  CUR DIR PWM FWD MSK 
int motor[4][4] = {{A0, 4,  5,  HIGH}, // motor 0
                   {A1, 7,  6,  HIGH}, // motor 1
                   {A2, 10, 11, LOW},  // motor 2
                   {A3, 8,  9,  LOW}}; // motor 3
/*    
Diagrama do posicionamento dos motores no carrinho   

      Frente
      _____
    0|     |1
     |     |
     |     |
    2|_____|3

Pino     Função
--------------------------------------------------
CUR      Sensor de corrente
DIR      Direção
PWM      Velocidade
FWD MASK indica qual o sinal que o motor deve receber para acionar o motor prá frente.
*/

// Essa rotina é a que conta os sinais enviados pelo encoder.
// A saída de um dos encoders está ligada ao pino 2 do Arduino,
// fazendo que count seja incrementado. Quanto mais veloz, mais 
// "counts" por unidade de tempo.
volatile unsigned int count = 0;
void encoderInt()
{
  count++;
}

// Set os modos dos pinos que serão usados
void setPinsMode()
{
  for(int i=0;i<4;i++)
  {
    for (int j=1;j<3;j++)
    {
      pinMode(motor[i][j],OUTPUT);
      pinMode(motor[i][j],OUTPUT);
    }
  }
}

// Comanda cada motor individualmente. Recebe como parâmetro o número do motor,
// a direção e a velocidade
void setMotor(int no, int dir, int speed)
{
  // Aqui ocorre a inversão do sinal de direção de acordo com a posição do motor
  if (dir)
    digitalWrite(motor[no][1], motor[no][3]);
  else
    digitalWrite(motor[no][1], !motor[no][3]);
  analogWrite(motor[no][2], speed);
}

// Aqui se aciona o carrinho "como um todo" (argh!).
// Tem dois dir e duas speed, porque comanda-se individualmente
// cada lado do rover, de maneira a fazer curvas, por exemplo.
void rover(int dirEsq, int dirDir, int speedEsq, int speedDir)
{
  setMotor(0,dirDir,speedDir);
  setMotor(1,dirEsq,speedEsq);
  setMotor(2,dirDir,speedDir);
  setMotor(3,dirEsq,speedEsq);
}

//Para o rover (dãããã...)
void roverParado()
{
  rover(FRENTE,FRENTE,0,0);
}

void setup()
{
  Serial.begin(9600); 
  setPinsMode();
// Conecta a interupção do encoder
  attachInterrupt(0,encoderInt,RISING);
}

void loop()
{
  // Move o rover à frente, com velocidade 50 (vai até 255)
  rover(FRENTE,FRENTE,50,50);
  // Mostra a contagem do encoder a cada segundo, ou seja, indica a velocidade.
  // Depois vai-se calibrá-lo para m/min.
  delay(1000);
  Serial.println(count);
  count=0;
}


Por fim, vídeo do resultado. Sabadão tem mais com o jipinho.