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

Picture of Haptic Proximity Module (HPM) for Low Vision Users

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

Picture of 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] ($26) (Cheaper Options: HC-SR04 $4 from
Female Header 1x4pin Straight 0.1" [socket for ultrasonic sensor, from] ($0.45)
Break Away Headers 40 Pins [] ($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) [] ($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

Picture of 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

Picture of 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!

Picture of 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

Picture of 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

Picture of 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

Picture of 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

Picture of 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!


YousefA13 (author)2015-11-02

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?

YousefA13 (author)YousefA132015-11-10

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

ishamsul (author)YousefA132015-11-12

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):

SRF10 (max 6m):

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.



YousefA13 (author)ishamsul2015-11-21

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

skinclinicaus (author)2015-09-01

I like this post.

ishamsul (author)skinclinicaus2015-09-06

Cheers! Looking forward to seeing some of your work.

elaine.corrington (author)2014-07-28

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.

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?

Gowtham07 (author)2014-01-16

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??

ishamsul (author)Gowtham072014-01-29

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


chetancc (author)2013-08-12

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.

ishamsul (author)chetancc2013-10-10

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!

oagusta (author)2013-10-06

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

ishamsul (author)oagusta2013-10-10

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 - this project uses both. I hope this helps! Cheers, Imran

tolstoyan (author)2013-02-16

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

ishamsul (author)tolstoyan2013-02-18

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

tolstoyan (author)2013-01-20

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

ishamsul (author)tolstoyan2013-02-03

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

tolstoyan (author)ishamsul2013-02-04

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: i hope you can help me out with this, and also i was new to arduino so im not really a code jockey

ishamsul (author)tolstoyan2013-02-05

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!

tolstoyan (author)ishamsul2013-02-06

okay, i haven't try to solder it to anything yet, i was doing it on a breadboard. i will try all the solution that you provide. i will send you some picture of my work to show you if anything is connected properly, by the way thanks for the support :)

ishamsul (author)tolstoyan2013-02-07

good luck! keep asking questions if you need to :)

tolstoyan (author)ishamsul2013-02-10
this is the exact arduino compatible i am using, can you check if it is compatible to arduino v3? if there's some changes like on the connectio or codes, can you please provide me that since i am very new to arduino thanks

tolstoyan (author)ishamsul2013-02-10
this is the exact arduino compatible i am using, can you check if it is compatible to arduino v3? if there's some changes like on the connectio or codes, can you please provide me that since i am very new to arduino thanks

chetancc (author)2012-12-15

Hi Imran,

Sorry for very late reply but I really liked your project. I am
planning to create it here in Mumbai India. I have gathered all the
parts and uploaded the program. But I saw circuit is behaving
different way.

(1) The motor continuously rotates (vibrates) without detecting any
object through ultrasonic sensor for sometime as per attached
screenshot from arduino IDE serial monitor "Output from Serial Monitor
Port 1.jpg"
(2) After some time motor stops for some time, see attached screenshot
"Output from Serial Monitor Port 2.jpg"
I did the exact connections as per schematic and breadboard design.

Suggest me if I doing something wrong. Let me know if you need more information.

ishamsul (author)chetancc2012-12-16

Hi Chetan,

Thank you for posting about this! It is great to see someone else build this circuit!

From the photos you have sent me it seems there may be a few problems.

1. Please ensure all digital connections that require pwm have been connected to pwm pins.
2. I've previously had issues with the HC-SR04 sensors, and switched to the more expensive (x4) but reliable sensors. This is something I'm yet to over come - it was suggested that this is a voltage issue as they are sensitive to voltage shifts (apparently). I attempted to overcome this by running into the Voltage In (VIN) pin as there is an on-board voltage regulator.

I will have a closer look at your email and images and get back to you with a longer reply! Thank you again!


zawy (author)2012-10-29

I have thought about doing a similar project, but would use echo location like some deaf people use clicking sounds to detect distance, direction, size, and texture of objects around them. The ears are advanced in detecting location of a sound and the higher frequencies give more precise distances. I believe only the young will therefore have exceptional skill. So, I think an inaudible ultrasonic automatic clicker could be useful, when combined with 4 microphones and 4 headphone speakers, and a frequency divider to lower the reflected sound to hearing range. The clicker would be in the belt buckle area, with 2 microphones listening on each side of the hips, and two on the shoulders. The idea is to have them far apart so the intuited triangulation of distances is improved. Since this is nearly 3 times the distance between the ears, maybe precision is 3 times better (although the ears and brain do other calculations that this prevents). The speakers would be in-the-ear buds, somehow placed in front of the ears, 2 for each ear. The clicker needs to be a wavelet of a range of wavelengths. The ears and brain might be optimized to use the reflected sounds of our own footsteps in the dark, which create a wavelet of high and low frequencies that varies with terrain. Simple finding the ideal audible clicking sound without anything else would be excellent.

ishamsul (author)zawy2012-10-31

hey zawy, go for it!! don't be afraid to start somewhere. I failed twice before I got here. Remember to fail quickly and learn. Send me a message if you'd like any help developing the idea.
all the best!

zawy (author)ishamsul2012-11-01

I am just providing food for thought for others. Another idea that is much more marketable to a larger audience rather than being useful to the blind is to make the reflected sound into music that paints a picture of the surroundings. The sequence of the notes would be a scan from left to right, the tone of the notes would be low for low objects and high for high objects. A musician would immediately be able to determine height to any accuracy the device is capable of. Volume of the note is distance to the object and length of the note is its width. In other words, if you drew dots to represent the objects in front of you on a sheet of paper from left to right, the dots would correspond to notes on a sheet of music from left to right. So if you can "see notes" when a tune is played, then you could "see objects" with this type of device.

ishamsul (author)2012-10-30

Hi Everyone, there is another instructables user, mrfrink, that has a similar ultrasonic device! Have a look at his BatGlove on!

MNSnowbird (author)2012-10-28

Your parts list show 2 6v batteries but your scematic shows 2 9v batteries. Did I overlook something?

ishamsul (author)MNSnowbird2012-10-28

this has also been updated on step 4! thank you for flagging this!! :D

ishamsul (author)MNSnowbird2012-10-28

Hi MN Snowbird!

Thanks for the comment, you haven't overlooked anything! Technically the circuit can be powered by either 6v or 9v battiers as it is connected to the VIN on the arduino. However, it will not fit on the circuit board!

Frtizing did not give me an option to put a single 6v battery so I opted for a 9V - just in case someone followed the drawing when building. I will replace the image and make special note of this!

Thanks again and I hope this helps you build the circuit better.


sidecars (author)2012-10-28

Thank you for sharing this. What a nice benefit for us all. I appreciate the thoughtfulness behind it.

ishamsul (author)sidecars2012-10-28

Thank you sidecars & CopterRichie!

CopterRichie (author)sidecars2012-10-28

Totally Agree.

chetancc (author)2012-10-28

Hey Ishamsul, good job, I am waiting for the video, please upload it as soon as possible. I want to see how it works :)

ihart (author)2012-10-26

Nice project! Is there a schematic?

ishamsul (author)ihart2012-10-26

There you go :)

ishamsul (author)ihart2012-10-26

thank you ihart! yes schematic is on its way :) will keep you updated! hopefully a video will be up in a few days also.

About This Instructable




Bio: 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 ... More »
Add instructable to: