sumo
Dependencies: ESC Servo mbed-dev mbed-rtos
main.cpp
- Committer:
- astroboy1611
- Date:
- 2017-09-06
- Revision:
- 0:98cd95fbb541
File content as of revision 0:98cd95fbb541:
#include "mbed.h" #include "rtos.h" #include "esc.h" #include "Servo.h" #define RightIR A3 #define LeftIR A1 #define RearIR A2 #define SERVO1 PB_6 //D10 #define SERVO2 PC_7 //D9 #define MotorLeft SERVO1 #define MotorRight SERVO2 #define BtnStart A5 #define BtnCalib A4 #define LeftBit 2 #define MidBit 1 #define RightBit 0 const double threshold = 0.2; Serial pc(SERIAL_TX, SERIAL_RX); DigitalOut led(LED1); DigitalIn StartButton(BtnStart, PullUp); DigitalIn CalibButton(BtnCalib, PullUp); AnalogIn LeftSensor(LeftIR); AnalogIn RightSensor(RightIR); AnalogIn RearSensor(RearIR); Servo LeftESC(MotorLeft); Servo RightESC(MotorRight); volatile double SensorRightVal, SensorLeftVal, SensorRearVal; volatile unsigned int SensorFlag; void initMotor() { LeftESC=0.5; RightESC=0.5; } void setMotor(double L, double R) { L /=(double)2; L+=(double)0.5; R /=(double)2; R+=(double)0.5; LeftESC=L; RightESC=R; Thread::wait(20); } void SensorReader(void const *argument) { while(true) { SensorRightVal = RightSensor.read(); SensorLeftVal = LeftSensor.read(); SensorRearVal = RearSensor.read(); if(SensorRightVal>threshold) { SensorFlag |=(1<<RightBit); } else { SensorFlag &=~(1<<RightBit); } if(SensorLeftVal>threshold) { SensorFlag |=(1<<LeftBit); } else { SensorFlag &=~(1<<LeftBit); } if (SensorRearVal>threshold) { SensorFlag |=(1<<MidBit); } else { SensorFlag &=~(1<<MidBit); } Thread::wait(20); //20ms } } void DataReporter(void const *argument) { while(true) { pc.printf("Sensor Flag 0x%X L = %10.5f R = %10.5f B = %10.5f BtnStart %d BtnCalib %d\r\n", SensorFlag, LeftSensor.read(), RightSensor.read(), RearSensor.read(), StartButton.read(), CalibButton.read()); Thread::wait(500); } } void MotorController(void const *argument) { while(true) { switch(SensorFlag) { case 0b000: setMotor(0.25,-0.25); break; case 0b001: setMotor(0.25,-0.25); break; case 0b010: setMotor(0.5,-0.5); break; case 0b011: break; case 0b100: setMotor(-0.25,0.25); break; case 0b101: setMotor(1,1); break; case 0b110: break; case 0b111: break; } Thread::wait(1); } } void enterCalibrationMode(void) { pc.printf("Entering Calibration Mode...\r\n"); pc.printf("Calib Button is Full Throttle\r\n"); pc.printf("Start Button is Full Reverse\r\n"); pc.printf("Please Restart Nucleo to exit from this mode\r\n"); while(true) { //pc.printf("entering loop\r\n"); if((CalibButton.read()==0)&&(StartButton.read()==1)) //full throttle { pc.printf("FullThrottle\r\n"); LeftESC=1; RightESC=1; } else if ((StartButton.read()==0)&&(CalibButton.read()==1)) //Full Reverse { pc.printf("FullReverse\r\n"); LeftESC=0; RightESC=0; } else //Neutral { pc.printf("Neutral\r\n"); LeftESC=0.5; RightESC=0.5; } wait(0.1); } } int main(void) { led=1; initMotor(); pc.baud(115200); Thread::wait(500); pc.printf("*** RTOS Sumo ROBOT SMADA ***\r\n"); pc.printf("Press Calib button then power on to enter Calibration Mode\r\n"); if(CalibButton.read()==0) { pc.printf("Please Release Calib Button\r\n"); while(CalibButton.read()==0); enterCalibrationMode(); } pc.printf("Release Start button To begin the match...\r\n "); while(StartButton.read()!=0); Thread::wait(5000); pc.printf("Bismillah.. Semoga kita menang, Amiinn...\r\n"); Thread SensorThread(SensorReader, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); Thread DataThread(DataReporter, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); Thread MotorThread(MotorController, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); while(1) { led=0; Thread::wait(100); led=1; Thread::wait(100); if(CalibButton.read()==0) { SensorThread.terminate(); DataThread.terminate(); MotorThread.terminate(); setMotor(0,0); while(1); } } }