![](/media/cache/group/Logo_RioBotz.png.50x50_q85.jpg)
Código Aldebaran+
Dependencies: mbed
main.cpp
- Committer:
- Mateusjesus
- Date:
- 2020-05-06
- Revision:
- 0:3e0de9e209d1
File content as of revision 0:3e0de9e209d1:
#include"mbed.h" #include"PwmOut.h" Serial bt(p9, p10); //================================================================================ //========================= MOTORS CONTROL - ==================================== //================================================================================ PwmOut Right(p21); PwmOut Left(p22); #define MED_PPM 1500 // Valor indicando que o motor deve ficar parado de acordo com o ppm int LSpeedGlobal; int RSpeedGlobal; void Drive(int LeftSpeed,int RightSpeed) { Left.pulsewidth_us(LeftSpeed); Right.pulsewidth_us(RightSpeed); LSpeedGlobal = LeftSpeed; RSpeedGlobal = RightSpeed; } void calibrate()// Função necessária para dar o PPM inicial nos controladores. { Drive(MED_PPM, MED_PPM); wait(3); } //================================================================================ //===================== DISTANCE SENSORS - ===================================== //================================================================================ //**************************** DEFINICOES - ************************************ DigitalIn Sensor1 (p26);// Sensor digital localizado na esquerda do robo DigitalIn Sensor2 (p27);//Sensor digital localizado na diagonal esquerda do robo DigitalIn Sensor3 (p28);//Sensor digital localizado na frente do robo DigitalIn Sensor4 (p25); //Sensor digital localizado na diagonal direita do robo DigitalIn Sensor5 (p30); //Sensor digital localizado na direita do robo int measure[5]= {0,0,0,0,0}; // Variável para guardar os valores dos sensores de distância. int total = 0; //{left, left_diagonal, front, right_diagonal, right} void Search () { measure[0] = Sensor1.read(); measure[1] = Sensor2.read(); measure[2] = Sensor3.read(); measure[3] = Sensor4.read(); measure[4] = Sensor5.read(); total = measure[4]*10000 + measure[3]*1000 + measure[2]*100 + measure[1]*10 + measure[0]; return; } //================================================================================ //===================== SWITCH INICIALIZATION - ================================= //================================================================================ InterruptIn SWITCH(p11); DigitalOut Led4(LED4); void desligar() { Drive(MED_PPM,MED_PPM); } //================================================================================ //===================== FAILSAFE - ============================================== //================================================================================ InterruptIn Failsafe(p12); // Interrupt on digital pushbutton input p12 Timer timer; DigitalOut Led3(LED3); int RC_value; int RC_start; int failsafe=0; #define FAILSAFE_SIGNAL 1400 //Valor em microssegundos do sinal do failsafe void intHigh() { RC_start=timer.read_us();//Começa o timer } void intLow() { RC_value=timer.read_us()- RC_start;//Reads ppm signal from RC receiver. if(RC_value > FAILSAFE_SIGNAL) { failsafe=0; //failsafe não ativado } else { failsafe=1; //failsafe ativado } } //================================================================================ //===================== LINE SENSORS - ========================================= //================================================================================ #define PARAMETER 0.908 #define RightSensor p18 #define LeftSensor p20 DigitalOut Led1 (LED1); DigitalOut Led2 (LED2); AnalogIn RightRead(RightSensor); AnalogIn LeftRead(LeftSensor); bool right_line=1,left_line=1; int result=0,anterior=0; int Line_check () { if(RightRead.read()>PARAMETER) { right_line=1; } else { right_line=0; //white } if(LeftRead.read()>PARAMETER) { left_line=1; } else { left_line=0; } result=right_line*10+left_line; if(result==0 && anterior==0) { return 0; } if(result==0 && anterior==1) { anterior=0; wait_ms(0); return 0; } switch(result) { case 10: { //Sensor de linha da direita viu a linha Led2=1; Led1=0; Drive(1500+5*(50),1500-5*(50)); //Para tras com velocidade máxima por 50ms wait(1); Drive(1500-5*(35),1500-5*(35));//Para esquerda com velocidade máxima por 100ms wait(0.5); anterior=1; break; } case 1: { //Sensor de linha da esquerda viu a linha Led2=0; Led1=1; Drive(1500+5*(50),1500-5*(50));//Para tras com velocidade máxima por 100ms wait(1); Drive(1500+5*(35),1500+5*(35)); //Para direita com velocidade máxima por 50ms wait(0.5); anterior=1; break; } case 11: { //Sensor de linha da esquerda e da direita viram a linha Led2=1; Led1=1; Drive(1500+5*(50),1500-5*(50));//Para tras wait(1); Drive(1500+5*(35),1500+5*(35)); //Para direita wait(0.5); anterior=1; break; } default: { anterior=1; Led2=0; Led1=0; break; } } return 1; } void Action () { switch(total) { case 0: //caso nao veja nenhum dos sensores Drive(LSpeedGlobal,RSpeedGlobal); break; case 1: //vira para a esquerda Drive(1500-5*(40),1500-5*(40)); break; case 10: //vira para a esquerda Drive(1500-5*(30),1500-5*(30)); break; case 11://vira para a esquerda Drive(1500-5*(30),1500-5*(30)); break; case 100: //vai reto Drive(1500-5*(60),1500+5*(60)); break; case 110://vai reto Drive(1500-5*(50),1500+5*(50)); break; case 1000: //vira para a direita Drive(1500+5*(30),1500+5*(30)); break;// case 1100://vai reto Drive(1500-5*(50),1500+5*(50)); break; case 1110://vai reto (GRANDE CHIFRE) Drive(1500-5*(100),1500+5*(100)); break; case 10000: //vira para direita Drive(1500+5*(40),1500+5*(40)); break; case 11000://vira para a direita Drive (1500+5*(30),1500+5*(30)); break; //todos os outros casos que são impossíveis default://para//////////// Drive(MED_PPM,MED_PPM); break; } } int main() { timer.start(); SWITCH.fall(&desligar);//Attach interrupt function request when falling edge is occurred Failsafe.fall(&intLow);//Attach interrupt function request when falling edge is occurred Failsafe.rise(&intHigh);//Attach interrupt function request when rising edge is occurred calibrate(); LSpeedGlobal = 1500-5*(30); RSpeedGlobal = 1500+5*(30); while(SWITCH.read()==0) { Search(); Led4=1; } Led4=0; while(1) { if(!failsafe && SWITCH.read()) { //Failsafe não ativado Led3=1; Action(); Search(); } else { // Failsafe ativado Led3=0; Drive(MED_PPM,MED_PPM); } } }