![](/media/cache/group/Logo_RioBotz.png.50x50_q85.jpg)
Codigo do miniSumo de 4 rodas
Dependencies: mbed
main.cpp
- Committer:
- rperoba
- Date:
- 2020-08-11
- Revision:
- 0:0321883eb43b
File content as of revision 0:0321883eb43b:
#include "mbed.h" #include "PwmOut.h" #define PpmSuperMaximo 2000 //AjustarValores #define PpmMaximo 1800 #define PpmPositivo2 1700 #define PpmPositivo 1600 #define PpmMedio 1500 #define PpmNegativo 1400 #define PpmNegativo2 1300 #define PpmMinimo 1200 #define debug false //Sensores de distância DigitalIn SensorEsquerdo (p16); DigitalIn SensorEsquerdoFrontal (p15); DigitalIn SensorFrontal (p14); DigitalIn SensorDireitoFrontal (p13); DigitalIn SensorDireito (p12); //Sensores de linha InterruptIn LinhaEsquerda(p19); InterruptIn LinhaDireita(p20); //Motores PwmOut MotoresEsquerdos(p21); PwmOut MotoresDireitos(p23); //MicroStart InterruptIn MicroStart(p18); //Bluetooth DigitalOut bluetoothState(p26); DigitalOut bluetoothEnable (p29); Serial bluetoothSerial (p28,p27); //Variáveis int leituraDeDistancia = 0; int comando=0; int ultimoPpmDireito; int ultimoPpmEsquerdo; void Drive(int ppmEsquerdo,int ppmDireito); void SetarMotores (); void LerSensoresDeDistancia(); void SensorDeLinhaLido(); void MicroStartInterruptRise(); void MicroStartInterruptFall(); void Estrategia(); int main() { #if debug bluetoothSerial.printf("Iniciando..."); #endif MicroStart.rise(&MicroStartInterruptRise); MicroStart.fall(&MicroStartInterruptFall); SetarMotores(); // Ajusta os motores LinhaDireita.rise(&SensorDeLinhaLido);//Interrupção para os sensores de linha LinhaEsquerda.rise(&SensorDeLinhaLido); while (comando == 0) { //Esperando a luta iniciar Drive(PpmMedio,PpmMedio);//Para o miniSumo LerSensoresDeDistancia(); } while (comando == 1) { //É ligado pelo microStart Estrategia();//Ajusta o PPM dos motores LerSensoresDeDistancia(); } } void MicroStartInterruptRise() { comando = 1; return; } void MicroStartInterruptFall() { comando = 0; Drive(PpmMedio,PpmMedio);//Para o miniSumo return; } void LerSensoresDeDistancia() // Faz a leitura dos sensores de distância e armazena em leitura de distância { leituraDeDistancia = 0; leituraDeDistancia += SensorDireito.read(); leituraDeDistancia += SensorDireitoFrontal.read() * 10 ; leituraDeDistancia += SensorFrontal.read() * 100 ; leituraDeDistancia += SensorEsquerdoFrontal.read() * 1000 ; leituraDeDistancia += SensorEsquerdo.read() * 10000 ; #if debug bluetoothSerial.printf("Leitura de distancia: %i",leituraDeDistancia); #endif return; } void SensorDeLinhaLido() // rotina quando algum sensor de linha é lido { Drive(PpmMinimo,PpmMinimo);//Ir para trás wait_us(1000); Drive(PpmNegativo2, PpmPositivo2);//Girar wait_us(500); #if debug bluetoothSerial.printf("Sensor de linha lido"); #endif return; } void Drive(int ppmEsquerdo,int ppmDireito) { MotoresDireitos.pulsewidth_us(ppmDireito); MotoresEsquerdos.pulsewidth_us(ppmEsquerdo); ultimoPpmDireito = ppmDireito; ultimoPpmEsquerdo = ppmEsquerdo; #if debug bluetoothSerial.printf("Ppm direito: %i Ppm esquerdo: %i",(ppmEsquerdo,ppmDireito)); #endif return; } void SetarMotores() // Ajusta o periodo do PWM dos motores,requerimento do Mbed { MotoresEsquerdos.period_ms(16); MotoresDireitos.period_ms(16); Drive(PpmMedio,PpmMedio); wait(3); #if debug bluetoothSerial.printf("Setando motores"); #endif return; } void Estrategia() { switch(leituraDeDistancia) { //implementar todas as leituras case 0: Drive(ultimoPpmEsquerdo,ultimoPpmDireito); break; case 1: // Somente sensor direito Drive(PpmPositivo2,PpmNegativo2); break; case 10://Somente sensor DireitoFrontal Drive(PpmPositivo2,PpmPositivo); break; case 100://Somente sensor Frontal Drive(PpmMaximo,PpmMaximo); break; case 1000://Somente sensor EsquerdoFrontal Drive(PpmPositivo,PpmPositivo2); break; case 10000://Somente sensor Esquerdo Drive(PpmPositivo2,PpmNegativo2); break; case 110://Frontal e frontalDireito Drive(PpmMaximo,PpmPositivo2); break; case 111://Todos os frontais Drive(PpmSuperMaximo,PpmSuperMaximo); break; case 1100://FrontalEsquerdo e frontal Drive(PpmPositivo2, PpmMaximo); break; default: Drive(PpmPositivo,PpmPositivo2); break; } return; }