Signet Ring Project


Most commercial tablets and smart phones with capacitive touchscreens consist of an array of conducting electrodes behind a transparent, insulating glass layer which detects a touch by measuring the additional capacitance of a human body in the circuit. When a user touches the screen, her finger acts as the second electrode in a capacitor with the screen as the dielectric. This change in voltage measured at one or more screen electrodes is then passed to the screen controller for processing. By using a voltage source and creating an artificial change in voltage, we can simulate touch events on a device.

The Device

The ring contains a small flash memory that stores a bit sequence or a message, which could be a user identifier or a secret key that authenticates a user. It also has a simple processor that reads the bit sequence and generates a On-Off keying modulated signal. That is, bit one is represented by turning on a carrier signal; and bit zero by switching off that carrier signal. When the ring is pressed against the screen, it acts as a voltage source which creates a set of touch events with timestamps following the bit sequence being transmitted.


The Signet Ring project uses artificial touch events to enable capacitive touch screen devices to uniquely identify users based on their individual code created from their ring. My objective was to create the application part of this project on an android device. An application to identify users based on a 4 bit/sec Ring transmitter. Once a user presses the ring on top of the screen, the program will identify which user is touching the screen and act accordingly.


The bulk of my summer was spent creating this application as well as testing and upgrading the current ring.

Identifying Touch Events

The Android platform has different types of events to determine what type of touch occurred on the screen. The ring that we are using was designed to create many "MOVE" events. Along with these "MOVE" events, we needed their exact timestamps to determine how far apart they were and when exactly they occured. However, Since the events captured by the actual Android operating system were inaccurate due to queuing delays we needed to access the kernel logs within the device to get the original timestamps. This required root access to the device. Reading the log stream from the kernel logs, gave us the information we needed.

Decoding 4 or 5 bit Codes

After reading the logs and scanning for the events we needed, I needed to apply an algorithm to accurately determine which groups of events were 1 bits and which were 0 bits. An algorithm already created by my mentor was outlined to me and I ported it to the android device. This algorithm would place the events into "bucket" or time intervals that counted the number of events that were between the beginning time and the ending time of the interval. There were 4 + 2 extra buckets that were needed since the codes were cyclic. Using these buckets as well as shifting them for more accuracy, we determined the code based on the number of events that were in each bucket that were close to the average number of events for a "one" bit and the average number of events for a "zero" bit.

Login Screen Application & other Test Tools

After decoding the ring, I built a login screen application for testing purposes. having the codes inside the login screen and applying the decoding I had the application set the user wallpaper to a specific picture that indicated the owner of the ring. Other tools I created was a graph tool to graph the number of events in each bucket so that one could visually inspect the accuracy of the decoding on the device.

Build New Rings for different Codes

The final part of this project was to prepare new rings for other codes. Since at the time, there was only one ring it was not possible to test with other codes. The design of the ring was made so that only one code could be used. I teamed up with another winlab intern to create 2 new rings that were robust and interchangeable in that it was made so that the microcontroller to generate the rings could be easily swapped to a different code.



The Drivesafe application is a program that resembles a fusion between a phonebook and a chat client. It is a buddy list like system that has a list of contacts and next to their name would be a "driving" or "available" sign which would signify whether the current user should chat or send a call to them.


My role in this project was to integrate Bluetooth awareness into the existing app. This meant that when you take the android phone into a car that is already paired with a hands free device, it will trigger the Drivesafe application to automatically change the current status to Driving.


I integrated the Bluetooth into the application and also added a self start mechanism to the application so that it would always be running in the background. I also tested the application with other phones to make sure the updates were occurring.

Last modified 7 years ago Last modified on Aug 27, 2012, 12:45:01 AM