Grupo
Clovis Bueno
Luan Bonfim
Paulo Costa
Renan Magalhães
Thiago Oliveira

Projeto
Robô controlado por controle analógico.

Resumo
Projeto de um robô, utilizando material reciclável, movido por dois motores de passo, e controlado por joystick analógico via cabos.

Software/materiais utilizados
Corpo:
  • Corpo de madeira balsa em formato de caixa(retangular);
  • Suporte das rodas de cantoneira de alumínio;
  • Rodas motoras de tampa de plástico(garrafa) de diâmetro de 30mm;
  • Eixo cilíndrico para os motores em madeira(cabo de vassoura);
  • Roda dianteira não motora(rodizío giratório de plástico - 30mm) e suporte em madeira balsa;
  • Cabeça em placa de isopor.

Componentes eletrônicos:
  • Arduíno Nano;
  • Caixa de bateria;
  • Placa de LEDs;
  • 2 Motores de passos de 12 V com 5 vias de alimentação e 4 fases;
  • 4 Baterias de 3,7 V cada;
  • Fios de conexão;
  • 2 Drivers de controle para motor de passo;
  • Joystick analógico.

Software:
  • IDE do Arduíno.

Metodologia

O trabalho consiste na utilização de um microcontrolador Arduíno Nano em um projeto de robô controlado por controle analógico, com dois motores de passos nas rodas traseiras, e uma roda giratória não motorizada na frente, também acoplado ao projeto em uma placa de isopor contendo LEDs de sinalização, informando se o robô está em movimento ou parado. Na alimentação são utilizadas quatro baterias de 3.7 V.
Todos os componentes eletrônicos, o Arduíno, e a roda giratória foram fornecidos pela Faculdade de Tecnologia de Americana.

Desenvolvimento

Etapa 1 - Projeto: O projeto (Figura 1) consiste em um corpo de madeira retangular e fechado, que comporte dentro dele os componentes elétricos, pilhas e o Arduíno, para que não fiquem expostos. Todas as medidas foram tomadas em função da caixa de bateria e do tamanho do Arduíno Nano e das placas de motor.
Etapa 2 - Construção do Corpo: O corpo em madeira foi montado utilizando madeira balsa e cola (Figura 2).
IMG_20161122_124809732.jpg
IMG_20161124_125550283.jpg
Figura 1 - Rascunho do Projeto
Figura 2 - Montagem do Corpo
Etapa 3 - Troca de Motores: Durante a execução do projeto foi necessário trocar o par de motores de passo, pois a voltagem dos motores originais(24 V) não eram compatíveis com a tensão disponível nas baterias. Trocando os motores, consequentemente foi necessário trocar o par de rodas, e ajustar a velocidade do projeto para os motores, conforme os testes realizados para verificar se os motores conseguiriam tracionar o peso do projeto completo. (Figura 3 e 4).
IMG_20161203_161538636.jpg
IMG_20161203_165517490.jpg
Figura 3 - Troca de Par de Motor e Rodas
Figura 4 - Componentes Separados

Etapa 4 - Rodas Patinando: Outro problema durante o desenvolvimento, foi resolver a questão do atrito das rodas com o piso, pois as mesmas estavam patinando durantes as curvas, o que dificultava o movimento; para resolver isso foi necessário encapar as rodas com borracha e prolongar a largura do eixo motor, o que resolveu o problema para a grande maioria dos tipos de piso (Figura 5).
WhatsApp Image 2016-12-08 at 15.01.36.jpeg
Figura 5

Figura 5 - Eixo e rodas adaptados.

Etapa 5 - Código: O código foi desenvolvido utilizando se a IDE do Arduíno com base nas notas das aulas de Laboratório de Programação.


#define HORARIO 1
#define ANTIHORARIO -1
#define LIMITE 4
#define STEPS 2048
#define PA_X A0
#define PA_Y A1
 
//pinos dos olhos
int luz[4] = {2, 3, 12, 13};
 
// pinos das rodas
int pinsR[4] = {8, 9, 10, 11};
int pinsL[4] = {4, 5, 6, 7};
 
int steps[4] = {
  B1000,
  B0100,
  B0010,
  B0001
};
 
//calcula o proximo passo
int nextStep(int currentStep, int dir) {
  if (dir == HORARIO)
    return (currentStep + 1) % LIMITE;
  else if (dir == ANTIHORARIO)
    return (currentStep + LIMITE - 1) % LIMITE;
  else
    return currentStep;
}
 
//executa o passo - pins[] corresponde ao pinos da roda que vai executar
// e current Step é o passo a ser dado
void writeStep(int pins[4], int currentStep) {
  digitalWrite(pins[0], steps[currentStep] & 1);
  digitalWrite(pins[1], (steps[currentStep] >> 1) & 1);
  digitalWrite(pins[2], (steps[currentStep] >> 2) & 1);
  digitalWrite(pins[3], (steps[currentStep] >> 3) & 1);
}
 
//função para retonar a velociadade
//que é o tempo de delay
int calculaVel(int vel) {
  if (vel > 1)
    return ((52 - vel) * 6);
  else if (vel < -1)
    return ((50 - (-vel)) * 6);
  else
    return 0;
}
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  // saida para o motor
  int i;
  for (i = 0; i < 4; i++) {
    pinMode(pinsR[i], OUTPUT);
    pinMode(pinsL[i], OUTPUT);
  }
  //saida para os olhos
  for (i = 0; i < 4; i++) {
    pinMode(luz[i], OUTPUT);
  }
}
 
int currentR = 0,
    currentL = 0,
    countR = 0,
    countL = 0,
    dir = 1,
    vel_X = 0,
    vel_Y = 0;
 
int i;
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(calculaVel(vel_X));
  //captura as posições do analogico
  //dividimos o sinal capturado por 10 para diminuir
  //o erro do controle analogico que não centralizava no 0
  //e subtraimos -50 para centralizar o analogico no 0.
  vel_X = analogRead(PA_X) / 10 - 50;
  vel_Y = analogRead(PA_Y) / 10 - 50;
  //ajusta direção, pra frente ou pra tras
  //conforme posição em X
  if (vel_X > 2) dir = 1;
  else if (vel_X < -2) dir = -1;
  else dir = 0;
 
  //alteração da luz conforme direção
  if (vel_X > 2 || vel_X < -2) {
    for (i = 0; i < 4; i++) {
      digitalWrite(luz[i], HIGH);
    }
  } else {
    for (i = 0; i < 4; i++) {
      digitalWrite(luz[i], LOW);
    }
  }
  //reseta valores para perimitir movimento
  if (countR == 1) countR = 0;
  if (countL == 1) countL = 0;
 
  //Obriga uma roda a não dar passos
  //conforme a posição em Y
  if (vel_Y > 20) countL = 1;
  if (vel_Y < -20) countR = 1;
 
  //executa o passo no motor
  writeStep(pinsR, currentR);
  writeStep(pinsL, currentL);
 
  //calcula o proximo passo do motor
  if (countR == 0) currentR = nextStep(currentR, dir);
  if (countL == 0) currentL = nextStep(currentL, dir);
 
  // vel_X controla o movimento pra frente e pra tras
  // em questao de velocidade
  delay(calculaVel(vel_X));
}
Etapa 6 - Teste Final: Após a troca do motores, foram feitas as últimas fixações no projeto, e colado o restante do corpo, os equipamento elétricos e o Arduíno foram colocados no interior do corpo, e o projeto final foi testado para garantir que nenhum fio tenha ficado solto dentro do corpo.

Resultados

Apesar da troca dos motores e do par de rodas por materiais de nível inferior, o projeto final cumpre os objetivos quanto à sua concepção original, ele realiza movimentos para frente e para trás, e também vira para esquerda e para direita, em ambos os sentidos. A sinalização de LEDs superior fica acesa enquanto o robô estiver em movimento(Figura 6).
IMG_20161207_221720933.jpg
Figura 6 - Projeto Concluído

Conclusão

A utilização de Arduíno facilitou a concepção da programação do projeto, o que foi um grande aprendizado, que ainda poderá ser mais explorado em outros projetos. O projeto ainda utilizou diferentes conceitos aprendidos em diversas disciplinas, sendo eles desde a programação em C, a montagem dos componentes elétricos, e o desenho do corpo do projeto.