Difference between revisions of "S14: Asset Management and Location System"

From Embedded Systems Learning Academy
Jump to: navigation, search
(Implementation)
(GPS)
Line 413: Line 413:
  
 
==== GPS ====
 
==== GPS ====
 +
GPS continuously sends a stream of GPS data. The only data that was of concern for this project was the following string:
 +
$GPGGA,111636.932,2447.0949,N,12100.5223,E,1,11,0.8,118.2,M,,,,0000*02<CR><LF>
 +
 +
This string contains:
 +
$GPGGA,UTC Time, Latitude, N/S Indicator, Longitude, E/W Indicator, GPS Quality Indicator, Satellites Used, HDOP, Altitude, DGPS Station ID, Checksum.
 +
 +
This data was only used if the GPS Quality Indictor was more than 1.
  
 
== Testing & Technical Challenges ==
 
== Testing & Technical Challenges ==

Revision as of 20:26, 22 May 2014


S14: Asset Management and Location System

Abstract

The ultimate vision of this project was to develop an asset management and location system to compete with The Tile App. There were two major components to the Tile solution: the tile and the application. The tile was small low-power embedded system that could be attached to an object. The application was primarily a user interface that provides visual feedback to guide a user to a specified tag.

For this project, the tile is simply a Bluetooth module power by a coin cell battery. The application, on the other hand, consists of:

  1. SJ One development board
  2. LCD
  3. Bluetooth module
  4. GPS module

The system used the Bluetooth RSSI value to determine proximity of the application device to the tile device. SJ One board communicated proximity to the user via a histogram that was displayed on the LCD. If the tile device was within the expected proximity, the GPS coordinates of the tile device were written to a file on the SC card. A webpage was developed which would read this file and plot the tile location of know tiles on Google Maps.

Complete feature set of Asset Management and Location System enabled the following:

  1. Locating/tracking a tile
  2. Adding/registering a new tile
  3. Removing a tile
  4. Listing all the registered tiles
  5. Updating the RTC
  6. Displaying the last known location of tiles on Google Maps

Objectives & Introduction

Objectives

  • To track a tile location within 100 meters
  • To add/register tiles to user
  • To remove tiles from user tiles database
  • To display a histogram of tile vicinity
  • To display last known location on Google Maps

Team Members & Responsibilities

  • Akash Ayare - Feature development
  • Pardeep Badhan - Feature development
  • Talha Ilyas - Packaging and feature unit testing

Schedule

Show a simple table or figures that show your scheduled as planned before you started working on the project. Then in another table column, write down the actual schedule so that readers can see the planned vs. actual goals. The point of the schedule is for readers to assess how to pace themselves if they are doing a similar project.

Week Date Planned Actual
1 3/6 Create Wiki page and add the schedule of the project. Wiki page was created and preliminary scheduling was added.
2 3/13 Research on Bluetooth and Zigbee radio technologies. Compared Bluetooth and Zigbee range and power consumption.

Although Zigbee has slightly better power consumption and better range, decision was made to use Bluetooth for the project to keep similarity with Tile project.

3 3/20 Order parts and research RSSI Parts were not ordered mainly due to the number of options available; more research was still needed.

Instead, the team registered with GitLab. Project "lpc1758_freertos" was checked in as the base project. Furthermore, the team trained on Git workflow and branching methodology.

4 3/27 Interface Bluetooth Modules. Ordered Class 1 Bluetooth version 2 modules.
5 4/3 Achieve basic Bluetooth communication. Basic connectivity achieved.

Hercules Setup software was used to connect to the Bluetooth Serial port.

6 4/10 Fetch RSSI value from the Bluetooth module. Discovered there are two ways to fetch the RSSI value. One mode worked better over the other, but it was slower. In a open room, with one of the modes, there wasn't significant change in RSSI value when proximity changed. The second mode provided better distance estimation, but it was slower to fetch RSSI value in this mode.
7 4/17 Experiment how this value changes with proximity. Started interfacing with the Bluetooth module with SJ One Board instead of Hercules.

Also, added a task to receive Bluetooth data and display it on console.

8 4/24 Implement visual indicator (histogram) corresponding to RSSI values. Interfaced LCD screen with SJ One Board.

Added tasks to control the user menu and monitor switches, and user menu infrastructure that:

  • Displayed the menu list to the LCD and selection markers to indicate currently selected menu item
  • Allowed the user to scroll up and down the menu list using the switches
  • Allowed the user to select a menu option
  • Allowed the user to go back to the previous menu
9 5/1 Packaging, battery installation, and testing. Expansion of feature-set Enhanced features:
  1. Added CharDev pointers in LCD and Bluetooth class instead of using the Uart2 and Uart3 directly. This allowed us to switch Uart ports with minimum code changes
  2. Changed switch ID variable names so they are independent of the action associated with the switch
  3. Modified LCD::display to add an option whether to display the selection marker or not
  4. Added "Add Tile" option (not completed yet, "select" action is pending). When "Add Tile" option is selected, the code does Bluetooth inquiry and lists all the devices on the LCD
  5. Enhanced logic to get the Bluetooth into command mode. The function Bluetooth::goToCmdMode makes sure the Bluetooth is in command mode before returning. It does this by issuing "V" command and verifying the received data. After issuing the CMD string ($$$), the trick was to wait few milliseconds
  6. Added a function that enables us to retrive string from the user. The top row of the LCD has character which the user can use to form a string. The switches allow the user to go left/right to select a character. The other two switches serve as backspace+cancel and select. Also, added an option to not center align the text on LCD.
  7. Updated the LCD class to support a FTDI (USB) emulation mode when a LCD display is not available. To enter emulation mode P2.7 must be pulled high. Otherwise, normal LCD mode will be assumed.
  8. Previously, after Adding a Tile only the bluetooth MAC address was visible on the screen. Now, the MAC address is concatenated with the RSSI value. The RSSI value starts with a negative (-) sign, so it is easy to distinguish the two values without using a space character. Also, when a list of tiles would return it wasn't easy to determine if you reached the bottom or the top of the list of tiles. Now, when you reach the top (or bottom) of the tile list a message will be displayed.
  9. The user menu portion of the "Add Tile" menu has been completed. The user can now 1) query the Bluetooth devices, 2) select the device he/she wants to add, 3) select the name of the device or simply use the MAC address. TODO: The corresponding back end operation needs to be completed. We should be able to store the device information (MAC address, Bluetooth name, device name (selected by the user) to the on-board flash. Changed the switch names back to its original form as suggested by Akash. Some touch ups to the LCD::display function.
  10. This change implements the Track Tile menu and associated actions. Plus, it will display a histogram based on the RSSI value. There are a lot of TODOs that need to be addressed in this change. The major things that need to be done is refactoring, splitting Track (List, Track, Histogram), and continuously update histogram until back is pushed.
  11. This change improves the display and overall user experience by conforming to existing design patterns and API. This change also includes some minimal refactoring. Split Track Action into List and Track. Plus, the display will automatically update whenever new data is available when operating in tracking mode. Pushing the back button will exit tracking mode... but the response can be a little slow.
10 5/8 Demo The demo was postponed to 05/22

Enhanced features:

  1. Finished backend support for "Add Tile", added support for "Remove Tile", and "List Tiles" menus. The "Add Tile" option now writes the tile information to the flash. At bootup, this file is read to determine the number registered tile devices, and the information of each device is read in memory. The file doesn't start a 0 to always make usage of Storage::append() API - if the offset is 0, it write to end of the file. Added "tileDevice" class that stores the information of a tile. The information includes 1) tile name, 2) Bluetooth name, 3) MAC address, 4) COD, 5) RSSI when the device was added. Moved the inquiry logic to a function. Also made it more robust. It is now able to handle a case where multiple inquiry attempts are made. The logic will finish the old query, and then it will start a new inquiry. Also moved the "Start of List" and "End of List" to LCD::display function to avoid the replication.
  2. Added new function called "inquirySingleBTDevice" that inquiries for a particular device. Also, started adding few comments to the code.
  3. Displayed more info in "List" menu - 1) Tile Name, 2) Bluetooth Name, and 3) MAC address
  4. Track feature has entry through list. Since list is redefined in devel, the track feature list is commented out - in turn, disabling the entire track feature. With the merge resolved, the next step is to evaluate if list can be modularized to satisfy requirements of both branches; otherwise logic changes need to be made.
  5. Re-enabled tracking feature. Changed entry into tracking feature from listTile... to selectTile. The selectTile... function makes use of registredTileDevice shared data structure. Additionally, it uses the new (simplified) logic for determining if the displayed list is at top or is at end; with updated re-initialization on back press/action. Minimal edits to trackTile... function to bring it into an operational state. However, this function needs to be updated to use latest APIs and data structures.
  6. trackTile... function has been refactored to maintain historical behavior, but now invokes inquirySingleBTDevice API. The inquiryAllBTDevices function signature was modified to include an optional argument to display the "Searching..." message. This message is not desirable when displaying a histogram in a loop. In any case, the inquiryAllBTDevices API remains backward compatible. Note: In testing, unexpected behavior was observed when a tile comes into or exits the field of vision while in trackingMode.
11 5/15 Fixed bugs:
  1. Bluetooth inquiry wasn't terminating when no devices were found. The state machine was going into PENDING_DEVICES state.
  2. Remove tile was corrupting the flash why overwritting the file header.
  3. Add tile option was displaying devices that were already added
  4. "No registered device" error is displayed when user selects an option that requires displaying devices and no devices have been added yet.
  5. Setting the error display timer to 4 seconds
  6. Displayed user set tile name in histogram

Enhanced features:

  1. Adding "Time" menu. With this menu, the user can view and set the time. Time is displayed in the following format: MM/DD/YYYY HH:MM This menu operates in the following way:
    1. After changing to Time menu, if the user clicks "Back", the main menu is displayed, and if the user clicks "Select", the user is allowed to change the time - the user is in "change time" state.
    2. If in "change time" state, the user can cycle back and forth between month, day, year, hour, and minute. If the user cycles through all of these, the time is updated. If the user cycles backwards, the time is not updated. Caret character (^) guides the user when in "change time" state.
  2. Added support for Google Maps. After opening the webpage, browse and select a file that contains information about the tile. The webpage will parse the file and display the location of each tile. Hovering over the marker will display the tile name, and clicking on the tile will display the 1) tile name, 2) time (last known instance), 3) last known location.
12 5/22 More feature development:
  1. Enabled UART1 support
  2. Enabled GPS support. Fetched GPS data using UART2, parsed the fetched GPS data, and updated the global variable.
  3. Added a Map task which will periodically (every 30 seconds) generate the gpsmap.txt file, but only if there is a file in the gpsdb/ directory that has a timestamp which is greater than gpsmap.txt; otherwise, the map task simply returns with minimal execution. The only time files are added to the gpsdb/ directory is when an attempt to track a file is made and the tile is found within a close range. At that moment, by hitting the back switch GPS data for that tile will automatically be recorded. Currently, GPS records do not get deleted when a tile is deleted.

Parts List & Cost

Item Part Name Part Cost Qty Total Cost
1 LPC1758 SJSU One Board $80 1 $80
2 SparkFun BlueSMiRF Gold] $64.95 2 $209.90
3 SparkFun Bluetooh Mate Gold $64.95 1 $274.85
4 Serial Enabled 16x2 LCD $24.95 1 $299.80
5 Venus GPS Logger with SMA Connector $59.95 1 $
6 Antenna GPS Embedded SMA $11.95 1 $
7 Mini Rocker Switch $ 1 $
8 Slider Switch $ 2 $
9 Tile Enclosure $ 2 $
10 Tracker Enclosure $ 1 $
10 9V Battery $ 1 $
11 9V Battery Enclosure $ 1 $
12 24.5mm Coin Cell Battery $2.95 2 $
13 12mm Coin Cell Battery $ 1 $
14 Micro SD Card $ 1 $

Design & Implementation

Hardware Design

The following diagram captures how all the modules of the application device were interfaced:

Schematic

The diagram below shows the breadboard prototype of the final product:

Breadboard Prototype

As mentioned earlier, the tile device was simply a Bluetooth module connected to a coin cell battery.

Hardware Interface

SJSU One UART3 was interfaced with the Bluetooth module at 115200 bps with RX and TX queue depth of 1024 character elements, respectively using the supplied UART3 driver. Both LCD and GPS used UART2 at 9600 bps with RX and TX depth of 1024 character elements. LCD used the TX of UART2 and GPD used the RX of UART2. The following table depicts the connections:

SJSU One Peripheral
Power 3.3V VCC Bluetooth
Ground GND GND
N/A CTS-I RTS
UART3 TX RX - O
RX TX - O
Power 3.3V VCC LCD
Ground GND GND
UART2 TX RX
Power 3.3V 3.3V GPS
Ground GND GND
UART2 RX TX

Software Design

Asset Management and Location System consisted of four tasks:

  1. Switch Task - Monitored the switches that allowed the user to navigate the user menu. When a switch was pressed, this task enqueued the switch ID to the Asset Management task. This task executed in low priority at 10ms interval.
  2. Asset Management Task - Controlled the LCD (user menu navigation) and Bluetooth module. This task received switch pressed notification from the Switch task. Upon receiving a switch pressed event, this task either updated the user display or initiated a Bluetooth inquiry. It also stored the GPS coordinates of each tile to a file on the flash memory. This task executed in low priority. If Bluetooth inquiry was in progress, this task operated at 1s interval otherwise it blocked on switch pressed event.
  3. GPS Task - Fetched the current location from the GPS module and stored it in global variable. This task operated in low priority at 1s interval.
  4. Map Task - This task executed in low priority at 30s interval. Using the files generated by the Asset Management task, it composed a file that the webpage parsed to plot tile location on Google Maps.

The interface between these tasks is described in the figure below:

Task Interaction


The Asset Management task managed the user menu based on events received from the Switch task. The user menu could be navigated in the following manner:

User Menu

Implementation

LCD

The LCD class represented the LCD module. The main objective of this class was to determine what was displayed and format the data that was displayed on the LCD. Furthermore, it was capable of operating in two modes:

  1. Real Mode: In this mode, all the data was printed to the LCD.
  2. Emulation Mode: In this mode, all the data was printed to UART1. The feature allowed multiple members of the team to work on the project even though the team owned single LCD module.

LCD module was represented by singleton design pattern:

LCD Module

Bluetooth

As the name implies, Bluetooth class enabled communication with the Bluetooth module. It provided the following functionality:

  1. Enter Command Mode: The Bluetooth module used for this project was capable of operating in two modes - 1) data mode and 2) command mode. In the data mode, the Bluetooth module worked as a data pipe and simply converted Bluetooth signals to UART and vice verse. In the command mode, however, the received data (either via Bluetooth or UART) instrumented the Bluetooth module to an operation such as change configuration ("set" commands, return current configuration ("get" commands), etc. The Bluetooth module doesn't have any physical indication of whether the module is in data mode or command mode. To address this issue, this feature issued a "get" command to retrieve the current firmware version of the module. If the expected firmware version was read, it was known that the module was in command mode. If not, an attempt was made to enter the command mode and read the firmware version number. This process repeated until either it eventually exceeded the number of expected tries or it command mode was entered.
  2. Enter Data Mode: This feature was not used for this project.
  3. Send Command: This was simply UART TX.
  4. Receive Data: This was simply UART RX.

The Bluetooth module was represented by singleton design pattern:

Bluetooth Module

Tile Device

The information of each device was stored in the following class. The stored information consisted of MAC address, tile name (identifier selected by the user), Bluetooth name, RSSI value, and Bluetooth class of service identifier.

Tile Information Storage

Asset Management

Bluetooth Inquiry

One of the most critical components of the project was Bluetooth inquiry. In hindsight, this functionality should have been implemented in Bluetooth software module. Doing so would change the interface, but the core functionality of the inquiry would remain the same. The Bluetooth inquiry can be best implemented with a state machine. The following diagram lists all the states and the transitions. To enable the user to cancel the inquiry at any time, the Bluetooth inquiry spanned multiple function calls. This required using local static variables to preserve the state. Of course, this means inquiry can't be launched from multiple threads. This was, however, the design that was chosen since Asset Management system has only one main thread.

Bluetooth Inquiry State Machine
User Menu

The update of user menu which was triggered by switch press or Bluetooth inquiry state change was made non-blocking operation. This allowed the user the ultimate control of the system behavior. For example, it allowed the user to cancel a Bluetooth inquiry and navigate to the previous menu while Bluetooth inquiry was under way. In order to support this, however, each menu had to preserve it's state across multiple function calls.

  • Main Menu: This menu just displays all the options that were available to the user.
  • Add Tile Menu: The following flow chart illustrates the add tile operation. When a tile device was added, the tile information was stored in RAM and to a file on the flash memory.
Add Tile Operation
  • Remove Tile Menu: This operation was essentially the inverse to add tile operation.
  • List Tiles: This menu listed information of all the registered devices to the LCD. The displayed information included: 1) User selected tile name, 2) Bluetooth name, 3) MAC address.
  • Time: This menu allowed the user to set the system RTC. The following figure illustrate how the set time menu worked. The diagram ignores the Up and Down buttons because they just change the value.
Display/Set Time Operation

File Storage

There were 3 set of files that were written:

  • This was a single file with name flash:tiles.txt. This file stored information of all the registered tiles and had the following structure:
tiles.txt File Structure
  • These were set of files stored in directory flash:gpsdb. Each tile device had a dedicated file that contained the last known GPS data of the tile device. The filename was the MAC address of the tile device. For example, tile device with the MAC address of aa:bb:cc:dd:ee:ff would be stored with full path of flash:gpsdb/aabbccddeeff. This file has the following structure:

Tile Identifier, Bluetooth Name, MAC, Time, Latitude, Longitude

  • This was a single file that was stored on the micro SD card. This file was parsed by the webpage to compose Google Maps. This file had the following structure:
Tile Identifier 1, Bluetooth Name 1, MAC 1, Time 1, Latitude 1, Longitude 1
Tile Identifier 2, Bluetooth Name 2, MAC 2, Time 2, Latitude 2, Longitude 2
...
Tile Identifier n, Bluetooth Name n, MAC n, Time n, Latitude n, Longitude n

GPS

GPS continuously sends a stream of GPS data. The only data that was of concern for this project was the following string: $GPGGA,111636.932,2447.0949,N,12100.5223,E,1,11,0.8,118.2,M,,,,0000*02<CR><LF>

This string contains: $GPGGA,UTC Time, Latitude, N/S Indicator, Longitude, E/W Indicator, GPS Quality Indicator, Satellites Used, HDOP, Altitude, DGPS Station ID, Checksum.

This data was only used if the GPS Quality Indictor was more than 1.

Testing & Technical Challenges

Describe the challenges of your project. What advise would you give yourself or someone else if your project can be started from scratch again? Make a smooth transition to testing section and described what it took to test your project.

Include sub-sections that list out a problem and solution, such as:

My Issue #1

Discuss the issue and resolution.

Conclusion

Conclude your project here. You can recap your testing and problems. You should address the "so what" part here to indicate what you ultimately learnt from this project. How has this project increased your knowledge?

Project Video

Upload a video of your project and post the link here.

Project Source Code

Send me your zipped source code and I will upload this to SourceForge and link it for you.

References

Acknowledgement

Any acknowledgement that you may wish to provide can be included here.

References Used

List any references used in project.

Appendix

You can list the references you used.