#define Itens_Menu 5
float MAX = 100.0 ,MIN = -100.0, Kp = 7.0, Kd = 10.0;
float vel8 = 0.0, vel9 = 0.0;
int cont8 = 0;
int cont9 = 0;
float power8, power9;
float var30 = 30.0;
float var90g = 7.0;
int velm1 = 100, velm2 = 93;
float tempo1 = 9.0 , tempo2 = 9.0;
int a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0, a7 = 0,a8=0;
int pid1, pid2, pid3, pid4, pid5, pidm1, pidm2,pid6,pid7,pid8;
int Parede_D = 14, Parede_E=4,Luz_H=2,Luz_V=6,Luz_Partida=9;
persistent int ponto_escuro = 100;
persistent int ponto_claro = 100;
persistent int media_cor[5][3];
persistent int dv[5][3];
persistent int VparedeD, VparedeE,pertoD,pertoE,longeD,longeE,Luz_Escolha;
char Menu[Itens_Menu][40] = {“0- Inicia_Partida Derick”, “1- Inicia_Partida2 Flavio”, “2- flavio calibrando”, “3- calibra tudo”, “4- polar”};
char bloco_cor[6][10] = {“Preto”, “Amarelo”, “azul”, “verde”, “vermelho”,”Erro”};
void velo8(){
int cont_ant = 0, te = 0; vel8 = 0.0; while(1){ if(cont8 != cont_ant){ vel8 = ((float)cont8 - (float)cont_ant)/((float)te*0.1); cont_ant = cont8; te = 1; } else { te = te + 1; if(te == 5) vel8 = 0.0; } sleep(0.1); }
}
void velo9(){
int cont_ant2 = 0, te2 = 0; vel9 = 0.0; if(cont9 != cont_ant2){ vel9 = ((float)cont9 - (float)cont_ant2)/((float)te2*0.1); cont_ant2 = cont9; te2 = 1; } else { te2 = te2 + 1; if(te2 == 5) vel9 = 0.0; }
} void count8(){
int est_ant = digital(8); int est_ant2 = digital(7); cont8 = 0; cont9 = 0; while(1){ if (est_ant == 0 && digital(8) == 1){ if(velm1>=0){ cont8 = cont8 + 1; } else { cont8 = cont8 - 1; } } est_ant = digital(8); if (est_ant2 == 0 && digital(7) == 1){ if(velm2>=0){ cont9 = cont9 + 1; } else { cont9 = cont9 - 1; } } est_ant2 = digital(7); sleep(0.004); }
}
void start_menu(){
int i = 0; int option; while(1){ while((!start_button()) || (!stop_button())){ printf("%s\n",Menu[i]); msleep(100L); if (start_button()){ executeItem(i); while (start_button()); } if (stop_button()){ i = (i + 1)% Itens_Menu; while (stop_button()); } } }
}
int rodar(float temp ,int vel, int mot){
motor(mot,vel); sleep(temp); off(mot);
} void stop(){
motor(0,0); motor(2,0); off(0); off(2);
}
void executa_teste(float ref){
int con; float eps = 0.2; while(!stop_button()){ con = cont8; power8 = Kp*( ref - (float)con); if(power8 > MAX){ power8= MAX; } else if(power8< MIN){ power8= MIN; } motor(0,(int)(power8+eps)); //printf("p = %f c = %d v = %f\n", power8, con, vel8); }
}
void executa_teste2(float ref){
int con; while(!stop_button()){ con = cont9; power9 = Kd*( ref - (float)con); if(power9 > MAX){ power9= MAX; } else if(power9< MIN){ power9= MIN; } motor(2,(int)power9); }
}
int executa_andar(float ref1, float ref2){
int wall_D, cor; float t1, t2; cont8 = 0; cont9 = 0; executa_andar2(100); wall_D = digital(Parede_D); if (wall_D == 1){ executa_braco2(); wall_D= digital(Parede_D); } cont8 = 0; cont9 = 0; executa_andar2(-9);
rodar(0.4, -70, 3); sleep(1.0); off(3);
executa_andar2(-8); executa_braco3(); executa_andar2(20); wall_D = digital(Parede_D); if (wall_D == 1){ wall_D= digital(Parede_D); } executa_braco(); cor=executa_cor(); //se nao preto: pega, da re ate a base if(cor!=0){ executa_andar2(-40); return 0; } else{ executa_andar2(-8); executa_rodar(90); executa_andar2(8); executa_rodar(-90); return 1; } stop();
}
void executa_andar_old(){
pidm1 = start_process(rodar(tempo1, velm1, 0)); pidm2 = start_process(rodar(tempo2, velm2, 2)); sleep(tempo1); kill_process(pidm1); off(0); kill_process(pidm2); off(2);
}
void executa_andar2(int ref){
int wall_D; cont8 = 0; cont9 = 0; if (ref < 0){ velm1 = -velm1; velm2 = -velm2; pidm1 = start_process(rodar(30.0, velm1, 0)); pidm2 = start_process(rodar(30.0, velm2, 2)); } else{ pidm1 = start_process(rodar(30.0, velm1, 0)); pidm2 = start_process(rodar(30.0, velm2, 2)); } wall_D = digital(Parede_D); if (ref < 0){ while(cont8 > ref){ } } else while(cont8 < ref && wall_D == 0){ wall_D = digital(Parede_D); } motor(0,0); motor(2,0); kill_process(pidm1); off(0); kill_process(pidm2); off(2); if (ref <= 0){ velm1 = -velm1; velm2 = -velm2; }
}
void execua_re(float tempo){
pidm1 = start_process(rodar(tempo, -70, 0)); pidm2 = start_process(rodar(tempo, -70, 2)); sleep(tempo); kill_process(pidm1); off(0); kill_process(pidm2); off(2);
}
void executa_rodar(int graus){
float temp1; if(graus==90||graus==-90){ temp1=2.3; }else{ if(graus==15){ temp1=0.3; }else{ temp1=4.5; } } if(graus>0){ pidm1 = start_process(rodar(temp1, -velm1, 0)); pidm2 = start_process(rodar(temp1, velm2, 2)); }else{ pidm1 = start_process(rodar(temp1, velm1, 0)); pidm2 = start_process(rodar(temp1, -velm2, 2)); } sleep(temp1); kill_process(pidm1); off(0); kill_process(pidm2); off(2);
}
Calibra linha escura e clara
void calibra_linha(){
int new; int cont=0; int soma=0; while(cont<10) { new = sensor_linha(); printf("Linha escura=%d\n",new); sleep(0.2); soma =soma+new; sleep(0.2); cont++; } ponto_escuro=soma/10; printf("Linha escura=%d\n",ponto_escuro); sleep(1.0); printf("Start para ponto branco"); while(!start_button()){ } cont=0; soma=0; while(cont<10) { new = sensor_linha(); printf("Linha clara=%d\n",new); sleep(0.2); soma =soma+new; sleep(0.2); cont++; } ponto_claro=soma/10; printf("Linha clara=%d\n", ponto_claro); sleep(1.0);
}
void calibra_cor(){
int new; int soma=0; int i, j, k, maior = 0, menor = 256; poke(0x1009, 0x3c); for (i = 0; i < 5;i ++){ sleep(0.5); printf("Start para %s\n",bloco_cor[i]); while(!start_button()){ } for (j = 0; j < 3; j ++){ soma = 0; for (k = 0; k < 2; k ++){ acende_led(j); sleep(0.2); new = sensor_cor(); if (new > maior) maior = new; if (new < menor) menor = new; printf("%s = %d\n", bloco_cor[i], new); soma = soma + new; sleep(0.1); } apaga_led(j); media_cor[i][j] = soma/2; dv[i][j] = maior- menor; } }
}
int executa_cor(){
int i,j,k,numCor=5; int cor[3]; int soma,new; printf("Executando leitura\n"); sleep(0.5); for (j = 0; j < 3; j ++){ soma = 0; for (k = 0; k < 3; k ++){ acende_led(j); sleep(0.2); new = sensor_cor(); soma = soma + new; sleep(0.1); } apaga_led(j); cor[j]=soma/3; } for(i=0;i<5;i++){ if(cor[0]>=(media_cor[i][0]-4)&&cor[0]<=(media_cor[i][0]+4)&&cor[1]>=(media_cor[i][1]-4)&&cor[1]<=(media_cor[i][1]+4)&&cor[2]>=(media_cor[i][2]-4)&&cor[2]<=(media_cor[i][2]+4)){ numCor=i; } } printf("Cor= %s\n", bloco_cor[numCor]); sleep(0.5); if(numCor==5){ return(0); }else{ return(numCor); }
}
Executa andar na linha
void executa_linha(){
while(1) { andar_direita(); na_linha(); fora_linha(); para_motor(); sleep(0.1); andar_esquerda(); na_linha(); fora_linha(); }
}
motor direita: 2 motor esquerda:0
void andar_reto(){
motor(0,95); motor(2,95);
}
void andar_esquerda(){
//motor(0,0); //motor(2,90); //sleep(0.5); motor(0,30); motor(2,90);
}
void andar_direita(){
//motor(0,80); //motor(2,0); //sleep(0.4); motor(0,75); motor(2,20);
}
void para_motor(){
motor(0,0); motor(2,0);
}
Calibra Parede
void calibra_parede(){
int wall= analog(Parede_E); sleep(1.0); while(!start_button()){ wall= analog(Parede_E); printf("Start para Parede_E= %d\n",wall); sleep(0.5); } printf("Parede_E= %d\n",wall); sleep(1.0); VparedeE= wall; beep(); sleep(1.0); /* give a pause for the display */ wall= digital(Parede_D); while(!start_button()){ wall= digital(Parede_D); printf("Start para Parede_D= %d\n",wall); sleep(0.5); } printf("Parede_D= %d\n",wall); sleep(1.0); VparedeD= wall; beep(); printf("Fim da calibragem\n"); sleep(1.0); /* give a pause for the display */
}
void calibra_paredeGentle(){
int wall= analog(Parede_E); while(!start_button()){ wall= analog(Parede_E); printf("Start para Parede_E perto= %d\n",wall); sleep(0.5); } pertoE= wall; printf("pertoE %d\n", pertoE); beep(); sleep(1.0); while(!start_button()){ wall= analog(Parede_E); printf("Start para Parede_E longe= %d\n",wall); } longeE= wall; printf("longeE %d\n", longeE); beep(); sleep(1.0); //parede da direita// while(!start_button()){ wall= digital(Parede_D); printf("Start para Parede_D perto= %d\n",wall); } pertoD= wall; printf("pertoD %d\n", pertoD); beep(); sleep(1.0); while(!start_button()){ wall= digital(Parede_D); printf("Start para Parede_D longe= %d\n",wall); } longeD= wall; printf("longeD %d\n", longeD); beep(); sleep(1.0); printf("Fim da Calibracao.\n"); beep(); sleep(0.5);
}
Segue parede simples void Parede_Simples(){
//x= 0; while (1) { int wall_D=digital(Parede_D); int wall_E=analog(Parede_E); printf("wall_D:%d wall_E: %d\n", wall_D, wall_E); if (wall_E > VparedeE) andar_esquerda(); /*longe */ else andar_direita(); /* perto */ if (wall_D < VparedeD){ execua_re(1.3); executa_rodar(90); /* longe */ } }
}
Segue parede Gentle void Parede_Gentle(){
while (1) { //int x =0; int wall_D= digital(Parede_D); int wall_E=analog(Parede_E); printf("wall_D:%d wall_E: %d\n", wall_D, wall_E); if (wall_E >= longeE){ /* too far */ andar_esquerda(); }else{ if (wall_E <= pertoE){ /* too close */ andar_direita(); }else{ if(wall_D >= longeD){ andar_reto(); } } } if (wall_D < longeD){ /* too close */ execua_re(1.3); executa_rodar(90); } }
}
void alinhar(){
if(Luz_Escolha==Luz_H){ int luzh = digital(Luz_H); int luzv = digital(Luz_V); }else{ int luzv = digital(Luz_H); int luzh = digital(Luz_V); } if(!luzv() && luzh()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); }else{ pidm1 = start_process(rodar(10.0, -velm1, 0)); pidm2 = start_process(rodar(10.0, velm2, 2)); while(1){ if(!luzv() && luzh()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); break; } //printf("luz:%d%d\n", luzv, luzh); sleep(0.5); } } beep(); sleep(0.5);
}
void alinhar2(){
if(Luz_Escolha==Luz_H){ int luzh = digital(Luz_H); int luzv = digital(Luz_V); }else{ int luzv = digital(Luz_H); int luzh = digital(Luz_V); } if(!luzv2() && luzh2()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); }else{ pidm1 = start_process(rodar(10.0, -velm1, 0)); pidm2 = start_process(rodar(10.0, velm2, 2)); while(1){ if(!luzv2() && luzh2()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); break; } sleep(0.5); } } beep(); sleep(0.5);
}
void escohe_luzV(){
Luz_Escolha=Luz_V; printf("Vertical"); sleep(1.5);
}
void escohe_luzH(){
Luz_Escolha=Luz_H; printf("Horizonal"); sleep(1.5);
}
void na_linha(){
while(sensor_linha() < ponto_escuro);
}
void fora_linha(){
while(sensor_linha() > ponto_claro);
}
int sensor_linha(){
return analog(2);
} int sensor_cor(){
return analog(3);
}
void executa_reta(){
executa_andar(var30, var30); executa_andar(var90g,-var90g); executa_andar(var90g,-var90g); executa_andar(var30, var30);
}
void acende_led(int cor){
if (cor == 0){ bit_set(0x1008, 4);//led vermelho } else if(cor == 1){ bit_set(0x1008, 8);//led verde } else if(cor == 2){ bit_set(0x1008, 16);//led amarelo }
}
void apaga_led(int cor){
if (cor == 0) bit_clear(0x1008, 4); else if(cor == 1) bit_clear(0x1008, 8); else if(cor == 2) bit_clear(0x1008, 16);
}
void executa_luzes(){
int tempo; tempo=0; while(tempo<8){ bit_set(0x1008, 4);//led vermelho// sleep(1.0); bit_clear(0x1008, 4); bit_set(0x1008, 8);//led verde// sleep(1.0); bit_clear(0x1008, 8); bit_set(0x1008, 16);//led amarelo// sleep(1.0); bit_clear(0x1008, 16); tempo++; }//end while//
}
void executa_musica2(){
}
void executa_musica(){
int pidt1, pidt2,pidt3; pidt1 = start_process(executa_luzes()); pidt2 = start_process(rodar(20.0 ,50, 0)); pidt3 = start_process(executa_musica2()); sleep(20.0); motor(0,0); off(0); kill_process(pidt2); kill_process(pidt3); tone(380.0, 0.01); bit_clear(0x1008, 4); bit_clear(0x1008, 8); bit_clear(0x1008, 16); kill_process(pidt1);
}
int andar_frente(){
int pidteste2 = start_process(count8()); int reu; reu = executa_andar(30.0, 30.0); kill_process(pidteste2); return (reu);
}
int naobate(){
while (1) { int wall_D= digital(Parede_D); int wall_E=analog(Parede_E); printf("wall_D:%d wall_E: %d\n", wall_D, wall_E); if (wall_E <= pertoE){ /* too close */ andar_direita(); }else{ if(wall_D == 0){ andar_reto(); } } if (wall_D == 1 || sensor_cor()>240){ /* too close */ stop(); break; } }
}
void voltabase(){
execua_re(1.5); while(1){ if (analog(Luz_Escolha)<50){ break; }else{ execua_re(1.5); alinhar2(); } }
}
void tatica1(){
int cor=5; while(1){ naobate(); //verificacor// cor=executa_cor(); //se nao preto: pega, da re ate a base// if(cor!=0){ executa_braco(); execua_re(2.0); voltabase(); executa_rodar(90); executa_braco3(); executa_rodar(-90); }else{//se preto: vira a direita e não bate. // execua_re(1.3); executa_rodar(-90); } }
}
void executa_taticas(int p){
int reu = 1; if(p == 1){ tatica1(); } else{ while(reu == 1){ reu = andar_frente(); } }
}
void begin(int p){
calibra_luz(); executa_taticas(p);
} int luzv(){
int luzv = analog(Luz_V); if(luzv<=35){ return(1); }else{ return(0); }
} int luzh(){
int luzh = analog(Luz_H); if(luzh<=75){ return(1); }else{ return(0); }
} void calibra_luz(){
if(!luzv() && luzh()){ off(0); off(2); Luz_Escolha=Luz_H; }else if(luzv() && !luzh()){ off(0); off(2); Luz_Escolha=Luz_V; }else{ pidm1 = start_process(rodar(10.0, -velm1, 0)); pidm2 = start_process(rodar(10.0, velm2, 2)); while(1){ if(!luzv() && luzh()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); Luz_Escolha=Luz_H; break; }else if(luzv() && !luzh()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); Luz_Escolha=Luz_V; break; }else{ sleep(1.0); } } } }
int luzv2(){ int luzv = analog(Luz_V); if(luzv<=100){ return(1); }else{ return(0); }
} int luzh2(){
int luzh = analog(Luz_H); if(luzh<=150){ return(1); }else{ return(0); }
}
void calibra_luz2(){ if(!luzv2() && luzh2()){ off(0); off(2); Luz_Escolha=Luz_H; }else if(luzv2() && !luzh2()){ off(0); off(2); Luz_Escolha=Luz_V; }else{ pidm1 = start_process(rodar(10.0, -velm1, 0)); pidm2 = start_process(rodar(10.0, velm2, 2)); while(1){ if(!luzv2() && luzh2()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); Luz_Escolha=Luz_H; break; }else if(luzv2() && !luzh2()){ kill_process(pidm1); off(0); kill_process(pidm2); off(2); Luz_Escolha=Luz_V; break; }else{ sleep(1.0); } } }
}
void Calibra_tudo(){
calibra_cor(); calibra_paredeGentle();
}
void inicia_Partida2(int parametro){
int luz= analog(5); poke(0x1009, 0x3c); while(1){ if(luz < 5){ int pidP = start_process(begin(parametro)); sleep(60.0); stop(); off(3); break; } luz= analog(5); printf("Esperando parida %d\n",luz); sleep(0.2); }
} void inicia_Partida(int parametro){
int luz= analog(5);//digital(Luz_Partida); int calibra_cor=0; poke(0x1009, 0x3c); sleep(1.5); while(1){ printf("Start-Caibra Stop-No\n" ); if(!stop_button()){ calibra_cor=1; break; }else if(!start_button()){ break; } } if(calibra_cor==1){ Calibra_tudo(); } while(1){ if(luz < 5){ int pidP = start_process(begin(parametro)); sleep(60.0); stop(); motor(3,0); off(3); break; } luz= analog(5);//digital(Luz_Partida); printf("Esperando parida %d\n",luz); sleep(0.2); }
}
void executa_braco(){
rodar(0.8, -70, 3); sleep(1.0); off(3); off(3);
}
void executa_braco2(){
rodar(0.65, -70, 3); sleep(0.8); off(3); off(3);
}
void executa_braco3(){
rodar(0.65, 85, 3); sleep(1.0); off(3);
}
void polar(){
int luzv,luzh,ldr; while(!stop_button()){ ldr=sensor_cor(); luzv = analog(Luz_V); luzh= analog(Luz_H); printf("luz:V:%dH:%d %d\n", luzv, luzh, ldr); sleep(1.0); }
}
void executeItem(int MenuOption){
int lixo = 1; if (MenuOption == 0){ inicia_Partida2(2); } if (MenuOption == 1){ inicia_Partida2(1); } if( MenuOption == 2){ inicia_Partida(2); } if( MenuOption == 3){ Calibra_tudo(); } if( MenuOption == 4){ polar(); }
}