I recently watched an episode of Stan Lee’s Superhumans which featured a blind
man who used a series of clicks, like a bat, to echo locate his surroundings. I
got to thinking about other blind people and their ability to navigate freely –
without the use of a guide dog or cane. I came up with the idea to use a series
of rangefinders that would take input from sensors and output feedback to pulse
vibration motors placed on a person’s head. As a person gets closer to an object
the intensity and frequency of the vibration would increase – it’s directly
proportional to the distance of an object. If a region was lacking feedback,
then it would be safe to proceed in that direction.

I call my submission the H.A.L.O. - the Haptic Assisted Locating of Obstacles. I
believe this can serve very useful for the visually impaired to have the freedom
to possibily move about hands-free without the assistance of a cane or seeing
eye dog. Technology has undoubtedly made our daily lives better. By using a few
inexpensive components and sensors, I’ve made a device that will allow the blind
to navigate their surroundings and avoid collisions.

Step 1: Overview and Parts List

Major Build Portions of the Project:
- Building the Halo
- Building the Motor Modules
- Building the Haptic Headband
- Wiring the Controller
- Creating the Software

The following is the parts list that will be relevant in the subsequent steps of this Instructable.  

 - Rigid frame (I used a round embroidery frame)
 - Female headers (for the sensors)
 - Ultrasonic Rangefinders (Parallax Ping Rangefinders)
 - Wire (Wires with male and female leads are convenient)
 - Glue
 - Twist ties to tidy up wiring
 - Soldering station
 - Male headers (for creating a bridge to feed 5v and ground
 - RJ-45-Term Screw Terminal (2)
 - RJ-45 Cable
- Marker

Motor Modules:
 - Vibration Motors (5) - Motot, VIB,3V/60mA, 7500RPM
 - Grid-Style PC Board
 - Male header pins
 - Motor "shroud" (to prevent things getting sucked into the motor)

Haptic Headband:
 - Headband
 - Sewing Kit
 - 5 Motor Modules
 - Wire (Wires with male and female leads are convenient)
 - Safety Pins
- Female headers
- Soldering station
- RJ-45-Term Screw Terminal (2)
- RJ-45 Cable
- Marker

Wiring the Microcontroller:
 - Arduino Mega 2560
 - Wire (Wires with male and female leads are convenient)
 - 5 LEDs
 - Darlington IC - ULN 2803A
 - 2 port screw terminal
 - 9v battery
 - 5v regulator

Building the Software:
- USB cable
- PC (for editing code and downloading to Arduino)
- Arduino
- Arduino development environment (www.arduino.cc)
- Source Code, modified Ping.h library 
Hi polymythic, I'm so happy to read this instructable.<br>I worked on a very similar project last year, for the Intel STS competition. It also uses 5 sensors and vibrating motors to convey distance information to the user. I like your idea of placing the motors around the head - I put them on a belt, against the lower back. I suppose that makes sense because whereas you have the sensors spread around 180 degrees, mine all face forward at slightly different angles, so the feedback doesn't really need to wrap around the body. The sensor placement is an interesting design choice - I wonder whether it's more useful to have good resolution in front of your face or be able to sense things in all directions around you. I guess if you added enough sensors, you could have both! Too bad vibrating motors are so imprecise...<br>I haven't had chance to check out your code yet, I'm looking forward to it.<br>Best of luck, I'll be voting for you.
Great to hear from you emattrose. Sounds like you've been down this road! The sensor layout I selected because I wanted to be like &quot;natural&quot; vision with some peripheral. Someone else had commented on making the front stronger and peripheral weaker, which is interesting. The vibration sensors are a bit imprecise, but with the right material to minimize mechanical transferrance, you should be able to get some good resolution on the haptic. Hmm.. Perhaps one of those beds that you jump on and the next person doesnt feel it. The code still has some artifacts of my free play, so feel free to do whatever. Also I have heard of a threading library for Arduino which could have made my life easier than this crazy leapfrogging state machine with timeouts and scheduling.
Great Job poly! Breaking new ground with something we've had access to for a long time. Such a great idea. I think using this with an assist from a can for the low stuff, curbs and the like, the blind could really speed up and move more freely in unfamiliar places. Really good idea. Good luck with this. Benmansfield's advice to hit up a sight center sounds right on and could really help refine the design and bring up some 'real world' issues seeing impaired have that sighted people aren't even aware of. Again... good luck man!
Thanks for the feedback. Agreed that the curb and low angle stuff is another part of the solution that should be integrated into the haptic picture. This project and people's commentary has fired up the mental gears thinking about assistive tech ideas.
I think this is the coolest thing I've ever seen on Instructables.<br><br>I think it'd be great to do a glove which you can feel distance on, too!<br><br>Also, would be great for able-bodied people, eyes in the back of the head...
Wow, bishopdante. That is high praise considering some of the AMAZING things that come up on this site. There are many directions to take this project for sure. Its a different experience having vision and using the device vs. being blindfolded. Your brain really does reach out for some data when you are blindfolded.
I seriously made an account just to tell you how wonderful this is... i honestly could see this being used by visually impaired people around the world. The idea is astounding. maybe a suggestion would be to put motors elsewhere as well as the head, it seems like it could get a little crowded up there with all the buzzing and im sure you have considered this, but still its such an astounding idea.
SaberToothTyler,<br>Thanks so much for your nice words. You are right in that if there is a lot of detection in an area, multiple adjacent sensors are firing. Teasing out the bit of quiet in the &quot;hallway&quot; situation (left and right firing, forward is no vibration) requires some focus and training. However, it is amazing that as a sighted person, when blindfolded, you quickly focus your brain computing on those stimulus. I would like to see how I do after being blindfolded with the rig for an hour or so.
Easily one of the most useful ideas on this site. I could definitely see this changing hundreds of lives. Possibly extend the range, and use a variable-vibration motor(if it exists), so that you can 'see' things across a room, and the vibration gets consistently stronger as the distance narrows. Also, perhaps if you used electric pulses instead of vibrations, the hardware could be slimmed down considerably. This is definitely worth patenting. I can also think of several military applications for a cheap, easy to use, set of night vision goggles that offer 360&deg; vision.
Thanks for the comments, comander01. One of my design objectives was to keep the project at a resonable cost, but far more could be done with different sensors (Kinect, anyone?) The form factor can be considerably improved, I agree. I could get this into a normal hat. I do in fact use variable vibration motor. I use the PWM output for the intensity of the motor, and frequency between pulses as well.
<p>hello every body </p><p>I worked on a very similar project, and I need help</p>this code for using only one motor and one hc-sr04 ultrasonic sensor, the code is shown below:<br><br>#define trigPin 7<br><br>#define echoPin 6<br><br>#define motorPin 5<br><br>void setup()<br>{ <br> Serial.begin(9600);// to use the serial monitor<br> <br> pinMode(trigPin, OUTPUT);<br> <br> pinMode(echoPin, INPUT);<br> <br> pinMode(motorPin, OUTPUT);<br> <br>}<br>void loop()<br>{<br> <br> int duration,distance;<br> <br> digitalWrite(trigPin, HIGH);<br> <br> delayMicroseconds(10);<br> <br> digitalWrite(trigPin, LOW);<br> <br> duration = pulseIn(echoPin, HIGH);<br> <br> distance = (duration/2)/29.1;<br> <br> Serial.print(distance);//to print the distance on the serial monitor<br> <br> Serial.println(&quot;cm&quot;);<br><br> // to make the motor vibrate depending on the distance<br> // if the ultrasonic sensor is too far from the obstacle it will vibrate slowly<br> // if the ultrasonic sensor is very close to the obstacle it will vibrate very fast<br> <br> if(distance &lt;= 60 &amp;&amp; distance &gt;= 45)<br> {<br> // to make the motor vibrate<br> digitalWrite(motorPin, HIGH); // making the motor on<br> <br> delay(200);<br> <br> digitalWrite(motorPin, LOW);// making the motor off<br> <br> delay(200);<br><br> } <br><br> else if(distance &lt; 45 &amp;&amp; distance &gt;= 30)<br> {<br> digitalWrite(motorPin, HIGH);<br> <br> delay(100);<br> <br> digitalWrite(motorPin, LOW);<br> <br> delay(100);<br> <br> }<br> else if(distance &lt; 30){<br> <br> digitalWrite(motorPin, HIGH);<br> <br> delay(50);<br> <br> digitalWrite(motorPin, LOW);<br> <br> delay(50); <br> <br> } <br> else <br> {<br> digitalWrite(motorPin, LOW);<br> }<br>}<p>I want to add two more motors and two ultrasonic sensors, one of them in the left and the other in the right...<br>I want you to help me in the code, because I don't know how I can change it for two other motors &hellip;<br> plz reply as soon as u can..</p>
<p>i invented an idea like this but a fake website davison invention stole it they have many lawsuits againts them for fraud</p>
hi, we are having trouble with the codes. The following errors is below: <br> <br>'RESCHEDULE_THRESHOLD_CONSTANT' was not declared in this scope. <br> <br>In file included from HALO_Sketch_12_10_v8_2010.pde:15: <br>C:\Users\CAIMOL\AppData\Local\Temp\Rar$EXa0.454\arduino-1.0.2\libraries\Ping2/Ping2.h:22:22: error: WProgram.h: No such file or directory <br>HALO_Sketch_12_10_v8_2010.pde: In function 'int pingAndAdjustSchedule(int)': <br>HALO_Sketch_12_10_v8_2010:184: error: 'RESCHEDULE_THRESHOLD_CONSTANT' was not declared in this scope <br>
Did you get your project running?
please we really need the solution ASAP
HI, we are already starting building your project but <br>we are having trouble with the codes. The following errors is below: <br> <br>'RESCHEDULE_THRESHOLD_CONSTANT' was not declared in this scope. <br> <br>In file included from HALO_Sketch_12_10_v8_2010.pde:15: <br>C:\Users\CAIMOL\AppData\Local\Temp\Rar$EXa0.454\arduino-1.0.2\libraries\Ping2/Ping2.h:22:22: error: WProgram.h: No such file or directory <br>HALO_Sketch_12_10_v8_2010.pde: In function 'int pingAndAdjustSchedule(int)': <br>HALO_Sketch_12_10_v8_2010:184: error: 'RESCHEDULE_THRESHOLD_CONSTANT' was not declared in this scope
Here is a similiar comment from another developer: <br> <br>From: bchua3 <br>Date: Dec 13, 2012. 8:01 PM <br>Subject: Project HALO <br> <br>Hi Sir, <br>Good day to you. <br>I am actually trying out the project HALO that you submitted. <br>I uploaded the code to our Arduino Mega 2560 directly. <br>There were a few errors, the RESCHEDULE_THRESHOLD_CONSTANT was not found so I had to delete the // before it. Wprogram.h was not found as well so I had to replace it with Arduino.h as we are using the latest Arduino IDE Build. <br>I compiled the program and it was a go, however, the motor kept on spinning and it wont detect the proximity of the obstacle. <br>Any advice Sir? <br>Thanks
Sir it's OK that he deleted \\ ,and he even replaced wprogram.h file with arduino.h . but what about his problem that motor keeps on spinning? And it won't detect proximity of the obstacle?<br>Please can you please give a solution to this?<br>If you have troubleshooted the code ,then please send it to my email id: maheshjshetty@gmail.comcom.<br>Please sir..!
It was commented out in the code for some reason. Just delete the // preceding the RESCHEDULE_THRESHOLD_CONSTANT up top. <br> <br>Also, you will need to copy the ping2 library into /your_arduino_directory/library/Ping2 <br> <br>
do i have to delete all these lines: <br> <br>// RESCHEDULE_THRESHOLD_CONSTANT - Note: This may be replaced by &quot;debouncing?&quot; the motor <br>// This is the threshold over which the distance is large enough to trigger a <br>// reschedule event. If too small, there may be a lot of rescheduling, and if <br>// it is too large, then there may not be enough granularity. <br>//#define RESCHEDULE_THRESHOLD_CONSTANT 20.83 <br> <br>or all these lines: <br> <br>// CALIBRATION VARIABLES <br>// INTERPULSE_LANTENCY (milliseconds) - Defines the period of time between when one ping <br>// fires and the next fires. This should allow for the sound to travel to <br>// its furthest detectable echo distance so that the next sensors RX will not <br>// pick up splash from the previous ping's TX. This may/will result in <br>// a lower than real distance result from the next sensor. <br>#define INTERPULSE_LATENCY_DURATION 25 <br> <br>// MOTOR_PULSE_DURATION (milliseconds) - Defines the duration that the motor will pulse <br>// This is a constant at the moment, and the MOTOR_VIBRATION_FACTOR will <br>// shorte between the pulses of the motor <br>#define MOTOR_PULSE_DURATION 250 <br> <br>// RESCHEDULE_THRESHOLD_CONSTANT - Note: This may be replaced by &quot;debouncing?&quot; the motor <br>// This is the threshold over which the distance is large enough to trigger a <br>// reschedule event. If too small, there may be a lot of rescheduling, and if <br>// it is too large, then there may not be enough granularity. <br>//#define RESCHEDULE_THRESHOLD_CONSTANT 20.83 <br>
<p>your project is truly awesome and very useful ,bro . please can you send me the full code of your projects ? i want to build one for my self . all help is appreciated.i hope you can rely to me as fast as you can ... <br></p>
<p>the project is one of the most amazing ever . i would like to get the full code for the sensors please . all help is appreciated </p>
<p>It's a great project you've done it, so could you please provide me how </p><p>Darlington IC - ULN 2803A pins are connected in the circuit?</p><p>My email <a href="mailto:ahmed.ebrahem@gmail.com" rel="nofollow">ahmed.ebrahem@gmail.com</a></p>
<p>Oh man you guys rock so hard :D </p><p>I was wondering to build a project similar like this and i'm seeing really hard work here about it! :D Really nice.</p><p>Did you guys have iterate on it? Seen here also another hactip project with a glove that also measures analog ir on fingers to vibe, really nice thoughts.</p><p>Will really want to know if you have been testing it on over this years and if you can &quot;sense&quot; enviroment better. </p><p>Thank you!</p>
sir will you please send me the source coding..my mail id is r.jamesanandh@gmail.com <br>
Hello! Source code is on the site in the instructable. It's fallen into disrepair because the Arduino environment has updated a couple times. I've made some modifications in the last year because others have contacted me. Way behind on updating. Will get to it when I've got time.<br>
sir will you please send me the source coding..my mail id is r.jamesanandh@gmail.com <br>
sir will you please send me the source coding..my mail id is r.jamesanandh@gmail.com <br>
DX sells an ultrasonic range finder for $3.20 (USD) shipped, $2.60 if you buy 3 or more. It would cut down on the cost of making this considerably.<br> <a href="http://dx.com/p/hc-sr04-ultrasonic-sensor-distance-measuring-module-133696" rel="nofollow">http://dx.com/p/hc-sr04-ultrasonic-sensor-distance-measuring-module-133696</a>
when we do what you told we will not encounter another problem like bchua3 had? or we will also have this problem &quot; the motor kept on spinning and it wont detect the proximity of the obstacle. &quot; ?<br>also i really found it hard to use the figure 1 because in the figure the motor has only 2 pins while in the your instruction it has 3 pins hehehe im confused, i know i might be a burden but thank you for being understanding.
What is the debug output telling you. Look for //DEBUG. Also, this function fireAndPrintSensor should be telling you all kinds of stuff. What is the serial output telling you? It should be telling you the range and intensities. Do you have some debug output you could send?<br><br> // Display the range information<br> Serial.print(&quot;************ SENSOR &quot;);<br> Serial.println(sensorNumber, DEC);<br> Serial.print(&quot; Inches:&quot;);<br> Serial.println(inputSensorArray[sensorNumber].inches(), DEC);<br> Serial.print(&quot; Feet:&quot;);<br> Serial.println(calculateRangeInFeet(inputSensorArray[sensorNumber].inches()),DEC);<br> Serial.print(&quot; Gap in Milliseconds:&quot;);<br> Serial.println(motorStopTimeGap[sensorNumber]);<br> Serial.print(&quot; Intensity:&quot;);<br> Serial.println(motorIntensity[sensorNumber]);<br> Serial.println();
i will try to do everything you sent but i don't know how to debug can you instruct me how?
i hope you do not loose your patience with us, sorry for trying to do a hard project for a beginner like us. your project is perfect for what we want to build. thank you for your full support and i hope you will keep on entertaining our questions, this is my email &quot;ralphlouietionghoy@ymail.com&quot; i hope you can send us your old schematic diagram. also when i delete the RESCHEDULE_THRESHOLD_CONSTANT there is no error regarding about that but still the error C:\Users\CAIMOL\AppData\Local\Temp\Rar$EXa0.454\arduino-1.0.2\libraries\Ping2/Ping2.h:22:22: error: WProgram.h: No such file or directory pop up but i already copy the ping2 library in the my arduino/libraries/ping2. Again thank you very much and i hope yo will respond ^^,
hi polymythic remember me? hehehe we are currently building your prototype we have all the components ready and we plan to start working on it on 29th of december, just curious though, what is the LED for? only for testing? and if we are going to create the project itself, does that mean the diagram in part 1 will changed? i need clarity please reply ASAP tnx a lot :)
No problem. I am here to help. The LEDs are for debug/testing really. The motors do not come through well in videos, so the LEDS show how the motors are pulsed. Also, they do make nice debug indicators.
so it means that we can removed the LED's when doing it on actual? by simply eliminating the connection of LED's in the diagram, it means that the motor will be directly connected in the IC?
hello i hope you will respond, i seriously want to built this project, but i find it hard to software, which exact code do i have to use because i am very poor at programming. can you tell me which one of the files i downloaded from this page is the code, if it is not there can you please send me or email it to me please please i really want to know the codes thank you and GOD bless
Certainly! Here you are! Good luck my friend. <br> <br>http://polymythic.com/HALO_SourceCode_v8.zip
what is the folder ping2 for? can i install the program HALO_Sketch_12_10_v8_2010.pde directly to the arduino without doing any changes? i am confused, what is the purpose of the ping2 folder? please respond i have all the materials bought. i will post some pictures and videos after i finish your project tnx a lot :)
The ping library calls to the IO that is connected to the digital input (the motion sensor). If nothing is available immediately, it will wait. This is called a &quot;blocking read&quot;. That will screw lots of timing up if it cannot read from the motion sensor. Ping2 just gets rid of that blocking read so the system can continue on its merry way. <br> <br>Copy ping2 library into arduino/libraries/Ping2 and it should be good to go. You'll see the &quot;include ping2.h&quot; in the sketch. <br>
thank you very much! your are so helpful i am building exactly what is in your instruction and if i hopefully understand it fully i might be able to make some modification hehehe but since im a beginner, i will make exactly this. <br>by the way im louie from the Philippines and a computer engineering student.here thanks again and GOD Bless...
The diagram is in the instructable. I did not produce a schematic as such. You should be able to understand how to hook everything up by looking at the pin assignment in the code and making sense of the image in step 1: <br><br>http://www.instructables.com/id/Haptic-Feedback-device-for-the-Visually-Impaired/<br><br>Zoom in and the pins should be right.<br>
im sorry if i am quite demanding hehe i dont want to put my components to waste if i made some mistake, coz items here in the philippines is quite expensive. anyway you really are helpful to your audience. wish you the best :)
No problem! The Maker Movement is about helping eachother out! Good luck from a friend in the United States!
last request can i have a copy of your schematic diagram :) tnx
I was thinking of doing this for a science fair, but much differently. Ur idea is way too bulky and only takes account for the upper-body not the lower.
Go forth and improve, Axeman! That is the beauty of open projects. Let me know how it goes and I hope you win!
Hi! Great project!! <br> <br>I am a Honours Industrial Design student and I've decided to replicate this project as part of my Major. <br> <br>I've gone for the budget HC-SR04 ultrasonic sensor, and now trying to modify your library to suit these ping sensors - i'm a novice with coding so i will see how I go. If you happen to know of any existing mods to your code could you please let me know? <br> <br>The project is based around Low Vision and Location Sensing. <br> <br> <br>Best, <br>imran <br> <br>www.imranshamsul.com <br>
Excellent! Let me know how your work goes. I have not modified any of the code, so it is as it was in the project I posted on instructables. <br><br>If you have any questions, I will try to answer them. Email me at steve@polymythic.com.<br><br>Good luck!
Hi, Steve. Haptic Feedback device for the Visually Impaired [Project HALO] can be commercialized. HALO - project for blind too. If you make such a device on an industrial scale - you can make many people happy.

About This Instructable


142 favorites


Bio: By sharing ideas there can be a crossroads of polymaths and myths. The origins of facts (found through science) meeting the origins of our beliefs ... More »
More by polymythic: Haptic Feedback device for the Visually Impaired [Project HALO] Motion Feedback MP3 Player Serv O'Beer with iPhone for the Perfect Pour
Add instructable to: