====== 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<