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.


Top Down ViewFront View


Parts Used

Pin Assignments

mbedH-Bridge
p22PWMA
p20AIN2
p19AIN1
VoutSTBY
p17BIN1
p16BIN2
P23PWMB
5VVM
VoutVCC
motor 1+ AO1
motor 1- A02
motor 2+ BO1
motor 2- BO2
GNDGND
mBedServo
+5VVcc
gndgnd
p24Trigger
mBedBluetooth
+5VVin
gndgnd
gndCTS
p14TXI
p13RXI
Sonar ConnectionsmBed (Back Sonar)mBed (Side Sonar)mBed (Front Sonar)
Vcc+5V+5V+5V
gndgndgndgnd
Triggerp6p8p10
Echop7p9p11

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.