Smart Glove for interpreting ASL (Sign Language) alphabet
Author: Andrei-Alexandru Georgescu
Group: 332-CD
Introduction
The intent is to make a hand-worn device that uses several sensors to internally store the position of each finger, as well as orientation measured with a gyroscope, and then using this data to interpret, based on set of logistic regressions, a corresponding letter according to the ASL standard alphabet.
The ML based interpretation of the gestures makes the device highly personalizable, as it could be trained for a specific individual's range of motion and manner of making the gestures.
Its primary and intended purpose is to interpret gestures, but it can also be used, once trained, in an educational fashion as it uses an LED to signal if the gesture is recognized.
General description
An important part of the project's logic is based on the 6 IMUs used. One is the “Reference Sensor” and it is mounted on the wrist such that it doesn't much experience the rotational movements of the hand. The other 5 are each mounted on a fingertip and all funnel their outputs towards the controller through an I²C multiplexer. The microcontroller is going to in turn request data from each of the sensors over the I²C line, and use the values to determine the position of each fingertip relative to the wrist.
The intended function of the project has 2 possible running modes, which determine how the positional data is used:
Learning Mode - In Learning Mode, the expectation is that the controller is connected to a companion computer that deals with the mathematical computation of the regression weights. It is also in this mode that the connected button is intended to be used, serving as a snapshot “trigger”, recording the data at the pressing moment and sending it over USART to the companion for processing.
Interpreting Mode - In Interpreting Mode, the expectation is that the controller has been pre-loaded with the necessary weights from a prior learning session. Here the positional data is used to sequentially calculate the “probability” of the gesture being associated to known symbol, interpreting the gesture to be the symbol with the highest “probability”, but only if it passes a minimum threshold of 80%. While a value is interpreted as known, a green led is active and internally a clock is started. If the guessed position is still the same after a half a seconds has passed, the interpretation is considered valid and written over I²C to the LCD. In Interpreting Mode, the connected button is instead used to clear the LCD screen of prior written content.
Hardware Design
Components:
Conexions:
In my project I used the following color coding:
For Power & GND (twisted together) I used the pairs Red/Black and Orange/Grey
For Data/Clk (also twisted together) I used the pairs Yellow/Brown, Blue/White and Green/Purple
This format allowed me to get 6 distinct pairing of Power/GND/Data/Clk, one for each of the sensors, for easier distinction!
The Pins used are as such:
The whole system is powered directly or indirectly from the 5v supplied by the Micro-USB
SDA - D21
SCL - D22
LED Control - D26
Button Control - 14
3v3 to power the IMUs
VIN as a 5v output to power the LCD and TCA9548
RST on the TCA9548 is connected to 5v (VIN) over a 4.7k resistor
SDA and SCL are connected to 3v3 over 4.7k resistor each
The SDn and SCn (outputs of the multiplexors) do not require pull-up resistors as those exist internally on the IMU breakout boards
The LED is connected to its Control Pin through a 200 resistor.
Thumb sensor is connected to line 7 (SD7, SC7)
Index sensor is connected to line 6 (SD7, SC6)
Middle sensor is connected to line 5 (SD7, SC5)
Ring sensor is connected to line 4 (SD7, SC4)
Pinky sensor is connected to line 3 (SD7, SC3)
Reference sensor is connected to line 2 (SD2, SC2)
Physical Wiring:
Software Design
Development Medium: Arduino IDE
Libraries:
Wire.h - For I²C communication.
LiquidCrystal_I2C.h - For controlling the LCD over I²C.
math.h - For the mathematical functions required for inference.
MPU6500_WE.h - For controlling the IMUs used and polling them for data.
Algorithms and Datastructures:
-
Wrapper Class over MPU6500
Wrapper functions over Wire for using TCA9548
Wrapper functions over Wire and LiquidCrystal_I2C for communicating with the LCD1602
Implemented Functions:
TCA9548 Functions:
MPU6500 Functions:
LCD1602 Functions:
Interpreter Functions:
Main Functions:
setup - initialises the serial communication stream, the multiplexor and lcd, then the senors. Configures pins for the connected led and button. Finally, if in recording mode, prints the csv header to the serial line
print_angles - to be used in recording/learning mode, prints to the serial the data from a sensor
interpret_loop - reads data from the sensors, then classifies it, interpreting gestures held for at least 2 seconds depending on their value: -1 as a non-recognised position, 0 to 25 as letters 'A' to 'Z', 26 as “move cursor to first line of LCD”, 27 as “move cursor to second line of LCD” and 28 as “clear lcd”. While detecting a gesture it doesnt know, the LED is of, while it is detecting a gesture it knows, the LED is on
Results
The overall result is a system that can be configured for either gesture interpretation or gesture learning. Functionally the ESP32 used could learn even more complex or larger matrices to continue using multionomial regression for more potential classes, learning new gestures that don't strinctly have to me mapped onto a character. The ESP32 has bluetooth/wifi functionality so it is completely plausible to modify a system like this to interact with smart devices by issuing commands. The choice to interpret sign-language is arbitrary. For my current learning set (30 entries for each gesture) inference analysis yields great results:
Conclusions and Lessons
Not a final conclusion really, but I realised half-way through development that I bought MPU6500 instead of MPU6050s like originally intended, which is a lesson to read more clearly when buying parts, I suppose.
Sometimes, the breakout schemes of the various components have diagrams that just actually lie, the TCA9548A for example was supposed to have its own pull up resistors, but I needed to at my own.
Positional tracking is difficult to realise with 6DOF systems, I was able to salvage my idea only because hand gestures have limited freedom of movement, but Z-rotation instability ruins any attempts at keeping a valid virtual Oxyz coordinate system.
I know it is minimal in effect, but I think solidly color coding my wiring by function may be the single best decision I made during the project.
LCD factory settings set contrast to 0, took a while of code/verify/upload cycles before I realised that one.
Always check if cables you buy are data-capable.
Although it worked for this project, sensors with pins going out like the ones I am using are cumbersome due to their volume occupied blocking natural finger positions. Same issue with the wiring being to long. I think using hard wires might've possibly been more beneficial in retrospect.
Avoid using textiles as a base support for projects, I had to sew my sensors in with thread and use a zip tie to position the breadboard because nothing was sticking.
Code Repository