Haptic Proximity Module (HPM) for Low Vision Users




Introduction: Haptic Proximity Module (HPM) for Low Vision Users

About: Imran Shamsul is a researcher from the Industrial Design Program at RMIT University, Melbourne; and one fifth of The Scale of Things, a Melbourne based design collective. A product of two different worlds, Imr…

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: 

Step 1: Shopping List

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


  • 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.


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)

  • 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.

  • 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.


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!

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!

Be the First to Share


    • Tiny Things Speed Challenge

      Tiny Things Speed Challenge
    • Paint Challenge

      Paint Challenge
    • Hide It Challenge

      Hide It Challenge



    6 years ago

    I'm planning to build this according to your instructions in less than 2 weeks, is it realistic given I have virtually no electronics background but a half-decent background in programming?


    Reply 6 years ago

    For clarification I'm building this as a component of my biomed course and would like to characterize the instrument (accuracy, precision, etc.)


    Reply 6 years ago

    Hi Yousef, firstly I must apologise, I had written a reply and to my knowledge had submitted it. Now it doesn't seem to be here! Please forgive me!

    Please give me more details on how you would like to characterise it?

    At this stage, with time restrictions, the best and fastest way will be to build it will be on breadboard to quickly connect all the components. You can use extended cables to attached the motor to your body or underneath the breadboard so you can hold it in your hand to get the haptic feedback (let me know if you require a sketch).

    Precision and accuracy comes down the the quality of the sensor that you are using. Depending on which sensor you purchase, you can review the datasheet of the component to get the manufacturers breakdown of the sensor's field of operation. Maybe a good starting point to compare for yourself.

    Checkout these two sensors for an idea of range and field of operation:

    SRF05 (max 4m): http://www.robotgear.com.au/Product.aspx/Details/2...

    SRF10 (max 6m): http://www.robotgear.com.au/Product.aspx/Details/2...

    If you're going to build a breadboard version, you can adjust the shopping list a little and buy some different components. It depends what you have easy access too. Let me know and I can recommend where to go.




    Reply 6 years ago

    Thank you Imran! I've ordered all my parts and I'll post back here to let you know how it goes. Essentially my project is an exercise in determining how much sensors deviate or fall in line with a sensor's spec sheet so in that sense it doesn't matter what the quality of the sensors are. .


    Reply 6 years ago on Introduction

    Cheers! Looking forward to seeing some of your work.

    Have an idea for you! I have worked with many deaf-blind people throughout my career. How about adding a variable vibratory component that would give a different feel for indicating speech sounds and volume so that there would be at least a slight distance sense of people approaching, entering a bedroom, etc? Get away from that sense of one's skin being the end of the world, always open to unpredictable invasion. That would make a difference to MANY people.


    Reply 6 years ago on Introduction

    Hi elaine, thank you for the great feedback! Extending the skin's sense is an interesting idea and one that should be further explored. I'd not thought about connecting sound to touch. Maybe we could explore ideas such as light intensity or even changes in barometric pressure as a means to change skin feedback?


    7 years ago on Introduction

    Hi Ishamsul, very impressive work and thanks for sharing this.. I have 2 questions..

    1) I know nothing about arduino.. Will I be able to understand the working and the code on my own??

    2) How long will it take to design this for a beginner like me??


    Reply 7 years ago on Introduction

    Hey Gowtham07,

    1) If this is your first foray into arduino I'd try some basic tutorials first to understand both how to load code onto an arduino, secondly how to understand how to manipulate the code to change pin numbers etc incase you use a different arduino. head to http://arduino.cc/en/Guide/HomePage to start at the beginning.

    2) i'm not sure how long it will take you, it took me 3 months in total to start from scratch with code and bread boards to designing a custom circuit board. How comfortable are you with the fundaments of electronics and circuit construction? If you want to build this circuit, if you follow the circuit diagram in step 4 you should be able to replicate it on breadboard first. Do everything on breadboard before you commit to soldering to a circuit board. Its great for debugging and working things out. Sometimes we just make mistakes.

    Good luck! please keep posting questions if you get stuck. Post any images if you want me to have a look.



    8 years ago on Introduction

    Hi Ishamsul, Can you please tell me how 3D printed housing as STL files turn into physical object? I am interested to know more about it.


    Reply 8 years ago on Introduction

    Hey chetan, I used a software to 'slice' the STL model so it could be sent to a 3D printer. Have a look around the ultimaker/reprap/makerbot forums regarding STL to 3D printed object. Good luck!


    8 years ago on Introduction

    which pin should i use if i wanna put buzzer on to ? tx


    Reply 8 years ago on Introduction

    Hey Oagusta, we didn't write in a function for a buzzer. You could use any pin provided you wrote in how you wanted the buzzer to work. Check out VIA - https://www.instructables.com/id/VIA-Visual-Impairment-Aid-Haptic-Sound-Feedbac/ this project uses both. I hope this helps! Cheers, Imran


    8 years ago on Introduction

    my prototype is now working thank you very much, it works out so well :)


    Reply 8 years ago on Introduction

    fantastic!! thank you for building one :) could you please send me a photo or a video if you can?


    8 years ago on Introduction

    can i use the arduino nano v.2 (atmega168)
    because it is cheaper hehehe :)


    Reply 8 years ago on Introduction

    Hey Tolstoyan,

    Apologies for the delayed reply! You can try and see how the v.2 will work. I think the main thing is to ensure there are enough PWM pins and digitial pins. There might need to be some work done to get the libraries working.

    Let me know how you go! Feel free to message me.

    Cheers, Imran


    Reply 8 years ago on Introduction

    i already bought all the components and i will be using the v3, i did exactly the same on your schematic diagram and your fritzing file but there seems to be a problem because the motor is not responding at all, here is the exact sensor i use: https://docs.google.com/file/d/0BxdLxDCD6HidSloyN0ZPYVA4QjA/edit?pli=1 i hope you can help me out with this, and also i was new to arduino so im not really a code jockey


    Reply 8 years ago on Introduction

    Awesome work! Firstly thank you so much for giving this project a go!

    Can you explain what's happening with the motor, is there no movement, some movement, constant movement, irratic movement... Etc.

    Have you tried this out on breadboard first? It will help debug any problems with the sensor or wiring.

    As for the code, have you installed the libraries properly in arduino? If you have the file should compile without error. What IS are you using arduino on?

    The code debugging can be achieved with an led in place of a motor, you want to begin a process of elimination.

    Check things like polarity, grounds etc.

    If you're using strip board have you broken up the link on the back, there is a chance that the circuit is shorting if you haven't.

    Check the function of the sensor, you can do this by checking the serial monitor and seeing if the values change as you turn the potentiometers, press the pause button, change the object distance in front of the Ultrasonic sensor.

    Getting the pin direction correct for the button is important.

    Keep at it! Please keep leaving comments and i will do my best to help along the way!