Difference between revisions of "F17: FoxP2"
Proj user5 (talk | contribs) (→Software Design) |
Proj user5 (talk | contribs) (→Software Design) |
||
Line 583: | Line 583: | ||
bool cmps11_calibrate(bool start_calibration, bool end_calibration); float compute_distance(float gps_lat, float gps_long, float dst_lat, float dst_long); | bool cmps11_calibrate(bool start_calibration, bool end_calibration); float compute_distance(float gps_lat, float gps_long, float dst_lat, float dst_long); | ||
− | The GPS library and Compass library are used by Geo_Sensor in order to calculate the Heading, Bearing, and Distance when geo_sensor_run() is called. Extern variables are used to share data CAN layer and Geo_Sensor. | + | The GPS library and Compass library are used by Geo_Sensor in order to calculate the Heading, Bearing, and Distance when geo_sensor_run() is called. Extern variables are used to share data CAN layer and Geo_Sensor. <br> |
extern float e_heading; | extern float e_heading; | ||
Line 594: | Line 594: | ||
extern uint8_t e_heading_valid; | extern uint8_t e_heading_valid; | ||
extern bool e_gps_distance_valid; | extern bool e_gps_distance_valid; | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! scope="col"| Task | ||
+ | ! scope="col"| Description | ||
+ | |- | ||
+ | ! scope="row"| geo_init() | ||
+ | | CAN_init() | ||
+ | geo_sensor_init() | ||
+ | |- | ||
+ | ! scope="row"| geo_1Hz() | ||
+ | | CAN_reset_bus() | ||
+ | |- | ||
+ | ! scope="row"| geo_10Hz() | ||
+ | | geo_sensor_run()<br> | ||
+ | command_car()<br> | ||
+ | geo_bridge_handshake()<br> | ||
+ | |- | ||
+ | ! scope="row"| geo_100Hz() | ||
+ | | can_rx() | ||
+ | |- | ||
+ | ! scope="row"| geo_1kHz() | ||
+ | | N/A | ||
+ | |- | ||
=== Implementation === | === Implementation === |
Revision as of 12:13, 17 December 2017
Contents
- 1 Grading Criteria
- 2 FOXP2
- 3 Abstract
- 4 Objectives & Introduction
- 5 Schedule
- 6 Parts List & Cost
- 7 Overall Design and Methodology
- 8 Motor Controller
- 9 LCD
- 10 Sensors
- 11 Geographical Controller
- 12 Android Application
- 13 SCons - Build Automation
- 14 Validation and Testing Plan
- 15 Testing & Technical Challenges
- 16 Conclusion
- 17 References
Grading Criteria
- How well is Software & Hardware Design described?
- How well can this report be used to reproduce this project?
- Code Quality
- Overall Report Quality:
- Software Block Diagrams
- Hardware Block Diagrams
- Schematic Quality
- Quality of technical challenges and solutions adopted.
FOXP2
Abstract
This project entails the aggregated knowledge from the Embedded System courses offered at SJSU leveraged into a fully functioning self-driving vehicle. This vehicle will navigate the terrain, avoid obstacles, and relay feedback to the user. The Initialization is enabled using the custom application which will set the final destination using GPS and destination node.
Objectives & Introduction
Show list of your objectives. This section includes the high-level details of your project. You can write about the various sensors or peripherals you used to get your project completed.
Team Members & Responsibilities
- R Nikfar
- Team Lead
- Electrical Circuits Engineering
- PCB design
- Sensor testing and implementation.
- Jason Tran
- Sensor IO Implementaion, and testing
- Master controller.
- Ahsan Uddin
- Git Admin
- Motor Control.
- Yuyu Chen
- Geographical Implementation
- Bridge Support
- Marvin Flores
- Android Application development
- Bridge Implementation
- Rabeel Elahi
- Master Controller Implementation.
- Sophia Quan
- LCD interface
- Motor Control.
- Michael Jaradah
- Testing.
- Taylor Kearns
- Testing.
- Bohan Liu
- Master Controller.
Schedule
Show a simple table or figures that show your scheduled as planned before you started working on the project. Then in another table column, write down the actual schedule so that readers can see the planned vs. actual goals. The point of the schedule is for readers to assess how to pace themselves if they are doing a similar project.
Week# | Date | End Date | Task | Status | Completion Date | |
---|---|---|---|---|---|---|
1 | 10/8/2017 | 10/14/2017 | Geographical: Order GPS and Compass
Android: Setup Android Studio; Run test application Motor: PWM proof of concept Sensors: Research and requirement for the proper front and reverse sensors. IO design. PCB: Initial design of PCB without peripherals was Completed. Master: Research Self-driving car algorithm. |
Completed
Completed Completed Completed Completed Completed |
Android & Bridge: 10/21/2017 | |
2 | 10/15/2017 | 10/21/2017 | Geographical: Interface with micro-controller to receive raw data
Android & Bridge: Initial App UI running. Create a solid plan for checkpoint algorithm. Motor: Run the car in straight line in manual mode. Sensors: Purchase and create the protocols and IO. Master: Start the design of the master controller for all IO. |
Completed
On-going Completed Completed On-going |
Geographical: 10/21/2017 Android & Bridge: 10/28/2017 | |
3 | 10/22/2017 | 10/28/2017 | Geographical: Implement algorithm to parse GPS NMEA sentence and calibrate compass
Android & Bridge: Checkpoint algorithm implemented. Phone to SJSUOne board communication setup. Motor: LCD Display initial integration Sensors: Initialize testing and debugging on the sensors. Master: Set priorities for the connected IO, and design a flowchart of the whole system |
Geographical: Completed Android & Bridge: Completed Delayed due to shipping issues |
Geographical: 10/28/2017 Android & Bridge: 11/04/2017 | |
4 | 10/29/2017 | 11/04/2017 | Geographical: Integrate GPS and compass together to get heading, bearing, and distance
Android & Bridge: Checkpoint algorithm testing. Full Communication with SJSUOne board implemented. Motor: Implement Speed and Voltage sensor. Full functional motor system that can support Gateway Sensors: Implement the IO and sensors with the master controller. PCB: initial design sent out to be printed. Master: Create and Design the Algorithm to handle IO from sensors and output motor controls. |
Completed
Geographical: Completed Android & Bridge: Completed Master: Completed |
Geographical: 11/04/2017 Android & Bridge: 11/11/2017 | |
5 | 11/05/2017 | 11/11/2017 | Geographical: Update DBC with Bridge controller and interface with other nodes on CAN bus
Android & Bridge: Other commands such as start and stop implemented and tested. Checkpoint algorithm finalized. Motor: Implement full functional LCD and Speed sensor feedback control Sensors: Further testing and fine-tuning of sensors for a fluid and seamless drive. Master: Testing of Signals, CAN, and behavior of the vehicle. |
Geographical: On-going Android & Bridge: Completed Master: On-going |
Geographical: 11/11/2017 Android & Bridge: 11/18/2017 | |
6 | 11/12/2017 | 11/18/2017 | Geographical: Calibrate compass with car
Motor: Reverse end to end system integration test Android & Bridge: Forward commands to GEO board Sensors: Improve filtering algorithm. Develop proof of concept for TOF sensors. |
Android & Bridge: Completed Motor: Completed |
Geographical: 11/14/2017 Android & Bridge: 11/25/2017 | |
7 | 11/19/2017 | 11/25/2017 | Geographical: Checkpoint algorithm
Motor: Speed integration check for final speed settings Android & Bridge: Receive messages from GEO & SENSOR. Add features to the app to display sensor values. Sensors: Compare TOF sensor viability. Look into other forms of measurement such as voltage, etc. |
Android & Bridge: Completed Motor: Completed |
Geographical: 11/25/2017 Android & Bridge: 11/25/2017 | |
8 | 11/26/2017 | 12/02/2017 | Geographical: System testing
Motor: Code freeze after feature complete. Clean up and unit test Android & Bridge: Implement auto-connect. Sensors: System testing |
Android & Bridge: Completed Motor: Completed |
Geographical: 12/02/2017 Android & Bridge: 12/02/2017 | |
9 | 12/03/2017 | 12/09/2017 | Geographical: System testing
Android & Bridge: Testing Sensors: System testing |
|||
10 | 12/10/2017 | 12/16/2017 | Geographical: Testing | Android & Bridge: Testing | ||
11 | 12/17/2017 | 12/20/2017 | Demo autonomous car on 12/20 |
Parts List & Cost
Item# | Part Desciption | Vendor | Qty | Cost $ |
---|---|---|---|---|
1 | RC Car | Amazon | 1 | 240.00 |
2 | SJOne board | Preet | 7 | 560.00 |
3 | Adafruit Ultimate GPS Breakout | [1] | 1 | 39.95 |
4 | CMPS11 - Tilt Compensated Compass Module | [2] | 1 | 29.90 |
5 | Bluetooth Module | Sparkfun | 1 | 24.95 |
6 | LIPO Batteries + Charger | 1 | 130.00 | |
7 | Ultrasonic sensor | Maxbotix | 5 | 150.00 |
8 | PCB | Bay Area Circuits | 2 | 75.00 |
9 | DB9 Connector + PCB components | HSC | 1 | 40.00 |
10 | CAN Transceiver | Microchip | 10 | 20.00 |
11 | LED HeadLights | Amazon | 1 | 30.00 |
12 | Traxxas XL-5 ESC (Replacement) | [3] | 1 | 55.00 |
13 | 4D Systems LCD | [4] | 1 | 100.98 |
Overall Design and Methodology
Board Connection Architecture
Our team's approach to the design of this project was solely based on the integrity of its connections and communication between the nodes. Each node would handle specific parts of the car that would require an extensive amount of computing. At the center of this communication would be our design and printed PCB(printed circuit board). This board was designed in a manner that would reduce the amount of noise within the circuitry of its components, and place its nodes at an optimal location relative to the car.
Insert Picture of the board connections here
Printed Circuit Board
The PCB which is at the heart of this project was designed in Eagle CAD. There were 2 iterations of this board. The first one was designed without validation and had problems with noise within the CAN communications(discussed in problems encountered section). This design lacked several necessary connections and was limited by functionality.
The Second version of the board would incorporate 4 external power outlets that supply 3.3V and 5V to external components as necessary. There would also be an external power unit with regulators that make sure that a clean power is fed to the boards if necessary. As shown in the schematic, the can transceivers are connected to the boards using the terminating resistors. This CAN bus line also connects to the DB9 connections to easily read the CAN data using the PCAN Dongle.
Before the Board was sent for printing, the rat nests had to be removed and the connections had to be routed in such a way that minimum amount of noise was created. this ensured a robust communication for the CAN bus and stable noise-free power supply for the external components such as the Ultrasonic Sensors.
Motor Controller
Motor Controller primary tasks are as follows: 1. Control the rear wheels for moving forward, backward and stop 2. Control the front wheels to maneuver 3. Display contents on the LCD
Hardware Design
1. ESC
2. Servo
3. RPM Sensor
4. LCD
Hardware Interface
1. CAN bus
2. PWM to Motor and servo
3. RPM sensor for edge detection
4. UART to LCD
In this section, you can describe how your hardware communicates, such as which BUSes used. You can discuss your driver implementation here, such that the Software Design section is isolated to talk about high level workings rather than inner working of your project.
Software Design
1. Init
2. 1 Hz Task
3. 10 Hz task
4. 100 Hz task
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.
LCD
The uLCD-32PTU is a 3.2" (240x320) LCD screen with a micro SD connector, GPIO's along with I2C and serial COMMS. Workshop4 IDE was used to program the GUI, and data was transmitted from the SJOne board through UART communication. The LCD displays RPM clicks, GPS heading, bearing, distance, and also the current firmware version and branch name.
Note: The display here shows the angularmeter which will display the rpm, the top right box will display the bearing, heading, and distance from the GPS, and the bottom box will disply the firmware git hash, and branch.
Sensors
The primary responsibility of the sensor ECU is to provide object detection capabilities.
Hardware Design
For object detection, distance sensors are used to provide proximity awareness. 3 distance sensors are placed on the front of the car (front left, front, and front right) to continuously measure the distance of the general directions. An object or obstacle can be detected when the distance of a given direction is below a threshold which indicates that the car cannot traverse in that direction and should attempt steer away from the blocked path.
Hardware Interface
Note: Despite the names, the TX and RX pins do not function as asynchronous serial transmit and receive. The TX functions as an open-drain output that pulls the line down when the sensor wants to trigger a cascaded sensor. The RX functions as an digital input that acts as a trigger for the sensor to begin measuring a distance.
Software Design
The sensor software follows a modular design pattern. Sensors is the top level module
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.
Geographical Controller
The main purpose of the geographical controller is to guide the car towards its destination. This is done by processing data from the GPS and Compass module in order to get the Heading, Bearing, and Distance.
The compass will allow the user to calculate the Heading, which tells us which direction the car is pointing relative to magnetic north nor simply, "Which way the car is pointing"?
The GPS will allow the user to get the current coordinate of the car, which will be useful when calculating the Bearing and Distance.
The Bearing tells us the direction from the current location to a checkpoint coordinate, and is given as the angle between the location and the current location of the car.
The Distance tells us how many meters away the current checkpoint is. Essentially, How far away are we from our destination?
The geographical controller is also responsible for:
1. Process data from GPS and Compass module.
2. Navigate to nearest checkpoints and to set destination.
3. Receive checkpoints from Bridge controller.
Hardware Design
Hardware Interface
CAN Bus
The CAN bus interface allows the geographical controller to send and receive data from other microcontrollers on the bus. For example, the geographical controller will send requests to the Gateway controller to tell it to turn right, left, or keep straight in order to reach the set checkpoints. The geographical controller will receive checkpoints from the Bridge controller in order for the geographical controller to know how to steer or how far away the destination is at.
MTK3339 Ultimate GPS
The MTK3339 Ultimate GPS module from Adafruit was chosen because it provided good results when it was used previously for a different project. The main purpose of the GPS module is to provide an accurate location of the car while the car navigates towards its destination. This is done by parsing NMEA sentences, which are transmitted by 22 satellites to pinpoint the current location of the module. There are various different types of NMEA sentences, such as $GPRMC and $GPGGA. The NMEA sentence that was used was $GPRMC, which provides only the recommended minimum. $GPRMC was also chosen because it is the only NMEA sentence the GPS module is able to provide data at 10Hz for real-time application. The module is interfaced via UART with a baud-rate set to 57600bps. The module also comes with a fix LED, which indicates if a GPS fix by blinking every 15 seconds, if not, it blinks every 1Hz. The module is powered by 3.3V from the SJOne board.
The $GPRMC sentence is separated by commas, which the user has to parse in order to get useful data out of the module. The most important data that the user want is the GPS coordinate, Latitude and Longitude. The strtok_r() function was used in order to parse the NMEA sentence.
Below is an example of a parsed $GPRMC sentence:
Example: $GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68 1 2 3 4 5 6 7 8 9 10 11 12
Number | Raw form | Description |
---|---|---|
1 | 225446 | Time of fix 22:54:46 UTC |
2 | A | Navigation receiver warning A = OK, V = warning |
3 | 4916.45 | Latitude 49 deg. 16.45 min |
4 | N | North |
5 | 12311.12 | Longitude 123 deg. 11.12 min |
6 | W | West |
7 | 000.5 | Speed over ground, Knots |
8 | 054.7 | Course Made Good, True |
9 | 191194 | Date of fix 19 November 1994 |
10 | 020.3 | Magnetic variation 20.3 deg |
11 | E | East |
12 | *68 | mandatory checksum |
CMPS11 - Tilt Compensated Compass Module
The CMPS11 - Tilt Compensated Compass module was chosen because it provides the heading value, which let the user know which way the car is facing relative to magnetic north. Not only does it provide heading, the module also has a 3-axis gyro and a 3-axis accelerometer to remove or neglect any errors while the module is tilted (going up or down a slope). Another compass module was considered before choosing this module because the old module had to be calibrated extensively in order for it to work properly. This module only needed to be calibrated one time in an environment free of magnetic interference. The heading was double-checked after the module was mounted onto the car.
The compass module is placed away from all other components of the car to minimize any magnetic interference from the motor, servo, sensors, and microcontrollers. Placing it in an environment where there is magnetic interference will cause incorrect reading of the heading and the car will navigate towards the wrong direction. The compass module is interfaced via I2C. It is powered on by 3.6-5V, but 3.3V works also.
Software Design
The Geographical Controller is designed in a way so that the code is modular and organized. Only what is needed are exposed.
GPS Compass Geo_Sensor bool gps_init(gps_data_ready_cb cb); bool cmps11_init(void); bool geo_sensor_init(void); bool get_lat_long(float *gps_data); float cmps11_get_heading(void); void geo_sensor_run(void); bool cmps11_calibrate(bool start_calibration, bool end_calibration); float compute_distance(float gps_lat, float gps_long, float dst_lat, float dst_long);
The GPS library and Compass library are used by Geo_Sensor in order to calculate the Heading, Bearing, and Distance when geo_sensor_run() is called. Extern variables are used to share data CAN layer and Geo_Sensor.
extern float e_heading; extern float e_bearing; extern float e_distance; extern float e_curr_latitude; extern float e_curr_longitude; extern float e_checkpoint_latitude; extern float e_checkpoint_longitude; extern uint8_t e_heading_valid; extern bool e_gps_distance_valid;
Task | Description |
---|---|
geo_init() | CAN_init()
geo_sensor_init() |
geo_1Hz() | CAN_reset_bus() |
geo_10Hz() | geo_sensor_run() command_car() |
geo_100Hz() | can_rx() |
geo_1kHz() | N/A |