![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Versao que rodou durante a competicao
Dependencies: RadioIn Servo mbed
Fork of Sumo_v2_Unstable by
main.cpp
- Committer:
- lfsantarelli
- Date:
- 2013-04-30
- Revision:
- 2:59c557d1230d
- Parent:
- 1:b11f1623539d
File content as of revision 2:59c557d1230d:
#include "Servo.h" #include "mbed.h" #include "RadioIn.h" #include "Config.h" int result=0; //Saber2=> Motor esquerda Saber1=> Motor Direita void Drive(float m_esq, float m_dir){ // Valores de -1 a 1 em cada motor float gain=0.95; float trime=-0.03; float trimd=0; saber2.write((-m_esq*gain/2)+0.5+trime); saber1.write((-m_dir*gain/2)+0.5+trimd); return; } void Monitor(){ int a=sd1; int b=sd2; int c=sd3; int d=sd4; int e=sd5; int f=!slFR; int g=!slRR; int h=!slRL; int i=!slFL; int linha=!slFL*1000+100*!slRL+10*!slRR+!slFR; float j=-(saber1.read()-0.5)*2; float k=-(saber2.read()-0.5)*2; float l=radio.chan3; //pc.printf("sd1= %d|sd2=%d|sd3=%d|sd4=%d|sd5=%d",a,b,c,d,e); pc.printf("Linha=%d|",linha); pc.printf("|FR=%d|RR=%d|RL=%d|FL=%d|",f,g,h,i); pc.printf("ME=%.3f|MD=%.3f|",k,j); pc.printf("Ch3=%.1f\r",l); return; } void DriveRC(){ float trim=0; // Trim para casar o 0 da sabertooth com o PWM do Mbed radio.Update(); saber1.write((radio.chan1+1)/2+trim); saber2.write((radio.chan2+1)/2+trim); return; } float ReadRadio(int chan){ // Retorna o valor do canal entre -1 e 1 radio.Update(); if (chan==1){return radio.chan1;} if (chan==2){return radio.chan2;} if (chan==3){return radio.chan3;} else return 0; } // Melhor usar o V-Tail Mixer e fazer o mix via hardware void DriveMixedRC(){ radio.Update(); saber1.write(((radio.chan1+radio.chan2)+1)/2); saber2.write(((radio.chan1-radio.chan2)+1)/2); return; } int LineCheck(){ result=!slFL*1000+!slFR; led1=!slFR; led2=!slRR; led3=!slRL; led4=!slFL; if (result==0 && anterior==0){return 0;} if (result==0 && anterior==1){anterior=0; wait(0); return 0;} switch (result){ case 1:{ // Somente FR Drive(-1,-1); wait(0.15); Drive(-1,1); wait(0.15); anterior=1; break; } case 10:{ // Somente RR //Drive(-1,1); anterior=1; //wait(0.05); break; } case 100:{ // Somente RL //Drive(1,-1); anterior=1; //wait(0.05); break; } case 1000:{ // Somente FL Drive(-1,-1); wait(0.15); Drive(1,-1); wait(0.15); anterior=1; break; } case 1001:{ // Os dois da frente Drive(-1,-1); wait(0.15); Drive(-1,1); wait(0.15); //Mesmo valor do wait final anterior=1; break; } case 0110:{ // Os dois de tras Drive(1,1); anterior=1; wait(0.15); break; } case 1100:{ // Os dois da direita Drive(-1,-1); wait(0.15); Drive(-1,1); anterior=1; break; } case 0011:{ // Os dois da esquerda Drive(-1,-1); wait(0.15); Drive(1,-1); anterior=1; break; } default: {anterior=1; break;} } return 1; } int Chase(){ int detectados=0; detectados=sd1+sd2+sd3+sd4+sd5; if (detectados==0){return 0;} while(detectados) { LineCheck(); switch(detectados){ case 1:{ if(sd5){Drive(-1,1);} else if(sd4){Drive(0.25,1);} else if(sd3){Drive(1,1);} else if(sd2){Drive(1,0.25);} else if(sd1){Drive(1,-1);}; break; } case 2:{ if(sd5&&sd2){Drive(-0.7,-0.3);} else if(sd4&&sd3){Drive(1,0.75);} else if(sd3&&sd2){Drive(0.75,1);} else if(sd1&&sd4){Drive(-0.3,-0.7);} break; } case 3:{ if(sd1&&sd4&&sd3){Drive(-0.3,-0.7);} else if(sd2&&sd3&&sd4){Drive(1,1);} else if(sd3&&sd2&&sd5){Drive(-0.7,-0.3);} break; } default: {break;} } detectados=sd1+sd2+sd3+sd4+sd5; } return 1; } void Search(){ Drive(0.8,0.8); //Anda reto até bater na linha return; } void StartRoutine(){ int y=0; //Parametro incremental para quebrar os wait times em tempos pequenos int z=0; //Parametro incremental para quebrar os wait times em tempos pequenos int stop=0; //Quebra a rotina caso ache o oponente ou a linha //Rotina de inicio de partida if (sSwitch==1){ // Inicio da Estrategia 2 (Inicia com o robo apontando 45graus (definir direito o angulo depois) pra direita e ele faz um L terminando no centro) wait(5); Drive(1,1); wait(0.03); /* while(y<3){ stop=LineCheck(); stop+=Chase(); if(stop){return;} Drive(0.7,0.7); wait(0.005); y++; Monitor(); } while(z<3){ stop=LineCheck(); stop+=Chase(); if(stop){return;} Drive(-0.7,0.7); wait(0.005); z++; */ Monitor(); //Fim da Estrategia 1 } else { //Inicio da Estrategia 1 (Inicia com o robo na mesma posicao da estrategia 1 e ele vira de cara e vai reto pro centro wait(5); while(y<3){ stop=LineCheck(); stop+=Chase(); if(stop){return;} Drive(-1,1); wait(0.005); y++; Monitor(); } // Fim da estrategia 2 } return; } int main() { saber1.period_us(5); saber2.period_us(5); radio.Init(); int started=0; while(1){ Monitor(); started=0; while(ReadRadio(3)>0) { // Modo Autonomo Monitor(); if(started==0){StartRoutine(); started=1;} LineCheck(); Chase(); Search(); } DriveMixedRC(); } }