Autonomous Parallel Parking Vehicle
Autonomous Parallel Parking Vehicle
by David Guigou, Evan Hopf, and Franklin Maxwell
Project Description
This project mimics the process of a two wheel drive automobile parallel parking itself. The vehicle we designed is 15 inches long and the parking space is 21 inches or approximately 1::12 scale model. To make it as realistic as possible the back wheels spin at the same rate using an H-Bridge to regulate two DC motors. The front wheels are connected to a makeshift axle created using K'Nex and are controlled by a Servo motor. To avoid the vehicle crashing into another vehicle or object while auto-parking program is running several sonar sensors are used for object detection. We based our parking algorithm off this link.
Parts Used
Pin Assignments
mbed | H-Bridge |
---|---|
p22 | PWMA |
p20 | AIN2 |
p19 | AIN1 |
Vout | STBY |
p17 | BIN1 |
p16 | BIN2 |
P23 | PWMB |
5V | VM |
Vout | VCC |
motor 1 | + AO1 |
motor 1 | - A02 |
motor 2 | + BO1 |
motor 2 | - BO2 |
GND | GND |
mBed | Servo |
---|---|
+5V | Vcc |
gnd | gnd |
p24 | Trigger |
mBed | Bluetooth |
---|---|
+5V | Vin |
gnd | gnd |
gnd | CTS |
p14 | TXI |
p13 | RXI |
Sonar Connections | mBed (Back Sonar) | mBed (Side Sonar) | mBed (Front Sonar) |
---|---|---|---|
Vcc | +5V | +5V | +5V |
gnd | gnd | gnd | gnd |
Trigger | p6 | p8 | p10 |
Echo | p7 | p9 | p11 |
Code
Complete Code for Program
#include "mbed.h" #include "motordriver.h" #include "rtos.h" #include "Speaker.h" #include "Servo.h" #include "Ultrasonic.h" // Initialize bluetooth chip RawSerial blue(p13,p14); // Initialize LED's BusOut myled(LED1,LED2,LED3,LED4); // Initialize motors (pwm, fwd, rev, can brake) Motor A(p22, p20, p19, 1); // LEFT working Motor B(p23, p16, p17, 1); // RIGHT working // Create Autopilot mode bool autopilot = 0; // Initialize servo Servo myservo(p24); float pos = 0.52; float pos2; //.52 - center //.77 - right //.27 - left // Create variable for start position of servo float startPos; // Optional speaker for sound effects //Speaker mySpeaker(p21); // Initialize sonar sensors Ultrasonic sonarBack(p6, p7);//p6 = trigger. p7 = echo Ultrasonic sonarSide(p8, p9); Ultrasonic sonarFront(p10, p11); int cm; long int count = 0; void fullRight() { while(pos > 0.27) { pos = pos - 0.05; myservo = pos; }//end of while }//end of full right void fullLeft() { while(pos < 0.77) { pos = pos + 0.05; myservo = pos; }//end of while }//end of full right void straight() { for (int i=0; i<5; i++) { pos2 = myservo.read(); if (pos2 <= 0.52) { pos = pos + 0.05; myservo = pos; wait(.1); pos = pos + 0.05; myservo = pos; wait(.1); pos = pos + 0.05; myservo = pos; wait(.1); pos = 0.52; myservo = pos; //myservo = .6; //wait(.1); //myservo = 0.52; } else if (pos2 > 0.52) { pos = pos - 0.05; myservo = pos; wait(.1); pos = pos - 0.05; myservo = pos; wait(.1); pos = pos - 0.05; myservo = pos; wait(.1); pos = 0.52; myservo = pos; //myservo = .44; //wait(.1); //myservo = 0.52; } }//end of for pos = 0.52; } //end of straight void backward() { A.speed(-0.5); B.speed(-0.5); }// end backwards void forward() { A.speed(0.5); B.speed(0.5); }// end forward void brake() { A.stop(0.5); B.stop(0.5); }//end brake void park() { fullRight(); backward(); //sonar info for when to turn left wait(1.9);//before 1.6 brake(); wait(1); straight(); wait(1); while(1) { cm = sonarBack.read_cm(); if (cm > 15) { backward(); if (count > 0) { count = count - 20; } } else { count++; if (count > 1000) { brake(); break; } }//end of else }//end of while count = 0; fullLeft(); wait(1); while(1) { cm = sonarBack.read_cm(); if (cm > 1) { backward(); if (count > 0) { count = count - 20; } } else { count++; if (count > 700000) { brake(); break; } }//end of else }//end of while count = 0; fullRight(); wait(1); while(1) { cm = sonarFront.read_cm(); if (cm > 5) { forward(); if (count > 0) { count = count - 20; } } else { count++; if (count > 80000) { brake(); break; } }//end of else }//end of while count = 0; straight(); wait(1); while(1) { cm = sonarBack.read_cm(); if (cm > 1) { backward(); if (count > 0) { count = count - 20; } } else { count++; if (count > 700000) { brake(); break; } }//end of else }//end of while }//end park Thread thread1; int main() { myservo = 0.6; straight(); char bnum=0; char bhit=0; while(1) { if (blue.getc()=='!') { if (blue.getc()=='B') { //button data packet bnum = blue.getc(); //button number bhit = blue.getc(); //1=hit, 0=release { myled = bnum - '0'; //current button number will appear on LEDs if (bnum == '4' && bhit == '1') { //if autopilot button pressed autopilot = !autopilot; } if (autopilot == 1) { //if autopilot on, then go to code for auto parking //***INSERT CODE FOR AUTOPILOT PARKING HERE*** park(); autopilot = 0; } else { //if autopilot is turned off, then drive car normally with bluetooth switch (bnum) { case '1': //number button 1 if (bhit=='1') { A.speed(0.7); B.speed(0.7); } else { A.speed(0); B.speed(0); } break; case '2': //number button 2 if (bhit=='1') { A.speed(-0.7); B.speed(-0.7); } else { A.speed(0); B.speed(0); } break; //need to change code to turn left and right case '5': //button 5 up arrow if (bhit=='1') { straight(); /*pos2 = myservo.read(); if (pos2 < 0.52) { myservo = .6; wait(.1); myservo = 0.52; } else if (pos2 > 0.52) { myservo = .44; wait(.1); myservo = 0.52; } pos = 0.52;*/ } else { //add release code here } break; case '8': //button 8 right arrow if (bhit=='1') { if (pos > 0.27) { pos = pos - 0.05; myservo = pos; } } else { } break; case '7': //button 7 left arrow if (bhit=='1') { // for (int i=0, i<10, i++0 if (pos < 0.77) { pos = pos + 0.05; myservo = pos; } } else { } break; default: break; } } }//end of if autopilot == true } } }//end of while(1) }//end of main
Videos
Demo
Steering System Design
Future Work
- Improve front steering system for reliability
- Hack an RC and make it autonomously park
- LIDAR Sensors instead of Sonar
Please log in to post comments.