From Embedded Systems Learning Academy
Project Title : Self Navigating Car
This project is aimed at developing a 1/5 RC car with a self-driving capability based on controller interaction over the CAN (Controller Area Network) bus. With the advent of driverless cars, we felt the need to develop a scaled-down version that can maneuver itself through co-ordinates fed by Google maps and correct its course when it sees an obstacle. To achieve this objective, we plan to integrate 6 controllers dedicated to specific roles that can pass messages over a common CAN communication bus. In addition, the prototype would involve an Android mobile application for data monitoring and controlling purpose to keep a track of the car remotely and feed it the required checkpoints to reach its destination. The car would comprise of three modes of operation namely; home, map and free run. In the home mode, the car would be guided to its home destination (which is preset to Boccardo Business center) from its current location. In the map mode, the user can feed in the desired destination through the google maps interface which the car would follow based on the co-ordinates and heading provided by its GPS and compass respectively. The free run mode will convert the mobile phone into a remote device capable of controlling the speed and direction of the car based on the accelerometer and gyroscope enabled on the device. In this way, the user can take control of the car at any given time. Below is the high-level block diagram of the entire system.
|
|
Abstract
Objective and Scope
Team Members & Responsibilities
- Sensor Controller:
- Motor Controller
- I/O Unit:
- Communication Bridge + Android:
- Geographical Controller:
- Master Controller:
Introduction
Schedule
Sensor Team Schedule
Sl. No
|
Start Date
|
End Date
|
Task
|
Status
|
Actual Completion Date
|
1
|
09/14/2014
|
09/20/2014
|
Understanding the logic of sensors to be used
|
Completed
|
09/20/2014
|
2
|
09/21/2014
|
10/04/2014
|
Writing the codes for the different types of sensors
|
Completed
|
10/04/2014
|
3
|
10/05/2014
|
10/11/2014
|
Testing the different sensors for accuracy and placing the order for the one we have selected.
|
Completed
|
10/11/2014
|
4
|
10/12/2014
|
10/25/2014
|
Build CAN transceiver and send data to the Master Board
|
Completed
|
10/25/2014
|
5
|
10/26/2014
|
11/01/2014
|
Place all the sensors on car and test for obstacle avoidance
|
Completed
|
10/28/2014
|
6
|
11/02/2014
|
11/14/2014
|
Work on light and tilt sensors
|
Completed
|
11/04/2014
|
7
|
11/15/2014
|
12/09/2014
|
Final testing and debugging
|
Completed
|
12/19/2014
|
Motor Team Schedule
Sl. No
|
Start Date
|
End Date
|
Task
|
Status
|
Actual Completion Date
|
1
|
09/14/2014
|
09/20/2014
|
Understand the logic of Motor Controller present in the RC Car
|
Completed
|
09/20/2014
|
2
|
09/21/2014
|
09/27/2014
|
Replace on-board controller with SJSU One board
|
Completed
|
09/22/2014
|
3
|
09/28/2014
|
10/04/2014
|
Drive the DC motor with SJSU One board at different Duty Cycles
|
Completed
|
09/30/2014
|
4
|
10/05/2014
|
10/11/2014
|
Test the Servo and DC motor together for moving forward and taking turns
|
Completed
|
10/09/2014
|
5
|
10/12/2014
|
10/18/2014
|
Build CAN Transceiver and move the car as per the CAN message received
|
Completed
|
10/13/2014
|
6
|
10/19/2014
|
10/25/2014
|
Make arrangement for CAN subscription task
|
Completed
|
10/25/2014
|
7
|
10/26/2014
|
11/01/2014
|
Interface encoder and calculate the actual speed at which car is running
|
Completed
|
10/28/2014
|
8
|
11/02/2014
|
11/08/2014
|
Make compensation algorithm and make car to move at desired speed
|
Completed
|
11/04/2014
|
9
|
11/09/2014
|
12/09/2014
|
Final testing and debugging
|
Completed
|
12/19/2014
|
I/O Team Schedule
Sl. No
|
Start Date
|
End Date
|
Task
|
Status
|
Actual Completion Date
|
1
|
09/14/2014
|
09/20/2014
|
Search and order GLCD module with touch screen, LEDs for headlights
|
Completed
|
09/20/2014
|
2
|
09/21/2014
|
10/04/2014
|
Study of GLCD data frame formats and design GUI
|
Completed
|
10/03/2014
|
3
|
10/05/2014
|
10/11/2014
|
Development of GLCD functions including touchscreen handler
|
Completed
|
10/11/2014
|
4
|
10/12/2014
|
10/25/2014
|
Setup CAN subscription tasks for communication with Master controller
|
Completed
|
10/27/2014
|
5
|
10/26/2014
|
11/01/2014
|
Develop hardware and code for automatic headlight control.
|
Completed
|
11/01/2014
|
6
|
11/02/2014
|
11/14/2014
|
Build hardware for switches and write interrupt handlers for the same
|
Completed
|
11/07/2014
|
7
|
11/15/2014
|
12/09/2014
|
Mount GLCD, headlights, switches on car and final testing
|
Completed
|
12/19/2014
|
Communication Bridge + Android Team Schedule
Sl. No
|
Start Date
|
End Date
|
Task
|
Status
|
Actual Completion Date
|
1
|
09/14/2014
|
09/20/2014
|
Google maps API research
|
Completed
|
09/20/2014
|
2
|
09/21/2014
|
10/04/2014
|
Mock locations on Google maps and simulate co-ordinates w/o gps
|
Completed
|
10/04/2014
|
3
|
10/05/2014
|
10/11/2014
|
Two way Bluetooth communication and setup RTOS tasks
|
Completed
|
10/11/2014
|
4
|
10/12/2014
|
10/25/2014
|
Raw GUI for app and setup CAN tasks for Start and Stop commands
|
Completed
|
10/25/2014
|
5
|
10/26/2014
|
11/09/2014
|
Integration with GEO module and queue for each subscribed service
|
Completed
|
11/09/2014
|
6
|
11/10/2014
|
11/16/2014
|
Incorporate all essential services into Android app and test for response
|
Completed
|
11/16/2014
|
7
|
11/16/2014
|
11/23/2014
|
Final setup and changes for all the CAN tasks along with XBee interfacing
|
Completed
|
11/23/2014
|
8
|
11/24/2014
|
12/01/2014
|
Testing with GEO module with real-time co-ordinates and plotting way points onto Maps
|
Completed
|
12/01/2014
|
9
|
12/02/2014
|
12/09/2014
|
Final Testing and verification of all components on the main field
|
Completed
|
12/19/2014
|
GEO Team Schedule
Sl. No
|
Start Date
|
End Date
|
Task
|
Status
|
Actual Completion Date
|
1
|
09/7/2014
|
09/14/2014
|
Market research for GPS and Compass Modules
|
Completed
|
09/14/2014
|
2
|
09/14/2014
|
09/21/2014
|
Place order / receive the modules
|
Completed
|
09/20/2014
|
3
|
09/21/2014
|
09/28/2014
|
Interface GPS with SJ -One board via UART
|
Completed
|
09/26/2014
|
4
|
09/28/2014
|
10/05/2014
|
Interface Compass with SJ-One Board via I2C
|
Completed
|
10/03/2014
|
5
|
10/05/2014
|
10/12/2014
|
Parsing the GPS data stream
|
Completed
|
10/11/2014
|
6
|
10/12/2014
|
10/19/2014
|
Calibration and testing of compass
|
Completed
|
10/13/2014
|
7
|
10/12/2014
|
10/19/2014
|
Decide CAN message ID’s and message formats
|
Completed
|
10/28/2014
|
8
|
10/19/2014
|
10/26/2014
|
Combining UART and GPS parsing. Create task for GPS
|
Completed
|
10/25/2014
|
9
|
10/19/2014
|
10/26/2014
|
Combining compass calibration and i2c interface. Create task for Compass
|
Completed
|
10/25/2014
|
10
|
10/26/2014
|
11/02/2014
|
Distance to Destination Calculation and Algorithm
|
Completed
|
11/02/2014
|
11
|
11/03/2014
|
11/10/2014
|
Basic CAN communication with Master, IO and Android
|
Completed
|
11/10/2014
|
12
|
11/10/2014
|
11/17/2014
|
Synchronization and Data Integrity (Semaphores/Mutex/Critical Section)
|
Completed
|
11/17/2014
|
13
|
11/18/2014
|
11/25/2014
|
Final Integration of CAN Framework and Implementation of CAN communication with other modules
|
Completed
|
11/25/2014
|
14
|
11/26/2014
|
12/09/2014
|
Testing and debugging on car (Re-Calibration/Bug Fixes)
|
Completed
|
12/19/2014
|
Master Team Schedule
Sl. No
|
Start Date
|
End Date
|
Task
|
Status
|
Actual Completion Date
|
1
|
09/7/2014
|
09/13/2014
|
Understanding CAN Bus and API's
|
Completed
|
09/13/2014
|
2
|
09/14/2014
|
09/20/2014
|
Deciding System Flow
|
Completed
|
09/20/2014
|
3
|
09/21/2014
|
09/27/2014
|
Deciding MSG id's for all devices
|
Completed
|
10/27/2014
|
4
|
09/28/2014
|
10/11/2014
|
Testing Subscription between 2 devices
|
Completed
|
10/4/2014
|
5
|
09/28/2014
|
10/11/2014
|
Making CAN bus hardware to interface all SJOne boards
|
Completed
|
10/11/2014
|
6
|
09/28/2014
|
10/11/2014
|
Testing subscription and time sync between all devices
|
Completed
|
10/11/2014
|
7
|
10/12/2014
|
10/18/2014
|
Reading sensor data from boards at the subscription rate
|
Completed
|
10/26/2014
|
8
|
10/19/2014
|
11/1/2014
|
Algorithm for obstacle avoidance
|
Completed
|
10/27/2014
|
9
|
11/2/2014
|
11/15/2014
|
Algorithm for GPS based navigation
|
Completed
|
11/15/2014
|
10
|
11/16/2014
|
11/22/2014
|
Initial testing and tweaking of the car
|
Completed
|
11/22/2014
|
11
|
11/23/2014
|
12/9/2014
|
Final Testing! Showdown time!
|
Completed
|
12/19/2014
|
Parts List & Cost
Qty
|
Description
|
Manufacturer
|
Part Number
|
Total Cost
|
1 |
RC Car |
- |
- |
$$$
|
10 |
CAN transceivers |
- |
- |
Free
|
1 |
GPS module |
- |
- |
$$
|
1 |
Magnetometer Module |
- |
- |
$
|
1 |
Ultrasonic Sensor |
- |
- |
$$
|
1 |
Misc Components |
- |
- |
$
|
|
Total Cost |
|
|
INCREASING!!
|
Backup Parts & cost
Qty
|
Description
|
Manufacturer
|
Part Number
|
Total Cost
|
Design & Implementation
CAN 11-bit ID Format
MSG
|
DST
|
SRC
|
5 bits (11-6)
|
3 bits (5-3)
|
3 bits (2-0)
|
Controller ID Table
Controller ID
|
Controller Type
|
001
|
Motor Controller
|
010
|
Master Controller
|
011
|
Sensor Controller
|
100
|
GEO Controller
|
110
|
Communication Bridge + Android Controller
|
111
|
I/O Controller
|
Controller Communication Table
Master Controller Communication Table
Message Number
|
Message Name (MSG_FUNCTION)
|
Data Layout of Data Sent over CAN (byte[0] = total number of data bytes)
|
0x082
|
POWERUP_SYN
|
NO DATA
|
0x102
|
POWERUP_ACK
|
Msg1 : byte[1] : (uint8_t) version
Msg1 : byte[2-3] : (uint16_t) year
Msg1 : byte[4] : (uint8_t) month
Msg1 : byte[5] : (uint8_t) date
Msg1 : byte[6] : (uint8_t) dayofweek
Msg1 : byte[7] : (uint8_t) hour
Msg2 : byte[1] : (uint8_t) minute
Msg2 : byte[2] : (uint8_t) second
|
0x142
|
HEARTBEAT
|
Msg1 : byte[1-2] : (uint16_t) rx_count
Msg1 : byte[3-4] : (uint16_t) rx_bytes
Msg1 : byte[5-6] : (uint16_t) tx_count
Msg1 : byte[7] : (uint16_t) tx_bytes
Msg2 : byte[1] : (uint16_t) tx_bytes
|
0x3CA
|
SPEED_DIR_COMMAND
|
Msg1 : byte[1] : (uint8_t) speed
Msg1 : byte[2] : (uint8_t) direction
Msg1 : byte[3] : (uint8_t) brake
|
Motor Controller Communication Table
Message Number
|
Message Name (MSG_FUNCTION)
|
Data Layout of Data Sent over CAN (byte[0] = total number of data bytes)
|
0x0D1
|
POWERUP_SYN_ACK
|
Msg1 : byte[1] : (uint8_t) version
|
0x191
|
HEARTBEAT_ACK
|
Msg1 : byte[1-2] : (uint16_t) rx_count
Msg1 : byte[3-4] : (uint16_t) rx_bytes
Msg1 : byte[5-6] : (uint16_t) tx_count
Msg1 : byte[7] : (uint16_t) tx_bytes
Msg2 : byte[1] : (uint16_t) tx_bytes
|
0x341
|
SPEED_ENCODER_DATA
|
Msg1 : byte[1] : (uint8_t) speed
Msg1 : byte[2] : (uint8_t) dir
Msg1 : byte[3] : (uint8_t) brake
|
GEO Controller Communication Table
Message Number
|
Message Name (MSG_FUNCTION)
|
Data Layout of Data Sent over CAN (byte[0] = total number of data bytes)
|
0x0D4
|
POWERUP_SYN_ACK
|
Msg1 : byte[1] : (uint8_t) version
|
0x194
|
HEARTBEAT_ACK
|
Msg1 : byte[1-2] : (uint16_t) rx_count
Msg1 : byte[3-4] : (uint16_t) rx_bytes
Msg1 : byte[5-6] : (uint16_t) tx_count
Msg1 : byte[7] : (uint16_t) tx_bytes
Msg2 : byte[1] : (uint16_t) tx_bytes
|
0x384
|
GEO_HEADING_DATA
|
Msg1 : byte[1] : (uint8_t) current_angle
Msg1 : byte[2] : (uint8_t) desired_angle
Msg1 : byte[3] : (uint8_t) destination_reached
Msg1 : byte[4] : (uint8_t) is_valid
|
0x484
|
GEO_LOCATION_DATA
|
Msg1 : byte[1-4] : (float) latitude
Msg1 : byte[5-7] : (float) longitude
Msg2 : byte[1] : (float) longitude
Msg2 : byte[2-3] : (uint16_t) dist_to_final_destination
Msg2 : byte[4-5] : (uint16_t) dist_to_next_checkpoint
Msg2 : byte[6] : (uint8_t) is_valid
|
0x2AC
|
CHECKPOINT_REQUEST
|
Msg1 : byte[1] : (uint8_t) checkpoint_num
|
Communication Bridge + Android Controller Communication Table
Message Number
|
Message Name (MSG_FUNCTION)
|
Data Layout of Data Sent over CAN (byte[0] = total number of data bytes)
|
0x0D5
|
POWERUP_SYN_ACK
|
Msg1 : byte[1] : (uint8_t) version
|
0x195
|
HEARTBEAT_ACK
|
Msg1 : byte[1-2] : (uint16_t) rx_count
Msg1 : byte[3-4] : (uint16_t) rx_bytes
Msg1 : byte[5-6] : (uint16_t) tx_count
Msg1 : byte[7] : (uint16_t) tx_bytes
Msg2 : byte[1] : (uint16_t) tx_bytes
|
0x1D5
|
CAR_PAUSE
|
NO DATA
|
0x215
|
CAR_RESUME
|
NO DATA
|
0x425
|
CHECKPOINT_DATA
|
Msg1 : byte[1-4] : (float) latitude
Msg1 : byte[5-7] : (float) longitude
Msg2 : byte[1] : (float) longitude
Msg2 : byte[2-3] : (uint16_t) total_distance
Msg2 : byte[4] : (uint8_t) checkpoint_num
Msg2 : byte[5] : (uint8_t) is_new_route
Msg2 : byte[6] : (uint8_t) is_final_checkpoint
|
0x2C5
|
DRIVE_MODE
|
Msg1 : byte[1] : (uint8_t) mode
|
0x255
|
FREE_RUN_DIR
|
Msg1 : byte[1] : (uint8_t) speed
Msg1 : byte[2] : (uint8_t) turn
Msg1 : byte[3] : (uint8_t) direction
|
Sensor Controller Communication Table
Message Number
|
Message Name (MSG_FUNCTION)
|
Data Layout of Data Sent over CAN (byte[0] = total number of data bytes)
|
0x0D3
|
POWERUP_SYN_ACK
|
Msg1 : byte[1] : (uint8_t) version
|
0x193
|
HEARTBEAT_ACK
|
Msg1 : byte[1-2] : (uint16_t) rx_count
Msg1 : byte[3-4] : (uint16_t) rx_bytes
Msg1 : byte[5-6] : (uint16_t) tx_count
Msg1 : byte[7] : (uint16_t) tx_bytes
Msg2 : byte[1] : (uint16_t) tx_bytes
|
0x303
|
DIST_SENSOR_DATA
|
Msg1 : byte[1] : (uint8t) left
Msg1 : byte[2] : (uint8t) middle
Msg1 : byte[3] : (uint8t) right
Msg1 : byte[4] : (uint8t) back
|
0x443
|
OTHER_SENSOR_DATA
|
Msg1 : byte[1] : (uint8t) battery
Msg1 : byte[2] : (uint8t) light
|
I/O Controller Communication Table
Message Number
|
Message Name (MSG_FUNCTION)
|
Data Layout of Data Sent over CAN (byte[0] = total number of data bytes)
|
0x0D6
|
POWERUP_SYN_ACK
|
Msg1 : byte[1] : (uint8_t) version
|
0x196
|
HEARTBEAT_ACK
|
Msg1 : byte[1-2] : (uint16_t) rx_count
Msg1 : byte[3-4] : (uint16_t) rx_bytes
Msg1 : byte[5-6] : (uint16_t) tx_count
Msg1 : byte[7] : (uint16_t) tx_bytes
Msg2 : byte[1] : (uint16_t) tx_bytes
|
0x1D4
|
CAR_PAUSE
|
NO DATA
|
0x214
|
CAR_RESUME
|
NO DATA
|
0x2C4
|
DRIVE_MODE
|
Msg1 : byte[1] : (uint8_t) mode
|
Testing & Technical Challenges
Sl. No
|
Test Case
|
Test Description
|
Result
|
Challenges and Learning
Future Enhancement
Conclusion
Project Video
Project Source Code
References
Acknowledgement
References Used
- Preetpal Kang, Lecture notes of CMPE 243, Computer Engineering, Charles W. Davidson College of Engineering, San Jose State University, Aug-Dec 2014.
- en.wikipedia.org/