Last summer while on vacation in Maine, we met another couple: Mike and Linda. Linda was blind and had been blind since the birth of (I think) their first child. They were really nice and we had a lot of laughs together. After we came home, I couldn't stop thinking about what it would be like to be blind. The blind have seeing eye dogs and canes and I am sure a lot of other things to help them. But still, there must be a lot of challenges. I tried to imagine what it would be like and I wondered, as an electronics nerd, if there was something I could do.
I burned my eyes one summer with a welder when I was around 20 years old (long story...dumb kid). It's something I'll never forget. Anyway, I had my eyes patched for a day. I remember my mother trying to walk me across the street. I kept asking her if the cars had stopped. She said something like, "I'm your mother...do you think I'd walk you out into traffic?" Thinking back on what a dweeb I was when I was a teenager, I wondered. But I couldn't get over not knowing if there was something about to hit me in the face as I walked. I was very happy and relieved when we took the patches off. That's the only thing close to 'experience' that I have had in my life with regards to blindness.
I recently wrote another Instructable about a young friend at work who lost his sight in his right eye and a device I made for him to tell him if there was something on his right side. If you want to read it it's here. That device used a Time-of-Flight sensor by ST Electronics. About a minute after finishing that project I decided that I could make a device to help the blind. The VL53L0X sensor I used on that project has a big brother/sister sensor called the VL53L1X. This device can measure greater distances than the VL53L0X. There was a breakout board for the VL53L0X from Adafruit and for the VL53L1X there was a breakout board from Sparkfun. I decided to create a pair of glasses with the VL53L1X on the front and a haptic feedback device (vibrating motor) behind the glasses near the bridge of the nose. I would vibrate the motor inversely proportional to the distance to an object i.e the closer an object was to the glasses, the more it would vibrate.
I should note here that the VL53L1X has a very narrow Field of View (programmable between 15-27 degrees) meaning, they are VERY directional. This is important as it gives good resolution. The idea is that the user can move their head like a radar antenna. This along with the narrow FOV allows the user to better discern objects at different distances.
A note about the VL53L0X and VL53L1X sensors: they are time-of-flight sensors. This means that they send out a LASER pulse (low power and in the Infrared spectrum so they are safe). The sensor times how long it takes to see the reflected pulse come back. So distance equals rate X time as we all remember from math/science classes right? So, divide the time in half and multiply by the speed of light and you get distance. But as was pointed out by another Instructables member, the glasses could have been called LiDAR Glasses as using a LASER in this way is Light Distance and Ranging (LiDAR). But as I said, not everyone knows what LiDAR is but I think most people know RADAR. And while infrared light and radio are all part of the electromagnetic spectrum, light is not considered a radio wave as microwave frequencies are. So, I'll leave the title as RADAR but now, you understand.
This project uses basically the same schematic as the one for the other project...as we'll see. The big questions for this project are, how do we mount the electronics on glasses and, what kind of glasses do we use?
Step 1: The Glasses
I decided that I could probably design a simple pair of glasses and print them with my 3D printer. I also decided that I only needed to 3D print the skeleton or frame of the glasses. I'd add a printed circuit board to solder in the components. The printed circuit board (protoboard) would be attached to the frames which would add strength to the whole assembly. A 3D rendering of the frames is shown above.
The STL files are also attached to this step. There are three files: left.stl, right.stl (the earpieces/arms) and glasses.stl (the frames).
Step 2: The Printed Circuit Board
I used an Adafruit Perma-Proto Full Sized Breadboard. I positioned the breadboard over the front of the glasses and centered them. The top edge of the glasses I made even with the top of the protoboard. The rectangular part of the glasses that extends out from the top is where the Time-Of-Flight sensor will eventually be mounted. A good portion of the top of this part of the frames sticks up above the protoboard. This is OK as we do not need to solder anything to the top of the sensor, just the bottom.
There is a hole in the center of the breadboard that is almost exactly on top of where the bridge of the nose will be in the glasses. I marked the 4 holes that are in the frame onto the protoboard using a fine tip marker. I then drilled the holes into the breadboard.
Next, I mounted the frames to the breadboard using M2.5 screws. Mine are nylon and I got a whole kit of screws from Adafruit for this purpose. Once the screws were attached I took a marker and drew a line around the frames onto the breadboard. For me, I marked straight down the indents on the sides of the frames where the ear pieces will be located. This is my preference...but maybe you'll want the ear parts of the frame to be visible.
Step 3: Cutting It Out
Next I took the 4 screws back out from holding the frames to the breadboard. I did a rough removal of material outside of the line we marked. I was careful to stay a little bit away from the lines because I would refine this later with the tabletop belt sander that I have. You can use a file...but we are getting ahead of ourselves.
You can rough cut around the line using whatever means you have. Maybe a bandsaw? Well, I don''t have one. I have a 'nibbler' for printed circuit boards so I used that. It actually took a fair amount of time and it is kind-of-a-drag to do. But printed circuit board material can shatter and crack and so, I wanted to go slow. I nibbled my way around and also up into the nose area...but only roughly. You can see what I was doing into the picture above.
Step 4: Sanding or Filing
I removed the material much closer to the line using my tabletop belt sander. Again, you can use a file if you don't have anything else. All I can say here about sanding is that, depending on the grit of abrasive in the sander, take care with how much material you try to remove. There's no going back. Sometimes a single slip can ruin the board (or at least make it look asymmetrical or blemished). So, take your time.
You can see my before and after pictures above.
Step 5: Fine Tuning
I reattached the frames with the 4 screws and went back to the belt sander. I very very carefully sanded off right up to the edge of the frames. I did need to use a round file in the nose section because I just couldn't make that sharp of a turn in my sander. See my final results above.
Step 6: Adding the Sensor
At this point I added the VL53L1X sensor breakout board. First I added two long M2.5 nylon screws pushing them through the holes in the frames and through the holes in the VL53L1X. I added a nylon nut to each screw and very gently tightened them. Over the top of each nut I added two (four total) nylon washers. These are needed to make sure that the VL53L1X sensor lays parallel to the protoboard.
I placed a 6 position terminal strip onto the board in a position so that the holes in the top of the VL53L1X lined up with the two screws I put at the top of the frames (with the nylon washers). I added nylon nuts to the ends of the screws and again, gently tightened them. See the pictures above.
Step 7: Schematic
As I said earlier, the schematic is roughly the same as the one for the Peripheral Radar project. One difference is that I added a pushbutton (a monetary contact switch). I imagine that at some point we'll need one to change modes or implement some feature...so, better to have it now than add it later.
I also added a 10K potentiometer. The pot is used to adjust the distance the software will consider as the maximum distance to respond to. Think of it as a sensitivity control.
The schematic is shown above.
The parts list (which I should have given earlier) is as follows:
SparkFun Distance Sensor Breakout - 4 Meter, VL53L1X - SEN-14722
Adafruit - Vibrating Mini Motor Disc - PRODUCT ID: 1201
Adafruit - Lithium Ion Polymer Battery - 3.7v 150mAh - PRODUCT ID: 1317
Adafruit Perma-Proto Full-sized Breadboard PCB - Single - PRODUCT ID: 1606
Tactile Switch Buttons (6mm slim) x 20 pack - PRODUCT ID: 1489
Sparkfun - JST Right-Angle Connector - Through-Hole 2-Pin - PRT-09749
10K ohm resistor - Junkbox (look on your floor)
10K-100K ohm resistor - Junkbox (look on your floor near the 10K resistors)
2N3904 NPN Transistor - Junkbox (or phone a friend)
Some hookup wire (I used 22 gauge stranded)
To charge the LiPo battery I also scooped up:
Adafruit - Micro Lipo - USB LiIon/LiPoly charger - v1 - PRODUCT ID: 1304
Step 8: Components Placement
I was trying to be as clever as I could about placing the components. I usually try and line up certain pins like power and ground...if I can. I try to at least minimize wire lengths. I needed to be sure to leave a space above where the bridge of the nose is for the vibration motor. In the end I arrived at the placement that can be see in the picture above.
Step 9: Grounds
I first soldered all of the components to the board in the positions I had decided on. Next, I added ground connections. Conveniently one of the big long strips on the PWB was still exposed so, I made this the common ground strip.
The picture above shows the ground connections and the 10K resistor. I'm not going to tell you where to place every wire as most people have their own ideas on how to do things. I'm just going to show you what I did.
Step 10: Wires
I added the rest of the wires as shown in the picture above. I added a piece of double stick tape under the vibration motor to ensure it is held in place. The sticky material that already came on the bottom of the motor didn't feel strong enough to me.
I used 22 gauge wire for my connections. If you have something smaller, use it. I used 22 gauge because that's the smallest I had on hand.
Step 11: Battery Bracket
I 3D printed a bracket to hold the LiPo battery (a rendering of it is shown above). I marked and drilled holes in the protoboard to mount the bracket to the opposite side of the glasses from the components as shown above.
I should note here that the bracket is very thin and flimsy and I have to print it with support material (I used ABS plastic for all of the parts for this project). You can easily break the bracket trying to get the support material off so go easy.
One thing I do to make my parts stronger is to dip them in acetone. Of course you have to be very careful doing this. I do it in a well ventilated area and I use gloves and eye protection. I do this after I remove the support material (of course). I have a container of acetone and, using tweezers, I completely dip the part into acetone for maybe a second or two. I immediately remove it and set it aside to dry. I usually leave parts for an hour or more before I touch them. The acetone will 'melt' the ABS chemically. This has the effect of sealing the layers of plastic.
The STL file for the bracket is attached to this step.
Step 12: Programming
After double checking all of my connections I attached the USB cable in order to program the Trinket M0.
To install and/or modify the software (attached to this step) you'll need the Arduino IDE and the board files for the Trinket M0 as well as the libraries for the VL53L1X from Sparkfun. All of that is here, and here.
If you are new to it, follow the instructions for using the Adafruit M0 on their learning site here. Once the software (added to this step) is loaded the board should start up and run on the power from the USB serial connection. Move the side of the board with the VL53L1X close to a wall or your hand and you should feel the motor vibrate. The vibration should get lower in amplitude the further away from the device an object is.
I want to emphasize that this software is the very first pass at this. I have made two pairs of glasses and I will be making two more right away. We (me and at least one other person working on this) will continue to refine the software and post any updates here. My hope is that others will also try this and post (maybe to GitHub) any changes/improvements they make.
Step 13: Finishing the Frames
I snapped the ear pieces into the notch on both sides of the glasses and applied acetone using a cue-tip. I soak up the acetone so I get a good amount when I press it into the corners. If they are snapped in tight then the acetone will be carried around via capillary attraction. I make sure they are positioned straight and if needed I use something to hold them in place for at least an hour. Sometimes I reapply and wait another hour. The acetone makes a great bond and my glasses seem quite strong at the frame boundary.
Of course, these glasses are just a prototype so, I kept the design simple and that is why there are no hinges for the arms of the glasses. They work pretty well anyway. But, if you want, you could always redesign them with hinges.
Step 14: Final Thoughts
I have noticed that the sensor doesn't do well in sunlight. This makes sense as I am sure that the sensor is saturated by IR from the sun making it impossible to separate that from the pulse that the sensor emits. Still, they'd make good glasses indoors and on nights and maybe cloudy days. Of course, I need to do more tests.
One thing I will do to change the design is add some kind of rubber to the notch that touches the bridge of the nose. If you tip your head down it's hard to feel the vibration as the glasses lift off of the skin a little under the force of gravity. I think some rubber to create friction will keep the glasses fixed to the nose so the vibration can be transferred to it.
I'm hoping to get some feedback on the glasses. I don't know that the glasses will be helpful to people but we'll just have to see. That's what prototypes are all about: feasibility, learning and refinements.
More sensors could have been added to the design. I chose to use one for this prototype because I think more than one vibration motor will be harder for the user to discern. But it might have been a good idea to have two sensors aiming out from the eyes. Then using two motors you could vibrate each side of the glasses. You could also use audio fed to each ear instead of vibration. Again, the idea is to try a prototype and get some experience.
If you made it this far, thanks for reading!