====== Trabalho Prático 2 - Nelsinho PIC-E ====== ===== Introdução ===== === Objetivos === Os objetivos deste trabalho são basicamente: * Avaliação experimental dos erros de atuação * Desenvolvimento de controle simples para o robô * Programação de tarefas concorrentes === Tarefas === - Estrutura e Controle: Desenvolver um robô apenas com peças do kit Lego (incluindo as rodas) e dois motores. Esse robô será controlado apenas pela HandyBoard. - Menu: Todas as tarefas deverão ser acessadas facilmente por meio de um menu, do potenciômetro e dos botões. A usabilidade dessa interface será avaliada. - Erros de translação e rotação: Para auxiliá-lo nessas tarefas, deve-se criar um dispositivo que levante e abaixe uma marcador (pincel atômico, marcador de quadro branco, caneta hidrográfica, etc.) sobre uma cartolina ou papel, no qual o robô trafegará (lembre-se de levar um idêntico para a apresentação). Dessa forma as trajetórias ficarão claramente marcadas e poderão ser medidas e verificadas com maior facilidade e precisão. - Calibração: para determinar a distância percorrida ou o ângulo de rotação em função do tempo de acionamento dos motores, deve-se realizar uma “calibração” prévia. Para isso faça, pelo menos, 10 testes para cada valor de potência P. Deve-se apresentar uma tabela onde para cada tempo t haja, pelo menos, 10 colunas com valores das distâncias (ângulos) percorridas. Tem-se que plotar um gráfico t x d (t-tempo; d-distância percorrida pelo robô ou theta - ângulo de rotação do robô). (P e t devem ser selecionados no menu). O gráfico deve mostrar o valor médio e a barra de erro correspondente de um desvio padrão em torno da média, como mostrado abaixo: {{:cursos:introrobotica:2009-2:grupo6:grafico.jpg|}} Com as tabelas de calibração, é possível ajustar curvas (polinômios) que possam ser utilizados para se obter distâncias e ângulos quaisquer (interpolação). === Apresentação === **Data de Apresentação:** 29/09/09 01/10/2009 ===== Desenvolvimento ===== === Reuniões === **24 de Setembro de 2009** Pontapé inicial do trabalho. Após todos os integrantes lerem a especificação, foi discutido opções para os protótipos. Ficou decidido que o robô terá 3 rodas sendo que 2 serão tracionadas por motores. A roda dianteira servirá apenas como um apoio, e estamos tratando de deixá-la com o menor atrito possível, para tal está sendo feito um apoio que deixará a roda livre pra se alinhar com o movimento do robô. Para as reduções, inicialmente utilizamos a rosca sem fim e mais 2 reduções em série, achamos o movimento lento, entretanto, manteremos essa configuração já que não temos limitação e tempo. **27 de Setembro de 2009** Nessa reunião terminamos a estrutura do robô e começamos a programação. Pausa para o Majestoso... Nesse momento não tínhamos a definição da terceira "roda", pois primeiramente colocamos uma roda que não aguentava o esforço e saia, depois colocamos um apoio que gerava muito atrito. Por indicação do Grupo 5, decidimos pegar um Rolon no laboratório. Como o robo "lembra" um carro de fórmula 1, nomeamos nosso robô: Nelsinho PIC-E, o piloto da moda juntamente com um famoso controlador PIC, que criamos uma nova versão. **30 de Setembro de 2009** Reunião de ajustes finais, testes no laboratório, sobre a cartolina. Todos os testes demoraram bastante. O problema com o eixo do motor atrasou ainda mais. === Código === int test(){ /* test mode variables */ int power=0; int time=0; /*setting the engine power*/ printf("Press START to change the power value\n"); while(!start_button()); while(start_button()); while(!stop_button()){ printf("Power = %d \n",power); power=knob()-100; sleep(0.25); } /*setting the functioning time*/ printf("Press START to change the time value\n"); while(!start_button()); while(start_button()); while(!stop_button()){ printf("Time = %d sec\n",time); time=knob(); sleep(0.25); } /*motor functions*/ motor(0,power); motor(1,power); sleep((float)time); alloff(); /*end of function*/ return 0; } int translation(){ /*translaction mode variable*/ int distance=0; /*setting the distance track*/ printf("Press START to change the distance value\n"); while(!start_button()); while(start_button()); while(!stop_button()){ printf("Distance = %d cm\n",distance); sleep(0.25); if(knob()<85) distance=10; else if(knob()<170) distance=20; else distance=30; } /*function*/ translate(distance); /*end of function*/ return 0; } int translate(int value){ if(value == 10){ sleep(2.0); motor(0,95); motor(1,85); /*calibrar valores*/ sleep(2.3); alloff(); }else if(value == 20){ sleep(2.0); motor(0,95); motor(1,85); sleep(4.6); alloff(); }else{ sleep(2.0); motor(0,95); motor(1,85); sleep(7.0); alloff(); } return 0; } int rotation(){ /*rotation mode variables*/ int angle=0; /*setting the angle rotation*/ printf("Press START to change the angle value\n"); while(!start_button()); while(start_button()); while(!stop_button()){ printf("Angle = %d grads\n",angle); sleep(0.25); if(knob()<85) angle=30; else if(knob()<170) angle=60; else angle=90; } /*function*/ rotate(angle); /*end of function*/ return 0; } int rotate(int value){ if(value == 30){ sleep(2.0); motor(0,90); /* calibrar valores */ motor(1,-90); sleep(1.3); alloff(); }else if(value == 60){ sleep(2.0); motor(0,90); /* calibrar valores */ motor(1,-90); sleep(2.6); alloff(); }else{ sleep(2.0); motor(0,90); motor(1,-90); /* calibrar valores */ sleep(3.9); alloff(); } return 0; } int leds(){ poke(0x1009,0x3c); /*map spin digital output*/ while(!stop_button()){ printf("Aperte STOP para abortar.\n"); sleep(1.0); poke(0x1008,4<