Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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);
}
}
}