162.RoboAnalógico

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

Robô controlado por controle analógico.
 * Projeto **

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

Corpo:
 * Software/materiais utilizados **
 * 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). 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).
 * [[image:IMG_20161122_124809732.jpg width="337" height="448"]] || [[image:IMG_20161124_125550283.jpg width="427" height="445"]] ||
 * = **Figura 1 - Rascunho do Projeto** ||= **Figura 2 - Montagem do Corpo** ||
 * [[image:IMG_20161203_161538636.jpg width="378" height="306"]] || [[image:fperrotti/IMG_20161203_165517490.jpg width="385" height="303"]] ||
 * = **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). 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.
 * [[image:WhatsApp Image 2016-12-08 at 15.01.36.jpeg width="513" height="338" caption="Figura 5"]] ||
 * Figura 5 - Eixo e rodas adaptados. ||

code format="c"
 * 1) define HORARIO 1
 * 2) define ANTIHORARIO -1
 * 3) define LIMITE 4
 * 4) define STEPS 2048
 * 5) define PA_X A0
 * 6) 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)); } code 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).
 * [[image:IMG_20161207_221720933.jpg width="331" height="260"]] ||
 * = 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.