Project tutorial
Haptic Proximity Module (HPM) for Low Vision users

Haptic Proximity Module (HPM) for Low Vision users

The Haptic Proximity Module (HPM) enables people with low vision, or other vision impairments, to engage with their direct surroundings.

  • 3,793 views
  • 1 comment
  • 21 respects

Components and supplies

Ard nano
Arduino Nano R3
×1
Devantech SRF05 Ultrasonic Sonar Range Finder
×1
3V DC Vibrating Motor
×1
50k 9mm Square Potentiometer Linear Single Gang
×2

About this project

The Haptic Proximity Module (HPM) seeks to enable people with low vision, or other vision impairments, to engage with their direct surroundings through vibration feedback from a range detector, and do so cheaply with readily available components. The aim of this instructables is to share the parts and process of creating this device in the hope that it will get shared and improved to become something beyond my current imagination! I also have hopes for it to allow one person to enable another through making this project and giving it away to someone who is experiencing vision impairment or loss, such as Low Vision. This project has been developed during my final year as an Industrial Design Honours student at RMIT University, Melbourne, Australia. Special thanks goes to Dr. Scott Mitchell for the inspiration and technical expertise in helping form the code underlying the HPM and further technical debugging. Its included functions are: - Pause button that switches off the range finding sensor and motor. - Potentiometer to control the maximum PWM output to the motor (0 - 255) - Potentiometer to control the maximum distance detected by the ultrasonic sensor (2-200cm) - Inverse mapping of range to motor PWM, i.e. as the distance detected is closer to the sensor the motor vibrates stronger. A comfortable level of soldering skill and familiarity with electronics is helpful along with an understanding of the Arduino programming environment. If you're just starting with electronics/arduino build this project on breadboard first! Head to Step 6 and Step 4 to review the code and schematics to get your head around it. A user test video can be seen here. User test video: 

http://www.youtube.com/embed/Nss_f5EncEM

Step 1: Shopping List

These are the components you will need plus most of the equipment I used.

Note:

  • Most components have been sourced within Australia, they also should be available online and accessible to many other countries.
  • All costs listed are in Australian Dollars without shipping.
  • Links will lead to where I sourced the parts.
  • Also keep in mind these components may be found cheaper elsewhere with a bit of research... and maybe bulk buying.
  • E-bay is also a good place to start with things like the batteries, arduino and potentially rangefinder if DX doesn't ship to you.
  • Student discount available in-store at JayCar Electronics within Australia.

Pictured: 

Strip Board [circuit mounting, jaycar electronics] (approx $6) 

McDonald's Straw [perfect diameter as a shroud to suit the vibration motor bellow] (free)  

Arduino Nano v.3 (compatible) w.out headers soldered [sourced from ebay, but can be found on Deal Extreme] ($14) 

Devantech SRF05 Ultrasonic Sonar Range Finder [distance sensing, from Robotgear.com.au] ($26) (Cheaper Options: HC-SR04 $4 from DX.com

Female Header 1x4pin Straight 0.1" [socket for ultrasonic sensor, from Robotgear.com.au] ($0.45) 

Break Away Headers 40 Pins [Robotgear.com.au] ($1.75) 

6mm Tact Switch [jaycar] ($0.95) 

3V DC Vibrating Motor [Jameco part No. 256382] ($4)
Sub-Mini Toggle Switch [jaycar] ($2.45) 

50k 9mm Square Potentiometer Linear Single Gang (qty. 2) [JayCar] ($2.75 ea) 

Knobs (qty. 2) [jaycar] ($0.95 ea) pick something different/recycle old knobs if you have them 

Economy Breadboard Jumper Kit - 5 Colours [jaycar] ($3.45) 

Duracell 6V PX28L (2CR11108) 160mAh battery (qty. 2) [HollyHockBatteries.com.au] ($12.80 ea) (Cheaper option from Jaycar $3.25 ea) 

Battery Holders pcb mount 1/2 AA (qty. 2) [RS Australia] ($3.95 ea)

Approx cost: $99.95 (+$50 for any further costs - generous estimation) Approx with cheaper options: $56.95 (+$50 for any further costs - generous estimation)

Not Pictured: Heat Shrink ($various) Solder ($various) Isopropyl Alcohol (pads from Jaycar $4.95) Wire for proximity sensor Masking Tape Electrical Tape Velcro Cable tie (in a small roll - this part is optional see optional step) Tools:

  • Soldering iron and equiptment
  • Third hand
  • Coping saw or bandsaw
  • Pliers
  • Plastic cutting tool
  • Scissors
  • Permanent marker
  • Mini flathead screw driver
  • 1.15mm drill bit

Step 2: Board Prep, Layout and Cutting


  1. The battery holder has a little plastic nodule that needs to be trimmed off, do this with the plastic trimmers.
  2. Layout 2 x 9mm Pots, 1 x arduino nano, 1 x tact switch, 1 x 1x4 header, 2 x battery holder on the non-copper side of the strip board.
  3. When you're happy with this, mark it out using the permanent marker. Also mark-up the cutting outline - leave one or two rows of holes away from where you'd actually want to cut, depending on how you cut the board it may shatter. If you're more confident you can get a precise cut go for it! 
  4. Use the coping saw to cut up the board. 
  5. Drill out the holes where the battery holder will go into as they are slightly larger than the strip board holes.
  6. Clean up the copper surface with isopropyl alcohol

Step 3: Prep the Sensor

Prep the sensor by soldering on the wires and header. Tips:

  • Place heat shrink over every second wire before heat shrinking the whole connection.
  • Depending on how you've connected the arduino pins to the 1x4 female header, solder the relevant wires on the sensor to that of the male header. I.e. Trigger on sensor to trigger on arduino. This will mean you can just plug straight in.

Step 4: Solder up the Board!


Before you commit to soldering, ensure you have read through this entire instructables, specifically read through step 6 as this step includes the arduino code file. Once you have read and understood the code and potentially tested it in breadboard form,  you will hopefully find your self more confident to layout and commit to solder.  If there is any confusion regarding the circuit layout please comment bellow. I have included the Fritzing file [zip], schematic and strip board diagram. The fritzing file should help you investigate the layout much closer - I attempted to replicate the layout on strip board also, despite best intentions, this is messy. Also I have used 9V batteries in the layout diagram as there are no 6V batteries in frizting - the 9v batteries will work fine but they will not fit on the board (unless you get creative...). Order of soldering:

  1. Arduino Headers on to the board (it is important that the arduino is NOT attached to the headers), note: it is best to solder the short end of the header through, in case you need extra height between the arduino and board to clear any jumpers.
  2. The pots and tact switch on - note that the position is different from the marked position in the previous step.
  3. Battery holder and 1x4 straight header
  4. Once this is done mark out where the jumper cables will be soldered.
  5. Jumper leads:
    1. Solder 1x4 straight header to digital pin 8,9,10, GND (VCC, Echo, Trig, Ground)
    2. Battery Holders - in parallel, ground to ground, positive to positive - make sure that this strip is empty and only batter power runs on this. 
    3. Tact switch ground and digital pin 4
    4. Potentiometers: as they are on a common strip with the tact switch ground this part is done. Solder one pot to Analog pin 6 (A6) and the other to 7 (A7). Solder the voltage to 5v.
    5. Solder two wires onto the toggle switch, this will be used to bridge the battery positive strip with the VIN pin on the arduino. Put some heat shrink on to the switch's terminals.

  6. DC Motor:
    1. to the rear, directly on to the copper, blue to GND and red to Digital pin 3. 
    2. Cut McDonald straw to length and then tape it on, making sure you cover the rotating part of the motor with enough straw.
To finish the circuit you will need to break up connections on the strip board. There are two ways to do this, the messy way and the clean way. This is the messy way:
  1. Once everything is soldered, mark out with a permanent marker where the breaks need to happen.
  2. Proceed to cut the breaks in with a pair of plastic trimmers, some areas will be tricky and delicate - carefully use a sharp blade for this.


Step 5: Prep & Solder the Arduino


  1. Before you solder the arduino on, be sure to remove the 3x2 row headers, this can be done by de-soldering them or just trimming the headers off - this is to create more clearance between the arduino and ultrasonic sensor.
  2. Cover the Mini-USB port with electrical tape to prevent any accidental short circuiting from touching the back of the ultrasonic sensor or any other exposed wire. This will prevent damage to the arduino! 
  3. Flip over the Arduino and place a length of electrical tape over the back to prevent any shorting from the jumpers. Ensure the tape is cut to width so not to impede header pins.
  4. Slide on arduino to header pins and solder them on. Note: to save time, you may solder only the pins that are being used.
  5. Once soldered attach Sensor and cover the back of the strip board with electrical tape in order to attach the motor and cover the solder joints.

Step 6: Load the Code


Understanding this part of the process will help you understand how to solder it together. Do not be afraid to try this out in breadboard first! In fact I recommend you have a dry run using a bread board - it will really help you learn about the circuit and how to manipulate its functions.

  1. Download Arduino 1.0.1. 
  2. Download the HPM ZIP package below, it includes the two libraries that have been modified to suit Arduino 1.0.1.
  3. Install the Ultrasonic and Button library from the HPM code package into the Arduino environment.
  4. Once that is done, open the code in Arduino.
  5. Select the type of arduino and serial port.
  6. Connect the arduino using the micro USB cable, NOTE: ensure that the power from the batteries has been switched off!
  7. Verify the code and then transfer on to the arduino! 
  8. To check that the code is working properly open the serial monitor to get a range, motor pwm and position of distance/PWM max settings. 
  9. Have a play and see how the values change!!

Step 7: Optional Step


This is an optional step. Get the velcro ziptie tape and wrap it around the board, this makes it easy to use the velcro tape as a means of attaching it to the body via a strap. OR Develop your own housing using 3D CAD and Printing.

Step 8: Video and Suggested Uses

Suggested uses (images for suggested use to come):

  • Velcro it to your forehead and go for a walk around the house
  • Velcro it to your leg, either above or bellow the knee to see how you may feel your way around furniture.
  • Try attaching it to your waist, maybe on a belt? 
  • Attach it to your back and see what its like when people walk up from behind!


http://www.youtube.com/embed/Nss_f5EncEM

Step 9: The Next Level: Custom PCB and 3D Printed Housing


Custom PCB to suit components and fit within the 3D printed housing. The pcb has been designed to suit components listed in the beginning of this instructables. This should hopefully make construction a bit quicker and easier. Custom PCB has been included as Gerber files in a .zip and 3D printed housing as STL files. The gerber files still have some trouble, but they have been tested and printed so please tweak as you see where they need to be! Any questions please ask and I will see how I can help!


Print with 3D Hubs!

Code

HPM_CODEPlain text
/* Code Developed by 
SCOTT MITCHELL, PhD. RMIT University scott.mitchell@rmit.edu.au
 &
Daud Imran SHAMSUL AMRI www.imranshamsul.com / imran.shamsul@gmail.com
 
 DATE: 22 OCT 2012
 
 Code for custom design pcb.
 Code functions include: 
 
 - Pot to control max distance (min distance set to 2cm so motor will not power on when set)
 - Power Sensor via Pin
 - Button, when motor off, sensor off.
 - second pot to control PWM output
 
 
 
 */

#include "Ultrasonic.h"

#include "Button.h"

Ultrasonic sensor1(9,10); // Ultrasonic(int TP, int EP);
const int MOT1 = 11; //D11 PWM
const int distPotPin = 6; //A6 distance pot
const int pwrPotPin = 7; //A7 power pot
const int sensor1Power = 8; // D8 PWM8

//distance min and max
const int minDistance = 2;  //dist in CM dont go below 2
const int maxDistance = 200;  //dist in CM

//power min and max
const int minPower = 0;
const int maxPower = 255;

int motorPWM, distPot, distControl; 
int outputPWM, pwrPot, pwrControl; 

long cm; 

boolean motorState = true;

Button button1 = Button(2,PULLUP);  //button control



void setup() {
  pinMode(MOT1, OUTPUT);
  pinMode(sensor1Power, OUTPUT);
  digitalWrite(sensor1Power, HIGH);

  Serial.begin(9600); // this just means you can output to the serial panel
}

void loop()
{ 
  if(button1.uniquePress()){ 
    motorState = !motorState;
  }

  button1.isPressed();

  // check the distance pot
  distPot = analogRead(distPotPin);
  distControl = map(distPot,0,1024,minDistance,maxDistance);


 //check the power pot
  pwrPot = analogRead(pwrPotPin); 
  pwrControl = map(pwrPot,0,1024,minPower,maxPower);


  if(motorState){
    cm = sensor1.Ranging(CM);

    motorPWM = map(cm,distControl,minDistance,minPower,pwrControl); //variable map formula relationship
    motorPWM = constrain(motorPWM, 0, 255);

    analogWrite(MOT1, motorPWM); 
    digitalWrite(sensor1Power, HIGH);
  }
  
  else {
    analogWrite(MOT1, 0);
    digitalWrite(sensor1Power, LOW);
  }


  Serial.print(cm);
  Serial.print("cm Max ");
  Serial.print(distControl);
  Serial.print("cm motorState:");
  Serial.print(motorState);
  Serial.print(" pwr control::");
   Serial.print(pwrControl);
 Serial.print(" PWM ");
  Serial.println(motorPWM);

  // delay(50);
}

Custom parts and enclosures

SS_CUT_BACK.STL
SS_CUT_FRONT.STL
GERBER.zip
GERBER.zip

Schematics

HPM_Fritzing%20file.zip
HPM_Fritzing%20file.zip

Comments

Similar projects you might like

Windows 10 IoT Core: UltraSonic Distance Mapper

Project showcase by Anurag S. Vasanwala

  • 51,778 views
  • 23 comments
  • 138 respects

E-Health: Low Cost Sensors for Early Disease Detection

Project tutorial by Saudin Dizdarevic

  • 14,285 views
  • 8 comments
  • 37 respects

IoT PCR: Low Cost DNA Replication Connected to the Internet.

Project showcase by Kemal Ficici

  • 8,256 views
  • 0 comments
  • 28 respects

Star Wars Lunch Box Data Aquisition

Project showcase by Josh Makatura

  • 7,064 views
  • 1 comment
  • 25 respects

Soldering Iron Controller for Hakko 907

Project tutorial by Alexander

  • 30,333 views
  • 22 comments
  • 67 respects

Rocky Rover: Robotic Vision System PixyCam & Arduino 101

Project tutorial by Ron Dagdag

  • 15,075 views
  • 7 comments
  • 104 respects
Add projectSign up / Login