F12: Self-Driving GPS Following Car
Contents
Self-Driving GPS Following Car
Abstract
The objective of this project is to create an autonomous vehicle that follows another car. A leading car will continually inform the autonomous car of its location. The autonomous car will then drive to the target location while avoiding obstacles along the way.
Introduction and Objectives
The Self-Driving GPS Following Car follows another car by driving to the GPS coordinates of the leading car. A ZigBee communication link transmits the GPS data from the leading car to the following car. The following car utilizes a GPS and a compass to determine its own location and orientation relative to magnetic north. Using the two pairs of GPS coordinates and the orientation of the car, the bearing and distance necessary to be traveled is calculated. The car uses proximity sensors, so the car can avoid obstacles while navigating to the destination.
The project required the following objectives to be accomplished:
- Read GPS coordinates of the leading car and the following self-driving car
- Use XBee modules to send and receive GPS coordinates from the leading car to the following car
- Compute the true north bearing and distance necessary for the following car to reach the leading car
- Account for difference between true north and magnetic north in bearing calculation
- Read the magnetic north bearing using a compass
- Read the distance to objects using proximity sensors
- Control steering motor to steer left, right, and straight using a motor controller
- Control direction motor to move forward, backward, and stop using a motor controller
- Determine algorithm to drive toward destination
- Determine algorithm to avoid obstacles
Team Members and Responsibilities
- Elias Barboza
- PWM driver, motor controllers, and obstacle avoidance
- Caleb Chow
- Read compass, read GPS coordinates, and move toward target GPS coordinates
- Stephen Lu
- ADC driver, read proximity sensors, compute distance based on measurement, and obstacle avoidance
Schedule
Week Number | Planned Items | Actual Items |
---|---|---|
Week 1: Design
|
|
|
Week 2: Construction
|
|
|
Week 3: Drivers
|
|
|
Week 4: Coding
|
|
|
Week 5: Coding
|
|
|
Week 6: Testing
|
|
|
Week 7: Finalization
|
|
|
Parts List & Cost
Parts | Quantity | Cost | Link |
---|---|---|---|
RC Car -
| 2 | ~$25 | Previously owned |
Microcontroller -
| 1 | ~$120 | |
XBee Module -
| 2 | ~$24.95 |
|
GPS -
| 2 | $37.21 | |
Motor Controller -
| 2 | ~$13 | |
Compass -
| 1 | $50 | |
Sonar Range Finder -
| 3 | $26.95 | |
Design & Implementation
Hardware Design
Leading Car
The leading car consists of the following additional hardware:
- XBee module
- GPS module
- 3.3V regulator circuit
The leading car is responsible for sending its GPS coordinates to the following car. This is accomplished by sending the raw GPS data over ZigBee to the following car. The GPS and XBee modules both use UART to communicate, so no microcontroller is necessary. The paired XBee modules will take care of the data transfer. Both modules ran off the same 3.3V power supply, which came from a regulator off of the car’s battery pack.
Following Car
The following car consists of the following additional hardware:
- SJ One board
- XBee module
- GPS module
- 2x Motor controllers
- Compass
- 3x proximity sensors
- 5 cells of AA battery pack
- 5V regulator circuit
- Power switch
The following car is responsible for avoiding obstacles and for driving to a destination coordinate. To accomplish this, the car needs to know its own location, the target coordinate, information about its surroundings, and be able to move. Its own location was determined using a GPS and a compass, while the target coordinate was received from the leading car over ZigBee. Proximity sensors were used to get information about its surroundings and motor controllers enabled control over the motors. A microcontroller was used to control all the peripheral devices. The compass and the motor controllers required a regulated 5V power supply, which came from a 5V regulator off of the car’s battery pack, while the microcontroller could take anywhere between around 4.5V to 9V, which came straight off of the car’s battery pack. The remaining devices took 3.3V, which came regulated from the microcontroller. The 5V regulator required a voltage higher than 5V, which resulted in the car’s battery pack being upgraded to five cells of AA batteries.
Hardware Interface
Leading Car
The following table shows the pin connections for the XBee module to send the GPS module's data to the receiving end of the XBee.
GPS to XBee Pin Connections
GPS Pin | XBee Pin |
---|---|
TX | RX |
Following Car
The following table shows the pin connections for the SJ One board to communicate with the peripherals.
SJ One Board Pin Connections
SJ One Board Pin | Destination Pin | Description |
---|---|---|
UART2 RX | GPS TX | GPS data received for following car |
UART3 RX | XBee TX | GPS data received using XBee for leading car |
I2C2 SDA | Compass SDA | Serial data |
I2C2 SCL | Compass SCL | Serial clock |
ADC0-3 / ADC0-out | Front proximity sensor analog out | Analog distance reading for front sensor |
ADC0-4 | Left proximity sensor analog out | Analog distance reading for left sensor |
ADC0-5 | Right proximity sensor analog out | Analog distance reading for right sensor |
GPIO P1.24 | Steering motor enable | Set steering amount |
GPIO P1.25 | Steering motor dir1 | Set steering direction |
GPIO P1.22 | Steering motor dir2 | Set steering direction |
PWM1-2 | Direction motor enable (PWM) | Set speed |
GPIO P1.19 | Direction motor dir1 | Set motor direction |
GPIO P1.23 | Direction motor dir2 | Set motor direction |
The GPS and XBee both communicated with the microcontroller using UART while the compass used I2C. There were no other alternatives that could be selected on the modules.
The three proximity sensors on the other hand had a selection of three outputs to choose from: UART, analog, or PWM. Since the UARTs and PWMs were all taken, analog outputs were selected to be used for the sensors.
A PWM and GPIOs were used to control the motors. The PWM was used to control the speed of the direction motor and GPIOs were used for the direction. The steering motor did not require a PWM since setting the amount to steer left or right was not necessary. The signals to the motor controllers were set using the logic table below to enable steering and direction movement.
Motor Controller Logic Table
- GPS – UART
- Outputs GPS data on Tx to XBee Rx
- XBee – UART
- Inputs data to send on Rx from GPS Tx
- Power Supply – 3.3V
- Supply power to GPS and XBee modules
- Add 3.3V voltage regulator with filtering capacitors to RC car’s battery pack
Following Car
Following Car Block Diagram
- Microcontroller
- 2012 SJSU One Board (LPC1758)
- GPS – UART
- P2.8 = Tx, P2.9 = Rx
- PINSEL4 = 0b10 for both
- Xbee – UART3
- P4.28 = Tx, P4.29 = Rx
- PINSEL9 = 0b11 for both
- I2C2 Devices
- P0.10 = SDA, P0.11 = SCL
- PINSEL0 = 0b10 for both
- Components :
- Proximity sensor (SRF08)
- Compass
- P0.10 = SDA, P0.11 = SCL
- Proximity Sensors (LV-MaxSonar-EZ4) – ADC4 and ADC5
- P1.30 = AD0.4
- P1.31 = AD0.5
- PINSEL3 = 11 for both
- Motor Controllers (2) – PWM
- P1.20 = PWM1.2
- P1.24 = PWM1.5
- PINSEL3 = 10 for both
- Power Supply – 5.0V from RC car's original battery pack
- Supply power to motor controllers for motors
- Supply power to SRF08 proximity sensor
- Power Supply – 3.3V
- Microcontroller 3.3V output
- Supply power to GPS, Xbee, and LV-MaxSonar-EZ4 proximity sensors
Software Design
Show your software design. For example, if you are designing an MP3 Player, show the tasks that you are using, and what they are doing at a high level. Do not show the details of the code. For example, do not show exact code, but you may show psuedocode and fragments of code. Keep in mind that you are showing DESIGN of your software, not the inner workings of it.
Implementation
This section includes implementation, but again, not the details, just the high level. For example, you can list the steps it takes to communicate over a sensor, or the steps needed to write a page of memory onto SPI Flash. You can include sub-sections for each of your component implementation.
Testing & Technical Challenges
Sensor Thresholds
Values needed to be determined for a number of thresholds. The thresholds were front detect, front backup, side detect, and side backup. The detect thresholds trigger the car to slow down and the backup thresholds trigger the car to backup.
We spent quite a bit of time figuring out the perfect front threshold. We needed to figure out the best values for these thresholds. We don’t want the thresholds to be too small so that the car doesn’t have enough space to slow down, stop, and backup. We also do not want the thresholds to be too large so that the car is always backing up when it has room to turn away from the obstacle.
Sound Reflections
The proximity sensors are ultrasonic, meaning they send out a sound wave and calculate how much time it takes for the reflected echo to come back. However, when our following car is in a corner, the sound waves might not reflect back to the source sensor, but to the other two sensors, making the car backup or turn unnecessarily.
To fix this problem, we would need more sensors to detect a larger radius and also a more descriptive picture of the obstacle. However, due to limited ADC pins we were only able to use a maximum of three sensors.
Compass Interference
The LSM303DLM compass uses the Earth’s magnetic field to determine the direction it is facing. Therefore, the compass has to be at least 6 inches away from any magnet, according to the datasheet. The GPS module on the car uses a magnet as its antenna so we knew we had to mount our compass, as explained in our hardware implementation section.
The interference became a problem when we were testing the compass indoors. There are a lot of sources of magnetic fields inside classrooms from computers. When we hard coded the car to always go north (0 degrees), the car will start going in one direction, before turning around and heading off to a different location. This problem will be solved when we test our car outdoors.
GPS Accuracy
Our GPS modules work the best outdoors. The GPS modules take a while to boot up, around 45 seconds to a minute. While testing outdoors, we connected our car via USB to Hercules until we received the GPS signal. Then, we unplugged the car but still left the car on so the GPS doesn’t shut off. We verified the GPS coordinates by printing out the coordinates in Hercules and putting them into Google Maps. However, the GPS module on our leading car was not very accurate. When we place the two cars next to each other, the coordinates are not the same, and differ by around 15 meters.
Power Consumption
We changed motor controllers around halfway through the project. The old motor controllers needed at least 6V to be powered. A 9V battery drained too quickly to be suitable for actual testing and demonstration purposes. The next idea was to take the 4 AA batteries’ voltage and use a voltage booster to boost it up to the necessary voltage. After a week of testing, the voltage booster stopped working due to overheating and the regulator melting. Preet suggested to use a new motor controller, the current one used in the car. This one only needed 5V as the supply.
Another power consumption problem was the compass. It needed a minimum of 5V to power on. This means the 4 AA batteries that produce 4.8V is not enough to power the compass. Since the voltage booster stopped working, we needed another way to produce more voltage. To fix the problem, we added another AA to the battery pack to create 6V. This required breaking one of the tabs on the battery pack and soldering more metal tabs to it. Using 5 AA batteries allowed us to power our motor controllers, the compass and the LPC1758 board.
XBee Range
The range of the Xbee modules should be 400 feet according to the datasheets. When testing outdoors, the following car seemed to drive away from the leading car. To debug the problem, we connected the following car via USB to Hercules and read the GPS data from both cars. Then, one member of the team walks away from the computer with the lead car until the leading car GPS data becomes invalid or inconsistent. After testing, the range of the Xbee modules was only 40-50 feet.
Bad Front Sensor
When we bought our parts, we only bought two proximity sensors, one pointing towards the left, and the other pointing towards the right. After a discussion with Preet, he suggested to add a sensor pointing forward and he provided us one. This sensor used I2C and passes the distance detected in inches as data. However, the maximum distance measured by the sensor was only 24 inches, which is too small to be our front threshold. We were able to find a 3rd proximity sensor that was the same as the other two side sensors. This sensor could measure up to 254 inches and is sufficient enough for our thresholds.
Motor Speeds
The motor controllers output a PWM signal to control the motors. The higher the duty cycle, the faster the motor spins. However, this will consume more energy. The duty cycle must be high enough for the wheels to overcome the friction of the ground. During the testing phase, the car also produces a high pitch sound, indicating that the duty cycle is not high enough. With the old motor controllers, when the duty cycle too high, the batteries drained quickly. With the new motor controllers that are more efficient and use less power, the duty cycle can be set to the maximum of 100 without draining the battery quickly.
Another side-effect of a high duty cycle is the car will travel too fast and have less time to stop and avoid obstacles. To fix this problem, the front and side thresholds were increased to allow the car to stop and backup without hitting obstacles.
Conclusion
The GPS Following Car is, in general, an embedded system that connects together five different components that are interfaced together in software through protocols such as I2C, UART, and ADC.
The main objective of the project was to create a car that would be able to follow another car automatically by acquiring the necessary information from the leading car, such as GPS coordinates and heading.
The challenge of the project was for the following car to be able to travel to its destination by itself without colliding with any external objects. This challenge was tackled by following a very strict and efficient object-avoiding algorithm.
As a team of engineers, this project enhanced our programming skills by taking our knowledge of the C and C++ languages and putting them to use to ensuring that the system worked effectively and efficiently. We learned to communicate and share information with one another in a way that we were always productive and learned to manage our time effectively to make consistent progress throughout the semester.
Also, our understanding of operating systems was challenged in this project because the system as a whole is based on FreeRTOS. By having an actual O.S. run our system we were challenged to meet acceptable CPU efficiency levels, to make use of the available memory efficiently by limiting our tasks to only using the amount of stack necessary to execute.
Project Video
Upload a video of your project and post the link here.
Project Source Code
Send me your zipped source code and I will upload this to SourceForge and link it for you.
References
Acknowledgement
Any acknowledgement that you may wish to provide can be included here.
References Used
List any references used in project.
Appendix
You can list the references you used.