TACTILE FEEDBACK COMPASS BELT

 

Tactile feedback compass belt is a wearable haptic belt which helps us navigate using vibrating directional feedback. It makes navigation much more convenient by reducing human interaction with smartphones or compasses. It is especially helpful for visually impaired who face difficulties in following directions.  

 

Steps for making a Tactile feedback compass belt:

Step 1: Collecting Components

Collect the following components:

  • 1 Arduino Uno
  • 1 digital compass IC like HMC5883L
  • 4 vibration motors
  • NPN transistors like BC548
  • Breadboard
  • Jumper wires
  • 1k ohm resistors
  • Fabric belt

 

Digital compass IC(HMC5883L): Earth’s magnetic field is present in space which points towards the magnetic north as shown in below image.

Current carrying conductor also generates a magnetic field around itself. Hence, whenever a current carrying conductor is placed in space, it experiences the effect of the earth’s magnetic field affecting the flow of the electrons through that conductor. These changes in the flow of the electrons are used for identifying the heading or direction of the magnetic field. This is the basic working principle of the magnetometer.

HMC5883L uses magnetoresistive sensor arranged in a bridge circuit, which is made of nickel-iron (Ni-Fe magnetic film) material. Its electrical resistance varies with the change in the applied magnetic field.

The correspondent movement of the nickel-iron material in space experiences earth’s magnetic field which changes the material’s resistance, and hence we get resultant voltage changes across the bridge. This change in voltages is used to get the magnetic field direction in space.

Features of HMC5883L:

  • Low Voltage Operations (2.16 to 3.6V)
  • Low Power Consumption (100 μA)
  • I 2C Digital Interface
  • Enables 1° to 2° Degree Compass Heading Accuracy

 

Vibrating motor: A vibrating motor is essentially a motor that is improperly balanced. There is an off-centred weight attached to the motor’s rotational shaft that causes the motor to wobble and thus, cause vibrations.

 

 Step 2: Finding the magnetic declination for your location

Magnetic declination or variation is the angle between magnetic north and true north at a particular location.  

Magnetic declination for Delhi, India is +1.19 degrees, i.e. 0.02 radians.

 

Step 3: Circuit Diagram

Make the following connections on your breadboard and Arduino using jumper wires and all other components. The following circuit diagram shows the connection for a single motor for ease of understanding.

Step 4: Code

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_HMC5883_U.h> 

int motora=2;

int motorb=3;

int motorc=4;

int motord=5;

Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);

void setup(void)

{

  Serial.begin(9600);

  if(!mag.begin())

  {

    Serial.println(“No digital compass detected”);

    while(1);

  }

}

 void loop(void)

{

  sensors_event_t event;

  mag.getEvent(&event);

  Serial.print(“X: “);

  Serial.println(event.magnetic.x);

  Serial.print(“Y: “);

  Serial.println(event.magnetic.y);

  Serial.print(“Z: “);

  Serial.println(event.magnetic.z);

  float heading = atan2(event.magnetic.y, event.magnetic.x);

  float declinationAngle = 0.02;

  heading -= declinationAngle;

  if(heading < 0)

    heading += 2*PI;

 

  if(heading >= 2*PI)

    heading -= 2*PI;

  float headingDegrees = heading * 180/M_PI;

  Serial.print(“Heading (degrees): “);

  Serial.println(headingDegrees);

  if((headingDegrees>=337.5 && headingDegrees<360) || (headingDegrees>0.0 && headingDegrees<22.5))

  {

    digitalWrite(motora, HIGH);

  }

  else

  {

    digitalWrite(motora, LOW);

  }  

  if(headingDegrees>=22.5 && headingDegrees<67.5)

  {

    digitalWrite(motorb, HIGH);

    digitalWrite(motora, HIGH);

  }

  else

  {

    digitalWrite(motorb, LOW);

    digitalWrite(motora, LOW);

  }

  if((headingDegrees>=67.5 && headingDegrees<90) || (headingDegrees>90 && headingDegrees<112.5))

  {

    digitalWrite(motorb, HIGH);

  }

  else

  {

    digitalWrite(motorb, LOW);

  }

    if (headingDegrees>=112.5 && headingDegrees<157.5)

  {

    digitalWrite(motorb, HIGH);

    digitalWrite(motorc, HIGH);

  }

  else

  {

    digitalWrite(motorb, LOW);

    digitalWrite(motorc, LOW);

  }

   if((headingDegrees>=157.5 && headingDegrees<180) || (headingDegrees>180 && headingDegrees<202.5))

  {

    digitalWrite(motorc, HIGH);

  }

  else

  {

    digitalWrite(motorc, LOW);

  }

  if(headingDegrees>=202.5 && headingDegrees<247.5)

  {

    digitalWrite(motorc, HIGH);

    digitalWrite(motord, HIGH);

  }

    else

  {

    digitalWrite(motorc, LOW);

    digitalWrite(motord, LOW);

  }

  if((headingDegrees>=247.5 && headingDegrees<270) || (headingDegrees>270 && headingDegrees <292.5))

  {

    digitalWrite(motord, HIGH);

  }

    else

  {

    digitalWrite(motord, LOW);

  }

  if(headingDegrees>=292.5 && headingDegrees<337.5)

  {

    digitalWrite(motora, HIGH);

    digitalWrite(motord, HIGH);

  }

    else

  {

    digitalWrite(motora, LOW);

    digitalWrite(motord, LOW);

  }

  if(headingDegrees==0)

  {

    digitalWrite(motora, HIGH);

    delay(100);

    digitalWrite(motora, LOW);

    delay(100);

    digitalWrite(motora, HIGH);

    delay(100);

    digitalWrite(motora, LOW);

    delay(100);

    digitalWrite(motora, HIGH);

    delay(100);

    digitalWrite(motora, LOW);

    delay(100);

  }

  if(headingDegrees==90)

  {

    digitalWrite(motorc, HIGH);

    delay(100);

    digitalWrite(motorc, LOW);

    delay(100);

    digitalWrite(motorc, HIGH);

    delay(100);

    digitalWrite(motorc, LOW);

    delay(100);

    digitalWrite(motorc, HIGH);

    delay(100);

    digitalWrite(motorc, LOW);

    delay(100);

  }

  if(headingDegrees==180)

  {

    digitalWrite(motorc, HIGH);

    delay(100);

    digitalWrite(motorc, LOW);

    delay(100);

    digitalWrite(motorc, HIGH);

    delay(100);

    digitalWrite(motorc, LOW);

    delay(100);

    digitalWrite(motorc, HIGH);

    delay(100);

    digitalWrite(motorc, LOW);

    delay(100);

  } 

  if(headingDegrees==270)

  {

    digitalWrite(motord, HIGH);

    delay(100);

    digitalWrite(motord, LOW);

    delay(100);

    digitalWrite(motord, HIGH);

    delay(100);

    digitalWrite(motord, LOW);

    delay(100);

    digitalWrite(motord, HIGH);

    delay(100);

    digitalWrite(motord, LOW);

    delay(100);

  }

  delay(500);

}

 

Step 5: Making the belt

Stitch or use a double-sided tape to embed the circuit on your belt. Fix the compass at front and all four motors in four different points indicating north, south, east and west.

 

Reference:

 

https://www.instructables.com/id/How-to-Make-a-Tactile-Feedback-Compass-Belt/

https://thenextweb.com/eu/2015/12/17/feelspace-helps-blind-feel-right-direction-vibrating-motors/

https://360.here.com/2015/04/17/wearables-improve-sense-direction/

https://www.researchgate.net/figure/The-tactile-belt-A-The-belt-as-it-was-worn-by-the-subject-A-waterproof-envelope_fig1_221689414