Expressing Braille Through Vibrations: a Portable, Inexpensive Braille Display

by bmajorspin in Circuits > Assistive Tech

1306 Views, 10 Favorites, 0 Comments

Expressing Braille Through Vibrations: a Portable, Inexpensive Braille Display

IMG_8450.JPG
20240201_000619.jpg

Mobile phones have become important tools in modern society, as they have changed the way we communicate, work, and access information. However, their features cannot be fully taken advantage of by the visually impaired population, as their only options for accessing text on mobile devices are TTS(Text-to-speech) software and refreshable braille displays.

  • TTS software, which is used in conjunction with screen readers(Apple's VoiceOver, Android's TalkBalk), allows blind individuals to hear text by converting it into speech.
  • Since audio is required for them to function, they can be inconvenient to use in public without headphones. It is also completely inaccessible to the deafblind.
  • Refreshable braille displays are devices that use moveable electronic pins to display braille from digital devices.
  • These devices are a convenient method of reading text for those who can read braille, and are accessible to the deafblind. However, the majority of the world’s blind population cannot afford one, as their prices can range from $3,500 to $15,000 depending on the amount of characters displayed. Additionally, the convenience and portability of a phone is lost when a separate, two-handed device is used in tandem—imagine having to whip out another device every time you received a text.

The goal of this project was to remake the Refreshable Braille Display such that it is inexpensive to manufacture, and convenient to use in public situations.

Note: I want to preface by saying that although the device was ultimately able to display braille, it is not currently a viable alternative to any of the options available due its slow output speed and incompatibility with existing screen reader software. This was mainly just a proof of concept, and I hope to expand on it in the future.

Supplies

Materials:

  1. Electronics:
  2. Arduino Nano 33 BLE with headers x1 ($29.30)
  3. Coin vibration motors x 6 ($4.50) (Pack of 20)
  4. 1k Resistor x 6 ($0.36) (Pack of 100)
  5. 1N4001 Diode x 6 ($1.20) (Pack of 20)
  6. 0.1uF Ceramic Capacitor x 6 ($0.35) (Pack of 120)
  7. 2N7000 N-Channel MOSFET x 6 ($0.48) (Pack of 100)
  8. 40mmx60mm Double Sided PCB Board x 1 ($0.31 per board)
  9. 22 GA Solid-Core Wire
  10. The other stuff:
  11. USB C to Micro USB OTG Cable x 1 ($3.50) (Pack of 2)
  12. Micro USB 5Pin B Male Connector x 1 ($0.40) (Pack of 20)3
  13. Magnetic Wall Mount Compatible with MagSafe x 1 ($7.50) (Pack of 2)
  14. ¼ L 3/8 OD Compression Springs x 6 ($7.14) (I just found these at an Ace's hardware)
  15. PLA Plastic Filament


Equipment:

  1. 3D Printer(I used an Ender 3)
  2. A computer with Fusion 360. Arduino IDE, and slicing software(I used Cura)
  3. A Phone
  4. Soldering iron
  5. Multimeter
  6. Wire stripper
  7. Helping Hands
  8. Flux(Encouraged but optional)
  9. Desoldering wick(Optional)


The total cost of the device(excluding equipment) was $54.33, which is 6.7% the price of the Orbit Reader 20 Plus, and 2.5% the price of the Brailliant BI 20X braille display.

Designing the Device

signal-2024-05-10-231707.jpeg
unnamed.jpg
googleintrod.gif

Regarding the issue of cost:

  • A major factor in the high cost of refreshable braille devices is the need for their pins to be durable enough to survive daily wear-and-tear. To achieve this, I reduced the amount of moving parts in the system by replacing the pins with 6 vibration motors to represent the 6 dots of a braille character.
  • The price of a braille display also scales with the amount of braille characters it can represent at one time. Instead of a row of costly braille cells, there is a singular array of vibration motors that pulses based on user control.

Regarding the issue of portability:

  • I wanted the device to mount magnetically to the back of a phone so that it would be easily accessible at all times, combining the phone and the display into a single device. Also, magnetic phone accessories are on the rise due to Apple's MagSafe, so I wanted to take advantage of that trend.

I modeled the layout of the motors on the Braille Keyboard in Android phones; I thought that if blind individuals could type braille characters in that configuration, they would be able to read characters from it as well. Instead of tapping on those areas, they would rest their fingers on them instead, using their thumbs to scroll through letters with phone's touch screen.

In order for the user to be able feel each motor individually, the motors couldn’t be mounted directly to the housing, as the vibrations from each motor would combine into a single, undistinguishable vibration. Therefore, I had to figure out a way to isolate each motor from one another and the housing. Between using rubber or springs, which I found were typically used in systems intending to reduce vibrations, I ended up using springs, as I found that rubber was used more for vibration dampening purposes.

I decided to use the phone as the power source for the device, as adding an external battery would require the device to be bulkier.

My final design was a magnetic phone accessory that sits in the center of the back of your phone. The top has 6 holes, which allows you directly touch the 6 spring-mounted vibration motors that vibrate according to text on the phone's screen.

Modeling the Housing

1707452470634-fcadf865-0922-4690-a368-35dc568feef8_1.jpg
1707452470634-fcadf865-0922-4690-a368-35dc568feef8_2.jpg
1707452470634-fcadf865-0922-4690-a368-35dc568feef8_3.jpg
actualspringcap Drawing v1.png

I used Fusion 360 to model the housing, which consisted of a top part and a bottom part that connected using cantilever snap-joints. The files are attached below if you want to edit them.

If I were to do this again, I would definitely have parameterized the model from the start; it was a total pain having to go back to change a dimension.

The final thickness was 17.2 mm, which is thinner than the Anker Magnetic Battery pack(18.034mm) and the Belkin BoostCharge(25.4mm), but still thicker than most magnetic phone accessories on the market.

3D-Printing the Housing

Screenshot 2024-04-19 at 12.07.01 PM.png
signal-2024-05-11-101732.jpeg

I printed the parts(attached below) using an Ender 3 with PLA filament.

I used Ultimaker Cura as my slicing software, but you can use whatever works for you. Arrange the pieces such that the external parts of the housing touch the buildplate(see the above photo). Also, print 6 of the spring caps with the thread side facing down, as well as 6 of the motor attachments.

My settings were:

  • 30% infill
  • 0.16mm resolution
  • 195°/50°
  • Tree supports touching buildplate
  • No rafts/adhesion

Designing and Simulating the Circuit

20231220_215004~3.jpg
8-x-2mm-vibration-motor.png
4f497e2fdd7e0720eac6dd59aafd1a25.png

For the circuit, I looked up how to control a single vibration motor with an Arduino through this website. It ended up needing a vibration motor, a transistor/MOSFET to amplify current(the motor requires 75mA), a diode and a capacitor to protect against voltage spikes, and a resistor.

I then scaled up the schematic for 6 motors, and simulated it using Tinkercad Circuits using a simple program that toggled the motors on and off.

Once I knew that the circuit would actually work, I arranged it to be soldered onto a perfboard with 20x14 holes. I had to fit components in the space under the Arduino Nano, which wasn't exactly ideal, but it ended up working. 

Note: If you know how to design a PCB, I strongly encourage you design and order a printed PCB of the schematic instead of soldering every connection by hand like I did. This has the benefit of reducing how much space the PCB takes up and the chance of errors. You can order your custom PCB through services like OSH Park, ExpressPCB or others. If you do this, you might need to adjust the model of the housing, which was designed to fit the 4x6 cm perfboard that I used.

Downloads

Soldering the Circuit

back.jpeg
front-w:o-arduino.jpeg
front-w-arduino.jpeg

Solder all the components according to the schematic, using my makeshift diagram in the previous step or your own arrangement.

When soldering connections, make sure to bend the end of each component in the direction you want to connect, and use that part as the bridge itself, rather than making a bunch of solder bridges like I did initially. Try to use as little solder as possible; it will make troubleshooting a lot easier if you run into any errors.

Assembling the Device

IMG_8449.JPG
20240208_184329.jpg
signal-2024-02-20-145830_029.jpeg
signal-2024-05-11-122444.jpeg

Cover the circular magnet in electric tape to prevent any possible shorts, and place in in the bottom housing. Then, get your 3/8 OD Compression Springs, cut them down to 1cm in length, then attach them to the threads on the bottom housing.

Once I got to this step, I realized I didn't factor in the housing of the USB cable, which made it impossible to close the housing, and was still interfering with one of the springs. To solve this issue, I had to cut off the micro-usb connector, and strip the tubing until the 4 wires(5V, ground, data+, and data-) were exposed. I then took a bare micro usb male connector and soldered those wires to their respective pads, finishing it off with some hot glue for strain relief(Use a lot more than I did in the photo).

For each vibration motor, attach a spring cap such that the adhesive side of the motor faces up. The spring caps will allow you to screw the motors on to the springs later on. Remove the adhesive and stick on the motor attachments. Next, place the perfboard on the mounting surface above the magnet, and mount each motor to their corresponding spring. Arrange the usb cable such that it exits through the hole in the housing, then snap on the top piece.

Programming the Arduino

Screenshot 2024-05-11 at 12.02.46 AM.png

The Arduino was set to be a BLE client, meaning that it listens for incoming data from the server(the phone). After establishing a connection with the server, it receives a 6-digit number that represents each dot, then vibrates based on that number. For example, the character “P” is "⠏", so it is represented by the number 222211. "O" is "⠕", so it is represented by 212121.

Upload "haptic-braille-noBLE.ino" to the Arduino if you want to use the serial monitor in the IDE to test specific letters, or "haptic-braille-digital-v3.ino", which is the actual BLE program that works with the app.

Programming the App

signal-2024-05-10-213406_003.jpeg
signal-2024-05-10-213406_002.jpeg
729ed1fe31ae59946f66c03bcf2346e0.png
1a7bcf9a61092f9ff1586623821ec09e.png

I programmed an app using MIT App inventor in order to control the device using a phone. The app then converts the text into an array of the 6-digit numbers mentioned in the previous step. As the user cycles through the characters using the forward/backward buttons or the slider, the app sends the corresponding number to the device over BLE, causing it to vibrate that specific character.

The .aia file type(MIT App inventor) wasn't supported on instructables, so here is the source code(its not a virus, I swear) for the app. In the "When ButtonScan.click" event, change to the MAC address of your arduino, which you can find by running the haptic-braille-digital-v3 program, then using a BLE app like LightBlue or nrF Connect to find the arduino, which should display the arduino's mac address.

You should be able to test the app on any phone through the MIT app inventor app, but if you have an Apple phone, you won't be able to download a permanent app(.apk file) like you can on Android. An apk file of the app is attached below, although it is set to connect to my specific arduino.

The ultimate goal for the app is for it to be able to capture the text on a screen, and allowing the user to scroll through the text.

Conclusion and Further Steps

FJ3I74CLTPTACCH.jpg

To use the device, simply attach the device to the back of your phone and plug it in. After you open the app, press the connect button to pair the devices, and you should be ready to start inputting text.

So far, I've tested it with one blind individual; they were successfully able to read braille using it, although they weren't able to read at higher output speeds. Due to the device's slow speed and lack of interface with existing software, it probably won't be replacing refreshable braille displays anytime soon. However, in its current state, it can serve as an inexpensive teaching tool for braille, and a way to read short amounts of text like notifications on the go.

Ultimately, the project accomplished the objective; the device is significantly cheaper than refreshable braille displays, portable, and succeeds at displaying braille.

Here are some steps forward in order of importance:

  1. Better vibration isolation: The biggest issue with the current design is the fact that the vibration isolation isn't perfect, making it unreadable when it reaches high output speeds. Worst comes to worst, I get rid of the vibration concept entirely, and find a less noisy, tactile output.
  2. Redesigned housing: Currently, the device still too bulky/thick to be comfortable to hold, which is in part due to how the microcontroller is positioned above the magnet. I want to redesign the housing such that there is a larger point of contact to the motors, and extend the bottom portion farther down for better ergonomics.
  3. Standard Bluetooth: I initially chose BLE(Bluetooth low energy) because I thought that it using less power would be more suitable considering that the only power source was the phone itself. After I had already soldered all the components, however, I realized the BLE is intended for intermittent sending of data(e.g. a temperature sensor that periodically sends data), rather than the constant sending of data that I was using it for. Although I never actually had any issues with BLE constantly sending data, I would still want to switch to a microcontroller with built-in Standard Bluetooth, which is actually designed for those constant streams of data(e.g. bluetooth headphones).
  4. Software: There's probably a more efficient way to send over the data than the 6-digit system that I was using. I was told to implement a buffer in case of any data loss, but I didn't really know how to do that. Also, building the screen-capturing software that I mentioned earlier.
  5. PWM: The microcontroller I used only had 4 analog(PWM) outputs, so I wasn't able to implement adjustable vibration strengths. To solve. this, I can either use a microcontroller with more PWM outputs, or a software library like softpwm.

Thanks for reading!