Vehicle code for Collision Avoidance Robot with Radar Imaging (Co-Developers: Andres Rodriguez and David Prina)
Dependencies: mbed Motordriver mbed-rtos HC_SR04_Ultrasonic_Library
main.cpp
- Committer:
- Andres013
- Date:
- 2019-04-26
- Revision:
- 0:3ec03802c957
File content as of revision 0:3ec03802c957:
#include "mbed.h" #include "ultrasonic.h" #include "motordriver.h" #include "rtos.h" #define STOP_DISTANCE 250 #define RADAR_SPEED 0.5 #define RADAR_WAIT 0.07 #define pi 3.14159265f /* LEDS TO SHOW WHICH MODE ROBOT IS IN */ DigitalOut led_left(LED1); DigitalOut led_center_left(LED2); DigitalOut led_center_right(LED3); DigitalOut led_right(LED4); AnalogIn lightSensor(p20); DigitalOut headlights(p30); Serial hc05_slave(p9,p10); Serial pc(USBTX, USBRX); Motor LeftMotor(p21,p15,p16,1); //left motor Motor RightMotor(p22,p17,p19,1); //right motor volatile int mode = 0; volatile float Lspeed_rx = 0; volatile float Rspeed_rx = 0; volatile float Fspeed_rx = 0; volatile float Bspeed_rx = 0; void collision_protocol (int distance); ultrasonic usSensor(p6, p5, 0.050f, 1, &collision_protocol); void collision_protocol (int distance) { if ((distance < STOP_DISTANCE) && (distance > 50)) { mode = 1; LeftMotor.speed(0); RightMotor.speed(0); Timer ack_timer; /* pc.printf("TOO CLOSE\r\n"); pc.printf("\r\nListening on Bluetooth...\r\n"); */ float angle; hc05_slave.printf("rXX1,0.101,0.101"); /* SEND MAGIC COMMAND TO CONTROLLER */ /* pc.printf("\r\nSENT\r\n"); */ LeftMotor.speed(-1); RightMotor.speed(-1); Thread::wait(400); /* BACK UP TO AVOID BEING SET OFF AGAIN */ LeftMotor.speed(0); RightMotor.speed(0); int x = 0; int dist = 0; int idx; char *ack; char response_buffer[25]; memset(response_buffer, NULL, 25); /* ZERO INIT */ ack_timer.start(); while(x < 60) { idx = 0; ack = NULL; /* ACK --> NULLPTR */ memset(response_buffer, NULL, 25); /* RESET BUFFER */ while(hc05_slave.readable() && idx < 25){ /* FILL RESPONSE BUFFER */ response_buffer[idx] = hc05_slave.getc(); idx++; } /* pc.printf("\r\nRESPONSE: %s\r\n", response_buffer); */ ack = strstr(response_buffer, "_ack_"); /* FIND ACK */ if(ack != NULL) { /* ACK RECIEVED */ pc.printf("Acknowledged - Sending reading %d\r\n",x); angle = ((2*pi)/60) * x; /* add pi/2 */ dist = usSensor.getCurrentDistance(); if(dist >= 5000) { dist = 4999; } /* pc.printf("1,%.3f,%.3f\r\n", (((float) dist)/500), angle); */ hc05_slave.printf("r%02d1,%02.3f,%.3f", x,(((float) dist)/500), angle); LeftMotor.speed(RADAR_SPEED); RightMotor.speed(-1*RADAR_SPEED); Thread::wait(RADAR_WAIT * 1000); /* TURN TO NEXT READING ANGLE */ LeftMotor.speed(0); RightMotor.speed(0); ack_timer.reset(); x++; } else { /* WAIT FOR ACK */ pc.printf("Waiting for ack...\r\n"); if(ack_timer.read_ms() > 2000) { /* RETRANSMIT IF ACK NOT RECV'D */ hc05_slave.printf("r%02d1,%02.3f,%.3f", x,(((float) dist)/500), angle); ack_timer.reset(); /* pc.printf("Retransmitting...\r\n"); */ } led_center_left = led_center_right = 1; } led_center_left = led_center_right = 1; Thread::wait(100); led_center_left = led_center_right = 0; } mode = 0; /* RESET MODE */ } } void coll_start () { usSensor.startUpdates(); Thread::wait(2000); while(1) { if (!mode) { usSensor.checkDistance(); /* pc.printf("%d", dist); */ Thread::wait(50); } } } void headlight_switch () { headlights = 0; while (1) { if (lightSensor.read() < 0.09) { headlights = 1; } else if (lightSensor > 0.105) { headlights = 0; } } } void read_speeds () { char speed_buffer[11]; char Lspeed_buff[5]; char Rspeed_buff[5]; char Fspeed_buff[5]; char Bspeed_buff[5]; char c; while (1) { if (hc05_slave.readable() && !mode) { memset(speed_buffer, NULL, 11); c = hc05_slave.getc(); if((c == 'v') || (c == 'h')) { int i = 0; while (i < 11){ if(hc05_slave.readable()) { speed_buffer[i] = hc05_slave.getc(); i++; } } if (c == 'h') { for (int j = 0; j < 5; j++) { Lspeed_buff[j] = speed_buffer[j]; } for (int j = 0; j < 5; j++) { Rspeed_buff[j] = speed_buffer[j+6]; } Lspeed_rx = atof(Lspeed_buff); Rspeed_rx = atof(Rspeed_buff); } else if (c == 'v') { for (int j = 0; j < 5; j++) { Fspeed_buff[j] = speed_buffer[j]; } for (int j = 0; j < 5; j++) { Bspeed_buff[j] = speed_buffer[j+6]; } Fspeed_rx = atof(Fspeed_buff); Bspeed_rx = atof(Bspeed_buff); } if (Fspeed_rx > 0.0f) { //pc.printf("forward\r\n"); //pc.printf("LF: %f, RF: %f\r\n", (Fspeed_rx * 0.5f + Rspeed_rx * 0.4), Fspeed_rx * 0.5f + Lspeed_rx * 0.4f); LeftMotor.speed(Fspeed_rx * 0.6f + Rspeed_rx * 0.4f); RightMotor.speed(Fspeed_rx * 0.6f + Lspeed_rx * 0.4f); } else if (Bspeed_rx > 0.0f) { //pc.printf("reverse\r\n"); //pc.printf("LF: %f, RF: %f\r\n", 0-(Bspeed_rx * 0.5f + Rspeed_rx * 0.4), 0-(Bspeed_rx * 0.5f + Lspeed_rx * 0.4f)); LeftMotor.speed(0-(Bspeed_rx * 0.5f + Rspeed_rx * 0.4f)); RightMotor.speed(0-(Bspeed_rx * 0.5f + Lspeed_rx * 0.4f)); } else { //pc.printf("turn only\r\n"); //pc.printf("LF: %f, RF: %f\r\n", Rspeed_rx * 0.4f, Lspeed_rx * 0.4f); LeftMotor.speed(Rspeed_rx * 0.4f); RightMotor.speed(Lspeed_rx * 0.4f); } } } } } int main() { hc05_slave.baud(115200); pc.baud(115200); Thread thread2(&read_speeds); Thread thread3(&coll_start); Thread thread4(&headlight_switch); while(1) { if(!mode) { led_left = led_right = 1; wait(0.2); led_left = led_right = 0; wait(0.2); } } }