<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://socialledge.com/sjsu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Proj+user12</id>
		<title>Embedded Systems Learning Academy - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://socialledge.com/sjsu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Proj+user12"/>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php/Special:Contributions/Proj_user12"/>
		<updated>2026-04-09T18:17:12Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.1</generator>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66707</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66707"/>
				<updated>2021-12-18T02:35:55Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* SOFTWARE DESIGN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Game.gif |300px|Final|right]]&lt;br /&gt;
&lt;br /&gt;
=='''JUVENILE JUMPERS'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Start.gif|thumb|left|400px| START SCREEN]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level1.gif|thumb|none|400px| LEVEL 1]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level2.gif|thumb|right|400px| LEVEL 2]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''ABSTRACT'''==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is a single player, endless platform game in which there are enemies and obstacles on various platforms. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== '''OBJECTIVES &amp;amp; INTRODUCTION'''==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== '''Team Members &amp;amp; Responsibilities''' ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
==''' SCHEDULE''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''PARTS LIST &amp;amp; COST''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''HARDWARE DESIGN''' ==&lt;br /&gt;
The game has been designed using SJtwo-c board, RGB LED- for visuals, MP3 decoder- for background music, joystick and PCB. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== '''Printed Circuit Board''' ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB and the schematic &amp;amp; layout is designed using Autodesk's Eagle software. The PCB fabrication vendor is JLCPCB.&lt;br /&gt;
====PIN Configuration====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PIN number&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
|      || '''LED Matrix'''                   ||&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|       || '''Joystick''' ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
| ||'''MP3 Decoder''' ||&lt;br /&gt;
|-&lt;br /&gt;
| RX    ||  Receiver        ||p4_29&lt;br /&gt;
|-&lt;br /&gt;
| TX     ||    Transmitter            ||p4_28&lt;br /&gt;
|-&lt;br /&gt;
| VCC     ||   connected to vcc         || 5V&lt;br /&gt;
|-&lt;br /&gt;
|GND  || Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Interfacing and Layout====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:Schematic.PNG|800px|thumb|center|Schematic]]&lt;br /&gt;
|[[File:Board.PNG|450px|thumb|right|Board Layout]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[File:PCB_Bottom.PNG|600px|thumb|center|PCB Bottom View]]&lt;br /&gt;
|[[File:PCB_top.PNG|600px|thumb|left|PCB Top View]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''LED Matrix'''  ===&lt;br /&gt;
A 64x64 RGB LED Matrix, with a total of 4096 pixels is used for display. Each LED can be fully controlled independently using 13 digital GPIOs. This matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. By combing RGB colors we can make different colors such as YELLOW, CYAN, RED, WHITE, MAGENTA. &lt;br /&gt;
==== Technical Specifications====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Specification&lt;br /&gt;
! Remarks&lt;br /&gt;
|-  &lt;br /&gt;
| Pitch || 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Resolution || 64x64 =4096 pixels&lt;br /&gt;
|-&lt;br /&gt;
| Volt/Amp || 5V/60A&lt;br /&gt;
|-&lt;br /&gt;
| Scan Rate|| 1/16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====LED Matrix Panel====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:RGB_Led_matrix.jpg|600px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
|[[File:Start_screen.jpg|500px|thumb|left|Start Screen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Dual Axis Joystick'''  ===&lt;br /&gt;
We have used 2-axis joystick to control the movements of the jumper. The joystick operates on 5V power and provides analog output, hence it is connected to the ADC pins of SJtwo-c board. X-axis values are used to define the left and right directions of the doodle. The switch on the joystick controls the start and stop actions of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
=== '''MP3 Decoder'''  ===&lt;br /&gt;
The MP3 decoder that we used is serial MP3 player model by Catalex (version v1.0.1). It's a simple MP3 player device which is based on a high-quality MP3 audio chip---YX5300. It can support 8k Hz ~ 48k Hz sampling frequency MP3 and WAV file formats. There is a TF card socket on board, so you can plug the micro SD card that stores audio files. MCU can control the MP3 playback state by sending commands to the module via UART port, such as switch songs, change the volume and play mode and so on.&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
== '''SOFTWARE DESIGN''' ==&lt;br /&gt;
&lt;br /&gt;
This is an open ended game having two levels with the feasibility of integrating more levels. &lt;br /&gt;
Below is the overview of game play.&lt;br /&gt;
&lt;br /&gt;
[[File:Game_play.png|600px |thumb|center|Game Overview]]&lt;br /&gt;
&lt;br /&gt;
'''1. Level_1:'''&lt;br /&gt;
* In the first level, the jumper will keep jumping on the tiles and the player needs to control its direction. There are some special tiles with spring embedded on them and if the doodle lands on such a tile it will take longer jumps than it      would have taken by landing on a regular tile.&lt;br /&gt;
* With each jump the score gets incremented by 10.&lt;br /&gt;
* After each jump, the background screen shifts down. &lt;br /&gt;
* While falling, if the jumper doesn't find any tile it will be moved out of the display and game ends.&lt;br /&gt;
* For reaching level two, you need to score above 150.&lt;br /&gt;
&lt;br /&gt;
'''2. Level_2:'''&lt;br /&gt;
* In this level more difficulties have been added using monsters.&lt;br /&gt;
* But with more difficulties comes more solutions, so we have provided cannon to the doodle to shoot and kill the enemies.&lt;br /&gt;
* also, there are extra points on killing an enemy.&lt;br /&gt;
* If the doodle collides with enemies, the game ends.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''There are five tasks in total that are involved in this game in order to ensure full functionality.'''&lt;br /&gt;
&lt;br /&gt;
[[File:Task.png|500px |thumb|center|Task Hierarchy]]&lt;br /&gt;
&lt;br /&gt;
'''1. Start and stop task:'''&lt;br /&gt;
* This task displays the game's start screen. &lt;br /&gt;
* To start the game, player need to press the onboard switch on the joystick.&lt;br /&gt;
* Switch is to be pressed again to restart the game.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Start stop task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void game_start_stop_task() {&lt;br /&gt;
  while (1) {&lt;br /&gt;
    if (!game_started) {&lt;br /&gt;
      led_matrtix_draw_objects_print_start_screen();&lt;br /&gt;
      while (1) {&lt;br /&gt;
        if (!start_game_button) {&lt;br /&gt;
          jumper_display_on_start_screen(56, 30);&lt;br /&gt;
        } else {&lt;br /&gt;
          break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (start_game_button) {&lt;br /&gt;
      start_game_button = 0;&lt;br /&gt;
      if ((play_button_count % 2) &amp;amp;&amp;amp; game_started) {&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
        fprintf(stderr, &amp;quot;Stopping game&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
        stop_game();&lt;br /&gt;
        game_started = 0;&lt;br /&gt;
      } else if (!game_started) {&lt;br /&gt;
        led_matrix__clear_data_buffer();&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
        fprintf(stderr, &amp;quot;Starting game&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
        start_game();&lt;br /&gt;
        game_started = 1;&lt;br /&gt;
      }&lt;br /&gt;
      play_button_count++;&lt;br /&gt;
    }&lt;br /&gt;
    vTaskDelay(100);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2. Background Screen task:'''&lt;br /&gt;
* This task creates background tiles for the doodle to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Led matrix Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static void background_screen_task() {&lt;br /&gt;
  srand(xTaskGetTickCount());&lt;br /&gt;
  initialize_background_screen();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    if (game_started) {&lt;br /&gt;
      update_background_screen(0);&lt;br /&gt;
      vTaskDelay(100);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''3. Game logic task:'''&lt;br /&gt;
* When the game starts, this task detects the doodle's  initial position and collision with tiles.&lt;br /&gt;
* The doodle can take four jumps at a time.&lt;br /&gt;
* If a collision is detected then it shifts down the background screen creating the illusion of jumping of doodle to next tile. &lt;br /&gt;
* This task checks level and increments score.&lt;br /&gt;
* If the score is more than 150, the game will be switched to next level.&lt;br /&gt;
''' Code snippet for Gameplay Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void game_play(void *params) {&lt;br /&gt;
  delay_time_ms = LEVEL1_DELAY_TIME_STANDARD;&lt;br /&gt;
  // Initialize Background Screen&lt;br /&gt;
  led_matrix_draw_alphabets_print_string(&amp;quot;LEVEL&amp;quot;, 15, 15, GREEN);&lt;br /&gt;
  led_matrix_print_digits_string(level + 1, 15, 50, YELLOW);&lt;br /&gt;
  vTaskDelay(2000);&lt;br /&gt;
  led_matrix__clear_data_buffer();&lt;br /&gt;
  initialize_background_screen();&lt;br /&gt;
  (void)find_initial_jumper_position(&amp;amp;jumper_row, &amp;amp;jumper_col);&lt;br /&gt;
  draw_jumper(jumper_row, jumper_col);&lt;br /&gt;
  while (1) {&lt;br /&gt;
    update_score();&lt;br /&gt;
    vTaskDelay(delay_time_ms);&lt;br /&gt;
    switch (level) {&lt;br /&gt;
    case 0:&lt;br /&gt;
      play_level_1();&lt;br /&gt;
      continue;&lt;br /&gt;
    case 1:&lt;br /&gt;
      play_level_2();&lt;br /&gt;
      continue;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''4 LED Matrix task:'''&lt;br /&gt;
* This is a high-priority task which keeps displaying frame data every 1ms.&lt;br /&gt;
* There is also a draw objects that draw enemies, doodle, alphabets and digits for score.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Led matrix Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static void display_task() {&lt;br /&gt;
  while (1) {&lt;br /&gt;
    led_matrix__update_display();&lt;br /&gt;
    vTaskDelay(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5 Enemy tasks:'''&lt;br /&gt;
* Enemies are created from column 0 to 63 at random positions in this task.&lt;br /&gt;
''' Code snippet for Led matrix Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void enemy_task(void *params) {&lt;br /&gt;
  find_initial_enemy_positions();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    if (!game_over) {&lt;br /&gt;
      draw_enemies();&lt;br /&gt;
      vTaskDelay(70);&lt;br /&gt;
    } else {&lt;br /&gt;
      vTaskSuspend(NULL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''6 Gun Task:'''&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If y-axis value is detected greater than 4000, a gun will be shot at the enemies.&lt;br /&gt;
''' Code snippet for Gun Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void gun_task(void *params) {&lt;br /&gt;
  while (1) {&lt;br /&gt;
    if (!game_over) {&lt;br /&gt;
      shoot_gun(jumper_row, jumper_col);&lt;br /&gt;
      vTaskDelay(20);&lt;br /&gt;
    } else {&lt;br /&gt;
      vTaskSuspend(NULL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''IMPLEMENTATION''' ==&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
A 64*64 led matrix is used for this project. The led matrix is divided into two halves of 32*64 each. It has 3 R,G,B pins and 3 64-bits registers (shift registers) for each upper and lower halves. The address lines provided are 5. This means that at a time same row from the upper half and the lower half will be selected. So in order to display a particular row appropriate row should be selected and appropriate data needs to be fed to the RGB shift registers of both top and bottom halves.&lt;br /&gt;
LED matrix is initialized by configuring the required pins as output. The led matrix has 3 more pins enable which are essential to display a pixel on the matrix. The clk pin that should used as a clk to the shift registers to shift the data out, the latch pin is used to latch the data from the shift registers onto the matrix's buffer, the output enable pin that is used to display the latched data on the selected row. &lt;br /&gt;
* Before feeding matrix data disable Output Enable (OE) GPIO&lt;br /&gt;
* Set bits on A, B, C, D GPIO pins to select the particular row. &lt;br /&gt;
* Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins&lt;br /&gt;
* To mask that particular pixel set zero on R, G, B GPIO pins&lt;br /&gt;
* Set and Reset the clock for pushing the R, G, B bits for each column &lt;br /&gt;
* Issue latch to mark the row's completion&lt;br /&gt;
* Set OE&lt;br /&gt;
* Small delay&lt;br /&gt;
* Reset latch before going to next row&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* Integrated different music for every level that keeps on playing in background.&lt;br /&gt;
* To get the game state, sound flags are checked.&lt;br /&gt;
* Different music for jumps, firing, game over and collisions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mp3__send_command(uint8_t command, uint8_t data_1, uint8_t data_2) {&lt;br /&gt;
  mp3_uart_buffer[0] = 0x7e;&lt;br /&gt;
  mp3_uart_buffer[1] = 0xff;&lt;br /&gt;
  mp3_uart_buffer[2] = 0x06;&lt;br /&gt;
  mp3_uart_buffer[3] = command;&lt;br /&gt;
  mp3_uart_buffer[4] = 0x00;&lt;br /&gt;
  mp3_uart_buffer[5] = data_1;&lt;br /&gt;
  mp3_uart_buffer[6] = data_2;&lt;br /&gt;
  mp3_uart_buffer[7] = 0xef;&lt;br /&gt;
&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
    uart__polled_put(UART__3, mp3_uart_buffer[i]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3__init() {&lt;br /&gt;
  int mp3_baud_rate = 9600;&lt;br /&gt;
  uart__init(UART__3, clock__get_peripheral_clock_hz(), mp3_baud_rate);&lt;br /&gt;
&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 28, GPIO__FUNCTION_2);&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 29, GPIO__FUNCTION_2);&lt;br /&gt;
&lt;br /&gt;
  mp3__send_command(SELECT_DEVICE, 0x00, DEV_TF);&lt;br /&gt;
  mp3_play_start_song();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play(int num) { &lt;br /&gt;
mp3__send_command(CYCLE_PLAY_FOLDER, num, 0x02); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play_start_song() { &lt;br /&gt;
mp3_play(1); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void enable_joystick(gpio__port_e adc1, uint8_t x_pin, gpio__port_e adc2, uint8_t y_pin, gpio__port_e port, int pin) {&lt;br /&gt;
  const uint32_t set_analog_mode = (1 &amp;lt;&amp;lt; 7);&lt;br /&gt;
&lt;br /&gt;
  LPC_IOCON-&amp;gt;P1_30 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
  LPC_IOCON-&amp;gt;P0_25 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
&lt;br /&gt;
  adc_xvalue = gpio__construct_with_function(adc1, x_pin, 1);&lt;br /&gt;
  adc_yvalue = gpio__construct_with_function(adc2, y_pin, 3);&lt;br /&gt;
  adc__initialize();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''TESTING &amp;amp; TECHNICAL CHALLENGES''' ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix and Game Play ===&lt;br /&gt;
* Collision detection with tiles was not working after the 32nd column. Eventually it turned out to be a very silly issue. It was because while doing `1 &amp;lt;&amp;lt; 64`, 1 should have been type casted to uint64_t.&lt;br /&gt;
* The random number generator was not generating randomness as desired. The reason for that was that the random number generator was being seeded only once using xTaskGetTickCount() which would always give the same seed as xTaskGetTickCount() gives the time from the stat of the program and that would be same always at the start of the program. To get around this problem, the random number generator was seeded each time before generating a new random number. &lt;br /&gt;
* Led matrix's buffer was being overwritten every time a jumper goes over the tiles. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
===MP3 Decoder ===&lt;br /&gt;
While integrating the mp3 decoder code with the rest of the code, there occurred an issue in display and game became slow. &lt;br /&gt;
So instead of creating a separate task for mp3 decoder, we just did mp3__init() in main function and the issues got resolved.&lt;br /&gt;
&lt;br /&gt;
=='''CONCLUSION'''==&lt;br /&gt;
&lt;br /&gt;
We were able to accomplish the goals of the game that we outlined at the starting. Juvenile jumpers game successfully ran and mimicked the original doodle jump game. All the game components functioned correctly during the final demo allowing for a flawless experience. The LED matrix was capable of loading the various monsters and gun while playing the sounds for each of the game items. The demo showcased that the gun was able to  shoot the enemies to gain points. Through this project, we learned a lot about designing real world project using FreeRTOS applications, drivers, PCB design, power management circuits, git source code management, and final integration testing. This project allowed us to understand the importance of writing down requirements, planning a schedule for development, and communication between all of us.&lt;br /&gt;
&lt;br /&gt;
== '''ACKNOWLEGEMENT''' ==&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a knowledgeable course and continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice and feedbacks.&lt;br /&gt;
&lt;br /&gt;
== '''APPENDIX''' ==&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66706</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66706"/>
				<updated>2021-12-18T02:32:45Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* SOFTWARE DESIGN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Game.gif |300px|Final|right]]&lt;br /&gt;
&lt;br /&gt;
=='''JUVENILE JUMPERS'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Start.gif|thumb|left|400px| START SCREEN]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level1.gif|thumb|none|400px| LEVEL 1]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level2.gif|thumb|right|400px| LEVEL 2]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''ABSTRACT'''==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is a single player, endless platform game in which there are enemies and obstacles on various platforms. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== '''OBJECTIVES &amp;amp; INTRODUCTION'''==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== '''Team Members &amp;amp; Responsibilities''' ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
==''' SCHEDULE''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''PARTS LIST &amp;amp; COST''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''HARDWARE DESIGN''' ==&lt;br /&gt;
The game has been designed using SJtwo-c board, RGB LED- for visuals, MP3 decoder- for background music, joystick and PCB. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== '''Printed Circuit Board''' ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB and the schematic &amp;amp; layout is designed using Autodesk's Eagle software. The PCB fabrication vendor is JLCPCB.&lt;br /&gt;
====PIN Configuration====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PIN number&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
|      || '''LED Matrix'''                   ||&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|       || '''Joystick''' ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
| ||'''MP3 Decoder''' ||&lt;br /&gt;
|-&lt;br /&gt;
| RX    ||  Receiver        ||p4_29&lt;br /&gt;
|-&lt;br /&gt;
| TX     ||    Transmitter            ||p4_28&lt;br /&gt;
|-&lt;br /&gt;
| VCC     ||   connected to vcc         || 5V&lt;br /&gt;
|-&lt;br /&gt;
|GND  || Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Interfacing and Layout====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:Schematic.PNG|800px|thumb|center|Schematic]]&lt;br /&gt;
|[[File:Board.PNG|450px|thumb|right|Board Layout]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[File:PCB_Bottom.PNG|600px|thumb|center|PCB Bottom View]]&lt;br /&gt;
|[[File:PCB_top.PNG|600px|thumb|left|PCB Top View]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''LED Matrix'''  ===&lt;br /&gt;
A 64x64 RGB LED Matrix, with a total of 4096 pixels is used for display. Each LED can be fully controlled independently using 13 digital GPIOs. This matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. By combing RGB colors we can make different colors such as YELLOW, CYAN, RED, WHITE, MAGENTA. &lt;br /&gt;
==== Technical Specifications====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Specification&lt;br /&gt;
! Remarks&lt;br /&gt;
|-  &lt;br /&gt;
| Pitch || 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Resolution || 64x64 =4096 pixels&lt;br /&gt;
|-&lt;br /&gt;
| Volt/Amp || 5V/60A&lt;br /&gt;
|-&lt;br /&gt;
| Scan Rate|| 1/16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====LED Matrix Panel====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:RGB_Led_matrix.jpg|600px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
|[[File:Start_screen.jpg|500px|thumb|left|Start Screen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Dual Axis Joystick'''  ===&lt;br /&gt;
We have used 2-axis joystick to control the movements of the jumper. The joystick operates on 5V power and provides analog output, hence it is connected to the ADC pins of SJtwo-c board. X-axis values are used to define the left and right directions of the doodle. The switch on the joystick controls the start and stop actions of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
=== '''MP3 Decoder'''  ===&lt;br /&gt;
The MP3 decoder that we used is serial MP3 player model by Catalex (version v1.0.1). It's a simple MP3 player device which is based on a high-quality MP3 audio chip---YX5300. It can support 8k Hz ~ 48k Hz sampling frequency MP3 and WAV file formats. There is a TF card socket on board, so you can plug the micro SD card that stores audio files. MCU can control the MP3 playback state by sending commands to the module via UART port, such as switch songs, change the volume and play mode and so on.&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
== '''SOFTWARE DESIGN''' ==&lt;br /&gt;
&lt;br /&gt;
This is an open ended game having two levels with the feasibility of integrating more levels. &lt;br /&gt;
Below is the overview of game play.&lt;br /&gt;
&lt;br /&gt;
[[File:Game_play.png|600px |thumb|center|Game Overview]]&lt;br /&gt;
&lt;br /&gt;
'''1. Level_1:'''&lt;br /&gt;
* In the first level, the jumper will keep jumping on the tiles and the player needs to control its direction. There are some special tiles with spring embedded on them and if the doodle lands on such a tile it will take longer jumps than it      would have taken by landing on a regular tile.&lt;br /&gt;
* With each jump the score gets incremented by 10.&lt;br /&gt;
* After each jump, the background screen shifts down. &lt;br /&gt;
* While falling, if the jumper doesn't find any tile it will be moved out of the display and game ends.&lt;br /&gt;
* For reaching level two, you need to score above 150.&lt;br /&gt;
&lt;br /&gt;
'''2. Level_2:'''&lt;br /&gt;
* In this level more difficulties have been added using monsters.&lt;br /&gt;
* But with more difficulties comes more solutions, so we have provided cannon to the doodle to shoot and kill the enemies.&lt;br /&gt;
* also, there are extra points on killing an enemy.&lt;br /&gt;
* If the doodle collides with enemies, the game ends.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''There are five tasks in total that are involved in this game in order to ensure full functionality.'''&lt;br /&gt;
&lt;br /&gt;
[[File:Task.png|500px |thumb|center|Task Hierarchy]]&lt;br /&gt;
&lt;br /&gt;
'''1. Start and stop task:'''&lt;br /&gt;
* This task displays the game's start screen. &lt;br /&gt;
* To start the game, player need to press the onboard switch on the joystick.&lt;br /&gt;
* Switch is to be pressed again to restart the game.&lt;br /&gt;
&lt;br /&gt;
'''2. Background Screen task:'''&lt;br /&gt;
* This task creates background tiles for the doodle to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
'''3. Game logic task:'''&lt;br /&gt;
* When the game starts, this task detects the doodle's  initial position and collision with tiles.&lt;br /&gt;
* The doodle can take four jumps at a time.&lt;br /&gt;
* If a collision is detected then it shifts down the background screen creating the illusion of jumping of doodle to next tile. &lt;br /&gt;
* This task checks level and increments score.&lt;br /&gt;
* If the score is more than 150, the game will be switched to next level.&lt;br /&gt;
''' Code snippet for Gameplay Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void game_play(void *params) {&lt;br /&gt;
  delay_time_ms = LEVEL1_DELAY_TIME_STANDARD;&lt;br /&gt;
  // Initialize Background Screen&lt;br /&gt;
  led_matrix_draw_alphabets_print_string(&amp;quot;LEVEL&amp;quot;, 15, 15, GREEN);&lt;br /&gt;
  led_matrix_print_digits_string(level + 1, 15, 50, YELLOW);&lt;br /&gt;
  vTaskDelay(2000);&lt;br /&gt;
  led_matrix__clear_data_buffer();&lt;br /&gt;
  initialize_background_screen();&lt;br /&gt;
  (void)find_initial_jumper_position(&amp;amp;jumper_row, &amp;amp;jumper_col);&lt;br /&gt;
  draw_jumper(jumper_row, jumper_col);&lt;br /&gt;
  while (1) {&lt;br /&gt;
    update_score();&lt;br /&gt;
    vTaskDelay(delay_time_ms);&lt;br /&gt;
    switch (level) {&lt;br /&gt;
    case 0:&lt;br /&gt;
      play_level_1();&lt;br /&gt;
      continue;&lt;br /&gt;
    case 1:&lt;br /&gt;
      play_level_2();&lt;br /&gt;
      continue;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''4 LED Matrix task:'''&lt;br /&gt;
* This is a high-priority task which keeps displaying frame data every 1ms.&lt;br /&gt;
* There is also a draw objects that draw enemies, doodle, alphabets and digits for score.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Led matrix Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static void display_task() {&lt;br /&gt;
  while (1) {&lt;br /&gt;
    led_matrix__update_display();&lt;br /&gt;
    vTaskDelay(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5 Enemy tasks:'''&lt;br /&gt;
* Enemies are created from column 0 to 63 at random positions in this task.&lt;br /&gt;
''' Code snippet for Led matrix Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void enemy_task(void *params) {&lt;br /&gt;
  find_initial_enemy_positions();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    if (!game_over) {&lt;br /&gt;
      draw_enemies();&lt;br /&gt;
      vTaskDelay(70);&lt;br /&gt;
    } else {&lt;br /&gt;
      vTaskSuspend(NULL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''6 Gun Task:'''&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If y-axis value is detected greater than 4000, a gun will be shot at the enemies.&lt;br /&gt;
''' Code snippet for Gun Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void gun_task(void *params) {&lt;br /&gt;
  while (1) {&lt;br /&gt;
    if (!game_over) {&lt;br /&gt;
      shoot_gun(jumper_row, jumper_col);&lt;br /&gt;
      vTaskDelay(20);&lt;br /&gt;
    } else {&lt;br /&gt;
      vTaskSuspend(NULL);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''IMPLEMENTATION''' ==&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
A 64*64 led matrix is used for this project. The led matrix is divided into two halves of 32*64 each. It has 3 R,G,B pins and 3 64-bits registers (shift registers) for each upper and lower halves. The address lines provided are 5. This means that at a time same row from the upper half and the lower half will be selected. So in order to display a particular row appropriate row should be selected and appropriate data needs to be fed to the RGB shift registers of both top and bottom halves.&lt;br /&gt;
LED matrix is initialized by configuring the required pins as output. The led matrix has 3 more pins enable which are essential to display a pixel on the matrix. The clk pin that should used as a clk to the shift registers to shift the data out, the latch pin is used to latch the data from the shift registers onto the matrix's buffer, the output enable pin that is used to display the latched data on the selected row. &lt;br /&gt;
* Before feeding matrix data disable Output Enable (OE) GPIO&lt;br /&gt;
* Set bits on A, B, C, D GPIO pins to select the particular row. &lt;br /&gt;
* Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins&lt;br /&gt;
* To mask that particular pixel set zero on R, G, B GPIO pins&lt;br /&gt;
* Set and Reset the clock for pushing the R, G, B bits for each column &lt;br /&gt;
* Issue latch to mark the row's completion&lt;br /&gt;
* Set OE&lt;br /&gt;
* Small delay&lt;br /&gt;
* Reset latch before going to next row&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* Integrated different music for every level that keeps on playing in background.&lt;br /&gt;
* To get the game state, sound flags are checked.&lt;br /&gt;
* Different music for jumps, firing, game over and collisions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mp3__send_command(uint8_t command, uint8_t data_1, uint8_t data_2) {&lt;br /&gt;
  mp3_uart_buffer[0] = 0x7e;&lt;br /&gt;
  mp3_uart_buffer[1] = 0xff;&lt;br /&gt;
  mp3_uart_buffer[2] = 0x06;&lt;br /&gt;
  mp3_uart_buffer[3] = command;&lt;br /&gt;
  mp3_uart_buffer[4] = 0x00;&lt;br /&gt;
  mp3_uart_buffer[5] = data_1;&lt;br /&gt;
  mp3_uart_buffer[6] = data_2;&lt;br /&gt;
  mp3_uart_buffer[7] = 0xef;&lt;br /&gt;
&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
    uart__polled_put(UART__3, mp3_uart_buffer[i]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3__init() {&lt;br /&gt;
  int mp3_baud_rate = 9600;&lt;br /&gt;
  uart__init(UART__3, clock__get_peripheral_clock_hz(), mp3_baud_rate);&lt;br /&gt;
&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 28, GPIO__FUNCTION_2);&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 29, GPIO__FUNCTION_2);&lt;br /&gt;
&lt;br /&gt;
  mp3__send_command(SELECT_DEVICE, 0x00, DEV_TF);&lt;br /&gt;
  mp3_play_start_song();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play(int num) { &lt;br /&gt;
mp3__send_command(CYCLE_PLAY_FOLDER, num, 0x02); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play_start_song() { &lt;br /&gt;
mp3_play(1); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void enable_joystick(gpio__port_e adc1, uint8_t x_pin, gpio__port_e adc2, uint8_t y_pin, gpio__port_e port, int pin) {&lt;br /&gt;
  const uint32_t set_analog_mode = (1 &amp;lt;&amp;lt; 7);&lt;br /&gt;
&lt;br /&gt;
  LPC_IOCON-&amp;gt;P1_30 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
  LPC_IOCON-&amp;gt;P0_25 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
&lt;br /&gt;
  adc_xvalue = gpio__construct_with_function(adc1, x_pin, 1);&lt;br /&gt;
  adc_yvalue = gpio__construct_with_function(adc2, y_pin, 3);&lt;br /&gt;
  adc__initialize();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''TESTING &amp;amp; TECHNICAL CHALLENGES''' ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix and Game Play ===&lt;br /&gt;
* Collision detection with tiles was not working after the 32nd column. Eventually it turned out to be a very silly issue. It was because while doing `1 &amp;lt;&amp;lt; 64`, 1 should have been type casted to uint64_t.&lt;br /&gt;
* The random number generator was not generating randomness as desired. The reason for that was that the random number generator was being seeded only once using xTaskGetTickCount() which would always give the same seed as xTaskGetTickCount() gives the time from the stat of the program and that would be same always at the start of the program. To get around this problem, the random number generator was seeded each time before generating a new random number. &lt;br /&gt;
* Led matrix's buffer was being overwritten every time a jumper goes over the tiles. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
===MP3 Decoder ===&lt;br /&gt;
While integrating the mp3 decoder code with the rest of the code, there occurred an issue in display and game became slow. &lt;br /&gt;
So instead of creating a separate task for mp3 decoder, we just did mp3__init() in main function and the issues got resolved.&lt;br /&gt;
&lt;br /&gt;
=='''CONCLUSION'''==&lt;br /&gt;
&lt;br /&gt;
We were able to accomplish the goals of the game that we outlined at the starting. Juvenile jumpers game successfully ran and mimicked the original doodle jump game. All the game components functioned correctly during the final demo allowing for a flawless experience. The LED matrix was capable of loading the various monsters and gun while playing the sounds for each of the game items. The demo showcased that the gun was able to  shoot the enemies to gain points. Through this project, we learned a lot about designing real world project using FreeRTOS applications, drivers, PCB design, power management circuits, git source code management, and final integration testing. This project allowed us to understand the importance of writing down requirements, planning a schedule for development, and communication between all of us.&lt;br /&gt;
&lt;br /&gt;
== '''ACKNOWLEGEMENT''' ==&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a knowledgeable course and continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice and feedbacks.&lt;br /&gt;
&lt;br /&gt;
== '''APPENDIX''' ==&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66705</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66705"/>
				<updated>2021-12-18T02:27:45Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* SOFTWARE DESIGN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Game.gif |300px|Final|right]]&lt;br /&gt;
&lt;br /&gt;
=='''JUVENILE JUMPERS'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Start.gif|thumb|left|400px| START SCREEN]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level1.gif|thumb|none|400px| LEVEL 1]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level2.gif|thumb|right|400px| LEVEL 2]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''ABSTRACT'''==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is a single player, endless platform game in which there are enemies and obstacles on various platforms. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== '''OBJECTIVES &amp;amp; INTRODUCTION'''==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== '''Team Members &amp;amp; Responsibilities''' ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
==''' SCHEDULE''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''PARTS LIST &amp;amp; COST''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''HARDWARE DESIGN''' ==&lt;br /&gt;
The game has been designed using SJtwo-c board, RGB LED- for visuals, MP3 decoder- for background music, joystick and PCB. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== '''Printed Circuit Board''' ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB and the schematic &amp;amp; layout is designed using Autodesk's Eagle software. The PCB fabrication vendor is JLCPCB.&lt;br /&gt;
====PIN Configuration====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PIN number&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
|      || '''LED Matrix'''                   ||&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|       || '''Joystick''' ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
| ||'''MP3 Decoder''' ||&lt;br /&gt;
|-&lt;br /&gt;
| RX    ||  Receiver        ||p4_29&lt;br /&gt;
|-&lt;br /&gt;
| TX     ||    Transmitter            ||p4_28&lt;br /&gt;
|-&lt;br /&gt;
| VCC     ||   connected to vcc         || 5V&lt;br /&gt;
|-&lt;br /&gt;
|GND  || Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Interfacing and Layout====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:Schematic.PNG|800px|thumb|center|Schematic]]&lt;br /&gt;
|[[File:Board.PNG|450px|thumb|right|Board Layout]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[File:PCB_Bottom.PNG|600px|thumb|center|PCB Bottom View]]&lt;br /&gt;
|[[File:PCB_top.PNG|600px|thumb|left|PCB Top View]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''LED Matrix'''  ===&lt;br /&gt;
A 64x64 RGB LED Matrix, with a total of 4096 pixels is used for display. Each LED can be fully controlled independently using 13 digital GPIOs. This matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. By combing RGB colors we can make different colors such as YELLOW, CYAN, RED, WHITE, MAGENTA. &lt;br /&gt;
==== Technical Specifications====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Specification&lt;br /&gt;
! Remarks&lt;br /&gt;
|-  &lt;br /&gt;
| Pitch || 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Resolution || 64x64 =4096 pixels&lt;br /&gt;
|-&lt;br /&gt;
| Volt/Amp || 5V/60A&lt;br /&gt;
|-&lt;br /&gt;
| Scan Rate|| 1/16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====LED Matrix Panel====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:RGB_Led_matrix.jpg|600px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
|[[File:Start_screen.jpg|500px|thumb|left|Start Screen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Dual Axis Joystick'''  ===&lt;br /&gt;
We have used 2-axis joystick to control the movements of the jumper. The joystick operates on 5V power and provides analog output, hence it is connected to the ADC pins of SJtwo-c board. X-axis values are used to define the left and right directions of the doodle. The switch on the joystick controls the start and stop actions of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
=== '''MP3 Decoder'''  ===&lt;br /&gt;
The MP3 decoder that we used is serial MP3 player model by Catalex (version v1.0.1). It's a simple MP3 player device which is based on a high-quality MP3 audio chip---YX5300. It can support 8k Hz ~ 48k Hz sampling frequency MP3 and WAV file formats. There is a TF card socket on board, so you can plug the micro SD card that stores audio files. MCU can control the MP3 playback state by sending commands to the module via UART port, such as switch songs, change the volume and play mode and so on.&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
== '''SOFTWARE DESIGN''' ==&lt;br /&gt;
&lt;br /&gt;
This is an open ended game having two levels with the feasibility of integrating more levels. &lt;br /&gt;
Below is the overview of game play.&lt;br /&gt;
&lt;br /&gt;
[[File:Game_play.png|600px |thumb|center|Game Overview]]&lt;br /&gt;
&lt;br /&gt;
'''1. Level_1:'''&lt;br /&gt;
* In the first level, the jumper will keep jumping on the tiles and the player needs to control its direction. There are some special tiles with spring embedded on them and if the doodle lands on such a tile it will take longer jumps than it      would have taken by landing on a regular tile.&lt;br /&gt;
* With each jump the score gets incremented by 10.&lt;br /&gt;
* After each jump, the background screen shifts down. &lt;br /&gt;
* While falling, if the jumper doesn't find any tile it will be moved out of the display and game ends.&lt;br /&gt;
* For reaching level two, you need to score above 150.&lt;br /&gt;
&lt;br /&gt;
'''2. Level_2:'''&lt;br /&gt;
* In this level more difficulties have been added using monsters.&lt;br /&gt;
* But with more difficulties comes more solutions, so we have provided cannon to the doodle to shoot and kill the enemies.&lt;br /&gt;
* also, there are extra points on killing an enemy.&lt;br /&gt;
* If the doodle collides with enemies, the game ends.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Gameplay Task'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void game_play(void *params) {&lt;br /&gt;
  delay_time_ms = LEVEL1_DELAY_TIME_STANDARD;&lt;br /&gt;
  // Initialize Background Screen&lt;br /&gt;
  led_matrix_draw_alphabets_print_string(&amp;quot;LEVEL&amp;quot;, 15, 15, GREEN);&lt;br /&gt;
  led_matrix_print_digits_string(level + 1, 15, 50, YELLOW);&lt;br /&gt;
  vTaskDelay(2000);&lt;br /&gt;
  led_matrix__clear_data_buffer();&lt;br /&gt;
  initialize_background_screen();&lt;br /&gt;
  (void)find_initial_jumper_position(&amp;amp;jumper_row, &amp;amp;jumper_col);&lt;br /&gt;
  draw_jumper(jumper_row, jumper_col);&lt;br /&gt;
  while (1) {&lt;br /&gt;
    update_score();&lt;br /&gt;
    vTaskDelay(delay_time_ms);&lt;br /&gt;
    switch (level) {&lt;br /&gt;
    case 0:&lt;br /&gt;
      play_level_1();&lt;br /&gt;
      continue;&lt;br /&gt;
    case 1:&lt;br /&gt;
      play_level_2();&lt;br /&gt;
      continue;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''There are five tasks in total that are involved in this game in order to ensure full functionality.'''&lt;br /&gt;
&lt;br /&gt;
[[File:Task.png|500px |thumb|center|Task Hierarchy]]&lt;br /&gt;
&lt;br /&gt;
'''1. Start and stop task:'''&lt;br /&gt;
* This task displays the game's start screen. &lt;br /&gt;
* To start the game, player need to press the onboard switch on the joystick.&lt;br /&gt;
* Switch is to be pressed again to restart the game.&lt;br /&gt;
&lt;br /&gt;
'''2. Background Screen task:'''&lt;br /&gt;
* This task creates background tiles for the doodle to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
'''3. Game logic task:'''&lt;br /&gt;
* When the game starts, this task detects the doodle's  initial position and collision with tiles.&lt;br /&gt;
* The doodle can take four jumps at a time.&lt;br /&gt;
* If a collision is detected then it shifts down the background screen creating the illusion of jumping of doodle to next tile. &lt;br /&gt;
* This task checks level and increments score.&lt;br /&gt;
* If the score is more than 150, the game will be switched to next level.&lt;br /&gt;
&lt;br /&gt;
'''4 LED Matrix task:'''&lt;br /&gt;
* This is a high-priority task which keeps displaying frame data every 1ms.&lt;br /&gt;
* There is also a draw objects that draw enemies, doodle, alphabets and digits for score.&lt;br /&gt;
&lt;br /&gt;
'''5 Enemy tasks:'''&lt;br /&gt;
* Enemies are created from column 0 to 63 at random positions in this task.&lt;br /&gt;
&lt;br /&gt;
'''6 Gun Task:'''&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If y-axis value is detected greater than 4000, a gun will be shot at the enemies.&lt;br /&gt;
&lt;br /&gt;
== '''IMPLEMENTATION''' ==&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
A 64*64 led matrix is used for this project. The led matrix is divided into two halves of 32*64 each. It has 3 R,G,B pins and 3 64-bits registers (shift registers) for each upper and lower halves. The address lines provided are 5. This means that at a time same row from the upper half and the lower half will be selected. So in order to display a particular row appropriate row should be selected and appropriate data needs to be fed to the RGB shift registers of both top and bottom halves.&lt;br /&gt;
LED matrix is initialized by configuring the required pins as output. The led matrix has 3 more pins enable which are essential to display a pixel on the matrix. The clk pin that should used as a clk to the shift registers to shift the data out, the latch pin is used to latch the data from the shift registers onto the matrix's buffer, the output enable pin that is used to display the latched data on the selected row. &lt;br /&gt;
* Before feeding matrix data disable Output Enable (OE) GPIO&lt;br /&gt;
* Set bits on A, B, C, D GPIO pins to select the particular row. &lt;br /&gt;
* Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins&lt;br /&gt;
* To mask that particular pixel set zero on R, G, B GPIO pins&lt;br /&gt;
* Set and Reset the clock for pushing the R, G, B bits for each column &lt;br /&gt;
* Issue latch to mark the row's completion&lt;br /&gt;
* Set OE&lt;br /&gt;
* Small delay&lt;br /&gt;
* Reset latch before going to next row&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* Integrated different music for every level that keeps on playing in background.&lt;br /&gt;
* To get the game state, sound flags are checked.&lt;br /&gt;
* Different music for jumps, firing, game over and collisions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mp3__send_command(uint8_t command, uint8_t data_1, uint8_t data_2) {&lt;br /&gt;
  mp3_uart_buffer[0] = 0x7e;&lt;br /&gt;
  mp3_uart_buffer[1] = 0xff;&lt;br /&gt;
  mp3_uart_buffer[2] = 0x06;&lt;br /&gt;
  mp3_uart_buffer[3] = command;&lt;br /&gt;
  mp3_uart_buffer[4] = 0x00;&lt;br /&gt;
  mp3_uart_buffer[5] = data_1;&lt;br /&gt;
  mp3_uart_buffer[6] = data_2;&lt;br /&gt;
  mp3_uart_buffer[7] = 0xef;&lt;br /&gt;
&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
    uart__polled_put(UART__3, mp3_uart_buffer[i]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3__init() {&lt;br /&gt;
  int mp3_baud_rate = 9600;&lt;br /&gt;
  uart__init(UART__3, clock__get_peripheral_clock_hz(), mp3_baud_rate);&lt;br /&gt;
&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 28, GPIO__FUNCTION_2);&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 29, GPIO__FUNCTION_2);&lt;br /&gt;
&lt;br /&gt;
  mp3__send_command(SELECT_DEVICE, 0x00, DEV_TF);&lt;br /&gt;
  mp3_play_start_song();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play(int num) { &lt;br /&gt;
mp3__send_command(CYCLE_PLAY_FOLDER, num, 0x02); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play_start_song() { &lt;br /&gt;
mp3_play(1); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void enable_joystick(gpio__port_e adc1, uint8_t x_pin, gpio__port_e adc2, uint8_t y_pin, gpio__port_e port, int pin) {&lt;br /&gt;
  const uint32_t set_analog_mode = (1 &amp;lt;&amp;lt; 7);&lt;br /&gt;
&lt;br /&gt;
  LPC_IOCON-&amp;gt;P1_30 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
  LPC_IOCON-&amp;gt;P0_25 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
&lt;br /&gt;
  adc_xvalue = gpio__construct_with_function(adc1, x_pin, 1);&lt;br /&gt;
  adc_yvalue = gpio__construct_with_function(adc2, y_pin, 3);&lt;br /&gt;
  adc__initialize();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''TESTING &amp;amp; TECHNICAL CHALLENGES''' ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix and Game Play ===&lt;br /&gt;
* Collision detection with tiles was not working after the 32nd column. Eventually it turned out to be a very silly issue. It was because while doing `1 &amp;lt;&amp;lt; 64`, 1 should have been type casted to uint64_t.&lt;br /&gt;
* The random number generator was not generating randomness as desired. The reason for that was that the random number generator was being seeded only once using xTaskGetTickCount() which would always give the same seed as xTaskGetTickCount() gives the time from the stat of the program and that would be same always at the start of the program. To get around this problem, the random number generator was seeded each time before generating a new random number. &lt;br /&gt;
* Led matrix's buffer was being overwritten every time a jumper goes over the tiles. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
===MP3 Decoder ===&lt;br /&gt;
While integrating the mp3 decoder code with the rest of the code, there occurred an issue in display and game became slow. &lt;br /&gt;
So instead of creating a separate task for mp3 decoder, we just did mp3__init() in main function and the issues got resolved.&lt;br /&gt;
&lt;br /&gt;
=='''CONCLUSION'''==&lt;br /&gt;
&lt;br /&gt;
We were able to accomplish the goals of the game that we outlined at the starting. Juvenile jumpers game successfully ran and mimicked the original doodle jump game. All the game components functioned correctly during the final demo allowing for a flawless experience. The LED matrix was capable of loading the various monsters and gun while playing the sounds for each of the game items. The demo showcased that the gun was able to  shoot the enemies to gain points. Through this project, we learned a lot about designing real world project using FreeRTOS applications, drivers, PCB design, power management circuits, git source code management, and final integration testing. This project allowed us to understand the importance of writing down requirements, planning a schedule for development, and communication between all of us.&lt;br /&gt;
&lt;br /&gt;
== '''ACKNOWLEGEMENT''' ==&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a knowledgeable course and continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice and feedbacks.&lt;br /&gt;
&lt;br /&gt;
== '''APPENDIX''' ==&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66702</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66702"/>
				<updated>2021-12-18T02:23:19Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* IMPLEMENTATION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Game.gif |300px|Final|right]]&lt;br /&gt;
&lt;br /&gt;
=='''JUVENILE JUMPERS'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Start.gif|thumb|left|400px| START SCREEN]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level1.gif|thumb|none|400px| LEVEL 1]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level2.gif|thumb|right|400px| LEVEL 2]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''ABSTRACT'''==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is a single player, endless platform game in which there are enemies and obstacles on various platforms. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== '''OBJECTIVES &amp;amp; INTRODUCTION'''==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== '''Team Members &amp;amp; Responsibilities''' ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
==''' SCHEDULE''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''PARTS LIST &amp;amp; COST''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''HARDWARE DESIGN''' ==&lt;br /&gt;
The game has been designed using SJtwo-c board, RGB LED- for visuals, MP3 decoder- for background music, joystick and PCB. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== '''Printed Circuit Board''' ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB and the schematic &amp;amp; layout is designed using Autodesk's Eagle software. The PCB fabrication vendor is JLCPCB.&lt;br /&gt;
====PIN Configuration====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PIN number&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
|      || '''LED Matrix'''                   ||&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|       || '''Joystick''' ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
| ||'''MP3 Decoder''' ||&lt;br /&gt;
|-&lt;br /&gt;
| RX    ||  Receiver        ||p4_29&lt;br /&gt;
|-&lt;br /&gt;
| TX     ||    Transmitter            ||p4_28&lt;br /&gt;
|-&lt;br /&gt;
| VCC     ||   connected to vcc         || 5V&lt;br /&gt;
|-&lt;br /&gt;
|GND  || Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Interfacing and Layout====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:Schematic.PNG|800px|thumb|center|Schematic]]&lt;br /&gt;
|[[File:Board.PNG|450px|thumb|right|Board Layout]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[File:PCB_Bottom.PNG|600px|thumb|center|PCB Bottom View]]&lt;br /&gt;
|[[File:PCB_top.PNG|600px|thumb|left|PCB Top View]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''LED Matrix'''  ===&lt;br /&gt;
A 64x64 RGB LED Matrix, with a total of 4096 pixels is used for display. Each LED can be fully controlled independently using 13 digital GPIOs. This matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. By combing RGB colors we can make different colors such as YELLOW, CYAN, RED, WHITE, MAGENTA. &lt;br /&gt;
==== Technical Specifications====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Specification&lt;br /&gt;
! Remarks&lt;br /&gt;
|-  &lt;br /&gt;
| Pitch || 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Resolution || 64x64 =4096 pixels&lt;br /&gt;
|-&lt;br /&gt;
| Volt/Amp || 5V/60A&lt;br /&gt;
|-&lt;br /&gt;
| Scan Rate|| 1/16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====LED Matrix Panel====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:RGB_Led_matrix.jpg|600px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
|[[File:Start_screen.jpg|500px|thumb|left|Start Screen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Dual Axis Joystick'''  ===&lt;br /&gt;
We have used 2-axis joystick to control the movements of the jumper. The joystick operates on 5V power and provides analog output, hence it is connected to the ADC pins of SJtwo-c board. X-axis values are used to define the left and right directions of the doodle. The switch on the joystick controls the start and stop actions of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
=== '''MP3 Decoder'''  ===&lt;br /&gt;
The MP3 decoder that we used is serial MP3 player model by Catalex (version v1.0.1). It's a simple MP3 player device which is based on a high-quality MP3 audio chip---YX5300. It can support 8k Hz ~ 48k Hz sampling frequency MP3 and WAV file formats. There is a TF card socket on board, so you can plug the micro SD card that stores audio files. MCU can control the MP3 playback state by sending commands to the module via UART port, such as switch songs, change the volume and play mode and so on.&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
== '''SOFTWARE DESIGN''' ==&lt;br /&gt;
&lt;br /&gt;
This is an open ended game having two levels with the feasibility of integrating more levels. &lt;br /&gt;
Below is the overview of game play.&lt;br /&gt;
&lt;br /&gt;
[[File:Game_play.png|600px |thumb|center|Game Overview]]&lt;br /&gt;
&lt;br /&gt;
'''1. Level_1:'''&lt;br /&gt;
* In the first level, the jumper will keep jumping on the tiles and the player needs to control its direction. There are some special tiles with spring embedded on them and if the doodle lands on such a tile it will take longer jumps than it      would have taken by landing on a regular tile.&lt;br /&gt;
* With each jump the score gets incremented by 10.&lt;br /&gt;
* After each jump, the background screen shifts down. &lt;br /&gt;
* While falling, if the jumper doesn't find any tile it will be moved out of the display and game ends.&lt;br /&gt;
* For reaching level two, you need to score above 150.&lt;br /&gt;
&lt;br /&gt;
'''2. Level_2:'''&lt;br /&gt;
* In this level more difficulties have been added using monsters.&lt;br /&gt;
* But with more difficulties comes more solutions, so we have provided cannon to the doodle to shoot and kill the enemies.&lt;br /&gt;
* also, there are extra points on killing an enemy.&lt;br /&gt;
* If the doodle collides with enemies, the game ends.&lt;br /&gt;
&lt;br /&gt;
'''There are five tasks in total that are involved in this game in order to ensure full functionality.'''&lt;br /&gt;
&lt;br /&gt;
[[File:Task.png|500px |thumb|center|Task Hierarchy]]&lt;br /&gt;
&lt;br /&gt;
'''1. Start and stop task:'''&lt;br /&gt;
* This task displays the game's start screen. &lt;br /&gt;
* To start the game, player need to press the onboard switch on the joystick.&lt;br /&gt;
* Switch is to be pressed again to restart the game.&lt;br /&gt;
&lt;br /&gt;
'''2. Background Screen task:'''&lt;br /&gt;
* This task creates background tiles for the doodle to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
'''3. Game logic task:'''&lt;br /&gt;
* When the game starts, this task detects the doodle's  initial position and collision with tiles.&lt;br /&gt;
* The doodle can take four jumps at a time.&lt;br /&gt;
* If a collision is detected then it shifts down the background screen creating the illusion of jumping of doodle to next tile. &lt;br /&gt;
* This task checks level and increments score.&lt;br /&gt;
* If the score is more than 150, the game will be switched to next level.&lt;br /&gt;
&lt;br /&gt;
'''4 LED Matrix task:'''&lt;br /&gt;
* This is a high-priority task which keeps displaying frame data every 1ms.&lt;br /&gt;
* There is also a draw objects that draw enemies, doodle, alphabets and digits for score.&lt;br /&gt;
&lt;br /&gt;
'''5 Enemy tasks:'''&lt;br /&gt;
* Enemies are created from column 0 to 63 at random positions in this task.&lt;br /&gt;
&lt;br /&gt;
'''6 Gun Task:'''&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If y-axis value is detected greater than 4000, a gun will be shot at the enemies.&lt;br /&gt;
&lt;br /&gt;
== '''IMPLEMENTATION''' ==&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
A 64*64 led matrix is used for this project. The led matrix is divided into two halves of 32*64 each. It has 3 R,G,B pins and 3 64-bits registers (shift registers) for each upper and lower halves. The address lines provided are 5. This means that at a time same row from the upper half and the lower half will be selected. So in order to display a particular row appropriate row should be selected and appropriate data needs to be fed to the RGB shift registers of both top and bottom halves.&lt;br /&gt;
LED matrix is initialized by configuring the required pins as output. The led matrix has 3 more pins enable which are essential to display a pixel on the matrix. The clk pin that should used as a clk to the shift registers to shift the data out, the latch pin is used to latch the data from the shift registers onto the matrix's buffer, the output enable pin that is used to display the latched data on the selected row. &lt;br /&gt;
* Before feeding matrix data disable Output Enable (OE) GPIO&lt;br /&gt;
* Set bits on A, B, C, D GPIO pins to select the particular row. &lt;br /&gt;
* Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins&lt;br /&gt;
* To mask that particular pixel set zero on R, G, B GPIO pins&lt;br /&gt;
* Set and Reset the clock for pushing the R, G, B bits for each column &lt;br /&gt;
* Issue latch to mark the row's completion&lt;br /&gt;
* Set OE&lt;br /&gt;
* Small delay&lt;br /&gt;
* Reset latch before going to next row&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* Integrated different music for every level that keeps on playing in background.&lt;br /&gt;
* To get the game state, sound flags are checked.&lt;br /&gt;
* Different music for jumps, firing, game over and collisions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mp3__send_command(uint8_t command, uint8_t data_1, uint8_t data_2) {&lt;br /&gt;
  mp3_uart_buffer[0] = 0x7e;&lt;br /&gt;
  mp3_uart_buffer[1] = 0xff;&lt;br /&gt;
  mp3_uart_buffer[2] = 0x06;&lt;br /&gt;
  mp3_uart_buffer[3] = command;&lt;br /&gt;
  mp3_uart_buffer[4] = 0x00;&lt;br /&gt;
  mp3_uart_buffer[5] = data_1;&lt;br /&gt;
  mp3_uart_buffer[6] = data_2;&lt;br /&gt;
  mp3_uart_buffer[7] = 0xef;&lt;br /&gt;
&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
    uart__polled_put(UART__3, mp3_uart_buffer[i]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3__init() {&lt;br /&gt;
  int mp3_baud_rate = 9600;&lt;br /&gt;
  uart__init(UART__3, clock__get_peripheral_clock_hz(), mp3_baud_rate);&lt;br /&gt;
&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 28, GPIO__FUNCTION_2);&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 29, GPIO__FUNCTION_2);&lt;br /&gt;
&lt;br /&gt;
  mp3__send_command(SELECT_DEVICE, 0x00, DEV_TF);&lt;br /&gt;
  mp3_play_start_song();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play(int num) { &lt;br /&gt;
mp3__send_command(CYCLE_PLAY_FOLDER, num, 0x02); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play_start_song() { &lt;br /&gt;
mp3_play(1); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void enable_joystick(gpio__port_e adc1, uint8_t x_pin, gpio__port_e adc2, uint8_t y_pin, gpio__port_e port, int pin) {&lt;br /&gt;
  const uint32_t set_analog_mode = (1 &amp;lt;&amp;lt; 7);&lt;br /&gt;
&lt;br /&gt;
  LPC_IOCON-&amp;gt;P1_30 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
  LPC_IOCON-&amp;gt;P0_25 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
&lt;br /&gt;
  adc_xvalue = gpio__construct_with_function(adc1, x_pin, 1);&lt;br /&gt;
  adc_yvalue = gpio__construct_with_function(adc2, y_pin, 3);&lt;br /&gt;
  adc__initialize();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''TESTING &amp;amp; TECHNICAL CHALLENGES''' ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix and Game Play ===&lt;br /&gt;
* Collision detection with tiles was not working after the 32nd column. Eventually it turned out to be a very silly issue. It was because while doing `1 &amp;lt;&amp;lt; 64`, 1 should have been type casted to uint64_t.&lt;br /&gt;
* The random number generator was not generating randomness as desired. The reason for that was that the random number generator was being seeded only once using xTaskGetTickCount() which would always give the same seed as xTaskGetTickCount() gives the time from the stat of the program and that would be same always at the start of the program. To get around this problem, the random number generator was seeded each time before generating a new random number. &lt;br /&gt;
* Led matrix's buffer was being overwritten every time a jumper goes over the tiles. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
===MP3 Decoder ===&lt;br /&gt;
While integrating the mp3 decoder code with the rest of the code, there occurred an issue in display and game became slow. &lt;br /&gt;
So instead of creating a separate task for mp3 decoder, we just did mp3__init() in main function and the issues got resolved.&lt;br /&gt;
&lt;br /&gt;
=='''CONCLUSION'''==&lt;br /&gt;
&lt;br /&gt;
We were able to accomplish the goals of the game that we outlined at the starting. Juvenile jumpers game successfully ran and mimicked the original doodle jump game. All the game components functioned correctly during the final demo allowing for a flawless experience. The LED matrix was capable of loading the various monsters and gun while playing the sounds for each of the game items. The demo showcased that the gun was able to  shoot the enemies to gain points. Through this project, we learned a lot about designing real world project using FreeRTOS applications, drivers, PCB design, power management circuits, git source code management, and final integration testing. This project allowed us to understand the importance of writing down requirements, planning a schedule for development, and communication between all of us.&lt;br /&gt;
&lt;br /&gt;
== '''ACKNOWLEGEMENT''' ==&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a knowledgeable course and continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice and feedbacks.&lt;br /&gt;
&lt;br /&gt;
== '''APPENDIX''' ==&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66701</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66701"/>
				<updated>2021-12-18T02:23:01Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* IMPLEMENTATION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Game.gif |300px|Final|right]]&lt;br /&gt;
&lt;br /&gt;
=='''JUVENILE JUMPERS'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Start.gif|thumb|left|400px| START SCREEN]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level1.gif|thumb|none|400px| LEVEL 1]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level2.gif|thumb|right|400px| LEVEL 2]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''ABSTRACT'''==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is a single player, endless platform game in which there are enemies and obstacles on various platforms. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== '''OBJECTIVES &amp;amp; INTRODUCTION'''==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== '''Team Members &amp;amp; Responsibilities''' ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
==''' SCHEDULE''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''PARTS LIST &amp;amp; COST''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''HARDWARE DESIGN''' ==&lt;br /&gt;
The game has been designed using SJtwo-c board, RGB LED- for visuals, MP3 decoder- for background music, joystick and PCB. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== '''Printed Circuit Board''' ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB and the schematic &amp;amp; layout is designed using Autodesk's Eagle software. The PCB fabrication vendor is JLCPCB.&lt;br /&gt;
====PIN Configuration====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PIN number&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
|      || '''LED Matrix'''                   ||&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|       || '''Joystick''' ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
| ||'''MP3 Decoder''' ||&lt;br /&gt;
|-&lt;br /&gt;
| RX    ||  Receiver        ||p4_29&lt;br /&gt;
|-&lt;br /&gt;
| TX     ||    Transmitter            ||p4_28&lt;br /&gt;
|-&lt;br /&gt;
| VCC     ||   connected to vcc         || 5V&lt;br /&gt;
|-&lt;br /&gt;
|GND  || Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Interfacing and Layout====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:Schematic.PNG|800px|thumb|center|Schematic]]&lt;br /&gt;
|[[File:Board.PNG|450px|thumb|right|Board Layout]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[File:PCB_Bottom.PNG|600px|thumb|center|PCB Bottom View]]&lt;br /&gt;
|[[File:PCB_top.PNG|600px|thumb|left|PCB Top View]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''LED Matrix'''  ===&lt;br /&gt;
A 64x64 RGB LED Matrix, with a total of 4096 pixels is used for display. Each LED can be fully controlled independently using 13 digital GPIOs. This matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. By combing RGB colors we can make different colors such as YELLOW, CYAN, RED, WHITE, MAGENTA. &lt;br /&gt;
==== Technical Specifications====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Specification&lt;br /&gt;
! Remarks&lt;br /&gt;
|-  &lt;br /&gt;
| Pitch || 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Resolution || 64x64 =4096 pixels&lt;br /&gt;
|-&lt;br /&gt;
| Volt/Amp || 5V/60A&lt;br /&gt;
|-&lt;br /&gt;
| Scan Rate|| 1/16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====LED Matrix Panel====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:RGB_Led_matrix.jpg|600px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
|[[File:Start_screen.jpg|500px|thumb|left|Start Screen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Dual Axis Joystick'''  ===&lt;br /&gt;
We have used 2-axis joystick to control the movements of the jumper. The joystick operates on 5V power and provides analog output, hence it is connected to the ADC pins of SJtwo-c board. X-axis values are used to define the left and right directions of the doodle. The switch on the joystick controls the start and stop actions of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
=== '''MP3 Decoder'''  ===&lt;br /&gt;
The MP3 decoder that we used is serial MP3 player model by Catalex (version v1.0.1). It's a simple MP3 player device which is based on a high-quality MP3 audio chip---YX5300. It can support 8k Hz ~ 48k Hz sampling frequency MP3 and WAV file formats. There is a TF card socket on board, so you can plug the micro SD card that stores audio files. MCU can control the MP3 playback state by sending commands to the module via UART port, such as switch songs, change the volume and play mode and so on.&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
== '''SOFTWARE DESIGN''' ==&lt;br /&gt;
&lt;br /&gt;
This is an open ended game having two levels with the feasibility of integrating more levels. &lt;br /&gt;
Below is the overview of game play.&lt;br /&gt;
&lt;br /&gt;
[[File:Game_play.png|600px |thumb|center|Game Overview]]&lt;br /&gt;
&lt;br /&gt;
'''1. Level_1:'''&lt;br /&gt;
* In the first level, the jumper will keep jumping on the tiles and the player needs to control its direction. There are some special tiles with spring embedded on them and if the doodle lands on such a tile it will take longer jumps than it      would have taken by landing on a regular tile.&lt;br /&gt;
* With each jump the score gets incremented by 10.&lt;br /&gt;
* After each jump, the background screen shifts down. &lt;br /&gt;
* While falling, if the jumper doesn't find any tile it will be moved out of the display and game ends.&lt;br /&gt;
* For reaching level two, you need to score above 150.&lt;br /&gt;
&lt;br /&gt;
'''2. Level_2:'''&lt;br /&gt;
* In this level more difficulties have been added using monsters.&lt;br /&gt;
* But with more difficulties comes more solutions, so we have provided cannon to the doodle to shoot and kill the enemies.&lt;br /&gt;
* also, there are extra points on killing an enemy.&lt;br /&gt;
* If the doodle collides with enemies, the game ends.&lt;br /&gt;
&lt;br /&gt;
'''There are five tasks in total that are involved in this game in order to ensure full functionality.'''&lt;br /&gt;
&lt;br /&gt;
[[File:Task.png|500px |thumb|center|Task Hierarchy]]&lt;br /&gt;
&lt;br /&gt;
'''1. Start and stop task:'''&lt;br /&gt;
* This task displays the game's start screen. &lt;br /&gt;
* To start the game, player need to press the onboard switch on the joystick.&lt;br /&gt;
* Switch is to be pressed again to restart the game.&lt;br /&gt;
&lt;br /&gt;
'''2. Background Screen task:'''&lt;br /&gt;
* This task creates background tiles for the doodle to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
'''3. Game logic task:'''&lt;br /&gt;
* When the game starts, this task detects the doodle's  initial position and collision with tiles.&lt;br /&gt;
* The doodle can take four jumps at a time.&lt;br /&gt;
* If a collision is detected then it shifts down the background screen creating the illusion of jumping of doodle to next tile. &lt;br /&gt;
* This task checks level and increments score.&lt;br /&gt;
* If the score is more than 150, the game will be switched to next level.&lt;br /&gt;
&lt;br /&gt;
'''4 LED Matrix task:'''&lt;br /&gt;
* This is a high-priority task which keeps displaying frame data every 1ms.&lt;br /&gt;
* There is also a draw objects that draw enemies, doodle, alphabets and digits for score.&lt;br /&gt;
&lt;br /&gt;
'''5 Enemy tasks:'''&lt;br /&gt;
* Enemies are created from column 0 to 63 at random positions in this task.&lt;br /&gt;
&lt;br /&gt;
'''6 Gun Task:'''&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If y-axis value is detected greater than 4000, a gun will be shot at the enemies.&lt;br /&gt;
&lt;br /&gt;
== '''IMPLEMENTATION''' ==&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
A 64*64 led matrix is used for this project. The led matrix is divided into two halves of 32*64 each. It has 3 R,G,B pins and 3 64-bits registers (shift registers) for each upper and lower halves. The address lines provided are 5. This means that at a time same row from the upper half and the lower half will be selected. So in order to display a particular row appropriate row should be selected and appropriate data needs to be fed to the RGB shift registers of both top and bottom halves.&lt;br /&gt;
LED matrix is initialized by configuring the required pins as output. The led matrix has 3 more pins enable which are essential to display a pixel on the matrix. The clk pin that should used as a clk to the shift registers to shift the data out, the latch pin is used to latch the data from the shift registers onto the matrix's buffer, the output enable pin that is used to display the latched data on the selected row. &lt;br /&gt;
* Before feeding matrix data disable Output Enable (OE) GPIO&lt;br /&gt;
* Set bits on A, B, C, D GPIO pins to select the particular row. &lt;br /&gt;
* Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins&lt;br /&gt;
* To mask that particular pixel set zero on R, G, B GPIO pins&lt;br /&gt;
* Set and Reset the clock for pushing the R, G, B bits for each column &lt;br /&gt;
* Issue latch to mark the row's completion&lt;br /&gt;
* Set OE&lt;br /&gt;
* Small delay&lt;br /&gt;
* Reset latch before going to next row&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* Integrated different music for every level that keeps on playing in background.&lt;br /&gt;
* To get the game state, sound flags are checked.&lt;br /&gt;
* Different music for jumps, firing, game over and collisions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mp3__send_command(uint8_t command, uint8_t data_1, uint8_t data_2) {&lt;br /&gt;
  mp3_uart_buffer[0] = 0x7e;&lt;br /&gt;
  mp3_uart_buffer[1] = 0xff;&lt;br /&gt;
  mp3_uart_buffer[2] = 0x06;&lt;br /&gt;
  mp3_uart_buffer[3] = command;&lt;br /&gt;
  mp3_uart_buffer[4] = 0x00;&lt;br /&gt;
  mp3_uart_buffer[5] = data_1;&lt;br /&gt;
  mp3_uart_buffer[6] = data_2;&lt;br /&gt;
  mp3_uart_buffer[7] = 0xef;&lt;br /&gt;
&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
    uart__polled_put(UART__3, mp3_uart_buffer[i]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3__init() {&lt;br /&gt;
  int mp3_baud_rate = 9600;&lt;br /&gt;
  uart__init(UART__3, clock__get_peripheral_clock_hz(), mp3_baud_rate);&lt;br /&gt;
&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 28, GPIO__FUNCTION_2);&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 29, GPIO__FUNCTION_2);&lt;br /&gt;
&lt;br /&gt;
  mp3__send_command(SELECT_DEVICE, 0x00, DEV_TF);&lt;br /&gt;
  mp3_play_start_song();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play(int num) { &lt;br /&gt;
mp3__send_command(CYCLE_PLAY_FOLDER, num, 0x02); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play_start_song() { &lt;br /&gt;
mp3_play(1); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void enable_joystick(gpio__port_e adc1, uint8_t x_pin, gpio__port_e adc2, uint8_t y_pin, gpio__port_e port, int pin) {&lt;br /&gt;
  const uint32_t set_analog_mode = (1 &amp;lt;&amp;lt; 7);&lt;br /&gt;
&lt;br /&gt;
  LPC_IOCON-&amp;gt;P1_30 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
  LPC_IOCON-&amp;gt;P0_25 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
&lt;br /&gt;
  adc_xvalue = gpio__construct_with_function(adc1, x_pin, 1);&lt;br /&gt;
  adc_yvalue = gpio__construct_with_function(adc2, y_pin, 3);&lt;br /&gt;
  adc__initialize();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''TESTING &amp;amp; TECHNICAL CHALLENGES''' ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix and Game Play ===&lt;br /&gt;
* Collision detection with tiles was not working after the 32nd column. Eventually it turned out to be a very silly issue. It was because while doing `1 &amp;lt;&amp;lt; 64`, 1 should have been type casted to uint64_t.&lt;br /&gt;
* The random number generator was not generating randomness as desired. The reason for that was that the random number generator was being seeded only once using xTaskGetTickCount() which would always give the same seed as xTaskGetTickCount() gives the time from the stat of the program and that would be same always at the start of the program. To get around this problem, the random number generator was seeded each time before generating a new random number. &lt;br /&gt;
* Led matrix's buffer was being overwritten every time a jumper goes over the tiles. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
===MP3 Decoder ===&lt;br /&gt;
While integrating the mp3 decoder code with the rest of the code, there occurred an issue in display and game became slow. &lt;br /&gt;
So instead of creating a separate task for mp3 decoder, we just did mp3__init() in main function and the issues got resolved.&lt;br /&gt;
&lt;br /&gt;
=='''CONCLUSION'''==&lt;br /&gt;
&lt;br /&gt;
We were able to accomplish the goals of the game that we outlined at the starting. Juvenile jumpers game successfully ran and mimicked the original doodle jump game. All the game components functioned correctly during the final demo allowing for a flawless experience. The LED matrix was capable of loading the various monsters and gun while playing the sounds for each of the game items. The demo showcased that the gun was able to  shoot the enemies to gain points. Through this project, we learned a lot about designing real world project using FreeRTOS applications, drivers, PCB design, power management circuits, git source code management, and final integration testing. This project allowed us to understand the importance of writing down requirements, planning a schedule for development, and communication between all of us.&lt;br /&gt;
&lt;br /&gt;
== '''ACKNOWLEGEMENT''' ==&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a knowledgeable course and continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice and feedbacks.&lt;br /&gt;
&lt;br /&gt;
== '''APPENDIX''' ==&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66624</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66624"/>
				<updated>2021-12-17T23:40:02Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* LED Matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Game.gif |300px|Final|right]]&lt;br /&gt;
&lt;br /&gt;
=='''JUVENILE JUMPERS'''==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Start.gif|thumb|left|400px| START SCREEN]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level1.gif|thumb|none|400px| LEVEL 1]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:level2.gif|thumb|right|400px| LEVEL 2]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''ABSTRACT'''==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is a single player, endless platform game in which there are enemies and obstacles on various platforms. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== '''OBJECTIVES &amp;amp; INTRODUCTION'''==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== '''Team Members &amp;amp; Responsibilities''' ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
==''' SCHEDULE''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''PARTS LIST &amp;amp; COST''' ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''HARDWARE DESIGN''' ==&lt;br /&gt;
The game has been designed using SJtwo-c board, RGB LED- for visuals, MP3 decoder- for background music, joystick and PCB. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== '''Printed Circuit Board''' ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB and the schematic &amp;amp; layout is designed using Autodesk's Eagle software. The PCB fabrication vendor is JLCPCB.&lt;br /&gt;
====PIN Configuration====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PIN number&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
|      || '''LED Matrix'''                   ||&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|       || '''Joystick''' ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
| ||'''MP3 Decoder''' ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
| ||'''Power Supply'''||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|       ||                ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Interfacing and Layout====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:Schematic.PNG|800px|thumb|center|Schematic]]&lt;br /&gt;
|[[File:Board.PNG|450px|thumb|right|Board Layout]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|[[File:PCB_Bottom.PNG|600px|thumb|center|PCB Bottom View]]&lt;br /&gt;
|[[File:PCB_top.PNG|600px|thumb|left|PCB Top View]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''LED Matrix'''  ===&lt;br /&gt;
A 64x64 RGB LED Matrix, with a total of 4096 pixels is used for display. Each LED can be fully controlled independently using 13 digital GPIOs. This matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. By combing RGB colors we can make different colors such as YELLOW, CYAN, RED, WHITE, MAGENTA. &lt;br /&gt;
==== Technical Specifications====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Specification&lt;br /&gt;
! Remarks&lt;br /&gt;
|-  &lt;br /&gt;
| Pitch || 3 mm&lt;br /&gt;
|-&lt;br /&gt;
| Resolution || 64x64 =4096 pixels&lt;br /&gt;
|-&lt;br /&gt;
| Volt/Amp || 5V/60A&lt;br /&gt;
|-&lt;br /&gt;
| Scan Rate|| 1/16&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====LED Matrix Panel====&lt;br /&gt;
{|&lt;br /&gt;
|[[File:RGB_Led_matrix.jpg|600px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
|[[File:Start_screen.jpg|500px|thumb|left|Start Screen]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== '''Dual Axis Joystick'''  ===&lt;br /&gt;
We have used 2-axis joystick to control the movements of the jumper. The joystick operates on 5V power and provides analog output, hence it is connected to the ADC pins of SJtwo-c board. X-axis values are used to define the left and right directions of the doodle. The switch on the joystick controls the start and stop actions of the game.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
=== '''MP3 Decoder'''  ===&lt;br /&gt;
The MP3 decoder that we used is serial MP3 player model by Catalex (version v1.0.1). It's a simple MP3 player device which is based on a high-quality MP3 audio chip---YX5300. It can support 8k Hz ~ 48k Hz sampling frequency MP3 and WAV file formats. There is a TF card socket on board, so you can plug the micro SD card that stores audio files. MCU can control the MP3 playback state by sending commands to the module via UART port, such as switch songs, change the volume and play mode and so on.&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
== '''SOFTWARE DESIGN''' ==&lt;br /&gt;
&lt;br /&gt;
This is an open ended game having two levels with the feasibility of integrating more levels. &lt;br /&gt;
Below is the overview of game play.&lt;br /&gt;
&lt;br /&gt;
[[File:Game_play.png|600px |thumb|center|Game Overview]]&lt;br /&gt;
&lt;br /&gt;
'''1. Level_1:'''&lt;br /&gt;
* In the first level, the jumper will keep jumping on the tiles and the player needs to control its direction. There are some special tiles with spring embedded on them and if the doodle lands on such a tile it will take longer jumps than it      would have taken by landing on a regular tile.&lt;br /&gt;
* With each jump the score gets incremented by 10.&lt;br /&gt;
* After each jump, the background screen shifts down. &lt;br /&gt;
* While falling, if the jumper doesn't find any tile it will be moved out of the display and game ends.&lt;br /&gt;
* For reaching level two, you need to score above 150.&lt;br /&gt;
&lt;br /&gt;
'''2. Level_2:'''&lt;br /&gt;
* In this level more difficulties have been added using monsters.&lt;br /&gt;
* But with more difficulties comes more solutions, so we have provided cannon to the doodle to shoot and kill the enemies.&lt;br /&gt;
* also, there are extra points on killing an enemy.&lt;br /&gt;
* If the doodle collides with enemies, the game ends.&lt;br /&gt;
&lt;br /&gt;
'''There are five tasks in total that are involved in this game in order to ensure full functionality.'''&lt;br /&gt;
&lt;br /&gt;
[[File:Task.png|500px |thumb|center|Task Hierarchy]]&lt;br /&gt;
&lt;br /&gt;
'''1. Start and stop task:'''&lt;br /&gt;
* This task displays the game's start screen. &lt;br /&gt;
* To start the game, player need to press the onboard switch on the joystick.&lt;br /&gt;
* Switch is to be pressed again to restart the game.&lt;br /&gt;
&lt;br /&gt;
'''2. Background Screen task:'''&lt;br /&gt;
* This task creates background tiles for the doodle to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
'''3. Game logic task:'''&lt;br /&gt;
* When the game starts, this task detects the doodle's  initial position and collision with tiles.&lt;br /&gt;
* The doodle can take four jumps at a time.&lt;br /&gt;
* If a collision is detected then it shifts down the background screen creating the illusion of jumping of doodle to next tile. &lt;br /&gt;
* This task checks level and increments score.&lt;br /&gt;
* If the score is more than 150, the game will be switched to next level.&lt;br /&gt;
&lt;br /&gt;
'''4 LED Matrix task:'''&lt;br /&gt;
* This is a high-priority task which keeps displaying frame data every 1ms.&lt;br /&gt;
* There is also a draw objects that draw enemies, doodle, alphabets and digits for score.&lt;br /&gt;
&lt;br /&gt;
'''5 Enemy tasks:'''&lt;br /&gt;
* Enemies are created from column 0 to 63 at random positions in this task.&lt;br /&gt;
&lt;br /&gt;
'''6 Gun Task:'''&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If y-axis value is detected greater than 4000, a gun will be shot at the enemies.&lt;br /&gt;
&lt;br /&gt;
== '''IMPLEMENTATION''' ==&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
A 64*64 led matrix is used for this project. The led matrix is divided into two halves of 32*64 each. It has 3 R,G,B pins and 3 64-bits registers (shift registers) for each upper and lower halves. The address lines provided are 5. This means that at a time same row from the upper half and the lower half will be selected. So in order to display a particular row appropriate row should be selected and appropriate data needs to be fed to the RGB shift registers of both top and bottom halves.&lt;br /&gt;
LED matrix is initialized by configuring the required pins as output. The led matrix has 3 more pins enable which are essential to display a pixel on the matrix. The clk pin that should used as a clk to the shift registers to shift the data out, the latch pin is used to latch the data from the shift registers onto the matrix's buffer, the output enable pin that is used to display the latched data on the selected row. &lt;br /&gt;
* Before feeding matrix data disable Output Enable (OE) GPIO&lt;br /&gt;
* Set bits on A, B, C, D GPIO pins to select the particular row. &lt;br /&gt;
* Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins&lt;br /&gt;
* To mask that particular pixel set zero on R, G, B GPIO pins&lt;br /&gt;
* Set and Reset the clock for pushing the R, G, B bits for each column &lt;br /&gt;
* Issue latch to mark the row's completion&lt;br /&gt;
* Set OE&lt;br /&gt;
* Small delay&lt;br /&gt;
* Reset latch before going to next row&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for LED Matrix:: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void led_matrix__update_display() {&lt;br /&gt;
  for (int i = 0; i &amp;lt; 32; i++) {&lt;br /&gt;
    led_matrix__disable_display();&lt;br /&gt;
    led_matrix__disable_latch();&lt;br /&gt;
    led_matrix__select_row(i); // will select i and i + 32 rows at same time&lt;br /&gt;
&lt;br /&gt;
    for (int j = TOTAL_LED_MATRIX_COLS; j &amp;gt;= 0; j--) { // shift data with MSB getting shifted-in first&lt;br /&gt;
      ((frame_buffer[i][RED_PLANE] &amp;gt;&amp;gt; j) &amp;amp; 1) ? gpio__set(r0) : gpio__reset(r0);&lt;br /&gt;
      ((frame_buffer[i][GREEN_PLANE] &amp;gt;&amp;gt; j) &amp;amp; 1) ? gpio__set(g0) : gpio__reset(g0);&lt;br /&gt;
      ((frame_buffer[i][BLUE_PLANE] &amp;gt;&amp;gt; j) &amp;amp; 1) ? gpio__set(b0) : gpio__reset(b0);&lt;br /&gt;
&lt;br /&gt;
      ((frame_buffer[i + LED_MATRIX_SCAN_RATE_FACTOR][RED_PLANE] &amp;gt;&amp;gt; j) &amp;amp; 1) ? gpio__set(r1) : gpio__reset(r1);&lt;br /&gt;
      ((frame_buffer[i + LED_MATRIX_SCAN_RATE_FACTOR][GREEN_PLANE] &amp;gt;&amp;gt; j) &amp;amp; 1) ? gpio__set(g1) : gpio__reset(g1);&lt;br /&gt;
      ((frame_buffer[i + LED_MATRIX_SCAN_RATE_FACTOR][BLUE_PLANE] &amp;gt;&amp;gt; j) &amp;amp; 1) ? gpio__set(b1) : gpio__reset(b1);&lt;br /&gt;
      gpio__set(clk);&lt;br /&gt;
      gpio__reset(clk); // shift in all 3 color bits at once for top half/bottom half registers&lt;br /&gt;
    }&lt;br /&gt;
    led_matrix__enable_latch(); // push shift register contents down to output registers&lt;br /&gt;
    led_matrix__enable_display();&lt;br /&gt;
    delay__us(50);&lt;br /&gt;
  }&lt;br /&gt;
  led_matrix__disable_display();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* Integrated different music for every level that keeps on playing in background.&lt;br /&gt;
* To get the game state, sound flags are checked.&lt;br /&gt;
* Different music for jumps, firing, game over and collisions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mp3__send_command(uint8_t command, uint8_t data_1, uint8_t data_2) {&lt;br /&gt;
  mp3_uart_buffer[0] = 0x7e;&lt;br /&gt;
  mp3_uart_buffer[1] = 0xff;&lt;br /&gt;
  mp3_uart_buffer[2] = 0x06;&lt;br /&gt;
  mp3_uart_buffer[3] = command;&lt;br /&gt;
  mp3_uart_buffer[4] = 0x00;&lt;br /&gt;
  mp3_uart_buffer[5] = data_1;&lt;br /&gt;
  mp3_uart_buffer[6] = data_2;&lt;br /&gt;
  mp3_uart_buffer[7] = 0xef;&lt;br /&gt;
&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
    uart__polled_put(UART__3, mp3_uart_buffer[i]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3__init() {&lt;br /&gt;
  int mp3_baud_rate = 9600;&lt;br /&gt;
  uart__init(UART__3, clock__get_peripheral_clock_hz(), mp3_baud_rate);&lt;br /&gt;
&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 28, GPIO__FUNCTION_2);&lt;br /&gt;
  gpio__construct_with_function(GPIO__PORT_4, 29, GPIO__FUNCTION_2);&lt;br /&gt;
&lt;br /&gt;
  mp3__send_command(SELECT_DEVICE, 0x00, DEV_TF);&lt;br /&gt;
  mp3_play_start_song();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play(int num) { &lt;br /&gt;
mp3__send_command(CYCLE_PLAY_FOLDER, num, 0x02); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mp3_play_start_song() { &lt;br /&gt;
mp3_play(1); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void enable_joystick(gpio__port_e adc1, uint8_t x_pin, gpio__port_e adc2, uint8_t y_pin, gpio__port_e port, int pin) {&lt;br /&gt;
  const uint32_t set_analog_mode = (1 &amp;lt;&amp;lt; 7);&lt;br /&gt;
&lt;br /&gt;
  LPC_IOCON-&amp;gt;P1_30 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
  LPC_IOCON-&amp;gt;P0_25 &amp;amp;= ~(set_analog_mode);&lt;br /&gt;
&lt;br /&gt;
  adc_xvalue = gpio__construct_with_function(adc1, x_pin, 1);&lt;br /&gt;
  adc_yvalue = gpio__construct_with_function(adc2, y_pin, 3);&lt;br /&gt;
  adc__initialize();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== '''TESTING &amp;amp; TECHNICAL CHALLENGES''' ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix and Game Play ===&lt;br /&gt;
* Collision detection with tiles was not working after the 32nd column. Eventually it turned out to be a very silly issue. It was because while doing `1 &amp;lt;&amp;lt; 64`, 1 should have been type casted to uint64_t.&lt;br /&gt;
* The random number generator was not generating randomness as desired. The reason for that was that the random number generator was being seeded only once using xTaskGetTickCount() which would always give the same seed as xTaskGetTickCount() gives the time from the stat of the program and that would be same always at the start of the program. To get around this problem, the random number generator was seeded each time before generating a new random number. &lt;br /&gt;
* Led matrix's buffer was being overwritten every time a jumper goes over the tiles. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
===MP3 Decoder ===&lt;br /&gt;
While integrating the mp3 decoder code with the rest of the code, there occurred an issue in display and game became slow. &lt;br /&gt;
So instead of creating a separate task for mp3 decoder, we just did mp3__init() in main function and the issues got resolved.&lt;br /&gt;
&lt;br /&gt;
=='''CONCLUSION'''==&lt;br /&gt;
&lt;br /&gt;
We were able to accomplish the goals of the game that we outlined at the starting. Juvenile jumpers game successfully ran and mimicked the original doodle jump game. All the game components functioned correctly during the final demo allowing for a flawless experience. The LED matrix was capable of loading the various monsters and gun while playing the sounds for each of the game items. The demo showcased that the gun was able to  shoot the enemies to gain points. Through this project, we learned a lot about designing real world project using FreeRTOS applications, drivers, PCB design, power management circuits, git source code management, and final integration testing. This project allowed us to understand the importance of writing down requirements, planning a schedule for development, and communication between all of us.&lt;br /&gt;
&lt;br /&gt;
== '''ACKNOWLEGEMENT''' ==&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a knowledgeable course and continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice and feedbacks.&lt;br /&gt;
&lt;br /&gt;
== '''APPENDIX''' ==&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66294</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66294"/>
				<updated>2021-12-17T07:03:30Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:game.jpg||330px|caption|right|]]&lt;br /&gt;
&lt;br /&gt;
=='''Juvenile Jumpers'''==&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is an endless platform game in which there are enemies and obstacles on various platforms. It is a single-player game. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward and backward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List and Cost ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
Juvenile Jumpers game is designed using SJ-Two board and RGB LED Matrix to see the visuals. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB. The schematic and board layout for the PCB is designed using Autodesk's Eagle software and the fabrication vendor is JLCPCB.&lt;br /&gt;
&lt;br /&gt;
[[File:Schematic.PNG|500px|thumb|left|Schematic]]&lt;br /&gt;
&lt;br /&gt;
[[File:PCB_Bottom.PNG|350px|thumb|right|PCB Bottom View]]&lt;br /&gt;
&lt;br /&gt;
[[File:PCB_top.PNG|350px|thumb|center|PCB Top View]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LED MATRIX  ===&lt;br /&gt;
&lt;br /&gt;
A 64x64 RGB LED Matrix is used as a display. The LED matrix panel has 4096 RGB LEDs. Each LED can be controlled independently. LED Matrix uses only 13 digital GPIOs to fully control each LED. This 64x64 LED matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. The LED matrix displays three main colors like RED, BLUE, GREEN. By combing these three colors we can make different colors like YELLOW, CYAN, PINK, WHITE, Magenta. &lt;br /&gt;
&lt;br /&gt;
[[File:Start_screen.jpg|400px|thumb|left|Start Screen]]&lt;br /&gt;
[[File:RGB_Led_matrix.jpg|400px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ LED Matrix Pin Description &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! LED Matrix Pin&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dual Axis Joystick  ===&lt;br /&gt;
This project uses the joystick to control the movements of the jumper. This project uses x-axis values to move the jumper to the left and right sides. A switch on the joystick is used to start the game by pressing the switch. The joystick provides the analog output, therefore the joystick is connected to ADC pins of the SJTwo board. It is operated on a 5V power supply.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MP3 Decoder  ===&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
&lt;br /&gt;
== Software Design ==&lt;br /&gt;
&lt;br /&gt;
This game has two levels. &lt;br /&gt;
&lt;br /&gt;
1. Level_1:&lt;br /&gt;
* In the first level, the jumper needs to jump on the tiles. Some tiles have an additional spring and if the jumper lands on the spring, the jumper will jump much higher than it generally would on landing on the standard tiles. &lt;br /&gt;
* With each jump to the next level the score gets incremented by 10 and appropriate music is played&lt;br /&gt;
* After jumping on the next level the background screen and the jumper are shifted down to the bottom most position&lt;br /&gt;
* The jumper again starts to jump from this position &lt;br /&gt;
* If while coming down, the jumper is not able to find a tile to land on the game is finished&lt;br /&gt;
* If the score is more than 150 then the second level will begin. &lt;br /&gt;
&lt;br /&gt;
2. Level_2:&lt;br /&gt;
* This level adds some difficulty to the game. This level move adds enemies to the game.&lt;br /&gt;
* Jumper has a gun functionality. By using a gun jumper can kill the enemy. &lt;br /&gt;
* If the jumper collides with the enemy game will be over.&lt;br /&gt;
* Rest all stays like Level 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a total of five tasks involved in this game in order to ensure full functionality.&lt;br /&gt;
&lt;br /&gt;
1. Start and stop task:&lt;br /&gt;
* This task displays the game's start screen. To start the game player need to press the onboard switch on the joystick.&lt;br /&gt;
* After the game is finished, if the player presses the button again, the game would start again. This is also handled by this task.&lt;br /&gt;
&lt;br /&gt;
2. Background task:&lt;br /&gt;
* This task creates background tiles for the jumper to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
3. Game logic task:&lt;br /&gt;
* When the game starts this task detects the jumper's initial position and starts jumping up.&lt;br /&gt;
* Jumper will start going down after reaching a certain height.&lt;br /&gt;
* It checks for the collision with tiles. If a collision is not detected then the jumper will keep going down.&lt;br /&gt;
* If a collision is detected then it shifts the background screen and jumpers down. &lt;br /&gt;
* It will update the score and check the level.&lt;br /&gt;
* If the score is more than 150, it will start level 2 of the game.&lt;br /&gt;
&lt;br /&gt;
4 LED Matrix task:&lt;br /&gt;
* This task keeps displaying frame data every 1ms.&lt;br /&gt;
* This is a high-priority task.&lt;br /&gt;
&lt;br /&gt;
5 Enemy tasks:&lt;br /&gt;
* This task creates enemies at a random position.&lt;br /&gt;
* It moves enemies from column 0 to 63&lt;br /&gt;
&lt;br /&gt;
6 Gun Task:&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If this task detects a y-axis value greater than 4000, a gun will be shot.&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
A 64*64 led matrix is used for this project. The led matrix is divided into two halves of 32*64 each. It has 3 R,G,B pins and 3 64-bits registers (shift registers) for each upper and lower halves. The address lines provided are 5. This means that at a time same row from the upper half and the lower half will be selected. So in order to display a particular row appropriate row should be selected and appropriate data needs to be fed to the RGB shift registers of both top and bottom halves.&lt;br /&gt;
LED matrix is initialized by configuring the required pins as output. The led matrix has 3 more pins enable which are essential to display a pixel on the matrix. The clk pin that should used as a clk to the shift registers to shift the data out, the latch pin is used to latch the data from the shift registers onto the matrix's buffer, the output enable pin that is used to display the latched data on the selected row. &lt;br /&gt;
* Before feeding matrix data disable Output Enable (OE) GPIO&lt;br /&gt;
* Set bits on A, B, C, D GPIO pins to select the particular row. &lt;br /&gt;
* Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins&lt;br /&gt;
* To mask that particular pixel set zero on R, G, B GPIO pins&lt;br /&gt;
* Set and Reset the clock for pushing the R, G, B bits for each column &lt;br /&gt;
* Issue latch to mark the row's completion&lt;br /&gt;
* Set OE&lt;br /&gt;
* Small delay&lt;br /&gt;
* Reset latch before going to next row&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* mp3 music changes according to the state of the game.&lt;br /&gt;
* To get the game state sound flags are checked.&lt;br /&gt;
* Music is placed in the file so need to find the respective file.&lt;br /&gt;
* Open the mp3 file.&lt;br /&gt;
* Read the contents of the file.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void mp3_play_sound(int num) { mp3__send_command(PLAY_FILE_WITH_FOLDER, 0x01, num); }&lt;br /&gt;
&lt;br /&gt;
void mp3_play_jump_up_sound() {&lt;br /&gt;
  mp3_play_sound(2);&lt;br /&gt;
  vTaskDelay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix ===&lt;br /&gt;
1. Collision detection with tiles not working after the 32nd column. This is due to the variable was not typed cast to uint64_t.&lt;br /&gt;
&lt;br /&gt;
2. The random number generator generates the same pattern and hence the tiles. Seeding just once with xTaskGetTickCount() did not generate randomness.&lt;br /&gt;
&lt;br /&gt;
3. Led buffer overwrite due to collision leaves background screen in an inconsistent state. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
We successfully designed the Juvenile Jumper game using the RGB LED Matrix and the SJ2 board. Implementing this project from scratch gave us more practical exposure in developing real-time embedded applications. This project helped us to better understand all the FreeRTOS APIs and their functioning. We learned about PCB design and various driver implementation.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a fantastic course and for his continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66293</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66293"/>
				<updated>2021-12-17T06:48:32Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Software Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:game.jpg||330px|caption|right|]]&lt;br /&gt;
&lt;br /&gt;
=='''Juvenile Jumpers'''==&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is an endless platform game in which there are enemies and obstacles on various platforms. It is a single-player game. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward and backward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List and Cost ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
Juvenile Jumpers game is designed using SJ-Two board and RGB LED Matrix to see the visuals. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB. The schematic and board layout for the PCB is designed using Autodesk's Eagle software and the fabrication vendor is JLCPCB.&lt;br /&gt;
&lt;br /&gt;
[[File:Schematic.PNG|500px|thumb|left|Schematic]]&lt;br /&gt;
&lt;br /&gt;
[[File:PCB_Bottom.PNG|350px|thumb|right|PCB Bottom View]]&lt;br /&gt;
&lt;br /&gt;
[[File:PCB_top.PNG|350px|thumb|center|PCB Top View]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LED MATRIX  ===&lt;br /&gt;
&lt;br /&gt;
A 64x64 RGB LED Matrix is used as a display. The LED matrix panel has 4096 RGB LEDs. Each LED can be controlled independently. LED Matrix uses only 13 digital GPIOs to fully control each LED. This 64x64 LED matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. The LED matrix displays three main colors like RED, BLUE, GREEN. By combing these three colors we can make different colors like YELLOW, CYAN, PINK, WHITE, Magenta. &lt;br /&gt;
&lt;br /&gt;
[[File:Start_screen.jpg|400px|thumb|left|Start Screen]]&lt;br /&gt;
[[File:RGB_Led_matrix.jpg|400px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ LED Matrix Pin Description &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! LED Matrix Pin&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dual Axis Joystick  ===&lt;br /&gt;
This project uses the joystick to control the movements of the jumper. This project uses x-axis values to move the jumper to the left and right sides. A switch on the joystick is used to start the game by pressing the switch. The joystick provides the analog output, therefore the joystick is connected to ADC pins of the SJTwo board. It is operated on a 5V power supply.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MP3 Decoder  ===&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
&lt;br /&gt;
== Software Design ==&lt;br /&gt;
&lt;br /&gt;
This game has two levels. &lt;br /&gt;
&lt;br /&gt;
1. Level_1:&lt;br /&gt;
* In the first level, the jumper needs to jump on the tiles. Some tiles have an additional spring and if the jumper lands on the spring, the jumper will jump much higher than it generally would on landing on the standard tiles. &lt;br /&gt;
* With each jump to the next level the score gets incremented by 10 and appropriate music is played&lt;br /&gt;
* After jumping on the next level the background screen and the jumper are shifted down to the bottom most position&lt;br /&gt;
* The jumper again starts to jump from this position &lt;br /&gt;
* If while coming down, the jumper is not able to find a tile to land on the game is finished&lt;br /&gt;
* If the score is more than 150 then the second level will begin. &lt;br /&gt;
&lt;br /&gt;
2. Level_2:&lt;br /&gt;
* This level adds some difficulty to the game. This level move adds enemies to the game.&lt;br /&gt;
* Jumper has a gun functionality. By using a gun jumper can kill the enemy. &lt;br /&gt;
* If the jumper collides with the enemy game will be over.&lt;br /&gt;
* Rest all stays like Level 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a total of five tasks involved in this game in order to ensure full functionality.&lt;br /&gt;
&lt;br /&gt;
1. Start and stop task:&lt;br /&gt;
* This task displays the game's start screen. To start the game player need to press the onboard switch on the joystick.&lt;br /&gt;
* After the game is finished, if the player presses the button again, the game would start again. This is also handled by this task.&lt;br /&gt;
&lt;br /&gt;
2. Background task:&lt;br /&gt;
* This task creates background tiles for the jumper to jump on.&lt;br /&gt;
* It keeps on refreshing the led_matrix frame buffer with background data buffer.&lt;br /&gt;
&lt;br /&gt;
3. Game logic task:&lt;br /&gt;
* When the game starts this task detects the jumper's initial position and starts jumping up.&lt;br /&gt;
* Jumper will start going down after reaching a certain height.&lt;br /&gt;
* It checks for the collision with tiles. If a collision is not detected then the jumper will keep going down.&lt;br /&gt;
* If a collision is detected then it shifts the background screen and jumpers down. &lt;br /&gt;
* It will update the score and check the level.&lt;br /&gt;
* If the score is more than 150, it will start level 2 of the game.&lt;br /&gt;
&lt;br /&gt;
4 LED Matrix task:&lt;br /&gt;
* This task keeps displaying frame data every 1ms.&lt;br /&gt;
* This is a high-priority task.&lt;br /&gt;
&lt;br /&gt;
5 Enemy tasks:&lt;br /&gt;
* This task creates enemies at a random position.&lt;br /&gt;
* It moves enemies from column 0 to 63&lt;br /&gt;
&lt;br /&gt;
6 Gun Task:&lt;br /&gt;
* This task keeps on monitoring the joystick data for Y-axis&lt;br /&gt;
* If this task detects a y-axis value greater than 4000, a gun will be shot.&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
LED matrix is initialized by configuring the required pins. Before feeding matrix data disable Output Enable (OE) GPIO. Set bits on A, B, C, D GPIO pins to select the particular row. Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins. To mask that particular pixel set zero on R, G, B GPIO pins. Set and Reset the clock for pushing the R, G, B bits for each column. Issue latch to mark the row's completion and reset latch before going to next row.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for LED Driver: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void led_matrix__set_pixel(int row, int column, led_matrix__color_e color) {&lt;br /&gt;
  // column = 63 - column;&lt;br /&gt;
  data_size pixel = ((data_size)1 &amp;lt;&amp;lt; column);&lt;br /&gt;
  if (color &amp;amp; BLUE_COLOR_BIT) {&lt;br /&gt;
    frame_buffer[row][BLUE_PLANE] |= pixel;&lt;br /&gt;
  }&lt;br /&gt;
  if (color &amp;amp; GREEN_COLOR_BIT) {&lt;br /&gt;
    frame_buffer[row][GREEN_PLANE] |= pixel;&lt;br /&gt;
  }&lt;br /&gt;
  if (color &amp;amp; RED_COLOR_BIT) {&lt;br /&gt;
    frame_buffer[row][RED_PLANE] |= pixel;&lt;br /&gt;
  }&lt;br /&gt;
  if (color == OFF) {&lt;br /&gt;
    clear_pixel(row, column);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* mp3 music changes according to the state of the game.&lt;br /&gt;
* To get the game state sound flags are checked.&lt;br /&gt;
* Music is placed in the file so need to find the respective file.&lt;br /&gt;
* Open the mp3 file.&lt;br /&gt;
* Read the contents of the file.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void mp3_play_sound(int num) { mp3__send_command(PLAY_FILE_WITH_FOLDER, 0x01, num); }&lt;br /&gt;
&lt;br /&gt;
void mp3_play_jump_up_sound() {&lt;br /&gt;
  mp3_play_sound(2);&lt;br /&gt;
  vTaskDelay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix ===&lt;br /&gt;
1. Collision detection with tiles not working after the 32nd column. This is due to the variable was not typed cast to uint64_t.&lt;br /&gt;
&lt;br /&gt;
2. The random number generator generates the same pattern and hence the tiles. Seeding just once with xTaskGetTickCount() did not generate randomness.&lt;br /&gt;
&lt;br /&gt;
3. Led buffer overwrite due to collision leaves background screen in an inconsistent state. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
We successfully designed the Juvenile Jumper game using the RGB LED Matrix and the SJ2 board. Implementing this project from scratch gave us more practical exposure in developing real-time embedded applications. This project helped us to better understand all the FreeRTOS APIs and their functioning. We learned about PCB design and various driver implementation.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a fantastic course and for his continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66292</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=66292"/>
				<updated>2021-12-17T05:54:30Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Objectives &amp;amp; Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:game.jpg||330px|caption|right|]]&lt;br /&gt;
&lt;br /&gt;
=='''Juvenile Jumpers'''==&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Juvenile Jumper is an endless platform game in which there are enemies and obstacles on various platforms. It is a single-player game. The doodle is a four-legged creature and has a trunk that he uses to shoot at enemies. The objective of the game is to go as high as you can without falling while avoiding/killing monsters and random obstacles. After each level, the difficulty of the game increases with more enemies and obstacles.&lt;br /&gt;
&lt;br /&gt;
[[File:Doodle.jpg|600px|thumb|center|High level layout of Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
The idea is to build the doodle jump game on a 64x64 RGB LED Screen. The game is played using a joystick. The doodle keeps on jumping and its direction can be controlled using left and right control of the joystick, which can also be used in forward and backward direction as gun to shoot the enemies. MP3 decoder is used for different sound effects in the background of game.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
'''Ritika Beniwal'''&lt;br /&gt;
* MP3 decoder driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
  &lt;br /&gt;
'''Anuja Sapkal'''&lt;br /&gt;
* Joystick driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB Schematic and Board Design&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
'''Sourab Gupta'''&lt;br /&gt;
* LED driver&lt;br /&gt;
* Game Logic&lt;br /&gt;
* PCB design verification&lt;br /&gt;
* WiKi page handling&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/23/2021&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects&lt;br /&gt;
* Brainstorming on various ideas&lt;br /&gt;
* Finalizing Project proposal&lt;br /&gt;
 &lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*09/29/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/10/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Discuss and create a list of required components&lt;br /&gt;
* Ordering of the Parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/11/2021&lt;br /&gt;
|&lt;br /&gt;
*10/19/2021&lt;br /&gt;
|&lt;br /&gt;
* Setup git repository&lt;br /&gt;
* Prepare and update wiki schedule&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 10/20/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/31/2021&lt;br /&gt;
|&lt;br /&gt;
* Distributing tasks among members&lt;br /&gt;
* Read LED matrix Datasheet and start working on its driver&lt;br /&gt;
* Read Joystick datasheet and start working on its driver&lt;br /&gt;
* Read MP3 decoder datasheet and start working on its driver&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/01/2021&lt;br /&gt;
|&lt;br /&gt;
*11/08/2021&lt;br /&gt;
|&lt;br /&gt;
* Review pins of sjtwo board to be used by components&lt;br /&gt;
* Finalize Wiki Schedule&lt;br /&gt;
* Understand high-level layout of the project&lt;br /&gt;
* Develop basic Led driver&lt;br /&gt;
* Develop basic Joystick Driver&lt;br /&gt;
* Develop basic MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Complete the design for PCB printing&lt;br /&gt;
* Order circuit boards components&lt;br /&gt;
* Create platforms and monsters on LED matrix&lt;br /&gt;
* Test MP3 decoder&lt;br /&gt;
* Interface Joystick and test monster movements on LED&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
|&lt;br /&gt;
*11/17/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Synchronize game sounds with game logic &lt;br /&gt;
* Test the modules&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/24/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 12/01/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Improving the game logic&lt;br /&gt;
* Final testing of all the modules with the board&lt;br /&gt;
* Bug  and error fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Design game casing and aesthetics&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
*&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List and Cost ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Name&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Supplier&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Quantity&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
64x64 RGB LED Matrix&lt;br /&gt;
| &lt;br /&gt;
https://www.sparkfun.com/products/14824&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 87.4&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
Sjtwo board&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/Generic-SJTwo-SJ2-SJSU/dp/B08G9LRPZ8&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 50&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| &lt;br /&gt;
Two-axis Joystick&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B01M5L1BMS/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 4.25&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| &lt;br /&gt;
MP3 Decoder&lt;br /&gt;
| &lt;br /&gt;
https://www.amazon.com/gp/product/B07JCXWY9M/&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 8.05&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| &lt;br /&gt;
Power Supply&lt;br /&gt;
| &lt;br /&gt;
https://bit.ly/31QJkoN&lt;br /&gt;
|&lt;br /&gt;
1&lt;br /&gt;
|&lt;br /&gt;
$ 7.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| &lt;br /&gt;
PCB &lt;br /&gt;
| &lt;br /&gt;
https://jlcpcb.com/&lt;br /&gt;
|&lt;br /&gt;
5&lt;br /&gt;
|&lt;br /&gt;
$14.21&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
Juvenile Jumpers game is designed using SJ-Two board and RGB LED Matrix to see the visuals. The game is controlled by using a two-axis joystick and to play the music we have used an MP3 decoder.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
All the essential hardware is retained using a printed circuit board. For this game, we have designed a two-layer PCB. The schematic and board layout for the PCB is designed using Autodesk's Eagle software and the fabrication vendor is JLCPCB.&lt;br /&gt;
&lt;br /&gt;
[[File:Schematic.PNG|500px|thumb|left|Schematic]]&lt;br /&gt;
&lt;br /&gt;
[[File:PCB_Bottom.PNG|350px|thumb|right|PCB Bottom View]]&lt;br /&gt;
&lt;br /&gt;
[[File:PCB_top.PNG|350px|thumb|center|PCB Top View]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LED MATRIX  ===&lt;br /&gt;
&lt;br /&gt;
A 64x64 RGB LED Matrix is used as a display. The LED matrix panel has 4096 RGB LEDs. Each LED can be controlled independently. LED Matrix uses only 13 digital GPIOs to fully control each LED. This 64x64 LED matrix has six 64-bit shift registers for R1, G1, B1 R2, G2, B2 where each color of the LED is controlled by one bit of the shift register. The LED matrix displays three main colors like RED, BLUE, GREEN. By combing these three colors we can make different colors like YELLOW, CYAN, PINK, WHITE, Magenta. &lt;br /&gt;
&lt;br /&gt;
[[File:Start_screen.jpg|400px|thumb|left|Start Screen]]&lt;br /&gt;
[[File:RGB_Led_matrix.jpg|400px|thumb|right|RGB LED Matrix]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ LED Matrix Pin Description &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! LED Matrix Pin&lt;br /&gt;
! Pin Description&lt;br /&gt;
! SJTwo Board Pin&lt;br /&gt;
|- &lt;br /&gt;
| R1 || Upper half (Section 1) || p2_0&lt;br /&gt;
|-&lt;br /&gt;
| G1 || Upper half (Section 1) || p2_1&lt;br /&gt;
|-&lt;br /&gt;
| B1 || Upper half (Section 1) || p2_2&lt;br /&gt;
|-&lt;br /&gt;
| R2||  Lower half (Section 2) || p2_4&lt;br /&gt;
|-&lt;br /&gt;
| G2 || Lower half (Section 2) || p2_5&lt;br /&gt;
|-&lt;br /&gt;
| B2 || Lower half (Section 2) || p2_6&lt;br /&gt;
|-&lt;br /&gt;
| A || Address Line || p2_7&lt;br /&gt;
|-&lt;br /&gt;
| B || Address Line || p2_8&lt;br /&gt;
|-&lt;br /&gt;
| C || Address Line || p2_9&lt;br /&gt;
|-&lt;br /&gt;
| D || Address Line || p0_16&lt;br /&gt;
|-&lt;br /&gt;
| E || Address Line || p0_15&lt;br /&gt;
|-&lt;br /&gt;
| GND ||  Connected to ground || GND&lt;br /&gt;
|-&lt;br /&gt;
| Clk || For upper half and lower half || p1_28&lt;br /&gt;
|-&lt;br /&gt;
| Latch|| For upper half and lower half || p1_23&lt;br /&gt;
|-&lt;br /&gt;
| OE || For upper half and lower half || p1_20&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dual Axis Joystick  ===&lt;br /&gt;
This project uses the joystick to control the movements of the jumper. This project uses x-axis values to move the jumper to the left and right sides. A switch on the joystick is used to start the game by pressing the switch. The joystick provides the analog output, therefore the joystick is connected to ADC pins of the SJTwo board. It is operated on a 5V power supply.&lt;br /&gt;
&lt;br /&gt;
[[File:D_joystick.jpg|500x280px |thumb|center|Dual Axis Joystick]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MP3 Decoder  ===&lt;br /&gt;
&lt;br /&gt;
[[File:MP3 Decoder.PNG|500x280px |thumb|center|MP3 Decoder]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
&lt;br /&gt;
== Software Design ==&lt;br /&gt;
&lt;br /&gt;
This game has two levels. &lt;br /&gt;
&lt;br /&gt;
1. Level_1:&lt;br /&gt;
*In the first level, the player needs to jump on the tiles. Some tiles have spring on them, therefore if the jumper collides with spring tiles jumper will make eight jumps. &lt;br /&gt;
* If the score is more than 160 then the second level will begin. &lt;br /&gt;
2. Level_2:&lt;br /&gt;
* This level adds some difficulty to the game. This level has enemies.&lt;br /&gt;
* Jumper has a gun functionality. By using a gun jumper can kill the enemy. &lt;br /&gt;
* If the jumper collides with the enemy game will be over.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a total of five tasks involved in this game in order to ensure full functionality.&lt;br /&gt;
&lt;br /&gt;
1. Start and stop task:&lt;br /&gt;
*This task displays the game's start screen. To start the game player need to press the onboard switch on the joystick.&lt;br /&gt;
*When the game is over this task display game over screen.&lt;br /&gt;
2. Background task:&lt;br /&gt;
* This task creates background tiles&lt;br /&gt;
* It keeps replacing the frame buffer with background data.&lt;br /&gt;
3. Game logic task:&lt;br /&gt;
* When the game starts this task detects the jumper's initial position and starts jumping up.&lt;br /&gt;
* Jumper will start going down after reaching a certain height.&lt;br /&gt;
* It checks for the collision with tiles. If a collision is not detected then the jumper will keep going down.&lt;br /&gt;
* If a collision is detected then it shifts the background screen and jumpers down. &lt;br /&gt;
* It will update the score and check the level.&lt;br /&gt;
* If the score is more than 160, it will start level 2 of the game.&lt;br /&gt;
4 LED tasks:&lt;br /&gt;
* This task keeps displaying frame data every 1ms.&lt;br /&gt;
* This is a high-priority task.&lt;br /&gt;
5 Enemy tasks:&lt;br /&gt;
* This task creates enemies at a random position.&lt;br /&gt;
* It moves enemies from column 0 to 63.&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
'''LED Driver'''&lt;br /&gt;
&lt;br /&gt;
LED matrix will initialize by configuring the required pin directions. Before feeding matrix data disable Output Enable (OE) GPIO. Set bits on A, B, C, D GPIO pins to select the particular row. Loop through the pixels (columns) in the selected row and set the pixel color on R, G, B GPIO pins. To mask that particular pixel set zero on R, G, B GPIO pins. Set and Reset the clock for pushing the R, G, B bits for each column. Issue latch to mark the row's completion and reset latch before going to next row.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for LED Driver: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void led_matrix__set_pixel(int row, int column, led_matrix__color_e color) {&lt;br /&gt;
  // column = 63 - column;&lt;br /&gt;
  data_size pixel = ((data_size)1 &amp;lt;&amp;lt; column);&lt;br /&gt;
  if (color &amp;amp; BLUE_COLOR_BIT) {&lt;br /&gt;
    frame_buffer[row][BLUE_PLANE] |= pixel;&lt;br /&gt;
  }&lt;br /&gt;
  if (color &amp;amp; GREEN_COLOR_BIT) {&lt;br /&gt;
    frame_buffer[row][GREEN_PLANE] |= pixel;&lt;br /&gt;
  }&lt;br /&gt;
  if (color &amp;amp; RED_COLOR_BIT) {&lt;br /&gt;
    frame_buffer[row][RED_PLANE] |= pixel;&lt;br /&gt;
  }&lt;br /&gt;
  if (color == OFF) {&lt;br /&gt;
    clear_pixel(row, column);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''MP3 Decoder'''&lt;br /&gt;
* mp3 music changes according to the state of the game.&lt;br /&gt;
* To get the game state sound flags are checked.&lt;br /&gt;
* Music is placed in the file so need to find the respective file.&lt;br /&gt;
* Open the mp3 file.&lt;br /&gt;
* Read the contents of the file.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for MP3: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void mp3_play_sound(int num) { mp3__send_command(PLAY_FILE_WITH_FOLDER, 0x01, num); }&lt;br /&gt;
&lt;br /&gt;
void mp3_play_jump_up_sound() {&lt;br /&gt;
  mp3_play_sound(2);&lt;br /&gt;
  vTaskDelay(50);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Joystick'''&lt;br /&gt;
&lt;br /&gt;
* Initialized the ADC Peripheral&lt;br /&gt;
* Set the appropriate pin functionality using the IOCON registers.&lt;br /&gt;
* Set the ADC pin functionality as input.&lt;br /&gt;
* Select ADC channels to read.&lt;br /&gt;
* Enable burst mode for a fast conversion.&lt;br /&gt;
&lt;br /&gt;
''' Code snippet for Joystick: '''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void initialize_joystick() {&lt;br /&gt;
  enable_joystick(GPIO__PORT_0, 25, GPIO__PORT_1, 30, GPIO__PORT_1, 31);&lt;br /&gt;
  button_press = p1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
&lt;br /&gt;
=== PCB Design ===&lt;br /&gt;
We struggled to get the dimensions of the power supply module to design the PCB as the exact module was not available in the library. We have selected the pin dimensions for the power supply module by referencing other pin headers and using a general approximation to make it work satisfactorily. Because of this, the PCB went through a lot of internal revisions. While testing hardware on the PCB for the first time we faced a problem related to ribbon cable. To solve this problem we just replace the ribbon cable but we spent too much time realizing the problem.&lt;br /&gt;
&lt;br /&gt;
=== LED Matrix ===&lt;br /&gt;
1. Collision detection with tiles not working after the 32nd column. This is due to the variable was not typed cast to uint64_t.&lt;br /&gt;
&lt;br /&gt;
2. The random number generator generates the same pattern and hence the tiles. Seeding just once with xTaskGetTickCount() did not generate randomness.&lt;br /&gt;
&lt;br /&gt;
3. Led buffer overwrite due to collision leaves background screen in an inconsistent state. To resolve this issue keep refreshing the background screen in a task.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
We successfully designed the Juvenile Jumper game using the RGB LED Matrix and the SJ2 board. Implementing this project from scratch gave us more practical exposure in developing real-time embedded applications. This project helped us to better understand all the FreeRTOS APIs and their functioning. We learned about PCB design and various driver implementation.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
*  [https://www.youtube.com/watch?v=lNCSVBdDDws Juvenile Jumpers - video]&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://gitlab.com/sourabgupta3/juvenilejumpers Gitlab link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
We would like to sincerely thank Professor Preetpal Kang for designing such a fantastic course and for his continuous guidance and support throughout the implementation of this project. Further, we would like to thank the ISA team for their advice.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
* [https://www.freertos.org/a00106.html FreeRTOS APIs]&lt;br /&gt;
* [https://learn.sparkfun.com/tutorials/using-eagle-schematic/all Sparkfun Eagle Software Tutorial]&lt;br /&gt;
* [https://bikerglen.com/projects/lighting/led-panel-1up/ LED matrix Driver Guide]&lt;br /&gt;
* [http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf MP3 Decoder Datasheet]&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65436</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65436"/>
				<updated>2021-10-17T05:02:16Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Doodle Jump&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Ritika Beniwal&lt;br /&gt;
**   &lt;br /&gt;
*  Anuja Sapkal&lt;br /&gt;
**   &lt;br /&gt;
*  Sourab Gupta&lt;br /&gt;
**&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/25/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information. Come up with an idea&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/26/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
*Create Gitlab repository &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In Progress&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2021&lt;br /&gt;
|&lt;br /&gt;
*11/02/2021&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
*Start working on Led driver&lt;br /&gt;
*Start working on Joystick Driver&lt;br /&gt;
*Start working on MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2021&lt;br /&gt;
|&lt;br /&gt;
* 11/09/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the game logic&lt;br /&gt;
* Complete the Led Driver&lt;br /&gt;
* Complete the Joystick Driver&lt;br /&gt;
* Complete the MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Keep working on the game logic&lt;br /&gt;
* Testing&lt;br /&gt;
* Bug fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65435</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65435"/>
				<updated>2021-10-17T05:01:10Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Doodle Jump&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Ritika Beniwal&lt;br /&gt;
**   &lt;br /&gt;
*  Anuja Sapkal&lt;br /&gt;
**   &lt;br /&gt;
*  Sourab Gupta&lt;br /&gt;
**&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/25/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information. Come up with an idea&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/26/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
*Create Gitlab repository &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2021&lt;br /&gt;
|&lt;br /&gt;
*11/02/2021&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
*Start working on Led driver&lt;br /&gt;
*Start working on Joystick Driver&lt;br /&gt;
*Start working on MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2021&lt;br /&gt;
|&lt;br /&gt;
* 11/09/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the game logic&lt;br /&gt;
* Complete the Led Driver&lt;br /&gt;
* Complete the Joystick Driver&lt;br /&gt;
* Complete the MP3 Decoder&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2021&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2021 &lt;br /&gt;
| &lt;br /&gt;
*11/23/2021&lt;br /&gt;
|&lt;br /&gt;
* Integration of circuit boards and microcontroller&lt;br /&gt;
* Work on Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2021&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Keep working on the game logic&lt;br /&gt;
* Testing&lt;br /&gt;
* Bug fixes&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2021&lt;br /&gt;
| &lt;br /&gt;
* 12/15/2021&lt;br /&gt;
|&lt;br /&gt;
* Finalize the gameplay&lt;br /&gt;
* Ready for demo&lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65434</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65434"/>
				<updated>2021-10-17T04:44:29Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Doodle Jump&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Ritika Beniwal&lt;br /&gt;
**   &lt;br /&gt;
*  Anuja Sapkal&lt;br /&gt;
**   &lt;br /&gt;
*  Sourab Gupta&lt;br /&gt;
**&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/25/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information. Come up with an idea&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2021   &lt;br /&gt;
| &lt;br /&gt;
*10/26/2021 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
*Create Gitlab repository &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2020&lt;br /&gt;
|&lt;br /&gt;
*11/01/2020&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2020&lt;br /&gt;
|&lt;br /&gt;
* 11/08/2020&lt;br /&gt;
|&lt;br /&gt;
* Develop graphics driver for LED matrix and implement initial game objects&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
|&lt;br /&gt;
*11/10/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
* circuit board and component assembly&lt;br /&gt;
* Circuit board testing&lt;br /&gt;
* Additional accessories if required and finalization of hardware&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2020 &lt;br /&gt;
| &lt;br /&gt;
*11/22/2020&lt;br /&gt;
|&lt;br /&gt;
*Integration of circuit boards and microcontroller&lt;br /&gt;
* Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2020&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/29/2020&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Integrate subsystem&lt;br /&gt;
* Finalizing the video game &lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Address bugs during testing of integrated system&lt;br /&gt;
* Test pause/play functionality&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Final Demo&lt;br /&gt;
*Update Gitlab repo with final code.&lt;br /&gt;
*Update test video.&lt;br /&gt;
*Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65433</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65433"/>
				<updated>2021-10-17T04:41:41Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Doodle Jump&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Ritika Beniwal&lt;br /&gt;
**   &lt;br /&gt;
*  Anuja Sapkal&lt;br /&gt;
**   &lt;br /&gt;
*  Sourab Gupta&lt;br /&gt;
**&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 09/25/2021&lt;br /&gt;
* 09/28/2021&lt;br /&gt;
|&lt;br /&gt;
* 10/18/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information and discuss among the group members.&lt;br /&gt;
* Create GitLab repository for project&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2020   &lt;br /&gt;
| &lt;br /&gt;
*10/20/2020 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2020&lt;br /&gt;
|&lt;br /&gt;
*11/01/2020&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2020&lt;br /&gt;
|&lt;br /&gt;
* 11/08/2020&lt;br /&gt;
|&lt;br /&gt;
* Develop graphics driver for LED matrix and implement initial game objects&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
|&lt;br /&gt;
*11/10/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
* circuit board and component assembly&lt;br /&gt;
* Circuit board testing&lt;br /&gt;
* Additional accessories if required and finalization of hardware&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2020 &lt;br /&gt;
| &lt;br /&gt;
*11/22/2020&lt;br /&gt;
|&lt;br /&gt;
*Integration of circuit boards and microcontroller&lt;br /&gt;
* Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2020&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/29/2020&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Integrate subsystem&lt;br /&gt;
* Finalizing the video game &lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Address bugs during testing of integrated system&lt;br /&gt;
* Test pause/play functionality&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Final Demo&lt;br /&gt;
*Update Gitlab repo with final code.&lt;br /&gt;
*Update test video.&lt;br /&gt;
*Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65432</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65432"/>
				<updated>2021-10-17T04:38:23Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Abstract */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Doodle Jump&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Ritika Beniwal&lt;br /&gt;
**   &lt;br /&gt;
*  Anuja Sapkal&lt;br /&gt;
**   &lt;br /&gt;
*  Sourab Gupta&lt;br /&gt;
**&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 10/12/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* 10/18/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information and discuss among the group members.&lt;br /&gt;
* Create GitLab repository for project&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2020   &lt;br /&gt;
| &lt;br /&gt;
*10/20/2020 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2020&lt;br /&gt;
|&lt;br /&gt;
*11/01/2020&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2020&lt;br /&gt;
|&lt;br /&gt;
* 11/08/2020&lt;br /&gt;
|&lt;br /&gt;
* Develop graphics driver for LED matrix and implement initial game objects&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
|&lt;br /&gt;
*11/10/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
* circuit board and component assembly&lt;br /&gt;
* Circuit board testing&lt;br /&gt;
* Additional accessories if required and finalization of hardware&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2020 &lt;br /&gt;
| &lt;br /&gt;
*11/22/2020&lt;br /&gt;
|&lt;br /&gt;
*Integration of circuit boards and microcontroller&lt;br /&gt;
* Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2020&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/29/2020&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Integrate subsystem&lt;br /&gt;
* Finalizing the video game &lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Address bugs during testing of integrated system&lt;br /&gt;
* Test pause/play functionality&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Final Demo&lt;br /&gt;
*Update Gitlab repo with final code.&lt;br /&gt;
*Update test video.&lt;br /&gt;
*Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65431</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65431"/>
				<updated>2021-10-17T04:38:10Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Project Title */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Doodle Jump&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Parking Frenzy is car parking video game. The player will be able to move the car in right or left direction, the road itself will be descending towards the car and will also consist of obstacles such as other vehicles. The road will have lanes through which the car must navigate to ultimately be able to slot itself into the right parking spot along side the road. The parking spots will be randomly generated along the edge of the LED matrix and the player must navigate the car into the spot at the right time or else it will result in a crash. The difficulty of the game will increase as the player reaches a certain amount of points. The difficulty will increase in terms of the speed of the car and the number of obstacles. The final score of the player will be displayed at the end of every game. a speaker attached to the board will generate the game sounds.&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Ritika Beniwal&lt;br /&gt;
**   &lt;br /&gt;
*  Anuja Sapkal&lt;br /&gt;
**   &lt;br /&gt;
*  Sourab Gupta&lt;br /&gt;
**&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 10/12/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* 10/18/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information and discuss among the group members.&lt;br /&gt;
* Create GitLab repository for project&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2020   &lt;br /&gt;
| &lt;br /&gt;
*10/20/2020 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2020&lt;br /&gt;
|&lt;br /&gt;
*11/01/2020&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2020&lt;br /&gt;
|&lt;br /&gt;
* 11/08/2020&lt;br /&gt;
|&lt;br /&gt;
* Develop graphics driver for LED matrix and implement initial game objects&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
|&lt;br /&gt;
*11/10/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
* circuit board and component assembly&lt;br /&gt;
* Circuit board testing&lt;br /&gt;
* Additional accessories if required and finalization of hardware&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2020 &lt;br /&gt;
| &lt;br /&gt;
*11/22/2020&lt;br /&gt;
|&lt;br /&gt;
*Integration of circuit boards and microcontroller&lt;br /&gt;
* Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2020&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/29/2020&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Integrate subsystem&lt;br /&gt;
* Finalizing the video game &lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Address bugs during testing of integrated system&lt;br /&gt;
* Test pause/play functionality&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Final Demo&lt;br /&gt;
*Update Gitlab repo with final code.&lt;br /&gt;
*Update test video.&lt;br /&gt;
*Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65430</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65430"/>
				<updated>2021-10-17T04:37:41Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Parking Frenzy&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Parking Frenzy is car parking video game. The player will be able to move the car in right or left direction, the road itself will be descending towards the car and will also consist of obstacles such as other vehicles. The road will have lanes through which the car must navigate to ultimately be able to slot itself into the right parking spot along side the road. The parking spots will be randomly generated along the edge of the LED matrix and the player must navigate the car into the spot at the right time or else it will result in a crash. The difficulty of the game will increase as the player reaches a certain amount of points. The difficulty will increase in terms of the speed of the car and the number of obstacles. The final score of the player will be displayed at the end of every game. a speaker attached to the board will generate the game sounds.&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Ritika Beniwal&lt;br /&gt;
**   &lt;br /&gt;
*  Anuja Sapkal&lt;br /&gt;
**   &lt;br /&gt;
*  Sourab Gupta&lt;br /&gt;
**&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 10/12/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* 10/18/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information and discuss among the group members.&lt;br /&gt;
* Create GitLab repository for project&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2020   &lt;br /&gt;
| &lt;br /&gt;
*10/20/2020 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2020&lt;br /&gt;
|&lt;br /&gt;
*11/01/2020&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2020&lt;br /&gt;
|&lt;br /&gt;
* 11/08/2020&lt;br /&gt;
|&lt;br /&gt;
* Develop graphics driver for LED matrix and implement initial game objects&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
|&lt;br /&gt;
*11/10/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
* circuit board and component assembly&lt;br /&gt;
* Circuit board testing&lt;br /&gt;
* Additional accessories if required and finalization of hardware&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2020 &lt;br /&gt;
| &lt;br /&gt;
*11/22/2020&lt;br /&gt;
|&lt;br /&gt;
*Integration of circuit boards and microcontroller&lt;br /&gt;
* Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2020&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/29/2020&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Integrate subsystem&lt;br /&gt;
* Finalizing the video game &lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Address bugs during testing of integrated system&lt;br /&gt;
* Test pause/play functionality&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Final Demo&lt;br /&gt;
*Update Gitlab repo with final code.&lt;br /&gt;
*Update test video.&lt;br /&gt;
*Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65429</id>
		<title>F21: Juvenile Jumpers</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=F21:_Juvenile_Jumpers&amp;diff=65429"/>
				<updated>2021-10-17T04:36:27Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: Created page with &amp;quot;=== Grading Criteria === &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt; *  How well is Software &amp;amp; Hardware Design described? *  How well can this report be used to reproduce this project? *  Code Quali...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Grading Criteria ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
*  How well is Software &amp;amp; Hardware Design described?&lt;br /&gt;
*  How well can this report be used to reproduce this project?&lt;br /&gt;
*  Code Quality&lt;br /&gt;
*  Overall Report Quality:&lt;br /&gt;
**  Software Block Diagrams&lt;br /&gt;
**  Hardware Block Diagrams&lt;br /&gt;
**:  Schematic Quality&lt;br /&gt;
**  Quality of technical challenges and solutions adopted.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Project Title ==&lt;br /&gt;
Parking Frenzy&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Parking Frenzy is car parking video game. The player will be able to move the car in right or left direction, the road itself will be descending towards the car and will also consist of obstacles such as other vehicles. The road will have lanes through which the car must navigate to ultimately be able to slot itself into the right parking spot along side the road. The parking spots will be randomly generated along the edge of the LED matrix and the player must navigate the car into the spot at the right time or else it will result in a crash. The difficulty of the game will increase as the player reaches a certain amount of points. The difficulty will increase in terms of the speed of the car and the number of obstacles. The final score of the player will be displayed at the end of every game. a speaker attached to the board will generate the game sounds.&lt;br /&gt;
&lt;br /&gt;
== Objectives &amp;amp; Introduction ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
*  Scott LoCascio&lt;br /&gt;
**   &lt;br /&gt;
*  Naeem Mannan&lt;br /&gt;
**   &lt;br /&gt;
*  Rahul Ghadge&lt;br /&gt;
**   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| &lt;br /&gt;
* 10/12/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* 10/18/2020&lt;br /&gt;
* 10/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Read previous projects, gather information and discuss among the group members.&lt;br /&gt;
* Create GitLab repository for project&lt;br /&gt;
| &lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;Completed&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| &lt;br /&gt;
*10/19/2020   &lt;br /&gt;
| &lt;br /&gt;
*10/20/2020 &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Order necessary parts&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;In progress&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
|&lt;br /&gt;
*10/26/2020&lt;br /&gt;
|&lt;br /&gt;
*11/01/2020&lt;br /&gt;
|&lt;br /&gt;
*Read and familiarize with LED Matrix Datasheet&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
|&lt;br /&gt;
* 11/02/2020&lt;br /&gt;
|&lt;br /&gt;
* 11/08/2020&lt;br /&gt;
|&lt;br /&gt;
* Develop graphics driver for LED matrix and implement initial game objects&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
|&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
*11/09/2020&lt;br /&gt;
|&lt;br /&gt;
*11/10/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
*11/15/2020&lt;br /&gt;
|&lt;br /&gt;
* Finalize wiki schedule&lt;br /&gt;
* Order circuit boards components and complete the design for printing&lt;br /&gt;
* circuit board and component assembly&lt;br /&gt;
* Circuit board testing&lt;br /&gt;
* Additional accessories if required and finalization of hardware&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
|&lt;br /&gt;
*11/16/2020 &lt;br /&gt;
| &lt;br /&gt;
*11/22/2020&lt;br /&gt;
|&lt;br /&gt;
*Integration of circuit boards and microcontroller&lt;br /&gt;
* Game logic development&lt;br /&gt;
* Testing and debugging the game logic&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| &lt;br /&gt;
* 11/23/2020&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
* 11/29/2020&lt;br /&gt;
|&lt;br /&gt;
* Integrate game logic code with LED matrix&lt;br /&gt;
* Integrate game sounds with game logic &lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| &lt;br /&gt;
* 11/30/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/06/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
* Integrate subsystem&lt;br /&gt;
* Finalizing the video game &lt;br /&gt;
* Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| &lt;br /&gt;
* 12/07/2020&lt;br /&gt;
| &lt;br /&gt;
* 12/13/2020&lt;br /&gt;
|&lt;br /&gt;
* Address bugs during testing of integrated system&lt;br /&gt;
* Test pause/play functionality&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
*12/14/2020&lt;br /&gt;
| &lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
*12/16/2020&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
*Final Demo&lt;br /&gt;
*Update Gitlab repo with final code.&lt;br /&gt;
*Update test video.&lt;br /&gt;
*Update the wiki page.&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Not started&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
Give a simple list of the cost of your project broken down by components.  Do not write long stories here.&lt;br /&gt;
&lt;br /&gt;
== Design &amp;amp; Implementation ==&lt;br /&gt;
The design section can go over your hardware and software design.  Organize this section using sub-sections that go over your design and implementation.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
Discuss your hardware design here.  Show detailed schematics, and the interface here.&lt;br /&gt;
&lt;br /&gt;
=== Hardware Interface ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
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.  &lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Testing &amp;amp; Technical Challenges ==&lt;br /&gt;
Describe the challenges of your project.  What advise would you give yourself or someone else if your project can be started from scratch again?&lt;br /&gt;
Make a smooth transition to testing section and described what it took to test your project.&lt;br /&gt;
&lt;br /&gt;
Include sub-sections that list out a problem and solution, such as:&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;Bug/issue name&amp;gt; ===&lt;br /&gt;
Discuss the issue and resolution.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Conclude your project here.  You can recap your testing and problems.  You should address the &amp;quot;so what&amp;quot; part here to indicate what you ultimately learnt from this project.  How has this project increased your knowledge?&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
Upload a video of your project and post the link here.&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
*  [https://sourceforge.net/projects/sjsu/files/CmpE_S2016/ Sourceforge Source Code Link]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
Any acknowledgement that you may wish to provide can be included here.&lt;br /&gt;
&lt;br /&gt;
=== References Used ===&lt;br /&gt;
List any references used in project.&lt;br /&gt;
&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
You can list the references you used.&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=Realtime_OS_on_Embedded_Systems&amp;diff=65428</id>
		<title>Realtime OS on Embedded Systems</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=Realtime_OS_on_Embedded_Systems&amp;diff=65428"/>
				<updated>2021-10-17T04:31:50Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /*  Fall 2021 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Program History ==&lt;br /&gt;
My contribution in Embedded System courses started with CmpE146.  This course teaches students on how to write UART, SPI, and I2C Drivers and interface their drivers to peripherals.  There are about 8 weekly labs in which students not only write drivers, but also learn the core of Real-time Operating Systems including threading (tasks), and inter-task communication using Queues and Semaphores.  FreeRTOS is the operating system used with C/C++ Compiler based on GNU.&lt;br /&gt;
&lt;br /&gt;
When the course was started by Dr. Ozemek @ SJSU (sometime before 2005), not many resources were out there.  Still, with helpful guidance from Dr. Ozemek, interesting projects were created.  This is when I started to help out in Embedded System Courses, and by collecting and sharing knowledge, we've raised the bar at SJSU!  &lt;br /&gt;
&lt;br /&gt;
There have been many great projects at SJSU, but since no one knew about them, the hard work went to a waste for anyone but the creator.  But now we've got the infrastructure to share the projects, which turn out as great references for future students.  Here is my project that started around 2007, and turned into Bachelor's Senior Design Project: &amp;lt;br/&amp;gt;&lt;br /&gt;
[http://www.youtube.com/watch?v=QEadXdRl3ws&amp;amp;feature=plcp YouTube Video of Self-Navigating Car]&lt;br /&gt;
&lt;br /&gt;
As of 2013, I have broadened my contribution to other embedded system courses like CmpE240, CmpE243 and CmpE244.&lt;br /&gt;
&lt;br /&gt;
== Lab Assignments ==&lt;br /&gt;
This article contains laboratory assignments and resources.  The assignments are under construction as we move towards SJ-One development board.&lt;br /&gt;
*  [[Embedded System Tutorial Tasks | Lesson 0: Multiple Tasks]]&lt;br /&gt;
*  [[Embedded System Tutorial GPIO | Lesson 1 : GPIO]]&lt;br /&gt;
*  [[Embedded System Tutorial UART | Lesson 2 : UART]]&lt;br /&gt;
*  [[Embedded System Tutorial SPI  | Lesson 3 : SPI]]&lt;br /&gt;
*  [[Embedded System I2C Tutorial  | Lesson 4 : I2C]]&lt;br /&gt;
*  [[Embedded System Tutorial Interrupts | Lesson 5 : Interrupts]]&lt;br /&gt;
*  [[Embedded System Tutorial FreeRTOS | Lesson 6 : FreeRTOS Tasks]]&lt;br /&gt;
*  [[Embedded System Tutorial File I/O | Lesson 7 : FreeRTOS Application Programming]]&lt;br /&gt;
&lt;br /&gt;
==== Class Project ====&lt;br /&gt;
* [[MP3 Player]]&lt;br /&gt;
&lt;br /&gt;
==Other reference articles==&lt;br /&gt;
*  [[Bitmasking Tutorial]] (+ GPIO Example)&lt;br /&gt;
*  [[ LPC17xx Memory Map &amp;amp; Interrupts]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Senior Design Projects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Semester Projects ==&lt;br /&gt;
Every semester, students are given about 7-10 weeks to complete their projects.  During this short time-span, students form groups, order parts, and begin working on their projects.  The work performed during the semester is documented at this Wiki.&lt;br /&gt;
&lt;br /&gt;
Here is the list of Preet's documented projects:&amp;lt;BR/&amp;gt;&lt;br /&gt;
*  [[Preet's Relay Controller Project]]&lt;br /&gt;
*  [[Nordic Low Powered Mesh Network stack]]&lt;br /&gt;
*  [http://www.youtube.com/watch?v=QEadXdRl3ws&amp;amp;feature=plcp Senior Design Project (MS-CmpE) Video]&lt;br /&gt;
&lt;br /&gt;
Here is another resource for good project references :&lt;br /&gt;
[http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/ Cornell EE476 Projects]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
=== Appendix ===&lt;br /&gt;
&lt;br /&gt;
=== [[Fall 2021 | Fall 2021]] ===&lt;br /&gt;
&lt;br /&gt;
*  [[F21: MARIO]]&lt;br /&gt;
*  [[F21: Group Project Name]]&lt;br /&gt;
*  [[F21: Sons of Ultron]]&lt;br /&gt;
*  [[F21: Juvenile Jumpers]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fall 2020 | Fall 2020]] ===&lt;br /&gt;
*  [[F20: Jubeat]]&lt;br /&gt;
*  [[F20: Flappy]]&lt;br /&gt;
*  [[F20: Space Invaders]]&lt;br /&gt;
*  [[F20: Treasure Diver]]&lt;br /&gt;
*  [[F20: Tom &amp;amp; Jerry]]&lt;br /&gt;
*  [[F20: Hungry Snake]]&lt;br /&gt;
*  [[F20: Son of a Gun]]&lt;br /&gt;
*  [[F20: Corona Run]]&lt;br /&gt;
*  [[F20: Maddening Marbles]]&lt;br /&gt;
*  [[F20: Bubble Shooter]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fall 2019 | Fall 2019]] ===&lt;br /&gt;
&lt;br /&gt;
*  [[F19: Smacman]]&lt;br /&gt;
*  [[F19: Tetris]]&lt;br /&gt;
*  [[F19: Space Impact]]&lt;br /&gt;
*  [[F19: Road Max Fury]]&lt;br /&gt;
*  [[F19: T-Rex Run!]]&lt;br /&gt;
*  [[F19: Infinity Mirror]]&lt;br /&gt;
*  [[F19: Tower Defense in Space]]&lt;br /&gt;
*  [[F19: Alien Wars]]&lt;br /&gt;
*  [[F19: Pocket tank]]&lt;br /&gt;
*  [[F19: M&amp;amp;B (Morph &amp;amp; Blend)]]&lt;br /&gt;
&lt;br /&gt;
=== [[Fall 2018 | Fall 2018]] ===&lt;br /&gt;
&lt;br /&gt;
*  [[F18: Flappy Bird]]&lt;br /&gt;
*  [[F18: Catch me if you can]]&lt;br /&gt;
*  [[F18: Zero Zero UFO]]&lt;br /&gt;
*  [[F18: Goals of Glory]]&lt;br /&gt;
*  [[F18: Spartan Warrior]]&lt;br /&gt;
*  [[F18: Wireless sensor network]]&lt;br /&gt;
*  [[F18: baem geim]]&lt;br /&gt;
*  [[F18: Hit the Balloon]]&lt;br /&gt;
*  [[F18: 2048]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Spring 2018 | Spring 2018]] ===&lt;br /&gt;
&lt;br /&gt;
*  [[S18: Team Nemesis(SJSU Cam)]]&lt;br /&gt;
*  [[S18: Death Race]]&lt;br /&gt;
*  [[S18: Hand gesture controlled multiplayer game]]&lt;br /&gt;
*  [[S18: Smart Rock Paper Scissors]]&lt;br /&gt;
*  [[S18: Spybot]]&lt;br /&gt;
*  [[S18: Audio Spectrum Analyzer with Graphics Display]]&lt;br /&gt;
*  [[S18: XY-Plotter]]&lt;br /&gt;
*  [[S18: RGB LED Sound Behavior on a Skateboard]]&lt;br /&gt;
*  [[S18: Spark - MP3 Music Player with Audio Spectrum]]&lt;br /&gt;
*  [[S18: Traffic Menace Video Game]]&lt;br /&gt;
*  [[S18: M.E.O.W]]&lt;br /&gt;
*  [[S18: Rahee]]&lt;br /&gt;
&lt;br /&gt;
=== [[Spring 2017 | Spring 2017]] ===&lt;br /&gt;
&lt;br /&gt;
*  [[S17: Wake up Barista]]&lt;br /&gt;
*  [[S17: Propeller Clock]]&lt;br /&gt;
*  [[S17: Sky Knight]]&lt;br /&gt;
*  [[S17: MyAutoHealth]]&lt;br /&gt;
*  [[S17: Logan]]&lt;br /&gt;
*  [[S17: ElectricBoard]]&lt;br /&gt;
*  [[S17: CamBot]]&lt;br /&gt;
*  [[S17: Sphero Droid]]&lt;br /&gt;
*  [[S17: Smart Planter]]&lt;br /&gt;
*  [[S17: Boom-Z Equalizer]]&lt;br /&gt;
*  [[S17: Interactive Snake and ladder ]]&lt;br /&gt;
*  [[S17: Smart Health Gear]]&lt;br /&gt;
*  [[S17: Halo]]&lt;br /&gt;
*  [[S17: Squad]]&lt;br /&gt;
*  [[S17: Smart security system]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Fall 2016 | Fall 2016]] ===&lt;br /&gt;
&lt;br /&gt;
CMPE146:&lt;br /&gt;
* [http://www.socialledge.com/sjsu/index.php?title=F16:_Seismograph F16: Seismograph]&lt;br /&gt;
* [[F16: Piano Glove]]&lt;br /&gt;
* [[F16: Object Detector]]&lt;br /&gt;
* [[F16: Autonomous Nautical System]]&lt;br /&gt;
* [[F16: Autonomous Fire Extinguishing Vehicle]]&lt;br /&gt;
* [[F16: Autonomous Runaway Alarm Car]]&lt;br /&gt;
* [[F16: E-Bike]]&lt;br /&gt;
* [[F16: NotifyBox]]&lt;br /&gt;
* [[F16: Wireless Tilt Controlled Camera Arm]]&lt;br /&gt;
* [[F16: OBD2 Reader]]&lt;br /&gt;
* [[F16: Micro Watch Monitoring System]]&lt;br /&gt;
* [[F16: Door Alarm System]]&lt;br /&gt;
* [[http://www.socialledge.com/sjsu/index.php?title=F16:_I2Coffee F16: UART Coffee]]&lt;br /&gt;
* [[F16: SJone to FPGA wireless integration]]&lt;br /&gt;
&lt;br /&gt;
=== [[Spring 2016 | Spring 2016]] ===&lt;br /&gt;
*  [[S16: Fantastic Four]]&lt;br /&gt;
*  [[S16: Simpsons]]&lt;br /&gt;
*  [[S16: Mars 1]]&lt;br /&gt;
*  [[S16: OpenSJ Bluz]]&lt;br /&gt;
*  [[S16: Motion Copy Bot]]&lt;br /&gt;
*  [[S16: Biker Assist]]&lt;br /&gt;
*  [[S16: Helios]]&lt;br /&gt;
*  [[S16: Sound Buddy]]&lt;br /&gt;
*  [[S16: Warriors]]&lt;br /&gt;
*  [[S16: Expendables]]&lt;br /&gt;
*  [[S16: Ahava]]&lt;br /&gt;
*  [[S16: Number 1]]&lt;br /&gt;
*  [[S16: SkyNet]]&lt;br /&gt;
*  [[S16: SmartDoorLock]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cmpe 146:&lt;br /&gt;
*  [[S16: Camera Gimbal]]&lt;br /&gt;
*  [[S16: Laser Harp]]&lt;br /&gt;
*  &amp;lt;strike&amp;gt;[[S16: Laser Cutter Motor Controller]]&amp;lt;/strike&amp;gt;&lt;br /&gt;
*  [[S16: Sprinkler]]&lt;br /&gt;
*  [[S16: The Jatrick Car]]&lt;br /&gt;
*  [[S16: Dan]]&lt;br /&gt;
*  [[S16: Robolamp]]&lt;br /&gt;
*  [[S16: Pinball]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Fall 2015 | Fall 2015]] ===&lt;br /&gt;
&lt;br /&gt;
CmpE146:&lt;br /&gt;
* [[F15: Autonomous Mobile]]&lt;br /&gt;
* [[F15: Car Report]]&lt;br /&gt;
* [[F15: Electronic Piano]]&lt;br /&gt;
* [[F15: Doorknock over Bluetooth]]&lt;br /&gt;
* [[F15: Smart Car]]&lt;br /&gt;
* [[F15: Plant Control]]&lt;br /&gt;
* [[F15: Laser Security System]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[CmpE244 Spring 2015 | Spring 2015]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* [[S15: Quadcopter - It flies]]&lt;br /&gt;
* [[S15: Remote Learner]]&lt;br /&gt;
* [[S15: Protocol Interface: I2C - CAN Bridge]]&lt;br /&gt;
* [[S15: Vision RC Car]]&lt;br /&gt;
* [[S15: SJeight Octocopter]]&lt;br /&gt;
* [[S15: Swarm Robots]]&lt;br /&gt;
* [[S15: Smart Sparta Parking System]]&lt;br /&gt;
* [[S15: Touch Navigator]]&lt;br /&gt;
* [[S15: Wizard's Chess System]]&lt;br /&gt;
* [[S15: Bug Rider]]&lt;br /&gt;
* [[S15: Real Time Brake Assist (RTBA)]]&lt;br /&gt;
* [[S15: Wireless Mesh Network]]&lt;br /&gt;
* [[S15: Wireless Power Transfer System]]&lt;br /&gt;
* [[S15: Drone]]&lt;br /&gt;
* [[S15: Tree Node using Google Protocol Buffers]]&lt;br /&gt;
* [[S15: Multi-media Car]]&lt;br /&gt;
* [[S15: Hand Gesture Recognition using IR Sensors]]&lt;br /&gt;
* [[S15: CAN controlled RGB LED cubes]]&lt;br /&gt;
* [[S15: Rubik's Cube Solver]]&lt;br /&gt;
* [[S15: RFID Security Box]]&lt;br /&gt;
* [[S15: Automated Meeting Room Reservation]]&lt;br /&gt;
* [[S15: Patient Buddy System (PBS)]]&lt;br /&gt;
&lt;br /&gt;
CmpE146:&lt;br /&gt;
* [[S15: Hovercopter]]&lt;br /&gt;
* [[S15: Triclops: Smart RC Car]]&lt;br /&gt;
* [[S15: Connect Four - Robotic Player]]&lt;br /&gt;
* [[S15: Self-Balancing Robot]]&lt;br /&gt;
* [[S15: MP3 Player with Graphic Equalizer Display]]&lt;br /&gt;
* [[S15: Motion-Controlled RC Car]]&lt;br /&gt;
* [[S15: MENL (Monster Encounter Night Light) ]]&lt;br /&gt;
* [[S15: Tilt Motion Controlled LED Alarm Clock]]&lt;br /&gt;
* [[S15: Alarm Based Coffee Maker]]&lt;br /&gt;
&lt;br /&gt;
=== [[CmpE244 Spring 2014 | Spring 2014]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
*  Senior Project: [[Project Advising: Remote Security System]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
* [[S14: Quadcopter]]&lt;br /&gt;
* [[S14: Smart Weather Clock]]&lt;br /&gt;
* [[S14: Divine WINd]]&lt;br /&gt;
* [[S14: Data Acquisition using CAN bus]]&lt;br /&gt;
* [[S14: E-Ink Display for Shopping Tags]]&lt;br /&gt;
* [[S14: Spectrum Analyzer for Audio Frequency Signals]]&lt;br /&gt;
* [[S14: CAN Firmware Uploader]]&lt;br /&gt;
* [[S14: Asset Management and Location System]]&lt;br /&gt;
* [[S14: Location  Tracker]]&lt;br /&gt;
* [[S14:  Androbot]]&lt;br /&gt;
* [[S14: Virtual Dog]]&lt;br /&gt;
* [[S14: Android based Automation]]&lt;br /&gt;
* [[S14: FaceTime Robo]]&lt;br /&gt;
* [[S14: Wireless Control Car]]&lt;br /&gt;
* [[S14: Power Efficient Security Door System for Light-rail using CAN Bus]]&lt;br /&gt;
* [[S14: Android based home monitoring system]]&lt;br /&gt;
* [[S14: Need For Speed]]&lt;br /&gt;
&lt;br /&gt;
CmpE146&lt;br /&gt;
* [[S14: Hyperintelligent NFC Locker of the Future]]&lt;br /&gt;
* [[S14: Smart Planter]]&lt;br /&gt;
* [[S14: Modular Security System]]&lt;br /&gt;
* [[S14: Autonomous Control System]]&lt;br /&gt;
* [[S14: Anti-Crash Car]]&lt;br /&gt;
* [[S14: Tricopter]]&lt;br /&gt;
&lt;br /&gt;
=== [[CmpE240 Fall 2013 | Fall 2013]] ===&lt;br /&gt;
&lt;br /&gt;
* [[F13: POV Display]]&lt;br /&gt;
* [[F13: Line Following Robot]]&lt;br /&gt;
* [[F13: LED Display]]&lt;br /&gt;
* [[F13: Bulb Ramper]]&lt;br /&gt;
* [[F13: Garage Parking Assistant]]&lt;br /&gt;
* [[F13: Quadcopter]]&lt;br /&gt;
* [[F13: BarkMaster2000]]&lt;br /&gt;
* [[F13: Remote Control Car]]&lt;br /&gt;
* [[F13: Obstacle Avoidance Robot]]&lt;br /&gt;
* [[F13: Vehicle On Board Diagnostics]]&lt;br /&gt;
&lt;br /&gt;
=== [[CmpE146 Spring 2013 | Spring 2013]] ===&lt;br /&gt;
&lt;br /&gt;
* [[S13: 2D Plotter]]&lt;br /&gt;
* [[S13: Smart Cube]]&lt;br /&gt;
* [[S13: Garage Parking Aid]]&lt;br /&gt;
* [[S13: Smart Security]]&lt;br /&gt;
* [[S13: Door Alarm System]]&lt;br /&gt;
* [[S13: Solar Panel Tracker]]&lt;br /&gt;
&lt;br /&gt;
=== [[CmpE146 Fall 2012|Fall 2012]] ===&lt;br /&gt;
&lt;br /&gt;
* [[F12: Evil Watchdog]]&lt;br /&gt;
* [[F12: Smart Bulb]]&lt;br /&gt;
* [[F12: All Your Base are Belong to You]]&lt;br /&gt;
* [[F12: Android Controlled MP3]]&lt;br /&gt;
* [[F12: Unified Wireless Health Monitoring System]]&lt;br /&gt;
* [[F12: OBD-II Android Monitor]]&lt;br /&gt;
* [[F12: Self-Driving GPS Following Car]]&lt;br /&gt;
* [[F12: Android Door Lock]]&lt;br /&gt;
&lt;br /&gt;
=== [[CmpE146 Spring 2012|Spring 2012]] ===&lt;br /&gt;
*  [[S12: FreeRTOS based QuadCopter]]&lt;br /&gt;
*  [[S12: Web-based MP3 Player]]&lt;br /&gt;
*  [[S12: Self Drive Car]]&lt;br /&gt;
*  [[S12: VAndroid]]&lt;br /&gt;
*  [[S12: Traffic Light Sensing Vehicle]]&lt;br /&gt;
*  [[S12: Sound Reader]]&lt;br /&gt;
*  [[S12: Remote Controlled MP3 Player]]&lt;br /&gt;
*  [[S12: Android Controlled Robot]]&lt;br /&gt;
*  [[S12: Eyes-Free GPS]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handy References ==&lt;br /&gt;
*  [[Sample Project Report]]&lt;br /&gt;
*  [[Project Proposal Guidelines]]&lt;br /&gt;
*  [[CmpE146 Lab. Resources]]&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65403</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65403"/>
				<updated>2021-05-29T05:36:31Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture with '''Preet''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;brown&amp;quot;&amp;gt; Deferred&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
*The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
*We initially used GLCD which was configured via GPIOs and it was working perfectly. Hence we created our PCB as per this LCD. But, while testing our car with various speeds and PID logic, it got toppled and damaged the LCD. So, we had to change to SJ Valley LCD, which was configured via the UART interface, at the last moment. So, we used the same location on the PCB to place the LCD and soldered wires below PCB. Hence, this correction was not visible on our end product.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;br /&gt;
http://socialledge.com/sjsu/index.php/Industrial_Application_using_CAN_Bus&lt;br /&gt;
&amp;lt;Br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65401</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65401"/>
				<updated>2021-05-29T05:33:51Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture with '''Preet''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
*The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
*We initially used GLCD which was configured via GPIOs and it was working perfectly. Hence we created our PCB as per this LCD. But, while testing our car with various speeds and PID logic, it got toppled and damaged the LCD. So, we had to change to SJ Valley LCD, which was configured via the UART interface, at the last moment. So, we used the same location on the PCB to place the LCD and soldered wires below PCB. Hence, this correction was not visible on our end product.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;br /&gt;
http://socialledge.com/sjsu/index.php/Industrial_Application_using_CAN_Bus&lt;br /&gt;
&amp;lt;Br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65400</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65400"/>
				<updated>2021-05-29T05:33:02Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture with '''Preet''']]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
*The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
*We initially used GLCD which was configured via GPIOs and it was working perfectly. Hence we created our PCB as per this LCD. But, while testing our car with various speeds and PID logic, it got toppled and damaged the LCD. So, we had to change to SJ Valley LCD, which was configured via the UART interface, at the last moment. So, we used the same location on the PCB to place the LCD and soldered wires below PCB. Hence, this correction was not visible on our end product.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;br /&gt;
http://socialledge.com/sjsu/index.php/Industrial_Application_using_CAN_Bus&lt;br /&gt;
&amp;lt;Br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65398</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65398"/>
				<updated>2021-05-29T05:30:34Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
*The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
*We initially used GLCD which was configured via GPIOs and it was working perfectly. Hence we created our PCB as per this LCD. But, while testing our car with various speeds and PID logic, it got toppled and damaged the LCD. So, we had to change to SJ Valley LCD, which was configured via the UART interface, at the last moment. So, we used the same location on the PCB to place the LCD and soldered wires below PCB. Hence, this correction was not visible on our end product.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;br /&gt;
http://socialledge.com/sjsu/index.php/Industrial_Application_using_CAN_Bus&lt;br /&gt;
&amp;lt;Br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65397</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65397"/>
				<updated>2021-05-29T05:29:54Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
*The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
*We initially used GLCD which was configured via GPIOs and it was working perfectly. Hence we created our PCB as per this LCD. But, while testing our car with various speeds and PID logic, it got toppled and damaged the LCD. So, we had to change to SJ Valley LCD, which was configured via the UART interface, at the last moment. So, we used the same location on the PCB to place the LCD and soldered wires below PCB. Hence, this correction was not visible on our end product.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65396</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65396"/>
				<updated>2021-05-29T05:28:17Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Frequent noisy measurements: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
*The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
*We initially used GLCD which was configured via GPIOs and it was working perfectly. Hence we created our PCB as per this LCD. But, while testing our car with various speeds and PID logic, it got toppled and damaged the LCD. So, we had to change to SJ Valley LCD, which was configured via the UART interface, at the last moment. So, we used the same location on the PCB to place the LCD and soldered wires below PCB. Hence, this correction was not visible on our end product.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65395</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65395"/>
				<updated>2021-05-29T05:28:05Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Technical Challenges */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
*The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
*We initially used GLCD which was configured via GPIOs and it was working perfectly. Hence we created our PCB as per this LCD. But, while testing our car with various speeds and PID logic, it got toppled and damaged the LCD. So, we had to change to SJ Valley LCD, which was configured via the UART interface, at the last moment. So, we used the same location on the PCB to place the LCD and soldered wires below PCB. Hence, this correction was not visible on our end product.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65388</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65388"/>
				<updated>2021-05-29T05:23:47Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Parts List &amp;amp; Cost */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 1&lt;br /&gt;
| $26.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $55.94&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65374</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65374"/>
				<updated>2021-05-29T05:18:32Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Parts List &amp;amp; Cost */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| Acrylic Sheet&lt;br /&gt;
| Tap Plastic&lt;br /&gt;
| 12&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| Battery&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B07LGZGG7T?ref=ppx_pop_mob_ap_share]&lt;br /&gt;
| 26.99&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| Traxxas Battery and Charger&lt;br /&gt;
| Amazon[https://www.amazon.com/dp/B074FXXP5J/ref=cm_sw_r_wa_api_glt_fabc_TQCR9J50NFX7VYE33PWB?_encoding=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 55.94&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65367</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65367"/>
				<updated>2021-05-29T05:12:45Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo And Bridge Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65366</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65366"/>
				<updated>2021-05-29T05:12:30Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65364</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65364"/>
				<updated>2021-05-29T05:12:10Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Roadster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65362</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65362"/>
				<updated>2021-05-29T05:11:49Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Roadster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|700px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65360</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65360"/>
				<updated>2021-05-29T05:11:38Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|500px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo and Bridge Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65359</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65359"/>
				<updated>2021-05-29T05:11:22Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Roadster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
&lt;br /&gt;
[[File:Side view Roadster.png|left|thumb|500px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=File:Side_view_Roadster.png&amp;diff=65358</id>
		<title>File:Side view Roadster.png</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=File:Side_view_Roadster.png&amp;diff=65358"/>
				<updated>2021-05-29T05:10:49Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65356</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65356"/>
				<updated>2021-05-29T05:10:47Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Geographical Controller */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical And Bridge Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65355</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65355"/>
				<updated>2021-05-29T05:09:56Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Communication Bridge Controller &amp;amp; LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65347</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65347"/>
				<updated>2021-05-29T05:04:22Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:gifroadster.gif|right|thumb|300px| Roadster]]&lt;br /&gt;
&lt;br /&gt;
== Roadster ==&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65346</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65346"/>
				<updated>2021-05-29T05:03:46Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Roadster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65345</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65345"/>
				<updated>2021-05-29T05:03:33Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65344</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65344"/>
				<updated>2021-05-29T05:03:12Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65342</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65342"/>
				<updated>2021-05-29T05:02:52Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
*Integration Testing&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
*Wiki Page Update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Gitlab]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65332</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65332"/>
				<updated>2021-05-29T04:59:39Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Software Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
&lt;br /&gt;
[[File:FlowChartDriverNode.png|thumb|1000px|caption|center|Driver Node Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1200px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65331</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65331"/>
				<updated>2021-05-29T04:58:48Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Driver Node */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png|thumb|1000px|caption|center|Driver Node Obstacle Avoidance Logic]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
''[https://gitlab.com/srikarreddy.narapureddy/roadster-app  Repository for Android App]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65327</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65327"/>
				<updated>2021-05-29T04:56:19Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* &lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;red&amp;quot;&amp;gt; Incomplete&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65326</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65326"/>
				<updated>2021-05-29T04:56:08Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* &lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
*&lt;br /&gt;
* &lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65325</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65325"/>
				<updated>2021-05-29T04:54:41Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master  Gitlab]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/  LinkedIn]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/  LinkedIn]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/  LinkedIn]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/  LinkedIn]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/  LinkedIn]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Provide ECU names and members responsible&amp;gt;&lt;br /&gt;
&amp;lt;One member may participate in more than one ECU&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sensor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Geo Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Driver Node&lt;br /&gt;
** [https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node DriverNode Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
* Motor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Android Application&lt;br /&gt;
** [https://gitlab.com/srikarreddy.narapureddy/roadster-app Android App Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* &lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
*&lt;br /&gt;
* &lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65324</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65324"/>
				<updated>2021-05-29T04:53:36Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master]'''&lt;br /&gt;
&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Provide ECU names and members responsible&amp;gt;&lt;br /&gt;
&amp;lt;One member may participate in more than one ECU&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sensor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Geo Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Driver Node&lt;br /&gt;
** [https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node DriverNode Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
* Motor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Android Application&lt;br /&gt;
** [https://gitlab.com/srikarreddy.narapureddy/roadster-app Android App Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* &lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
*&lt;br /&gt;
* &lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65322</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65322"/>
				<updated>2021-05-29T04:53:03Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roadster GitLab - [https://gitlab.com/nimit.patel/roadster/-/tree/master]'''&lt;br /&gt;
'''Tejas Pidwalkar [https://www.linkedin.com/in/tejaspidkalwar/]'''&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
'''Nimit Patel [https://www.linkedin.com/in/nimit393/]'''&lt;br /&gt;
*Geo Node &lt;br /&gt;
'''Tirth Pandya [https://www.linkedin.com/in/tirthpandya/]'''&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
'''Srikar Reddy [https://www.linkedin.com/in/srikar-narapureddy/]'''&lt;br /&gt;
*Android Application&lt;br /&gt;
'''Sourab Gupta [https://www.linkedin.com/in/sourab-gupta-52b18553/]'''&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Provide ECU names and members responsible&amp;gt;&lt;br /&gt;
&amp;lt;One member may participate in more than one ECU&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sensor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Geo Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Driver Node&lt;br /&gt;
** [https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node DriverNode Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
* Motor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Android Application&lt;br /&gt;
** [https://gitlab.com/srikarreddy.narapureddy/roadster-app Android App Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* &lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
*&lt;br /&gt;
* &lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65316</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65316"/>
				<updated>2021-05-29T04:48:09Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tejas Pidwalkar&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
Nimit Patel&lt;br /&gt;
*Geo Node &lt;br /&gt;
Tirth Pandya&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
Srikar Reddy&lt;br /&gt;
*Android Application&lt;br /&gt;
Sourab Gupta&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Provide ECU names and members responsible&amp;gt;&lt;br /&gt;
&amp;lt;One member may participate in more than one ECU&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sensor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Geo Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Driver Node&lt;br /&gt;
** [https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node DriverNode Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
* Motor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Android Application&lt;br /&gt;
** [https://gitlab.com/srikarreddy.narapureddy/roadster-app Android App Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* &lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
*&lt;br /&gt;
* &lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	<entry>
		<id>http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65314</id>
		<title>S21: Roadster</title>
		<link rel="alternate" type="text/html" href="http://socialledge.com/sjsu/index.php?title=S21:_Roadster&amp;diff=65314"/>
				<updated>2021-05-29T04:47:46Z</updated>
		
		<summary type="html">&lt;p&gt;Proj user12: /* Team Members &amp;amp; Responsibilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Roadster ==&lt;br /&gt;
[[File:gifroadster.gif|left|thumb|600px| Roadster]]&lt;br /&gt;
[[File:Roadsterportrait.jpeg|right|thumb|500px| Roadster]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:System_design_roadster.png|center|800px| System Design]]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
Roadster is a battery powered autonomous car, that drives itself to a specified destination and avoids any obstacles that comes its way. The car infrastructure has four Nodes (Geo, Sensor, Driver and Motor) that communicate over the CAN bus and an android application interface to set the destination location. In order to make an informed decision the car processes Geo and Sensor Node’s data which is used to steer the car in the right direction.&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
The project was divided into 5 modules:&lt;br /&gt;
&lt;br /&gt;
* Sensor Node- Detecting obstacles in the vicinity of the car to avoid hitting the obstacle and maneuver around the same.&lt;br /&gt;
* Geo Node- Provide heading for car to reach destination. Communicate over blue tooth with mobile application. Battery state.&lt;br /&gt;
* Driver Node- Manipulate turn angles and forward/reverse speed based on the inputs from Sensor and Geo nodes&lt;br /&gt;
* Motor Node- PID control logic to attain the said speed/direction desired by driver node.&lt;br /&gt;
* Android Application- Dashboard for real time data from car. Send instruction such as destination, way points and start/stop.&lt;br /&gt;
&lt;br /&gt;
=== Team Members &amp;amp; Responsibilities ===&lt;br /&gt;
&lt;br /&gt;
[[File:Team Picture 2.jpeg|thumb|550px|caption|left|Team Picture]]&lt;br /&gt;
[[File:Team picture 1.jpeg|thumb|550px|caption|center|Team Picture]]&lt;br /&gt;
&lt;br /&gt;
Tejas Pidwalkar&lt;br /&gt;
*Sensor Node&lt;br /&gt;
*Driver Node&lt;br /&gt;
Nimit Patel&lt;br /&gt;
*Geo Node &lt;br /&gt;
Tirth Pandya&lt;br /&gt;
*Motor Node&lt;br /&gt;
*PCB design &lt;br /&gt;
Srikar Reddy&lt;br /&gt;
*Android Application&lt;br /&gt;
Sourab Gupta&lt;br /&gt;
*Driver Node&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/nimit.patel/roadster/-/tree/master Gitlab Repository]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Provide ECU names and members responsible&amp;gt;&lt;br /&gt;
&amp;lt;One member may participate in more than one ECU&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sensor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Geo Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Driver Node&lt;br /&gt;
** [https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node DriverNode Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
* Motor Node&lt;br /&gt;
** Link to Gitlab user1&lt;br /&gt;
&lt;br /&gt;
* Android Application&lt;br /&gt;
** [https://gitlab.com/srikarreddy.narapureddy/roadster-app Android App Gitlab Repository]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Week#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Start Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| End Date&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Task&lt;br /&gt;
! scope=:col&amp;quot;| Actual Completion&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Status&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1 &lt;br /&gt;
03/01 to 03/07 &lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''Start of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 03/01&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/05&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/07&lt;br /&gt;
|&lt;br /&gt;
* Study and discuss previous project reports&lt;br /&gt;
* Brainstorm on the requirements for the project&lt;br /&gt;
* Identify and order/purchase the required components &lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
*&amp;lt;font color = &amp;quot;maroon&amp;quot;&amp;gt; 03/09&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
03/08 to 03/14&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/11&lt;br /&gt;
* 03/12&lt;br /&gt;
|&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/08&lt;br /&gt;
* 03/14&lt;br /&gt;
* 03/14&lt;br /&gt;
|&lt;br /&gt;
* Create and setup Gitlab Repository&lt;br /&gt;
* Create and setup Confluence for document collaboration&lt;br /&gt;
* Study the datasheets and manual of acquired components&lt;br /&gt;
* Distribute initial roles among the team members&lt;br /&gt;
|&lt;br /&gt;
* 03/04&lt;br /&gt;
* 03/07&lt;br /&gt;
* 03/17&lt;br /&gt;
* 03/15&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
03/15 to 03/21&lt;br /&gt;
|&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/15&lt;br /&gt;
* 03/19&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/15&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/18&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/27&lt;br /&gt;
|&lt;br /&gt;
* Interface ultrasonic sensors and test the functionality &lt;br /&gt;
* Interface GPS and Compass and test the functionality&lt;br /&gt;
* Analyze and decide the hardware placement of the RC Car&lt;br /&gt;
* Create SENSOR and DRIVER nodes to transmit and receive data&lt;br /&gt;
* Identify the Android app requirements and start studying the Android framework&lt;br /&gt;
|&lt;br /&gt;
* 03/18&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt; 03/22 &amp;lt;/font&amp;gt;&lt;br /&gt;
* 03/20&lt;br /&gt;
* 03/21&lt;br /&gt;
* 03/25&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
03/22 to 03/28&lt;br /&gt;
|&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/22&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/27&lt;br /&gt;
* 03/22&lt;br /&gt;
|&lt;br /&gt;
* 03/25&lt;br /&gt;
* 03/24&lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/31&lt;br /&gt;
* 03/28&lt;br /&gt;
|&lt;br /&gt;
* Create the GEO node to get coordinates and cardinal directions from GPS and Compass &lt;br /&gt;
* Interface the Bluetooth module to communicate with SJ-two board&lt;br /&gt;
* Create the MOTOR node to drive the RC Car&lt;br /&gt;
* Start designing the DBC file&lt;br /&gt;
* Develop an initial version of the Android app&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;03/24&amp;lt;/font&amp;gt; &lt;br /&gt;
* &lt;br /&gt;
* 03/28&lt;br /&gt;
* 03/30&lt;br /&gt;
* 03/28&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
03/29 to 04/04&lt;br /&gt;
&amp;lt;font color = &amp;quot;sienna&amp;quot;&amp;gt; ''End of Phase 1''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/02&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/29&lt;br /&gt;
* 03/31&lt;br /&gt;
* 04/03&lt;br /&gt;
|&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/01&lt;br /&gt;
* 04/03&lt;br /&gt;
* 04/04&lt;br /&gt;
|&lt;br /&gt;
* Finalize the DBC file &lt;br /&gt;
* Design obstacle avoidance and steering logic on the DRIVER node&lt;br /&gt;
* Design motor driving logic on the MOTOR node with the encoder&lt;br /&gt;
* Interface the LCD module with the DRIVER node to display messages&lt;br /&gt;
* Integrate sensor data on the SENSOR node&lt;br /&gt;
* '''Collective Test 1:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt; '''Integrate all the completed modules and test on BusMaster''' &amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;font color = 'maroon&amp;gt;04/05&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/01&lt;br /&gt;
*&lt;br /&gt;
* &lt;br /&gt;
* &amp;lt;font color = 'maroon'&amp;gt;04/04&amp;lt;/font&amp;gt;&lt;br /&gt;
* 04/04&lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;blue&amp;quot;&amp;gt; ''In Progress''&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
*&amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt; Completed&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
04/05 to 04/11&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''Start of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/05&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
|&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/08&lt;br /&gt;
* 04/10&lt;br /&gt;
* 04/11&lt;br /&gt;
|&lt;br /&gt;
* Tune the SENSOR and DRIVER nodes to drive the RC car&lt;br /&gt;
* Communicate to the DRIVER node over Bluetooth via Android app&lt;br /&gt;
* Debug and revise the integrated modules with necessary improvements&lt;br /&gt;
* '''Collective Test 2''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Drive the car to a hardcoded GPS destination'''&amp;lt;/font color&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
04/12 to 04/18&lt;br /&gt;
|&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/12&lt;br /&gt;
* 04/17&lt;br /&gt;
|&lt;br /&gt;
* 04/15&lt;br /&gt;
* 04/18&lt;br /&gt;
* 04/16&lt;br /&gt;
* 04/18&lt;br /&gt;
|&lt;br /&gt;
* Integrate GEO node to DRIVER node for navigation&lt;br /&gt;
* Design driving decision logic based on the navigation data&lt;br /&gt;
* Design a dashboard on the LCD to display the values&lt;br /&gt;
* '''Collective Test 3''':&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the car driving with navigation data from the Android app'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
04/19 to 04/25&lt;br /&gt;
&amp;lt;font color = &amp;quot;magenta&amp;quot;&amp;gt;''End of Phase 2''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
* 04/19&lt;br /&gt;
|&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
* 04/25&lt;br /&gt;
|&lt;br /&gt;
* Add functionalities to display various sensor data on the Android app&lt;br /&gt;
* Design and 3D print the required components&lt;br /&gt;
* Design and order PCB&lt;br /&gt;
* Test and improve the RC car performance based on the changes &lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
04/26 to 05/02&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''Start of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 04/26&lt;br /&gt;
* 05/01&lt;br /&gt;
|&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 04/30&lt;br /&gt;
* 05/02&lt;br /&gt;
|&lt;br /&gt;
* Design individual architecture diagrams and algorithms for documentation&lt;br /&gt;
* Make any necessary improvements based on previous test results&lt;br /&gt;
* Complete the final version of the Android app&lt;br /&gt;
* '''Collective Test 4:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test car on various terrains and slopes'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
| &lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
05/03 to 05/09&lt;br /&gt;
|&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/03&lt;br /&gt;
* 05/08&lt;br /&gt;
|&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/07&lt;br /&gt;
* 05/09&lt;br /&gt;
|&lt;br /&gt;
* Replace the circuits with their corresponding PCBs and assemble&lt;br /&gt;
* Complete the RC Car structure and assembly with the 3D printed parts - Prototype 1&lt;br /&gt;
* Refactor the code modules with necessary improvements&lt;br /&gt;
* '''Collective Test 5:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Test the Prototype 1 with the aim of sending the car to return Preet's PCAN Dongle'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
05/10 to 05/16&lt;br /&gt;
&amp;lt;font color = &amp;quot;Tomato&amp;quot;&amp;gt;''End of Phase 3''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/10&lt;br /&gt;
* 05/15&lt;br /&gt;
|&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
* 05/16&lt;br /&gt;
|&lt;br /&gt;
* Revise and improve the wiki report to cover all the aspects of design and implementation&lt;br /&gt;
* Fix all the errors and make improvements&lt;br /&gt;
* Final testing of all the modules and car&lt;br /&gt;
* '''Collective Test 6:'''&amp;lt;font color = &amp;quot;DarkGreen&amp;quot;&amp;gt;''' Have the final version of the project tested with all the functionalities'''&amp;lt;/font color&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
* &lt;br /&gt;
|&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
*&amp;lt;font color = &amp;quot;gray&amp;quot;&amp;gt; N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parts List &amp;amp; Cost ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Item#&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Part Desciption&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Qty&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Cost&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
| RC Car &lt;br /&gt;
| Traxxas [https://www.amazon.com/gp/product/B07DFXN118/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 1&lt;br /&gt;
| $250.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
| CAN Transceivers MCP2551-I/P&lt;br /&gt;
| Comimark [https://www.amazon.com/Comimark-Transceiver-TJA1050-Controller-Schnittstelle/dp/B07W4VZ2F2/ref=sr_1_4?crid=L6PXVWD9BFTN&amp;amp;dchild=1&amp;amp;keywords=can+transceiver&amp;amp;qid=1621786818&amp;amp;sprefix=can+trans%2Caps%2C566&amp;amp;sr=8-4]&lt;br /&gt;
| 5&lt;br /&gt;
| $7.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
| Ultrasonic Sensors&lt;br /&gt;
| Max Botix[https://www.amazon.com/gp/product/B07Q588SBP/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;amp;psc=1]&lt;br /&gt;
| 5&lt;br /&gt;
| $150.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
| GPS and Antenna&lt;br /&gt;
| Adafruit[https://www.amazon.com/Adafruit-Ultimate-GPS-Breakout-External/dp/B00I6LZW4O/ref=sr_1_7?dchild=1&amp;amp;keywords=adafruit+gps&amp;amp;qid=1622071143&amp;amp;sr=8-7]&lt;br /&gt;
| 1&lt;br /&gt;
| $60.00&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
| HC05 bluetooth RF Transreceiver&lt;br /&gt;
| HiLetgo[https://www.amazon.com/HiLetgo-Bluetooth-Transceiver-Integrated-Communication/dp/B07VL725T8/]&lt;br /&gt;
| 1&lt;br /&gt;
| $12.59&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
| Triple-axis Accelerometer&lt;br /&gt;
| Adafruit[https://www.adafruit.com/product/1120]&lt;br /&gt;
| 1&lt;br /&gt;
| $21.40&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
| Traxxas RPM Sensor&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-6520-RPM-Sensor-long/dp/B006IRXEZM]&lt;br /&gt;
| 1&lt;br /&gt;
| $12&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
| Discrete Electronic Components&lt;br /&gt;
| Generic[http://www.excesssolutions.com/]&lt;br /&gt;
| 1&lt;br /&gt;
| $28.75&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
| Buck-Boost Voltage Regulator&lt;br /&gt;
| Generic[https://www.amazon.com/Adjustable-Converter-Automatic-Voltage-Regulator/dp/B07NTXSJHB/]&lt;br /&gt;
| 1&lt;br /&gt;
| $11.99&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
| Traxxas Telemetry Trigger magnet &amp;amp; holder&lt;br /&gt;
| Traxxas[https://www.amazon.com/Traxxas-Telemetry-Trigger-Magnet-Holder/dp/B00864A3T0/]&lt;br /&gt;
| 1&lt;br /&gt;
| $6.35&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 13&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| 14&lt;br /&gt;
| &lt;br /&gt;
| Amazon[]&lt;br /&gt;
| 1&lt;br /&gt;
| $&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Printed Circuit Board  ==&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Schematic&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterSchematic.png|center|thumb|800px| Roadster Schematic]]&lt;br /&gt;
&amp;lt;h4&amp;gt;PCB Design&amp;lt;/h4&amp;gt;&lt;br /&gt;
[[File:RoadsterPCB.png|center | 1200px| Roadster PCB]]&lt;br /&gt;
&lt;br /&gt;
== CAN Communication ==&lt;br /&gt;
We use controller area network to broadcast data between the 4 nodes. All nodes are connected to each other through a physically conventional two wire bus. The wires are a twisted pair with 120 Ω resistors at each ends of the bus. 1s and 0s are transmitted as CAN High(0V difference) and Can Low(2v difference). &lt;br /&gt;
A CAN frame has the following contents:&lt;br /&gt;
* Data Length Code (4bits)&lt;br /&gt;
* Remote Transmission Request.&lt;br /&gt;
* ID extend bit.&lt;br /&gt;
* Message ID (11 bit or 29 bit)&lt;br /&gt;
* Data bytes( depends on DLC)&lt;br /&gt;
* CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Arbitration''': No two nodes will transmit at the same time because if arbitration. A lower Message-ID has a Higher priority on the CAN bus since 0 is the dominant bit.&lt;br /&gt;
&lt;br /&gt;
'''Bit Stuffing''': CAN bus stuffs extra bits when a long chain of multiple 1's or 0's occur to improve CAN integrity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Sr. No&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Message function&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Receivers&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Driver Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|300&lt;br /&gt;
|speed and steering direction for the motor.&lt;br /&gt;
|Motor&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|310&lt;br /&gt;
|Destination reached&lt;br /&gt;
|Sensor&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Sensor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|200&lt;br /&gt;
|Sensor sonars from front, back, left ,right sensor&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Motor Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|700&lt;br /&gt;
|motor speed, motor direction&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Geo and Bridge Controller&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|400&lt;br /&gt;
|Bearing, Heading and Distance&lt;br /&gt;
|Driver&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Debug messages&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|851&lt;br /&gt;
|Driver Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|811&lt;br /&gt;
|Motor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|801&lt;br /&gt;
|Sensor Debug&lt;br /&gt;
|SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
[[File:roadstercan.png|center|500px|thumb|CAN Bus Design]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DBC File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
VERSION &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NS_ :&lt;br /&gt;
	BA_&lt;br /&gt;
	BA_DEF_&lt;br /&gt;
	BA_DEF_DEF_&lt;br /&gt;
	BA_DEF_DEF_REL_&lt;br /&gt;
	BA_DEF_REL_&lt;br /&gt;
	BA_DEF_SGTYPE_&lt;br /&gt;
	BA_REL_&lt;br /&gt;
	BA_SGTYPE_&lt;br /&gt;
	BO_TX_BU_&lt;br /&gt;
	BU_BO_REL_&lt;br /&gt;
	BU_EV_REL_&lt;br /&gt;
	BU_SG_REL_&lt;br /&gt;
	CAT_&lt;br /&gt;
	CAT_DEF_&lt;br /&gt;
	CM_&lt;br /&gt;
	ENVVAR_DATA_&lt;br /&gt;
	EV_DATA_&lt;br /&gt;
	FILTER&lt;br /&gt;
	NS_DESC_&lt;br /&gt;
	SGTYPE_&lt;br /&gt;
	SGTYPE_VAL_&lt;br /&gt;
	SG_MUL_VAL_&lt;br /&gt;
	SIGTYPE_VALTYPE_&lt;br /&gt;
	SIG_GROUP_&lt;br /&gt;
	SIG_TYPE_REF_&lt;br /&gt;
	SIG_VALTYPE_&lt;br /&gt;
	VAL_&lt;br /&gt;
	VAL_TABLE_&lt;br /&gt;
&lt;br /&gt;
BS_:&lt;br /&gt;
&lt;br /&gt;
BU_: DRIVER MOTOR SENSOR GEO_AND_BRIDGE DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 200 SENSOR_SONARS: 5 SENSOR&lt;br /&gt;
 SG_ SENSOR_SONARS_left : 0|10@1+ (1,0) [0|800] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_right : 10|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_middle : 20|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
 SG_ SENSOR_SONARS_rear : 30|10@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 300 DRIVER_TO_MOTOR: 2 DRIVER&lt;br /&gt;
 SG_ MOTOR_speed : 0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; MOTOR&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; MOTOR&lt;br /&gt;
&lt;br /&gt;
BO_ 310 DRIVER_BROADCAST: 1 DRIVER&lt;br /&gt;
 SG_ DEST_reached : 0|8@1+ (1,0) [0|0] &amp;quot;flag&amp;quot; SENSOR &lt;br /&gt;
&lt;br /&gt;
BO_ 400 GEO_CONTROLLER_COMPASS: 6 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ HEADING : 0|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ BEARING : 12|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DRIVER&lt;br /&gt;
  SG_ DISTANCE : 24|17@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 401 GEO_CONTROLLER_COMPASS_DEBUG: 9 GEO_AND_BRIDGE&lt;br /&gt;
  SG_ WAYPOINT_COUNT : 0|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
  SG_ STATUS : 8|8@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ DISTANCE_TO_WAYPOINT : 16|12@1+ (0.01,0) [0|0] &amp;quot;Meters&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_TO_WAYPOINT : 28|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ BEARING_TO_WAYPOINT : 40|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ HEADING_RAW : 52|12@1+ (1,0) [0|359] &amp;quot;Degrees&amp;quot; DEBUG&lt;br /&gt;
  SG_ WAYPOINT_CURRENT : 64|8@1+ (1,0) [0|16] &amp;quot;&amp;quot; DEBUG&lt;br /&gt;
&lt;br /&gt;
BO_ 700 MOTOR_TO_DRIVER: 8 MOTOR&lt;br /&gt;
 SG_ MOTOR_speed:0|8@1+ (0.1,-12.5) [-12.5|12.5] &amp;quot;m/s&amp;quot; DRIVER&lt;br /&gt;
 SG_ MOTOR_direction : 8|7@1+ (1,-45) [-45|45] &amp;quot;degree&amp;quot; DRIVER&lt;br /&gt;
&lt;br /&gt;
BO_ 851 DRIVER_DEBUG_DATA: 1 DEBUG&lt;br /&gt;
 SG_ forwardDrivingState:0|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ reverseDrivingState: 2|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isRightSteeringPossible:4|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ isLeftSteeringPossible:6|2@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 &lt;br /&gt;
BO_ 801 SENSOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ LEFT_sensor_raw:0|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ RIGHT_sensor_raw: 16|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ FRONT_sensor_raw: 32|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ REAR_sensor_raw: 48|16@1+ (1,0) [0|0] &amp;quot;cm&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 811 MOTOR_DEBUG_DATA: 8 DEBUG&lt;br /&gt;
 SG_ MOTOR_rps_value:0|32@1+ (1,0) [0|0] &amp;quot;rps value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
 SG_ MOTOR_pwm_value:32|8@1+ (0.01,0) [0|0] &amp;quot;dc motor pwm value&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1000 DRIVER_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ DRIVER_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1100 MOTOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ MOTOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1200 SENSOR_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ SENSOR_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; MOTOR,DRIVER,GEO_AND_BRIDGE&lt;br /&gt;
&lt;br /&gt;
BO_ 1300 GEO_HEARTBEAT: 1 DRIVER&lt;br /&gt;
 SG_ GEO_HEARTBEAT_cmd : 0|8@1+ (1,0) [0|0] &amp;quot;&amp;quot; SENSOR,MOTOR,DRIVER&lt;br /&gt;
&lt;br /&gt;
CM_ BU_ DRIVER &amp;quot;The driver controller driving the car&amp;quot;;&lt;br /&gt;
CM_ BU_ MOTOR &amp;quot;The motor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BU_ SENSOR &amp;quot;The sensor controller of the car&amp;quot;;&lt;br /&gt;
CM_ BO_ 100 &amp;quot;Sync message used to synchronize the controllers&amp;quot;;&lt;br /&gt;
CM_ SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;Heartbeat command from the driver&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_ &amp;quot;BusType&amp;quot; STRING ;&lt;br /&gt;
BA_DEF_ BO_ &amp;quot;GenMsgCycleTime&amp;quot; INT 0 0;&lt;br /&gt;
BA_DEF_ SG_ &amp;quot;FieldType&amp;quot; STRING ;&lt;br /&gt;
&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;BusType&amp;quot; &amp;quot;CAN&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;FieldType&amp;quot; &amp;quot;&amp;quot;;&lt;br /&gt;
BA_DEF_DEF_ &amp;quot;GenMsgCycleTime&amp;quot; 0;&lt;br /&gt;
&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 100 1000;&lt;br /&gt;
BA_ &amp;quot;GenMsgCycleTime&amp;quot; BO_ 200 50;&lt;br /&gt;
BA_ &amp;quot;FieldType&amp;quot; SG_ 100 DRIVER_HEARTBEAT_cmd &amp;quot;DRIVER_HEARTBEAT_cmd&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
VAL_ 100 DRIVER_HEARTBEAT_cmd 2 &amp;quot;DRIVER_HEARTBEAT_cmd_REBOOT&amp;quot; 1 &amp;quot;DRIVER_HEARTBEAT_cmd_SYNC&amp;quot; 0 &amp;quot;DRIVER_HEARTBEAT_cmd_NOOP&amp;quot; ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sensor ECU ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
Gitlab link to Sensor Node Firmware: https://gitlab.com/nimit.patel/roadster/-/tree/Main/Sensor_Node&lt;br /&gt;
&lt;br /&gt;
The sensor controller node is responsible for interfacing with Ultrasonic sensors to know obstacles’ distance from the vehicle. We have used MaxBotix 1010 LV-EZ1 sensors for the right and left positions and MaxBotix 1000 LV-EZ0 sensor in the middle front position (To have a wider beam range of obstacle detection in blind spots). &lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node.png|center|800px|thumb|Sensor Controller Diagram]]&lt;br /&gt;
&lt;br /&gt;
Below is the beam pattern for both sensors.&lt;br /&gt;
&lt;br /&gt;
[[File:Beam_Pattern_MB1000_EZ0.gif|left|500px|thumb|Beam Pattern MaxBotix MB1000 EZ0]]&lt;br /&gt;
[[File:Beam_Pattern_MB1010_EZ1.gif|center|500px|thumb|Beam Pattern MaxBotix MB1010 EZ1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
==== Sensor Controller Schematic ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:SensorSch.png|center|800px|thumb|Sensor Controller Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Board Pin Connections ====&lt;br /&gt;
&lt;br /&gt;
Sensors are interfaced with combination of GPIO, ADC Pins on SJTWo board. Below is the descriptive pin layout:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center; width: 400px; height: 200px;&amp;quot;&lt;br /&gt;
|+ Sensors pin layout&lt;br /&gt;
|-&lt;br /&gt;
! Sr. No.&lt;br /&gt;
! SJTwo board Pin&lt;br /&gt;
! Maxbotix sensor Pin&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
! 1 &lt;br /&gt;
| ADC2-P0.25 || AN(Front sensor) || ADC input from front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| ADC3-P0.26 || AN(Rear Sensor) || ADC input from rear sensor&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ADC4-P1.30 || AN(Left Sensor) || ADC input from left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| ADC5-P1.31 || AN(Right Sensor) || ADC input from right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| GPIO-P0.6 || RX(Left Sensor) || Trigger for left sensor&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| GPIO-P0.7 || RX(Front Sensor) || Trigger for front sensor&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| GPIO-P0.8 || RX(Right Sensor) || Trigger for right sensor&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| GPIO-P0.9 || RX(Rear Sensor) || Trigger for rear sensor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Software Design &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
The sensor node mainly does two activity viz. 1) Read sensor values, 2) Transmit obstacle distance over CAN bus. Both of these activities happen in a 20Hz periodic callback. &lt;br /&gt;
&lt;br /&gt;
1. Read Sensor Values&lt;br /&gt;
&lt;br /&gt;
*  Sensors are mounted at four locations as mentioned below diagram. To read these sensor values, we initialized and configured 4 sensors using 4 ADCs viz ADC2, ADC3, ADC4, and ADC5. Considering the front 3 sensors' close proximity and possible beam interference, we decided to range extreme front sensors at a time and the middle front next in sequence while in a 20 Hz loop. And the rear sensor is triggered regularly. All the sensor values are digitally converted in the range of 0 to 4096 (12 bit ADC). These values are converted to distance format in centimeter unit using formula '''conv_val = (raw_val * 0.3182) - 0.3959'''.&lt;br /&gt;
[[File:Sensor_placement.png|center|400px|thumb|Sensors Placement location]]&lt;br /&gt;
&lt;br /&gt;
*  Now, to avoid frequent noise pulses, we used a median filter. We created an array of 10 elements for each sensor and maintained a write index to track the current update position. Thus, all read values have been updated in the buffer which acts as a circular buffer as we start overwriting from the start index.&lt;br /&gt;
&lt;br /&gt;
2.  Transmit obstacle distance over CAN bus:&lt;br /&gt;
&lt;br /&gt;
*  Sensor node is responsible for broadcasting all four sensor values in terms of distance in centimeter over CAN bus. To broadcast filtered values, it first sorts the existing values in the respective allocated sensor buffer. Then it takes the mean of five median values. It does the same thing for all four sensors. Finally, it transmits those values over CAN bus. Below flow chart gives the detailed flow of code at a high level.&lt;br /&gt;
&lt;br /&gt;
[[File:Sensor_Node_flow_chart.png|center|600px|thumb|Sensor Node Controller Flow Chart]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font color=&amp;quot;0000FF&amp;quot;&amp;gt;Technical Challenges &amp;lt;/font&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==== Neighboring Sensor Interference: ====&lt;br /&gt;
*  As explained above, we have mounted three ultrasonic sensors in the front, and those were configured to range in continuous mode, in which sensors were continuously measuring distance by transmitting beam. Out of 3, the middle sensor is of type with wider beam to detect blind spots ahead.&lt;br /&gt;
*  Most of the time, we observed that the obstacle in the middle sensor range used also gets detected by the left/right sensor, which disturbs driving logic. This used to happen due to sensor beam interference among three sensors.&lt;br /&gt;
*  To solve this problem, we decided to trigger sensor beams in such time intervals that they won’t interfere with neighboring ones. We used the Rx pin of the sensor to trigger ranging and scheduled to trigger left and right sensor at one time and middle sensor next time. This sequence helped us avoid interference altogether.&lt;br /&gt;
&lt;br /&gt;
==== Frequent noisy measurements: ====&lt;br /&gt;
*  While reading the obstacle distance, it used to change suddenly to some random value, and that used to disturb driving logic. To get noise-free readings from sensors, we implemented a median filter. All the read values from sensors have been collected in the respective buffer of 10 elements. While sending obstacle distance on CAN bus, the median filter sort the buffer and takes an average of 5 median values. This way, it helped us to remove almost all noisy values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motor ECU ==&lt;br /&gt;
[[File:MotorSch.png|center|800px|thumb| Motor Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:XL5esc.png|300px|thumb|left|Traxass ESC XL5]]&lt;br /&gt;
[[File:Servotrx.jpg|300px|right|thumb|Traxass Servo Motor]]&lt;br /&gt;
[[File:Rpmsens.jpg|300px|center|thumb|Traxass RPM Sensor]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The motor node(SJ-2) interfaces primarily interfaces with:&lt;br /&gt;
* Traxass Motor ESC over PWM&lt;br /&gt;
* Traxass RPM Sensor over GPIO Interrupt&lt;br /&gt;
* Traxass Servo Motor over PWM&lt;br /&gt;
&lt;br /&gt;
All these three components have 3 pins each. The functionalities of these pins are mentioned in the table below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Module&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Black&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Red&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| White&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| ESC&lt;br /&gt;
| Ground&lt;br /&gt;
| Vout : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| Servo&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| PWM Input&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| RPM Sensor&lt;br /&gt;
| Ground&lt;br /&gt;
| Vin : 6 V&lt;br /&gt;
| Pulse Output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&lt;br /&gt;
The motor node acts based on the speed and direction received over CAN bus from the Driver Node. The positive speed values are treated as forward motion and the negative speed values are considered to be the reverse motion of the RC car.&lt;br /&gt;
&lt;br /&gt;
The steering angles are divided into 5-degree segments and the motor node sends the pre-defined pwm duty cycle of the particular segment to the servo motor depending on the angle value received from the driver node.&lt;br /&gt;
&lt;br /&gt;
[[File:Flowchartmotor.png|800px|thumb|center|Motor Node - Software Flowchart]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* Firstly, the Traxxas motor ESC and other Traxass parts are members of the Traxxas Hobby Parts family, and they are not intended for development purposes. This is why there are no technical specification documents or any program/development guides available. One needs to test the motor ESC by feeding the PWM duty cycles in various sequences at various duty cycle percentages. We used the Remote control to reproduce some scenarios where the ESC was behaving unexpectedly. &lt;br /&gt;
* The ESC configuration changes to the Lipo battery state if the Lipo battery is used. If one switches back to the NiMH battery, then the ESC starts flashing the led in a green-red repeated sequence, and the ESC power button stops working. In this scenario, there is a calibration process that can save your boat and can make the ESC function normally again. Follow this procedure : [https://www.youtube.com/watch?v=1br9_h1OsV8 ESC Calibration]&lt;br /&gt;
*Another challenge with the motor node program development is that you cannot rely on unit testing. Whoever works on the motor node, should make sure that the sequence of the duty cycles being fed to the ESC produces the expected results on the motor as well. The forward-reverse transitioning and the speed controlling both can be a bit tricky. Also, the hard brake logic can take a while to get working properly.&lt;br /&gt;
* Some useful reference values for the ESC are : 15% -&amp;gt; Neutral; 15.8%-&amp;gt; Minimum forward speed, 10%-&amp;gt;Full reverse speed.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geographical Controller ==&lt;br /&gt;
&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster/-/merge_requests/5 Repository link for Geo Controller]''&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
[[File:GeoSch.png|650px|thumb|center|Geo Node Schematic]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Hc05.jpeg|400px|thumb|left|Bluetooth Trans-receiver]]&lt;br /&gt;
[[File:GPS.jpg|400px|thumb|right|GPS Module]]&lt;br /&gt;
[[File:compass_roadster.jpg|400px|thumb|center|3 Axis Magnetometer (eCompass)]]&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
[[File:Votlage Divider.jpg|400px|thumb|right|Battery Monitoring]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The SJ2 board communicates with:&lt;br /&gt;
* Bluettoth transreceiver over UART&lt;br /&gt;
* LSM303DLHC over I2C&lt;br /&gt;
* GPS model over UART&lt;br /&gt;
* Battery monitoring &lt;br /&gt;
&lt;br /&gt;
Considering the orientation of the car changes as it travel along the land, tilt compensation logic for heading calculation using the magnetometer is a must for accurate measurement. Without the tilt compensation algorithm which uses the onboard accelorometer, the heading computation can have error up to 60 degrees, which has the potential to send the car off course.&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
For battery monitoring, the values for the voltage divider should be chosen such that the full range of the onboard ADC can be efficiently used. Depending one the cell type of the battery, the discharge curve can be use to map the charge state corresponding to voltage level. This method has its flaws and sophisticated techniques involving Coulomb count yields far better results, however, the technique discussed above suffices the needs of our project. Charge state of battery transmitted over Mobile app, greatly facilitates the charging schedule while testing and final demo day.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The periodic scheduler for Geo Controller Node does the following functionalities:&lt;br /&gt;
*  In 10Hz periodic callback:&lt;br /&gt;
** gps__update() : Fetch GPS data from GPS controller.&lt;br /&gt;
** geo_compass__periodic_send() : Reads the Magnetometer and accelerometer values from Compass controller and convert those to current heading data.&lt;br /&gt;
*  In 100Hz periodic callback:&lt;br /&gt;
** bluetooth__run_once() : Send specified data to android application via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
The GEO controller is divided into 5 parts.&lt;br /&gt;
&lt;br /&gt;
*The current location of the car is determined using the GPS.&lt;br /&gt;
&lt;br /&gt;
*The current magnetic heading of car is determined using the on board compass.&lt;br /&gt;
&lt;br /&gt;
*The way point calculation determines the nearest way point continuously by computing the distance using Haversine formula and current location using GPS.&lt;br /&gt;
&lt;br /&gt;
*The heading is also computed using the Haversine formula and the difference between the actual and required is sent over the CAN bus for heading correction.&lt;br /&gt;
&lt;br /&gt;
*Alternatively, once the car is within the threshold distance, next way point is selected and the car heads to the next way point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Geo logic.png|800px|thumb|center|Heading computation from geographical (Geo) controller]]&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
* The GPS module sends data at 9600 baud rate, updating the data every one second. The data update rate needs to be updated to 10Hz for fast maneuvering and course correction of the car. If the update frequency is updated, the data sent over the UART is higher than it can handle in 10Hz periodic function. Hence, only GPGGA messages should be enabled to extract the required data and reduce the time spent in parsing the incoming string. NEMA (PMTK) messages should be correctly configured on the module for desired functioning.&lt;br /&gt;
* Heading calculation without the tilt compensation logic using the onboard accelorometer of LSM303 is in accurate. Reading accelorometer values requires and offset of 0x80 to the byte addressing of the accelorometer read. Magnetometer need no such offset. This is weird, considering both the I2C devices reside on the same physical chip.&lt;br /&gt;
*Using data type as float as opposed to double, utilizes the onboard FPU, which is faster. Double utilizes software implementation, which takes more clock cycle. Considering extensive use of math library in distance/heading measurement and tilt compensation algorithm, completing the task with the periodic is of at most importance.&lt;br /&gt;
* GPS fix is best when when there are no obstruction above the module. Module requires clear wide view of sky for a fast fix and error free location detection. &lt;br /&gt;
* LSM303DLHC is sensitive to even weak magnetic field interference. Place the chip devoid of such active/passive magnetic fields.&lt;br /&gt;
* Calibrating LSM303 is a must to get accurate heading values. 2-point calibration worked just fine for our team. More sophisticated methods are available too.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication Bridge Controller &amp;amp; LCD ==&lt;br /&gt;
&amp;lt;Picture and link to Gitlab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
&amp;lt;List the code modules that are being called periodically.&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt; List of problems and their detailed resolutions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
== Driver Node ==&lt;br /&gt;
https://gitlab.com/nimit.patel/roadster/-/tree/Main/Driver_Node&lt;br /&gt;
&lt;br /&gt;
=== Hardware Design ===&lt;br /&gt;
The Driver Node has one peripheral connected to it and that is the LCD screen.&lt;br /&gt;
&lt;br /&gt;
[[File:Driver_Node_HW_Design.png|thumb|700px|caption|left|Driver Node Schematic]]&lt;br /&gt;
[[File:DriverSch.png|thumb|700px|caption|center|Driver Node Schematic]]&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
The driver node controls the logic of steering the car in the right direction based on the data received from the Sensor and Geo Nodes. The following flowchart describes that process.&lt;br /&gt;
*Driver Node Flow Chart&lt;br /&gt;
[[File:FlowChartDriverNode.png]]&lt;br /&gt;
&lt;br /&gt;
In case there are obstacles in the path where the car wants to move to, the following obstacle avoid logic would kick in.&lt;br /&gt;
*Driver Node Obstacle Avoidance Logic&lt;br /&gt;
[[File:ObstacleAvoidanceDriverNode.png]]&lt;br /&gt;
The work in the Driver Node is done using two different periodic tasks. Here is a description of those periodic tasks and what they do. &lt;br /&gt;
*1 Hz Loop:&lt;br /&gt;
**Transmit debug messages over the CAN bus&lt;br /&gt;
**Transmit messages on the LCD&lt;br /&gt;
**Transmit destination reached flag over the CAN Bus&lt;br /&gt;
*20 Hz Loop:&lt;br /&gt;
**Receive Sensor Data&lt;br /&gt;
**Receive Geo Data&lt;br /&gt;
**Process and Transmit Data(Motor Direction and Speed) to Motor Node&lt;br /&gt;
*LCD Interface&lt;br /&gt;
The LCD interface on the Driver is used to print some important information about the car. This is what it prints.&lt;br /&gt;
**Car Speed&lt;br /&gt;
**Distance from the Destination&lt;br /&gt;
**Car State (Car Stopped from the App, Car Moving, Destination Reached)&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
The Driver Node did not have much hardware interfaced on it apart from LCD. So from the hardware side there were no technical challenges. On the software front as well there were not many challenges as unit tests helped debug most of the issues then and there.&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mobile Application ==&lt;br /&gt;
We created a lightweight mobile app to navigate our car, It can communicate with the car via Bluetooth and is capable of sending Destination co-ordinates along with checkpoints. Receive and Update live location on Google Maps, send Start, Stop and Clear commands, Receive and Display Debug Data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt; &lt;br /&gt;
 &amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:Roadsterintro.jpeg|thumb|none|220px| Splash screen]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp1.jpg|thumb|none|220px| Data from roadster]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;[[File:roadsterapp2.jpg|thumb|none|220px| Checkpoints]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===User Interface===&lt;br /&gt;
The app has minimal buttons on the same screen as Google Maps View to confirm the cars current state and location before sending the commands.&lt;br /&gt;
&lt;br /&gt;
        connect_Btn.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                listPairedDevices(v);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        clear.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    if(!state) {&lt;br /&gt;
                        mConnectedThread.write(&amp;quot;--,\n&amp;quot;);&lt;br /&gt;
                        mMap.clear();&lt;br /&gt;
                        checkpoints.clear();&lt;br /&gt;
                        sending_status.setText(&amp;quot;Waiting&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                    else{&lt;br /&gt;
                        Toast.makeText(getApplicationContext(),&amp;quot;Stop the car First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        stop.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;!!,\n&amp;quot;);&lt;br /&gt;
                    state=false;&lt;br /&gt;
                    move_camera=false;&lt;br /&gt;
                    car_status.setText(&amp;quot;   stopped&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        start.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    mConnectedThread.write(&amp;quot;##,\n&amp;quot;);&lt;br /&gt;
                    state=true;&lt;br /&gt;
                    move_camera=true;&lt;br /&gt;
                    car_status.setText(&amp;quot;   started&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        send_cpts.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onClick(View v) {&lt;br /&gt;
                try {&lt;br /&gt;
                    sending_status.setText(&amp;quot;....&amp;quot;);&lt;br /&gt;
                for(int i=0;i&amp;lt;checkpoints.size();i++) {&lt;br /&gt;
                    String cpt=&amp;quot;GPS,&amp;quot;+checkpoints.get(i).latitude+&amp;quot;,&amp;quot;+checkpoints.get(i).longitude+&amp;quot;\n&amp;quot;;&lt;br /&gt;
                    mConnectedThread.write(cpt);&lt;br /&gt;
                }&lt;br /&gt;
                sending_status.setText(&amp;quot;Sent&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                catch (Exception e)&lt;br /&gt;
                {&lt;br /&gt;
                    Toast.makeText(getApplicationContext(),&amp;quot;Connect to Roadster First&amp;quot;,Toast.LENGTH_SHORT).show();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
=== Software Design ===&lt;br /&gt;
This app has mainly two activities, The main activity and maps activity.&lt;br /&gt;
&lt;br /&gt;
===Maps Activity===&lt;br /&gt;
This is the only functional activity for the app and is responsible for the Google Maps and Bluetooth related Tasks. User can also dynamically select multiple checkpoints and send them to the bridge node. This is achieved using java vector and OnMapclickListener setup to read each marker placed by the user.&lt;br /&gt;
&lt;br /&gt;
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public void onMapClick(LatLng latLng) {&lt;br /&gt;
                int precision = (int) Math.pow(10,6);&lt;br /&gt;
                double new_latitude = (double)((int)(precision*latLng.latitude))/precision;&lt;br /&gt;
                double new_longitude = (double)((int)(precision*latLng.longitude))/precision;&lt;br /&gt;
                LatLng myloc = new LatLng(latLng.latitude, latLng.longitude);&lt;br /&gt;
                mMap.addMarker(new MarkerOptions().position(myloc).title(&amp;quot;Destination&amp;quot;));&lt;br /&gt;
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myloc,20));&lt;br /&gt;
                checkpoints.add(new LatLng(new_latitude,new_longitude));&lt;br /&gt;
                destination_coordinates = &amp;quot;GPS,&amp;quot; + new_latitude + &amp;quot;,&amp;quot; + new_longitude +&amp;quot;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
===Bluetooth===&lt;br /&gt;
The Bluetooth connection is initially set up by reading the id and MAC addresses of the selected device, The available devices are displayed on a listView under the connect button. Once the socket is established, Bluetooth module provides read() and write() API used to communicate. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            if(!mBTAdapter.isEnabled()) {&lt;br /&gt;
                Toast.makeText(getBaseContext(), &amp;quot;Bluetooth not on&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            mBluetoothStatus.setText(&amp;quot;Connecting...&amp;quot;);&lt;br /&gt;
            // Get the device MAC address, which is the last 17 chars in the View&lt;br /&gt;
            String info = ((TextView) v).getText().toString();&lt;br /&gt;
            final String address = info.substring(info.length() - 17);&lt;br /&gt;
            final String name = info.substring(0,info.length() - 17);&lt;br /&gt;
            new Thread()&lt;br /&gt;
            {&lt;br /&gt;
                public void run() {&lt;br /&gt;
                    boolean fail = false;&lt;br /&gt;
                    BluetoothDevice device = mBTAdapter.getRemoteDevice(address);&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket = createBluetoothSocket(device);&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        fail = true;&lt;br /&gt;
                        Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                    }&lt;br /&gt;
                    // Establish the Bluetooth socket connection.&lt;br /&gt;
                    try {&lt;br /&gt;
                        mBTSocket.connect();&lt;br /&gt;
                    } catch (IOException e) {&lt;br /&gt;
                        try {&lt;br /&gt;
                            fail = true;&lt;br /&gt;
                            mBTSocket.close();&lt;br /&gt;
                            mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)&lt;br /&gt;
                                    .sendToTarget();&lt;br /&gt;
                        } catch (IOException e2) {&lt;br /&gt;
                            Toast.makeText(getBaseContext(), &amp;quot;Socket creation failed&amp;quot;, Toast.LENGTH_SHORT).show();&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    if(fail == false) {&lt;br /&gt;
                        mConnectedThread = new ConnectedThread(mBTSocket);&lt;br /&gt;
                        mConnectedThread.start();&lt;br /&gt;
                        mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)&lt;br /&gt;
                                .sendToTarget();&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Bridge node sends data in string format with end of line chars, The Bluetooth handler concatenates the received data and waits for the &amp;quot;end of line&amp;quot; before trying to parse it. Below is the code snippet that parses the incoming stream with location and debug data sent by the bridge node. &lt;br /&gt;
&lt;br /&gt;
                    if(readMessage.indexOf(&amp;quot;\n&amp;quot;)&amp;gt;0) {&lt;br /&gt;
                        message = new StringTokenizer(readMessage, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                        StringTokenizer st;&lt;br /&gt;
                        while (message.hasMoreTokens()) {&lt;br /&gt;
                            st = null;&lt;br /&gt;
                            received_line = message.nextToken();&lt;br /&gt;
                            st = new StringTokenizer(received_line, &amp;quot;,&amp;quot;);&lt;br /&gt;
                            try {&lt;br /&gt;
                                read = st.nextToken();&lt;br /&gt;
                            } catch (Exception e) {&lt;br /&gt;
                                continue;&lt;br /&gt;
                            }&lt;br /&gt;
                            if (read.compareTo(&amp;quot;GPS&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    LatLng current_location = new LatLng(Double.parseDouble(st.nextToken()), Double.parseDouble(st.nextToken()));&lt;br /&gt;
                                    waypoint.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                    prev.remove();&lt;br /&gt;
                                    prev = mMap.addMarker(new &lt;br /&gt;
                                           MarkerOptions().position(current_location).anchor(0.5f,0.5f).rotation(compass_value).title(&amp;quot;Roadster&amp;quot;)&lt;br /&gt;
                                           .icon(BitmapFromVector(getApplicationContext(), R.drawable.ic_baseline_directions_car_filled_24)));&lt;br /&gt;
                             if (state || init) {&lt;br /&gt;
                                        mMap.moveCamera(CameraUpdateFactory.newLatLng(current_location));&lt;br /&gt;
                                        if (current_location.latitude != 0) init = false;&lt;br /&gt;
                                    }&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;speed&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    speed.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;m/s&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;sens&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    left.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    right.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    center.setText(st.nextToken() + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                    back.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;cm&amp;quot;);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;comp&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    compass.setText(st.nextToken());&lt;br /&gt;
                                    String compass_s=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    compass_raw.setText(compass_s);&lt;br /&gt;
                                    compass_value =Integer.parseInt(compass_s);&lt;br /&gt;
                                    prev.setAnchor(0.5f,0.5f);&lt;br /&gt;
                                    prev.setRotation(compass_value);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;dist&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    String dis=st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
                                    distance.setText(dis+&amp;quot;m&amp;quot;);&lt;br /&gt;
                                    //int prog=(int)Float.parseFloat(dis)%200;&lt;br /&gt;
                                    //progress.setProgress(prog);&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            } else if (read.compareTo(&amp;quot;mot&amp;quot;) == 0) {&lt;br /&gt;
                                try {&lt;br /&gt;
                                    rps.setText(st.nextToken());&lt;br /&gt;
                                    pwm.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;));&lt;br /&gt;
                                } catch (Exception e) {&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                            else if(read.compareTo(&amp;quot;bat&amp;quot;)==0){&lt;br /&gt;
                                try{&lt;br /&gt;
                                    battery.setText(st.nextToken(&amp;quot;\n&amp;quot;).replace(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)+&amp;quot;%&amp;quot;);&lt;br /&gt;
                                }catch (Exception e){&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                       }&lt;br /&gt;
                        readMessage=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Technical Challenges ===&lt;br /&gt;
Given no experience in Android Development, we had to start from the basics about the activities, message passing etc. The initial challenge was to understand the google maps API and generate the API key to access google cloud to implement the map view and markers. Implementing Bluetooth communication required scanning the list of paired devices and acquire the MAC address required to open a socket using the provided API. Fortunately, there are many example implementations to go through. We decided to use a similar line buffer that is used in the Geo node to read the debug data sent from the app, this helped solve the challenge of parsing the group of variables sent by the bridge node by reading from the CAN bus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;HR&amp;gt;&lt;br /&gt;
&amp;lt;BR/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&amp;lt;Organized summary of the project&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;What did you learn?&amp;gt;&lt;br /&gt;
* Embedded project are generally single board projects. The mandatory use of CAN bus required a great deal of collaboration, where all board are interdependent and the system design should be robust to make it work every single time, the car is used for its intended purpose.&lt;br /&gt;
*Unit testing helps in early phase of the  project, where the hardware setup is not ready yet, but one needs to start coding to get ahead of the curve and start building logic. This helps in troubleshooting the hardware as well.&lt;br /&gt;
&lt;br /&gt;
=== Project Video ===&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/Q24ghJRe9VM&lt;br /&gt;
&lt;br /&gt;
=== Project Source Code ===&lt;br /&gt;
''[https://gitlab.com/nimit.patel/roadster Repository link for Autonomous RC Car]''&lt;br /&gt;
&lt;br /&gt;
=== Advise for Future Students ===&lt;br /&gt;
* Get the hardware modules and test the same with SJ2 (Before the Mid Semester exams). Once this is done, create a PCB and mount devices and then start the extensive software testing. Considering the car is  moving object, temporary connections over bread board and zero PCB might work, but reliability will remain a doubt at the back of the head. Eliminate the same by creating the PCB early. You might even want to iterate to a second PCB, once you are a few weeks into testing and want to change amend previous mistakes/improve existing layout and placements. The time and effort this will save is worth it.&lt;br /&gt;
*Once the hardware is nearing its completion, the Mobile app should be ready in its rudimentary form. Having a hand held debug device is more useful, compared to using PCAN dongle which is great for static testing.&lt;br /&gt;
* The software will take multiple iteration by testing your car in various field scenarios. This is not a project which can be completed a night before demo. Keep a healthy amount of time for testing.&lt;br /&gt;
* The sole working power socket available in university outside of the university buildings is available on the top floor of the tenth street car garage. This is especially useful when testing in field.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledgement ===&lt;br /&gt;
* Building a hardware project without the availability of a electronics lab of the university which had been shut, due to COVID-19 pandemic tested our resourcefulness to our extremes.Considering the remote nature of course work, resource availability in any shape or form from university was sadly non existent. All the team members should be appreciated for their unwavering enthusiasm to make this a success story.&lt;br /&gt;
* Preet's advice for buying quality hardware parts should be followed to the line.&lt;br /&gt;
&lt;br /&gt;
=== References ===&lt;/div&gt;</summary>
		<author><name>Proj user12</name></author>	</entry>

	</feed>